1717
1818//! Recursive visitors for ast Nodes. See [`Visitor`] for more details.
1919
20- use crate :: ast:: { Expr , ObjectName , Query , Statement , TableFactor , Value } ;
20+ use crate :: ast:: { Expr , ObjectName , Query , Select , Statement , TableFactor , Value } ;
2121use core:: ops:: ControlFlow ;
2222
2323/// A type that can be visited by a [`Visitor`]. See [`Visitor`] for
@@ -207,6 +207,16 @@ pub trait Visitor {
207207 ControlFlow :: Continue ( ( ) )
208208 }
209209
210+ /// Invoked for any [Select] that appear in the AST before visiting children
211+ fn pre_visit_select ( & mut self , _select : & Select ) -> ControlFlow < Self :: Break > {
212+ ControlFlow :: Continue ( ( ) )
213+ }
214+
215+ /// Invoked for any [Select] that appear in the AST after visiting children
216+ fn post_visit_select ( & mut self , _select : & Select ) -> ControlFlow < Self :: Break > {
217+ ControlFlow :: Continue ( ( ) )
218+ }
219+
210220 /// Invoked for any relations (e.g. tables) that appear in the AST before visiting children
211221 fn pre_visit_relation ( & mut self , _relation : & ObjectName ) -> ControlFlow < Self :: Break > {
212222 ControlFlow :: Continue ( ( ) )
@@ -319,6 +329,16 @@ pub trait VisitorMut {
319329 ControlFlow :: Continue ( ( ) )
320330 }
321331
332+ /// Invoked for any [Select] that appear in the AST before visiting children
333+ fn pre_visit_select ( & mut self , _select : & mut Select ) -> ControlFlow < Self :: Break > {
334+ ControlFlow :: Continue ( ( ) )
335+ }
336+
337+ /// Invoked for any [Select] that appear in the AST after visiting children
338+ fn post_visit_select ( & mut self , _select : & mut Select ) -> ControlFlow < Self :: Break > {
339+ ControlFlow :: Continue ( ( ) )
340+ }
341+
322342 /// Invoked for any relations (e.g. tables) that appear in the AST before visiting children
323343 fn pre_visit_relation ( & mut self , _relation : & mut ObjectName ) -> ControlFlow < Self :: Break > {
324344 ControlFlow :: Continue ( ( ) )
@@ -709,6 +729,16 @@ mod tests {
709729 ControlFlow :: Continue ( ( ) )
710730 }
711731
732+ fn pre_visit_select ( & mut self , select : & Select ) -> ControlFlow < Self :: Break > {
733+ self . visited . push ( format ! ( "PRE: SELECT: {select}" ) ) ;
734+ ControlFlow :: Continue ( ( ) )
735+ }
736+
737+ fn post_visit_select ( & mut self , select : & Select ) -> ControlFlow < Self :: Break > {
738+ self . visited . push ( format ! ( "POST: SELECT: {select}" ) ) ;
739+ ControlFlow :: Continue ( ( ) )
740+ }
741+
712742 fn pre_visit_relation ( & mut self , relation : & ObjectName ) -> ControlFlow < Self :: Break > {
713743 self . visited . push ( format ! ( "PRE: RELATION: {relation}" ) ) ;
714744 ControlFlow :: Continue ( ( ) )
@@ -779,10 +809,12 @@ mod tests {
779809 vec![
780810 "PRE: STATEMENT: SELECT * FROM table_name AS my_table" ,
781811 "PRE: QUERY: SELECT * FROM table_name AS my_table" ,
812+ "PRE: SELECT: SELECT * FROM table_name AS my_table" ,
782813 "PRE: TABLE FACTOR: table_name AS my_table" ,
783814 "PRE: RELATION: table_name" ,
784815 "POST: RELATION: table_name" ,
785816 "POST: TABLE FACTOR: table_name AS my_table" ,
817+ "POST: SELECT: SELECT * FROM table_name AS my_table" ,
786818 "POST: QUERY: SELECT * FROM table_name AS my_table" ,
787819 "POST: STATEMENT: SELECT * FROM table_name AS my_table" ,
788820 ] ,
@@ -792,6 +824,7 @@ mod tests {
792824 vec![
793825 "PRE: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
794826 "PRE: QUERY: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
827+ "PRE: SELECT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
795828 "PRE: TABLE FACTOR: t1" ,
796829 "PRE: RELATION: t1" ,
797830 "POST: RELATION: t1" ,
@@ -806,6 +839,7 @@ mod tests {
806839 "PRE: EXPR: t2.t1_id" ,
807840 "POST: EXPR: t2.t1_id" ,
808841 "POST: EXPR: t1.id = t2.t1_id" ,
842+ "POST: SELECT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
809843 "POST: QUERY: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
810844 "POST: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id" ,
811845 ] ,
@@ -815,20 +849,24 @@ mod tests {
815849 vec![
816850 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
817851 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
852+ "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
818853 "PRE: TABLE FACTOR: t1" ,
819854 "PRE: RELATION: t1" ,
820855 "POST: RELATION: t1" ,
821856 "POST: TABLE FACTOR: t1" ,
822857 "PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
823858 "PRE: QUERY: SELECT column FROM t2" ,
859+ "PRE: SELECT: SELECT column FROM t2" ,
824860 "PRE: EXPR: column" ,
825861 "POST: EXPR: column" ,
826862 "PRE: TABLE FACTOR: t2" ,
827863 "PRE: RELATION: t2" ,
828864 "POST: RELATION: t2" ,
829865 "POST: TABLE FACTOR: t2" ,
866+ "POST: SELECT: SELECT column FROM t2" ,
830867 "POST: QUERY: SELECT column FROM t2" ,
831868 "POST: EXPR: EXISTS (SELECT column FROM t2)" ,
869+ "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
832870 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
833871 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
834872 ] ,
@@ -838,20 +876,24 @@ mod tests {
838876 vec![
839877 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
840878 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
879+ "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
841880 "PRE: TABLE FACTOR: t1" ,
842881 "PRE: RELATION: t1" ,
843882 "POST: RELATION: t1" ,
844883 "POST: TABLE FACTOR: t1" ,
845884 "PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
846885 "PRE: QUERY: SELECT column FROM t2" ,
886+ "PRE: SELECT: SELECT column FROM t2" ,
847887 "PRE: EXPR: column" ,
848888 "POST: EXPR: column" ,
849889 "PRE: TABLE FACTOR: t2" ,
850890 "PRE: RELATION: t2" ,
851891 "POST: RELATION: t2" ,
852892 "POST: TABLE FACTOR: t2" ,
893+ "POST: SELECT: SELECT column FROM t2" ,
853894 "POST: QUERY: SELECT column FROM t2" ,
854895 "POST: EXPR: EXISTS (SELECT column FROM t2)" ,
896+ "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
855897 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
856898 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
857899 ] ,
@@ -861,24 +903,30 @@ mod tests {
861903 vec![
862904 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
863905 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
906+ "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
864907 "PRE: TABLE FACTOR: t1" ,
865908 "PRE: RELATION: t1" ,
866909 "POST: RELATION: t1" ,
867910 "POST: TABLE FACTOR: t1" ,
868911 "PRE: EXPR: EXISTS (SELECT column FROM t2)" ,
869912 "PRE: QUERY: SELECT column FROM t2" ,
913+ "PRE: SELECT: SELECT column FROM t2" ,
870914 "PRE: EXPR: column" ,
871915 "POST: EXPR: column" ,
872916 "PRE: TABLE FACTOR: t2" ,
873917 "PRE: RELATION: t2" ,
874918 "POST: RELATION: t2" ,
875919 "POST: TABLE FACTOR: t2" ,
920+ "POST: SELECT: SELECT column FROM t2" ,
876921 "POST: QUERY: SELECT column FROM t2" ,
877922 "POST: EXPR: EXISTS (SELECT column FROM t2)" ,
923+ "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)" ,
924+ "PRE: SELECT: SELECT * FROM t3" ,
878925 "PRE: TABLE FACTOR: t3" ,
879926 "PRE: RELATION: t3" ,
880927 "POST: RELATION: t3" ,
881928 "POST: TABLE FACTOR: t3" ,
929+ "POST: SELECT: SELECT * FROM t3" ,
882930 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
883931 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3" ,
884932 ] ,
@@ -892,6 +940,7 @@ mod tests {
892940 vec![
893941 "PRE: STATEMENT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID" ,
894942 "PRE: QUERY: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID" ,
943+ "PRE: SELECT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)" ,
895944 "PRE: TABLE FACTOR: monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)" ,
896945 "PRE: TABLE FACTOR: monthly_sales" ,
897946 "PRE: RELATION: monthly_sales" ,
@@ -912,6 +961,7 @@ mod tests {
912961 "PRE: EXPR: 'APR'" ,
913962 "POST: EXPR: 'APR'" ,
914963 "POST: TABLE FACTOR: monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)" ,
964+ "POST: SELECT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)" ,
915965 "PRE: EXPR: EMPID" ,
916966 "POST: EXPR: EMPID" ,
917967 "POST: QUERY: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID" ,
0 commit comments