@@ -7,7 +7,7 @@ use regex::Regex;
77use sqlparser:: ast:: { SetExpr , Statement } ;
88use sqlparser:: dialect:: GenericDialect ;
99use sqlparser:: parser:: Parser as SqlParser ;
10- use tree_sitter:: Parser as CodeParser ;
10+ use tree_sitter:: { Node , Parser as CodeParser } ;
1111use walkdir:: WalkDir ;
1212
1313struct SqlQueryError {
@@ -123,56 +123,61 @@ fn validate_query_with_schema(query: &Vec<Statement>, schema: &TablesAndColumns)
123123 return errors;
124124}
125125
126- fn find_queries ( code : & [ u8 ] ) -> Vec < QueryInCode > {
127- let mut parser = CodeParser :: new ( ) ;
128- parser
129- . set_language ( tree_sitter_python:: language ( ) )
130- . expect ( "Error loading Python grammar" ) ;
131- let parsed = parser. parse ( code, None ) ;
132- let mut queries: Vec < QueryInCode > = Vec :: new ( ) ;
126+ fn find_queries_in_tree ( node : & Node , code : & [ u8 ] , queries : & mut Vec < QueryInCode > ) {
127+ let mut cursor = node. walk ( ) ;
133128 let dialect = GenericDialect { } ;
134129
135- if let Some ( tree) = parsed {
136- let mut cursor = tree. walk ( ) ;
137- for node in tree. root_node ( ) . children ( & mut cursor) {
138- let mut node_cursor = node. walk ( ) ;
139- for component in node. children ( & mut node_cursor) {
140- if component. kind ( ) != "assignment" {
141- continue ;
142- }
130+ for child in node. children ( & mut cursor) {
131+ let mut child_cursor = child. walk ( ) ;
132+ for component in child. children ( & mut child_cursor) {
133+ if component. kind ( ) != "assignment" {
134+ continue ;
135+ }
143136
144- if component. child_count ( ) > 3 {
145- continue ;
146- }
137+ if component. child_count ( ) > 3 {
138+ continue ;
139+ }
147140
148- let identifier = component. child ( 0 ) . unwrap ( ) ;
149- let equal = component. child ( 1 ) . unwrap ( ) ;
150- let var = component. child ( 2 ) . unwrap ( ) ;
141+ let identifier = component. child ( 0 ) . unwrap ( ) ;
142+ let equal = component. child ( 1 ) . unwrap ( ) ;
143+ let var = component. child ( 2 ) . unwrap ( ) ;
151144
152- let is_string_assignment = identifier. kind ( ) == "identifier"
153- && equal. kind ( ) == "="
154- && var. kind ( ) == "string" ;
145+ let is_string_assignment =
146+ identifier. kind ( ) == "identifier" && equal. kind ( ) == "=" && var. kind ( ) == "string" ;
155147
156- if !is_string_assignment {
157- continue ;
158- }
148+ if !is_string_assignment {
149+ continue ;
150+ }
159151
160- let content = var. child ( 1 ) . unwrap ( ) ;
161- let content_as_string =
162- String :: from_utf8_lossy ( & code[ content. start_byte ( ) ..content. end_byte ( ) ] ) ;
152+ let content = var. child ( 1 ) . unwrap ( ) ;
153+ let content_as_string =
154+ String :: from_utf8_lossy ( & code[ content. start_byte ( ) ..content. end_byte ( ) ] ) ;
163155
164- let point = component. start_position ( ) ;
156+ let point = component. start_position ( ) ;
165157
166- let statements = SqlParser :: parse_sql ( & dialect, & content_as_string) ;
158+ let statements = SqlParser :: parse_sql ( & dialect, & content_as_string) ;
167159
168- if let Ok ( statements) = statements {
169- queries. push ( QueryInCode {
170- line : point. row + 1 ,
171- statements,
172- } )
173- }
160+ if let Ok ( statements) = statements {
161+ queries. push ( QueryInCode {
162+ line : point. row + 1 ,
163+ statements,
164+ } )
174165 }
175166 }
167+ find_queries_in_tree ( & child, code, queries) ;
168+ }
169+ }
170+
171+ fn find_queries ( code : & [ u8 ] ) -> Vec < QueryInCode > {
172+ let mut parser = CodeParser :: new ( ) ;
173+ parser
174+ . set_language ( tree_sitter_python:: language ( ) )
175+ . expect ( "Error loading Python grammar" ) ;
176+ let parsed = parser. parse ( code, None ) ;
177+ let mut queries: Vec < QueryInCode > = Vec :: new ( ) ;
178+
179+ if let Some ( tree) = parsed {
180+ find_queries_in_tree ( & tree. root_node ( ) , & code, & mut queries) ;
176181 }
177182 return queries;
178183}
0 commit comments