12
12
13
13
//! Recursive visitors for ast Nodes. See [`Visitor`] for more details.
14
14
15
- use crate :: ast:: { Expr , FunctionArgExpr , ObjectName , SetExpr , Statement } ;
15
+ use crate :: ast:: { Expr , FunctionArgExpr , ObjectName , SetExpr , Statement , TableFactor } ;
16
16
use core:: ops:: ControlFlow ;
17
17
18
18
/// A type that can be visited by a [`Visitor`]. See [`Visitor`] for
@@ -115,8 +115,8 @@ visit_noop!(bigdecimal::BigDecimal);
115
115
116
116
/// A visitor that can be used to walk an AST tree.
117
117
///
118
- /// `previst_ ` methods are invoked before visiting all children of the
119
- /// node and `postvisit_ ` methods are invoked after visiting all
118
+ /// `pre_visit_ ` methods are invoked before visiting all children of the
119
+ /// node and `post_visit_ ` methods are invoked after visiting all
120
120
/// children of the node.
121
121
///
122
122
/// # See also
@@ -139,7 +139,7 @@ visit_noop!(bigdecimal::BigDecimal);
139
139
/// }
140
140
///
141
141
/// // Visit relations and exprs before children are visited (depth first walk)
142
- /// // Note you can also visit statements and visit exprs after children have been visitoed
142
+ /// // Note you can also visit statements and visit exprs after children have been visited
143
143
/// impl Visitor for V {
144
144
/// type Break = ();
145
145
///
@@ -189,6 +189,16 @@ pub trait Visitor {
189
189
ControlFlow :: Continue ( ( ) )
190
190
}
191
191
192
+ /// Invoked for any table factors that appear in the AST before visiting children
193
+ fn pre_visit_table_factor ( & mut self , _table_factor : & TableFactor ) -> ControlFlow < Self :: Break > {
194
+ ControlFlow :: Continue ( ( ) )
195
+ }
196
+
197
+ /// Invoked for any table factors that appear in the AST after visiting children
198
+ fn post_visit_table_factor ( & mut self , _table_factor : & TableFactor ) -> ControlFlow < Self :: Break > {
199
+ ControlFlow :: Continue ( ( ) )
200
+ }
201
+
192
202
/// Invoked for any expressions that appear in the AST before visiting children
193
203
fn pre_visit_expr ( & mut self , _expr : & Expr ) -> ControlFlow < Self :: Break > {
194
204
ControlFlow :: Continue ( ( ) )
@@ -231,8 +241,8 @@ pub trait Visitor {
231
241
232
242
/// A visitor that can be used to mutate an AST tree.
233
243
///
234
- /// `previst_ ` methods are invoked before visiting all children of the
235
- /// node and `postvisit_ ` methods are invoked after visiting all
244
+ /// `pre_visit_ ` methods are invoked before visiting all children of the
245
+ /// node and `post_visit_ ` methods are invoked after visiting all
236
246
/// children of the node.
237
247
///
238
248
/// # See also
@@ -286,6 +296,22 @@ pub trait VisitorMut {
286
296
ControlFlow :: Continue ( ( ) )
287
297
}
288
298
299
+ /// Invoked for any table factors that appear in the AST before visiting children
300
+ fn pre_visit_table_factor (
301
+ & mut self ,
302
+ _table_factor : & mut TableFactor ,
303
+ ) -> ControlFlow < Self :: Break > {
304
+ ControlFlow :: Continue ( ( ) )
305
+ }
306
+
307
+ /// Invoked for any table factors that appear in the AST after visiting children
308
+ fn post_visit_table_factor (
309
+ & mut self ,
310
+ _table_factor : & mut TableFactor ,
311
+ ) -> ControlFlow < Self :: Break > {
312
+ ControlFlow :: Continue ( ( ) )
313
+ }
314
+
289
315
/// Invoked for any expressions that appear in the AST before visiting children
290
316
fn pre_visit_expr ( & mut self , _expr : & mut Expr ) -> ControlFlow < Self :: Break > {
291
317
ControlFlow :: Continue ( ( ) )
@@ -719,6 +745,24 @@ mod tests {
719
745
ControlFlow :: Continue ( ( ) )
720
746
}
721
747
748
+ fn pre_visit_table_factor (
749
+ & mut self ,
750
+ table_factor : & TableFactor ,
751
+ ) -> ControlFlow < Self :: Break > {
752
+ self . visited
753
+ . push ( format ! ( "PRE: TABLE FACTOR: {table_factor}" ) ) ;
754
+ ControlFlow :: Continue ( ( ) )
755
+ }
756
+
757
+ fn post_visit_table_factor (
758
+ & mut self ,
759
+ table_factor : & TableFactor ,
760
+ ) -> ControlFlow < Self :: Break > {
761
+ self . visited
762
+ . push ( format ! ( "POST: TABLE FACTOR: {table_factor}" ) ) ;
763
+ ControlFlow :: Continue ( ( ) )
764
+ }
765
+
722
766
fn pre_visit_expr ( & mut self , expr : & Expr ) -> ControlFlow < Self :: Break > {
723
767
self . visited . push ( format ! ( "PRE: EXPR: {expr}" ) ) ;
724
768
ControlFlow :: Continue ( ( ) )
@@ -757,22 +801,28 @@ mod tests {
757
801
fn test_sql ( ) {
758
802
let tests = vec ! [
759
803
(
760
- "SELECT * from table_name" ,
804
+ "SELECT * from table_name as my_table " ,
761
805
vec![
762
- "PRE: STATEMENT: SELECT * FROM table_name" ,
806
+ "PRE: STATEMENT: SELECT * FROM table_name AS my_table" ,
807
+ "PRE: TABLE FACTOR: table_name AS my_table" ,
763
808
"PRE: RELATION: table_name" ,
764
809
"POST: RELATION: table_name" ,
765
- "POST: STATEMENT: SELECT * FROM table_name" ,
810
+ "POST: TABLE FACTOR: table_name AS my_table" ,
811
+ "POST: STATEMENT: SELECT * FROM table_name AS my_table" ,
766
812
] ,
767
813
) ,
768
814
(
769
815
"SELECT * from t1 join t2 on t1.id = t2.t1_id" ,
770
816
vec![
771
817
"PRE: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
818
+ "PRE: TABLE FACTOR: t1" ,
772
819
"PRE: RELATION: t1" ,
773
820
"POST: RELATION: t1" ,
821
+ "POST: TABLE FACTOR: t1" ,
822
+ "PRE: TABLE FACTOR: t2" ,
774
823
"PRE: RELATION: t2" ,
775
824
"POST: RELATION: t2" ,
825
+ "POST: TABLE FACTOR: t2" ,
776
826
"PRE: EXPR: t1.id = t2.t1_id" ,
777
827
"PRE: EXPR: t1.id" ,
778
828
"POST: EXPR: t1.id" ,
@@ -786,13 +836,17 @@ mod tests {
786
836
"SELECT * from t1 where EXISTS(SELECT column from t2)" ,
787
837
vec![
788
838
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
839
+ "PRE: TABLE FACTOR: t1" ,
789
840
"PRE: RELATION: t1" ,
790
841
"POST: RELATION: t1" ,
842
+ "POST: TABLE FACTOR: t1" ,
791
843
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
792
844
"PRE: EXPR: column" ,
793
845
"POST: EXPR: column" ,
846
+ "PRE: TABLE FACTOR: t2" ,
794
847
"PRE: RELATION: t2" ,
795
848
"POST: RELATION: t2" ,
849
+ "POST: TABLE FACTOR: t2" ,
796
850
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
797
851
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
798
852
] ,
@@ -801,13 +855,17 @@ mod tests {
801
855
"SELECT * from t1 where EXISTS(SELECT column from t2)" ,
802
856
vec![
803
857
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
858
+ "PRE: TABLE FACTOR: t1" ,
804
859
"PRE: RELATION: t1" ,
805
860
"POST: RELATION: t1" ,
861
+ "POST: TABLE FACTOR: t1" ,
806
862
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
807
863
"PRE: EXPR: column" ,
808
864
"POST: EXPR: column" ,
865
+ "PRE: TABLE FACTOR: t2" ,
809
866
"PRE: RELATION: t2" ,
810
867
"POST: RELATION: t2" ,
868
+ "POST: TABLE FACTOR: t2" ,
811
869
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
812
870
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
813
871
] ,
@@ -816,16 +874,22 @@ mod tests {
816
874
"SELECT * from t1 where EXISTS(SELECT column from t2) UNION SELECT * from t3" ,
817
875
vec![
818
876
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
877
+ "PRE: TABLE FACTOR: t1" ,
819
878
"PRE: RELATION: t1" ,
820
879
"POST: RELATION: t1" ,
880
+ "POST: TABLE FACTOR: t1" ,
821
881
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
822
882
"PRE: EXPR: column" ,
823
883
"POST: EXPR: column" ,
884
+ "PRE: TABLE FACTOR: t2" ,
824
885
"PRE: RELATION: t2" ,
825
886
"POST: RELATION: t2" ,
887
+ "POST: TABLE FACTOR: t2" ,
826
888
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
889
+ "PRE: TABLE FACTOR: t3" ,
827
890
"PRE: RELATION: t3" ,
828
891
"POST: RELATION: t3" ,
892
+ "POST: TABLE FACTOR: t3" ,
829
893
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
830
894
] ,
831
895
) ,
0 commit comments