1#[cfg(not(feature = "std"))]
21use alloc::{boxed::Box, string::String, vec::Vec};
22use core::ops::ControlFlow;
23
24use crate::ast::{Expr, Ident, ObjectName, Query, Select, Statement, TableFactor, ValueWithSpan};
25
26pub trait Visit {
38 fn visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break>;
43}
44
45pub trait VisitMut {
57 fn visit<V: VisitorMut>(&mut self, visitor: &mut V) -> ControlFlow<V::Break>;
63}
64
65impl<T: Visit> Visit for Option<T> {
66 fn visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
67 if let Some(s) = self {
68 s.visit(visitor)?;
69 }
70 ControlFlow::Continue(())
71 }
72}
73
74impl<T: Visit> Visit for Vec<T> {
75 fn visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
76 for v in self {
77 v.visit(visitor)?;
78 }
79 ControlFlow::Continue(())
80 }
81}
82
83impl<T: Visit> Visit for Box<T> {
84 fn visit<V: Visitor>(&self, visitor: &mut V) -> ControlFlow<V::Break> {
85 T::visit(self, visitor)
86 }
87}
88
89impl<T: VisitMut> VisitMut for Option<T> {
90 fn visit<V: VisitorMut>(&mut self, visitor: &mut V) -> ControlFlow<V::Break> {
91 if let Some(s) = self {
92 s.visit(visitor)?;
93 }
94 ControlFlow::Continue(())
95 }
96}
97
98impl<T: VisitMut> VisitMut for Vec<T> {
99 fn visit<V: VisitorMut>(&mut self, visitor: &mut V) -> ControlFlow<V::Break> {
100 for v in self {
101 v.visit(visitor)?;
102 }
103 ControlFlow::Continue(())
104 }
105}
106
107impl<T: VisitMut> VisitMut for Box<T> {
108 fn visit<V: VisitorMut>(&mut self, visitor: &mut V) -> ControlFlow<V::Break> {
109 T::visit(self, visitor)
110 }
111}
112
113macro_rules! visit_noop {
114 ($($t:ty),+) => {
115 $(impl Visit for $t {
116 fn visit<V: Visitor>(&self, _visitor: &mut V) -> ControlFlow<V::Break> {
117 ControlFlow::Continue(())
118 }
119 })+
120 $(impl VisitMut for $t {
121 fn visit<V: VisitorMut>(&mut self, _visitor: &mut V) -> ControlFlow<V::Break> {
122 ControlFlow::Continue(())
123 }
124 })+
125 };
126}
127
128visit_noop!(u8, u16, u32, u64, i8, i16, i32, i64, char, bool, String);
129
130#[cfg(feature = "bigdecimal")]
131visit_noop!(bigdecimal::BigDecimal);
132
133pub trait Visitor {
196 type Break;
202
203 fn pre_visit_query(&mut self, _query: &Query) -> ControlFlow<Self::Break> {
205 ControlFlow::Continue(())
206 }
207
208 fn post_visit_query(&mut self, _query: &Query) -> ControlFlow<Self::Break> {
210 ControlFlow::Continue(())
211 }
212
213 fn pre_visit_select(&mut self, _select: &Select) -> ControlFlow<Self::Break> {
215 ControlFlow::Continue(())
216 }
217
218 fn post_visit_select(&mut self, _select: &Select) -> ControlFlow<Self::Break> {
220 ControlFlow::Continue(())
221 }
222
223 fn pre_visit_relation(&mut self, _relation: &ObjectName) -> ControlFlow<Self::Break> {
225 ControlFlow::Continue(())
226 }
227
228 fn post_visit_relation(&mut self, _relation: &ObjectName) -> ControlFlow<Self::Break> {
230 ControlFlow::Continue(())
231 }
232
233 fn pre_visit_table_factor(&mut self, _table_factor: &TableFactor) -> ControlFlow<Self::Break> {
235 ControlFlow::Continue(())
236 }
237
238 fn post_visit_table_factor(&mut self, _table_factor: &TableFactor) -> ControlFlow<Self::Break> {
240 ControlFlow::Continue(())
241 }
242
243 fn pre_visit_expr(&mut self, _expr: &Expr) -> ControlFlow<Self::Break> {
245 ControlFlow::Continue(())
246 }
247
248 fn post_visit_expr(&mut self, _expr: &Expr) -> ControlFlow<Self::Break> {
250 ControlFlow::Continue(())
251 }
252
253 fn pre_visit_statement(&mut self, _statement: &Statement) -> ControlFlow<Self::Break> {
255 ControlFlow::Continue(())
256 }
257
258 fn post_visit_statement(&mut self, _statement: &Statement) -> ControlFlow<Self::Break> {
260 ControlFlow::Continue(())
261 }
262
263 fn pre_visit_value(&mut self, _value: &ValueWithSpan) -> ControlFlow<Self::Break> {
265 ControlFlow::Continue(())
266 }
267
268 fn post_visit_value(&mut self, _value: &ValueWithSpan) -> ControlFlow<Self::Break> {
270 ControlFlow::Continue(())
271 }
272
273 fn pre_visit_ident(&mut self, _ident: &Ident) -> ControlFlow<Self::Break> {
275 ControlFlow::Continue(())
276 }
277
278 fn post_visit_ident(&mut self, _ident: &Ident) -> ControlFlow<Self::Break> {
280 ControlFlow::Continue(())
281 }
282}
283
284pub trait VisitorMut {
328 type Break;
334
335 fn pre_visit_query(&mut self, _query: &mut Query) -> ControlFlow<Self::Break> {
337 ControlFlow::Continue(())
338 }
339
340 fn post_visit_query(&mut self, _query: &mut Query) -> ControlFlow<Self::Break> {
342 ControlFlow::Continue(())
343 }
344
345 fn pre_visit_select(&mut self, _select: &mut Select) -> ControlFlow<Self::Break> {
347 ControlFlow::Continue(())
348 }
349
350 fn post_visit_select(&mut self, _select: &mut Select) -> ControlFlow<Self::Break> {
352 ControlFlow::Continue(())
353 }
354
355 fn pre_visit_relation(&mut self, _relation: &mut ObjectName) -> ControlFlow<Self::Break> {
357 ControlFlow::Continue(())
358 }
359
360 fn post_visit_relation(&mut self, _relation: &mut ObjectName) -> ControlFlow<Self::Break> {
362 ControlFlow::Continue(())
363 }
364
365 fn pre_visit_table_factor(
367 &mut self,
368 _table_factor: &mut TableFactor,
369 ) -> ControlFlow<Self::Break> {
370 ControlFlow::Continue(())
371 }
372
373 fn post_visit_table_factor(
375 &mut self,
376 _table_factor: &mut TableFactor,
377 ) -> ControlFlow<Self::Break> {
378 ControlFlow::Continue(())
379 }
380
381 fn pre_visit_expr(&mut self, _expr: &mut Expr) -> ControlFlow<Self::Break> {
383 ControlFlow::Continue(())
384 }
385
386 fn post_visit_expr(&mut self, _expr: &mut Expr) -> ControlFlow<Self::Break> {
388 ControlFlow::Continue(())
389 }
390
391 fn pre_visit_statement(&mut self, _statement: &mut Statement) -> ControlFlow<Self::Break> {
393 ControlFlow::Continue(())
394 }
395
396 fn post_visit_statement(&mut self, _statement: &mut Statement) -> ControlFlow<Self::Break> {
398 ControlFlow::Continue(())
399 }
400
401 fn pre_visit_value(&mut self, _value: &mut ValueWithSpan) -> ControlFlow<Self::Break> {
403 ControlFlow::Continue(())
404 }
405
406 fn post_visit_value(&mut self, _value: &mut ValueWithSpan) -> ControlFlow<Self::Break> {
408 ControlFlow::Continue(())
409 }
410
411 fn pre_visit_ident(&mut self, _ident: &mut Ident) -> ControlFlow<Self::Break> {
413 ControlFlow::Continue(())
414 }
415
416 fn post_visit_ident(&mut self, _ident: &mut Ident) -> ControlFlow<Self::Break> {
418 ControlFlow::Continue(())
419 }
420}
421
422struct RelationVisitor<F>(F);
423
424impl<E, F: FnMut(&ObjectName) -> ControlFlow<E>> Visitor for RelationVisitor<F> {
425 type Break = E;
426
427 fn pre_visit_relation(&mut self, relation: &ObjectName) -> ControlFlow<Self::Break> {
428 self.0(relation)
429 }
430}
431
432impl<E, F: FnMut(&mut ObjectName) -> ControlFlow<E>> VisitorMut for RelationVisitor<F> {
433 type Break = E;
434
435 fn post_visit_relation(&mut self, relation: &mut ObjectName) -> ControlFlow<Self::Break> {
436 self.0(relation)
437 }
438}
439
440pub fn visit_relations<V, E, F>(v: &V, f: F) -> ControlFlow<E>
468where
469 V: Visit,
470 F: FnMut(&ObjectName) -> ControlFlow<E>,
471{
472 let mut visitor = RelationVisitor(f);
473 v.visit(&mut visitor)?;
474 ControlFlow::Continue(())
475}
476
477pub fn visit_relations_mut<V, E, F>(v: &mut V, f: F) -> ControlFlow<E>
501where
502 V: VisitMut,
503 F: FnMut(&mut ObjectName) -> ControlFlow<E>,
504{
505 let mut visitor = RelationVisitor(f);
506 v.visit(&mut visitor)?;
507 ControlFlow::Continue(())
508}
509
510struct ExprVisitor<F>(F);
511
512impl<E, F: FnMut(&Expr) -> ControlFlow<E>> Visitor for ExprVisitor<F> {
513 type Break = E;
514
515 fn pre_visit_expr(&mut self, expr: &Expr) -> ControlFlow<Self::Break> {
516 self.0(expr)
517 }
518}
519
520impl<E, F: FnMut(&mut Expr) -> ControlFlow<E>> VisitorMut for ExprVisitor<F> {
521 type Break = E;
522
523 fn post_visit_expr(&mut self, expr: &mut Expr) -> ControlFlow<Self::Break> {
524 self.0(expr)
525 }
526}
527
528pub fn visit_expressions<V, E, F>(v: &V, f: F) -> ControlFlow<E>
558where
559 V: Visit,
560 F: FnMut(&Expr) -> ControlFlow<E>,
561{
562 let mut visitor = ExprVisitor(f);
563 v.visit(&mut visitor)?;
564 ControlFlow::Continue(())
565}
566
567pub fn visit_expressions_mut<V, E, F>(v: &mut V, f: F) -> ControlFlow<E>
632where
633 V: VisitMut,
634 F: FnMut(&mut Expr) -> ControlFlow<E>,
635{
636 v.visit(&mut ExprVisitor(f))?;
637 ControlFlow::Continue(())
638}
639
640struct StatementVisitor<F>(F);
641
642impl<E, F: FnMut(&Statement) -> ControlFlow<E>> Visitor for StatementVisitor<F> {
643 type Break = E;
644
645 fn pre_visit_statement(&mut self, statement: &Statement) -> ControlFlow<Self::Break> {
646 self.0(statement)
647 }
648}
649
650impl<E, F: FnMut(&mut Statement) -> ControlFlow<E>> VisitorMut for StatementVisitor<F> {
651 type Break = E;
652
653 fn post_visit_statement(&mut self, statement: &mut Statement) -> ControlFlow<Self::Break> {
654 self.0(statement)
655 }
656}
657
658pub fn visit_statements<V, E, F>(v: &V, f: F) -> ControlFlow<E>
687where
688 V: Visit,
689 F: FnMut(&Statement) -> ControlFlow<E>,
690{
691 let mut visitor = StatementVisitor(f);
692 v.visit(&mut visitor)?;
693 ControlFlow::Continue(())
694}
695
696pub fn visit_statements_mut<V, E, F>(v: &mut V, f: F) -> ControlFlow<E>
719where
720 V: VisitMut,
721 F: FnMut(&mut Statement) -> ControlFlow<E>,
722{
723 v.visit(&mut StatementVisitor(f))?;
724 ControlFlow::Continue(())
725}
726
727#[cfg(test)]
728mod tests {
729 use super::*;
730 use crate::ast::Statement;
731 use crate::dialect::GenericDialect;
732 use crate::parser::Parser;
733 use crate::tokenizer::Tokenizer;
734
735 #[derive(Default)]
736 struct TestVisitor {
737 visited: Vec<String>,
738 }
739
740 impl Visitor for TestVisitor {
741 type Break = ();
742
743 fn pre_visit_query(&mut self, query: &Query) -> ControlFlow<Self::Break> {
745 self.visited.push(format!("PRE: QUERY: {query}"));
746 ControlFlow::Continue(())
747 }
748
749 fn post_visit_query(&mut self, query: &Query) -> ControlFlow<Self::Break> {
751 self.visited.push(format!("POST: QUERY: {query}"));
752 ControlFlow::Continue(())
753 }
754
755 fn pre_visit_select(&mut self, select: &Select) -> ControlFlow<Self::Break> {
756 self.visited.push(format!("PRE: SELECT: {select}"));
757 ControlFlow::Continue(())
758 }
759
760 fn post_visit_select(&mut self, select: &Select) -> ControlFlow<Self::Break> {
761 self.visited.push(format!("POST: SELECT: {select}"));
762 ControlFlow::Continue(())
763 }
764
765 fn pre_visit_relation(&mut self, relation: &ObjectName) -> ControlFlow<Self::Break> {
766 self.visited.push(format!("PRE: RELATION: {relation}"));
767 ControlFlow::Continue(())
768 }
769
770 fn post_visit_relation(&mut self, relation: &ObjectName) -> ControlFlow<Self::Break> {
771 self.visited.push(format!("POST: RELATION: {relation}"));
772 ControlFlow::Continue(())
773 }
774
775 fn pre_visit_table_factor(
776 &mut self,
777 table_factor: &TableFactor,
778 ) -> ControlFlow<Self::Break> {
779 self.visited
780 .push(format!("PRE: TABLE FACTOR: {table_factor}"));
781 ControlFlow::Continue(())
782 }
783
784 fn post_visit_table_factor(
785 &mut self,
786 table_factor: &TableFactor,
787 ) -> ControlFlow<Self::Break> {
788 self.visited
789 .push(format!("POST: TABLE FACTOR: {table_factor}"));
790 ControlFlow::Continue(())
791 }
792
793 fn pre_visit_expr(&mut self, expr: &Expr) -> ControlFlow<Self::Break> {
794 self.visited.push(format!("PRE: EXPR: {expr}"));
795 ControlFlow::Continue(())
796 }
797
798 fn post_visit_expr(&mut self, expr: &Expr) -> ControlFlow<Self::Break> {
799 self.visited.push(format!("POST: EXPR: {expr}"));
800 ControlFlow::Continue(())
801 }
802
803 fn pre_visit_statement(&mut self, statement: &Statement) -> ControlFlow<Self::Break> {
804 self.visited.push(format!("PRE: STATEMENT: {statement}"));
805 ControlFlow::Continue(())
806 }
807
808 fn post_visit_statement(&mut self, statement: &Statement) -> ControlFlow<Self::Break> {
809 self.visited.push(format!("POST: STATEMENT: {statement}"));
810 ControlFlow::Continue(())
811 }
812 }
813
814 fn do_visit<V: Visitor<Break = ()>>(sql: &str, visitor: &mut V) -> Statement {
815 let dialect = GenericDialect {};
816 let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
817 let s = Parser::new(&dialect)
818 .with_tokens(tokens)
819 .parse_statement()
820 .unwrap();
821
822 let flow = s.visit(visitor);
823 assert_eq!(flow, ControlFlow::Continue(()));
824 s
825 }
826
827 #[test]
828 fn test_sql() {
829 let tests = vec![
830 (
831 "SELECT * from table_name as my_table",
832 vec![
833 "PRE: STATEMENT: SELECT * FROM table_name AS my_table",
834 "PRE: QUERY: SELECT * FROM table_name AS my_table",
835 "PRE: SELECT: SELECT * FROM table_name AS my_table",
836 "PRE: TABLE FACTOR: table_name AS my_table",
837 "PRE: RELATION: table_name",
838 "POST: RELATION: table_name",
839 "POST: TABLE FACTOR: table_name AS my_table",
840 "POST: SELECT: SELECT * FROM table_name AS my_table",
841 "POST: QUERY: SELECT * FROM table_name AS my_table",
842 "POST: STATEMENT: SELECT * FROM table_name AS my_table",
843 ],
844 ),
845 (
846 "SELECT * from t1 join t2 on t1.id = t2.t1_id",
847 vec![
848 "PRE: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
849 "PRE: QUERY: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
850 "PRE: SELECT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
851 "PRE: TABLE FACTOR: t1",
852 "PRE: RELATION: t1",
853 "POST: RELATION: t1",
854 "POST: TABLE FACTOR: t1",
855 "PRE: TABLE FACTOR: t2",
856 "PRE: RELATION: t2",
857 "POST: RELATION: t2",
858 "POST: TABLE FACTOR: t2",
859 "PRE: EXPR: t1.id = t2.t1_id",
860 "PRE: EXPR: t1.id",
861 "POST: EXPR: t1.id",
862 "PRE: EXPR: t2.t1_id",
863 "POST: EXPR: t2.t1_id",
864 "POST: EXPR: t1.id = t2.t1_id",
865 "POST: SELECT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
866 "POST: QUERY: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
867 "POST: STATEMENT: SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id",
868 ],
869 ),
870 (
871 "SELECT * from t1 where EXISTS(SELECT column from t2)",
872 vec![
873 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
874 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
875 "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
876 "PRE: TABLE FACTOR: t1",
877 "PRE: RELATION: t1",
878 "POST: RELATION: t1",
879 "POST: TABLE FACTOR: t1",
880 "PRE: EXPR: EXISTS (SELECT column FROM t2)",
881 "PRE: QUERY: SELECT column FROM t2",
882 "PRE: SELECT: SELECT column FROM t2",
883 "PRE: EXPR: column",
884 "POST: EXPR: column",
885 "PRE: TABLE FACTOR: t2",
886 "PRE: RELATION: t2",
887 "POST: RELATION: t2",
888 "POST: TABLE FACTOR: t2",
889 "POST: SELECT: SELECT column FROM t2",
890 "POST: QUERY: SELECT column FROM t2",
891 "POST: EXPR: EXISTS (SELECT column FROM t2)",
892 "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
893 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
894 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
895 ],
896 ),
897 (
898 "SELECT * from t1 where EXISTS(SELECT column from t2)",
899 vec![
900 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
901 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
902 "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
903 "PRE: TABLE FACTOR: t1",
904 "PRE: RELATION: t1",
905 "POST: RELATION: t1",
906 "POST: TABLE FACTOR: t1",
907 "PRE: EXPR: EXISTS (SELECT column FROM t2)",
908 "PRE: QUERY: SELECT column FROM t2",
909 "PRE: SELECT: SELECT column FROM t2",
910 "PRE: EXPR: column",
911 "POST: EXPR: column",
912 "PRE: TABLE FACTOR: t2",
913 "PRE: RELATION: t2",
914 "POST: RELATION: t2",
915 "POST: TABLE FACTOR: t2",
916 "POST: SELECT: SELECT column FROM t2",
917 "POST: QUERY: SELECT column FROM t2",
918 "POST: EXPR: EXISTS (SELECT column FROM t2)",
919 "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
920 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
921 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
922 ],
923 ),
924 (
925 "SELECT * from t1 where EXISTS(SELECT column from t2) UNION SELECT * from t3",
926 vec![
927 "PRE: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3",
928 "PRE: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3",
929 "PRE: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
930 "PRE: TABLE FACTOR: t1",
931 "PRE: RELATION: t1",
932 "POST: RELATION: t1",
933 "POST: TABLE FACTOR: t1",
934 "PRE: EXPR: EXISTS (SELECT column FROM t2)",
935 "PRE: QUERY: SELECT column FROM t2",
936 "PRE: SELECT: SELECT column FROM t2",
937 "PRE: EXPR: column",
938 "POST: EXPR: column",
939 "PRE: TABLE FACTOR: t2",
940 "PRE: RELATION: t2",
941 "POST: RELATION: t2",
942 "POST: TABLE FACTOR: t2",
943 "POST: SELECT: SELECT column FROM t2",
944 "POST: QUERY: SELECT column FROM t2",
945 "POST: EXPR: EXISTS (SELECT column FROM t2)",
946 "POST: SELECT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2)",
947 "PRE: SELECT: SELECT * FROM t3",
948 "PRE: TABLE FACTOR: t3",
949 "PRE: RELATION: t3",
950 "POST: RELATION: t3",
951 "POST: TABLE FACTOR: t3",
952 "POST: SELECT: SELECT * FROM t3",
953 "POST: QUERY: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3",
954 "POST: STATEMENT: SELECT * FROM t1 WHERE EXISTS (SELECT column FROM t2) UNION SELECT * FROM t3",
955 ],
956 ),
957 (
958 concat!(
959 "SELECT * FROM monthly_sales ",
960 "PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ",
961 "ORDER BY EMPID"
962 ),
963 vec![
964 "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",
965 "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",
966 "PRE: SELECT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)",
967 "PRE: TABLE FACTOR: monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)",
968 "PRE: TABLE FACTOR: monthly_sales",
969 "PRE: RELATION: monthly_sales",
970 "POST: RELATION: monthly_sales",
971 "POST: TABLE FACTOR: monthly_sales",
972 "PRE: EXPR: SUM(a.amount)",
973 "PRE: EXPR: a.amount",
974 "POST: EXPR: a.amount",
975 "POST: EXPR: SUM(a.amount)",
976 "PRE: EXPR: a.MONTH",
977 "POST: EXPR: a.MONTH",
978 "PRE: EXPR: 'JAN'",
979 "POST: EXPR: 'JAN'",
980 "PRE: EXPR: 'FEB'",
981 "POST: EXPR: 'FEB'",
982 "PRE: EXPR: 'MAR'",
983 "POST: EXPR: 'MAR'",
984 "PRE: EXPR: 'APR'",
985 "POST: EXPR: 'APR'",
986 "POST: TABLE FACTOR: monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)",
987 "POST: SELECT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d)",
988 "PRE: EXPR: EMPID",
989 "POST: EXPR: EMPID",
990 "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",
991 "POST: STATEMENT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID",
992 ]
993 ),
994 (
995 "SHOW COLUMNS FROM t1",
996 vec![
997 "PRE: STATEMENT: SHOW COLUMNS FROM t1",
998 "PRE: RELATION: t1",
999 "POST: RELATION: t1",
1000 "POST: STATEMENT: SHOW COLUMNS FROM t1",
1001 ],
1002 ),
1003 ];
1004 for (sql, expected) in tests {
1005 let mut visitor = TestVisitor::default();
1006 let _ = do_visit(sql, &mut visitor);
1007 let actual: Vec<_> = visitor.visited.iter().map(|x| x.as_str()).collect();
1008 assert_eq!(actual, expected)
1009 }
1010 }
1011
1012 struct QuickVisitor; impl Visitor for QuickVisitor {
1015 type Break = ();
1016 }
1017
1018 #[test]
1019 fn overflow() {
1020 let cond = (0..1000)
1021 .map(|n| format!("X = {n}"))
1022 .collect::<Vec<_>>()
1023 .join(" OR ");
1024 let sql = format!("SELECT x where {cond}");
1025
1026 let dialect = GenericDialect {};
1027 let tokens = Tokenizer::new(&dialect, sql.as_str()).tokenize().unwrap();
1028 let s = Parser::new(&dialect)
1029 .with_tokens(tokens)
1030 .parse_statement()
1031 .unwrap();
1032
1033 let mut visitor = QuickVisitor {};
1034 let flow = s.visit(&mut visitor);
1035 assert_eq!(flow, ControlFlow::Continue(()));
1036 }
1037
1038 #[derive(Default)]
1039 struct IdentVisitor {
1040 idents: Vec<String>,
1041 }
1042
1043 impl Visitor for IdentVisitor {
1044 type Break = ();
1045
1046 fn pre_visit_ident(&mut self, ident: &Ident) -> ControlFlow<Self::Break> {
1047 self.idents.push(ident.value.clone());
1048 ControlFlow::Continue(())
1049 }
1050 }
1051
1052 #[test]
1053 fn test_pre_visit_ident() {
1054 let mut visitor = IdentVisitor::default();
1055 do_visit("SELECT a, b FROM t", &mut visitor);
1056 assert_eq!(visitor.idents, vec!["a", "b", "t"]);
1057 }
1058}
1059
1060#[cfg(test)]
1061mod visit_mut_tests {
1062 use crate::ast::{Ident, Statement, Value, ValueWithSpan, VisitMut, VisitorMut};
1063 use crate::dialect::GenericDialect;
1064 use crate::parser::Parser;
1065 use crate::tokenizer::Tokenizer;
1066 use core::ops::ControlFlow;
1067
1068 #[derive(Default)]
1069 struct MutatorVisitor {
1070 index: u64,
1071 }
1072
1073 impl VisitorMut for MutatorVisitor {
1074 type Break = ();
1075
1076 fn pre_visit_value(&mut self, value: &mut ValueWithSpan) -> ControlFlow<Self::Break> {
1077 self.index += 1;
1078 value.value = Value::SingleQuotedString(format!("REDACTED_{}", self.index));
1079 ControlFlow::Continue(())
1080 }
1081
1082 fn post_visit_value(&mut self, _value: &mut ValueWithSpan) -> ControlFlow<Self::Break> {
1083 ControlFlow::Continue(())
1084 }
1085 }
1086
1087 fn do_visit_mut<V: VisitorMut<Break = ()>>(sql: &str, visitor: &mut V) -> Statement {
1088 let dialect = GenericDialect {};
1089 let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
1090 let mut s = Parser::new(&dialect)
1091 .with_tokens(tokens)
1092 .parse_statement()
1093 .unwrap();
1094
1095 let flow = s.visit(visitor);
1096 assert_eq!(flow, ControlFlow::Continue(()));
1097 s
1098 }
1099
1100 #[test]
1101 fn test_value_redact() {
1102 let tests = vec![
1103 (
1104 concat!(
1105 "SELECT * FROM monthly_sales ",
1106 "PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ",
1107 "ORDER BY EMPID"
1108 ),
1109 concat!(
1110 "SELECT * FROM monthly_sales ",
1111 "PIVOT(SUM(a.amount) FOR a.MONTH IN ('REDACTED_1', 'REDACTED_2', 'REDACTED_3', 'REDACTED_4')) AS p (c, d) ",
1112 "ORDER BY EMPID"
1113 ),
1114 ),
1115 ];
1116
1117 for (sql, expected) in tests {
1118 let mut visitor = MutatorVisitor::default();
1119 let mutated = do_visit_mut(sql, &mut visitor);
1120 assert_eq!(mutated.to_string(), expected)
1121 }
1122 }
1123
1124 #[derive(Default)]
1125 struct IdentMutator;
1126
1127 impl VisitorMut for IdentMutator {
1128 type Break = ();
1129
1130 fn pre_visit_ident(&mut self, ident: &mut Ident) -> ControlFlow<Self::Break> {
1131 ident.value = ident.value.to_uppercase();
1132 ControlFlow::Continue(())
1133 }
1134 }
1135
1136 #[test]
1137 fn test_pre_visit_ident_mut() {
1138 let mut visitor = IdentMutator;
1139 let mutated = do_visit_mut("SELECT a, b FROM t", &mut visitor);
1140 assert_eq!(mutated.to_string(), "SELECT A, B FROM T");
1141 }
1142}