Skip to content

Commit 5c8a729

Browse files
authored
Merge pull request #122 from supabase/feat/tree-sitter-sql
feat: add tree-sitter-sql integration
2 parents 8ec46eb + de46f47 commit 5c8a729

File tree

9 files changed

+105
-2
lines changed

9 files changed

+105
-2
lines changed

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
[submodule "libpg_query"]
22
path = libpg_query
33
url = https://github.com/pganalyze/libpg_query.git
4+
[submodule "crates/tree_sitter_sql/tree-sitter-sql"]
5+
path = crates/tree_sitter_sql/tree-sitter-sql
6+
url = https://github.com/DerekStride/tree-sitter-sql
7+
branch = gh-pages

Cargo.lock

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ resolver = "2"
99
rust-version = "1.71"
1010

1111
[workspace.dependencies]
12+
tree_sitter_sql = { path = "./crates/tree_sitter_sql", version = "0.0.0" }
1213
schema_cache = { path = "./crates/schema_cache", version = "0.0.0" }
1314
parser = { path = "./crates/parser", version = "0.0.0" }
1415
codegen = { path = "./crates/codegen", version = "0.0.0" }

crates/schema_cache/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ mod schema_cache;
77
mod schemas;
88
mod tables;
99

10-
use schema_cache::SchemaCache;
1110
use sqlx::postgres::PgPool;
1211

12+
pub use schema_cache::SchemaCache;
13+
1314
#[derive(Debug, Clone)]
1415
struct SchemaCacheManager {
1516
pub cache: SchemaCache,

crates/tree_sitter_sql/Cargo.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
name = "tree_sitter_sql"
3+
version = "0.0.0"
4+
edition = "2021"
5+
6+
build = "build.rs"
7+
8+
[build-dependencies]
9+
cc="*"
10+
11+
[dependencies]
12+
tree-sitter = "0.20.10"
13+
14+
[lib]
15+
doctest = false

crates/tree_sitter_sql/build.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
fn main() {
2+
let src_dir = std::path::Path::new("./tree-sitter-sql/src");
3+
let mut config = cc::Build::new();
4+
config.include(&src_dir);
5+
config
6+
.flag_if_supported("-Wno-unused-parameter")
7+
.flag_if_supported("-Wno-unused-but-set-variable")
8+
.flag_if_supported("-Wno-trigraphs");
9+
let parser_path = src_dir.join("parser.c");
10+
let scanner_path = src_dir.join("scanner.c");
11+
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
12+
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
13+
config.file(&parser_path);
14+
config.file(&scanner_path);
15+
config.compile("parser-scanner");
16+
}

crates/tree_sitter_sql/src/lib.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use tree_sitter::Language;
2+
3+
extern "C" {
4+
fn tree_sitter_sql() -> Language;
5+
}
6+
7+
pub fn language() -> Language {
8+
unsafe { tree_sitter_sql() }
9+
}
10+
11+
#[cfg(test)]
12+
mod tests {
13+
use tree_sitter::{Query, QueryCursor};
14+
15+
#[test]
16+
fn test_can_load_grammar() {
17+
let mut parser = tree_sitter::Parser::new();
18+
parser
19+
.set_language(super::language())
20+
.expect("Error loading sql language");
21+
let source_code = "SELECT 1 FROM public.table where id = 4";
22+
23+
let query = Query::new(
24+
parser.language().unwrap(),
25+
"(
26+
relation (
27+
(
28+
object_reference
29+
schema: (identifier)
30+
name: (identifier)
31+
) @reference
32+
)
33+
)
34+
",
35+
)
36+
.unwrap();
37+
38+
let tree = parser.parse(source_code, None).unwrap();
39+
40+
let mut cursor = QueryCursor::new();
41+
42+
let mut captures = cursor.captures(&query, tree.root_node(), source_code.as_bytes());
43+
let (match_, idx) = captures.next().unwrap();
44+
let capture = match_.captures[idx];
45+
assert_eq!(capture.node.kind(), "object_reference");
46+
}
47+
}
Submodule tree-sitter-sql added at da2d1ef

0 commit comments

Comments
 (0)