Skip to content

Commit d9b53a0

Browse files
authored
Introduce Visit::visit_select (#2235)
1 parent 0b589b2 commit d9b53a0

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

src/ast/query.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ pub enum SetExpr {
156156
/// UNION/EXCEPT/INTERSECT of two queries
157157
/// A set operation combining two query expressions.
158158
SetOperation {
159+
/// Left operand of the set operation.
160+
left: Box<SetExpr>,
159161
/// The set operator used (e.g. `UNION`, `EXCEPT`).
160162
op: SetOperator,
161163
/// Optional quantifier (`ALL`, `DISTINCT`, etc.).
162164
set_quantifier: SetQuantifier,
163-
/// Left operand of the set operation.
164-
left: Box<SetExpr>,
165165
/// Right operand of the set operation.
166166
right: Box<SetExpr>,
167167
},
@@ -442,6 +442,7 @@ impl SelectModifiers {
442442
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
443443
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
444444
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
445+
#[cfg_attr(feature = "visitor", visit(with = "visit_select"))]
445446
pub struct Select {
446447
/// Token for the `SELECT` keyword
447448
pub select_token: AttachedToken,

src/ast/visitor.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
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};
2121
use 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

Comments
 (0)