12
12
13
13
//! Recursive visitors for ast Nodes. See [`Visitor`] for more details.
14
14
15
- use crate :: ast:: { Expr , ObjectName , Statement } ;
15
+ use crate :: ast:: { Expr , ObjectName , 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 ( ( ) )
@@ -212,8 +222,8 @@ pub trait Visitor {
212
222
213
223
/// A visitor that can be used to mutate an AST tree.
214
224
///
215
- /// `previst_ ` methods are invoked before visiting all children of the
216
- /// node and `postvisit_ ` methods are invoked after visiting all
225
+ /// `pre_visit_ ` methods are invoked before visiting all children of the
226
+ /// node and `post_visit_ ` methods are invoked after visiting all
217
227
/// children of the node.
218
228
///
219
229
/// # See also
@@ -267,6 +277,22 @@ pub trait VisitorMut {
267
277
ControlFlow :: Continue ( ( ) )
268
278
}
269
279
280
+ /// Invoked for any table factors that appear in the AST before visiting children
281
+ fn pre_visit_table_factor (
282
+ & mut self ,
283
+ _table_factor : & mut TableFactor ,
284
+ ) -> ControlFlow < Self :: Break > {
285
+ ControlFlow :: Continue ( ( ) )
286
+ }
287
+
288
+ /// Invoked for any table factors that appear in the AST after visiting children
289
+ fn post_visit_table_factor (
290
+ & mut self ,
291
+ _table_factor : & mut TableFactor ,
292
+ ) -> ControlFlow < Self :: Break > {
293
+ ControlFlow :: Continue ( ( ) )
294
+ }
295
+
270
296
/// Invoked for any expressions that appear in the AST before visiting children
271
297
fn pre_visit_expr ( & mut self , _expr : & mut Expr ) -> ControlFlow < Self :: Break > {
272
298
ControlFlow :: Continue ( ( ) )
@@ -609,6 +635,24 @@ mod tests {
609
635
ControlFlow :: Continue ( ( ) )
610
636
}
611
637
638
+ fn pre_visit_table_factor (
639
+ & mut self ,
640
+ table_factor : & TableFactor ,
641
+ ) -> ControlFlow < Self :: Break > {
642
+ self . visited
643
+ . push ( format ! ( "PRE: TABLE FACTOR: {table_factor}" ) ) ;
644
+ ControlFlow :: Continue ( ( ) )
645
+ }
646
+
647
+ fn post_visit_table_factor (
648
+ & mut self ,
649
+ table_factor : & TableFactor ,
650
+ ) -> ControlFlow < Self :: Break > {
651
+ self . visited
652
+ . push ( format ! ( "POST: TABLE FACTOR: {table_factor}" ) ) ;
653
+ ControlFlow :: Continue ( ( ) )
654
+ }
655
+
612
656
fn pre_visit_expr ( & mut self , expr : & Expr ) -> ControlFlow < Self :: Break > {
613
657
self . visited . push ( format ! ( "PRE: EXPR: {expr}" ) ) ;
614
658
ControlFlow :: Continue ( ( ) )
@@ -647,22 +691,28 @@ mod tests {
647
691
fn test_sql ( ) {
648
692
let tests = vec ! [
649
693
(
650
- "SELECT * from table_name" ,
694
+ "SELECT * from table_name as my_table " ,
651
695
vec![
652
- "PRE: STATEMENT: SELECT * FROM table_name" ,
696
+ "PRE: STATEMENT: SELECT * FROM table_name AS my_table" ,
697
+ "PRE: TABLE FACTOR: table_name AS my_table" ,
653
698
"PRE: RELATION: table_name" ,
654
699
"POST: RELATION: table_name" ,
655
- "POST: STATEMENT: SELECT * FROM table_name" ,
700
+ "POST: TABLE FACTOR: table_name AS my_table" ,
701
+ "POST: STATEMENT: SELECT * FROM table_name AS my_table" ,
656
702
] ,
657
703
) ,
658
704
(
659
705
"SELECT * from t1 join t2 on t1.id = t2.t1_id" ,
660
706
vec![
661
707
"PRE: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
708
+ "PRE: TABLE FACTOR: t1" ,
662
709
"PRE: RELATION: t1" ,
663
710
"POST: RELATION: t1" ,
711
+ "POST: TABLE FACTOR: t1" ,
712
+ "PRE: TABLE FACTOR: t2" ,
664
713
"PRE: RELATION: t2" ,
665
714
"POST: RELATION: t2" ,
715
+ "POST: TABLE FACTOR: t2" ,
666
716
"PRE: EXPR: t1.id = t2.t1_id" ,
667
717
"PRE: EXPR: t1.id" ,
668
718
"POST: EXPR: t1.id" ,
@@ -676,13 +726,17 @@ mod tests {
676
726
"SELECT * from t1 where EXISTS(SELECT column from t2)" ,
677
727
vec![
678
728
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
729
+ "PRE: TABLE FACTOR: t1" ,
679
730
"PRE: RELATION: t1" ,
680
731
"POST: RELATION: t1" ,
732
+ "POST: TABLE FACTOR: t1" ,
681
733
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
682
734
"PRE: EXPR: column" ,
683
735
"POST: EXPR: column" ,
736
+ "PRE: TABLE FACTOR: t2" ,
684
737
"PRE: RELATION: t2" ,
685
738
"POST: RELATION: t2" ,
739
+ "POST: TABLE FACTOR: t2" ,
686
740
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
687
741
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
688
742
] ,
@@ -691,13 +745,17 @@ mod tests {
691
745
"SELECT * from t1 where EXISTS(SELECT column from t2)" ,
692
746
vec![
693
747
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
748
+ "PRE: TABLE FACTOR: t1" ,
694
749
"PRE: RELATION: t1" ,
695
750
"POST: RELATION: t1" ,
751
+ "POST: TABLE FACTOR: t1" ,
696
752
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
697
753
"PRE: EXPR: column" ,
698
754
"POST: EXPR: column" ,
755
+ "PRE: TABLE FACTOR: t2" ,
699
756
"PRE: RELATION: t2" ,
700
757
"POST: RELATION: t2" ,
758
+ "POST: TABLE FACTOR: t2" ,
701
759
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
702
760
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
703
761
] ,
@@ -706,16 +764,22 @@ mod tests {
706
764
"SELECT * from t1 where EXISTS(SELECT column from t2) UNION SELECT * from t3" ,
707
765
vec![
708
766
"PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
767
+ "PRE: TABLE FACTOR: t1" ,
709
768
"PRE: RELATION: t1" ,
710
769
"POST: RELATION: t1" ,
770
+ "POST: TABLE FACTOR: t1" ,
711
771
"PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
712
772
"PRE: EXPR: column" ,
713
773
"POST: EXPR: column" ,
774
+ "PRE: TABLE FACTOR: t2" ,
714
775
"PRE: RELATION: t2" ,
715
776
"POST: RELATION: t2" ,
777
+ "POST: TABLE FACTOR: t2" ,
716
778
"POST: EXPR: EXISTS (SELECT column FROM t2)" ,
779
+ "PRE: TABLE FACTOR: t3" ,
717
780
"PRE: RELATION: t3" ,
718
781
"POST: RELATION: t3" ,
782
+ "POST: TABLE FACTOR: t3" ,
719
783
"POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
720
784
] ,
721
785
) ,
0 commit comments