1#![allow(unused_variables)]
2
3use super::{
4 Assignment, Assignments, Association, Condition, Cte, Delete, Expr, ExprAnd, ExprAny, ExprArg,
5 ExprBinaryOp, ExprCast, ExprColumn, ExprError, ExprExists, ExprFunc, ExprInList,
6 ExprInSubquery, ExprIsNull, ExprIsVariant, ExprLet, ExprLike, ExprList, ExprMap, ExprMatch,
7 ExprNot, ExprOr, ExprProject, ExprRecord, ExprReference, ExprSet, ExprSetOp, ExprStartsWith,
8 ExprStmt, Filter, FuncCount, FuncLastInsertId, Insert, InsertTarget, Join, JoinOp, Limit,
9 LimitCursor, LimitOffset, Node, OrderBy, OrderByExpr, Path, Projection, Query, Returning,
10 Select, Source, SourceModel, SourceTable, SourceTableId, Statement, TableDerived, TableFactor,
11 TableRef, TableWithJoins, Type, Update, UpdateTarget, Value, ValueRecord, Values, With,
12};
13
14pub trait Visit {
36 fn visit<N: Node>(&mut self, i: &N)
38 where
39 Self: Sized,
40 {
41 i.visit(self);
42 }
43
44 fn visit_assignment(&mut self, i: &Assignment) {
48 visit_assignment(self, i);
49 }
50
51 fn visit_assignments(&mut self, i: &Assignments) {
55 visit_assignments(self, i);
56 }
57
58 fn visit_association(&mut self, i: &Association) {
62 visit_association(self, i);
63 }
64
65 fn visit_cte(&mut self, i: &Cte) {
69 visit_cte(self, i);
70 }
71
72 fn visit_expr(&mut self, i: &Expr) {
76 visit_expr(self, i);
77 }
78
79 fn visit_expr_and(&mut self, i: &ExprAnd) {
83 visit_expr_and(self, i);
84 }
85
86 fn visit_expr_any(&mut self, i: &ExprAny) {
90 visit_expr_any(self, i);
91 }
92
93 fn visit_expr_arg(&mut self, i: &ExprArg) {
97 visit_expr_arg(self, i);
98 }
99
100 fn visit_expr_binary_op(&mut self, i: &ExprBinaryOp) {
104 visit_expr_binary_op(self, i);
105 }
106
107 fn visit_expr_cast(&mut self, i: &ExprCast) {
111 visit_expr_cast(self, i);
112 }
113
114 fn visit_expr_column(&mut self, i: &ExprColumn) {
118 visit_expr_column(self, i);
119 }
120
121 fn visit_expr_default(&mut self) {
125 visit_expr_default(self);
126 }
127
128 fn visit_expr_error(&mut self, i: &ExprError) {
132 visit_expr_error(self, i);
133 }
134
135 fn visit_expr_exists(&mut self, i: &ExprExists) {
139 visit_expr_exists(self, i);
140 }
141
142 fn visit_expr_func(&mut self, i: &ExprFunc) {
146 visit_expr_func(self, i);
147 }
148
149 fn visit_expr_func_count(&mut self, i: &FuncCount) {
153 visit_expr_func_count(self, i);
154 }
155
156 fn visit_expr_func_last_insert_id(&mut self, i: &FuncLastInsertId) {
160 visit_expr_func_last_insert_id(self, i);
161 }
162
163 fn visit_expr_in_list(&mut self, i: &ExprInList) {
167 visit_expr_in_list(self, i);
168 }
169
170 fn visit_expr_in_subquery(&mut self, i: &ExprInSubquery) {
174 visit_expr_in_subquery(self, i);
175 }
176
177 fn visit_expr_is_null(&mut self, i: &ExprIsNull) {
181 visit_expr_is_null(self, i);
182 }
183
184 fn visit_expr_is_variant(&mut self, i: &ExprIsVariant) {
188 visit_expr_is_variant(self, i);
189 }
190
191 fn visit_expr_let(&mut self, i: &ExprLet) {
195 visit_expr_let(self, i);
196 }
197
198 fn visit_expr_like(&mut self, i: &ExprLike) {
202 visit_expr_like(self, i);
203 }
204
205 fn visit_expr_map(&mut self, i: &ExprMap) {
209 visit_expr_map(self, i);
210 }
211
212 fn visit_expr_match(&mut self, i: &ExprMatch) {
216 visit_expr_match(self, i);
217 }
218
219 fn visit_expr_not(&mut self, i: &ExprNot) {
223 visit_expr_not(self, i);
224 }
225
226 fn visit_expr_or(&mut self, i: &ExprOr) {
230 visit_expr_or(self, i);
231 }
232
233 fn visit_expr_list(&mut self, i: &ExprList) {
237 visit_expr_list(self, i);
238 }
239
240 fn visit_expr_record(&mut self, i: &ExprRecord) {
244 visit_expr_record(self, i);
245 }
246
247 fn visit_expr_reference(&mut self, i: &ExprReference) {
251 visit_expr_reference(self, i);
252 }
253
254 fn visit_expr_set(&mut self, i: &ExprSet) {
258 visit_expr_set(self, i);
259 }
260
261 fn visit_expr_set_op(&mut self, i: &ExprSetOp) {
265 visit_expr_set_op(self, i);
266 }
267
268 fn visit_expr_starts_with(&mut self, i: &ExprStartsWith) {
272 visit_expr_starts_with(self, i);
273 }
274
275 fn visit_expr_stmt(&mut self, i: &ExprStmt) {
279 visit_expr_stmt(self, i);
280 }
281
282 fn visit_filter(&mut self, i: &Filter) {
286 visit_filter(self, i);
287 }
288
289 fn visit_condition(&mut self, i: &Condition) {
293 visit_condition(self, i);
294 }
295
296 fn visit_expr_project(&mut self, i: &ExprProject) {
300 visit_expr_project(self, i);
301 }
302
303 fn visit_insert_target(&mut self, i: &InsertTarget) {
307 visit_insert_target(self, i);
308 }
309
310 fn visit_join(&mut self, i: &Join) {
314 visit_join(self, i);
315 }
316
317 fn visit_limit(&mut self, i: &Limit) {
321 visit_limit(self, i);
322 }
323
324 fn visit_limit_cursor(&mut self, i: &LimitCursor) {
328 visit_limit_cursor(self, i);
329 }
330
331 fn visit_limit_offset(&mut self, i: &LimitOffset) {
335 visit_limit_offset(self, i);
336 }
337
338 fn visit_order_by(&mut self, i: &OrderBy) {
342 visit_order_by(self, i);
343 }
344
345 fn visit_order_by_expr(&mut self, i: &OrderByExpr) {
349 visit_order_by_expr(self, i);
350 }
351
352 fn visit_path(&mut self, i: &Path) {
356 visit_path(self, i);
357 }
358
359 fn visit_projection(&mut self, i: &Projection) {
363 visit_projection(self, i);
364 }
365
366 fn visit_returning(&mut self, i: &Returning) {
370 visit_returning(self, i);
371 }
372
373 fn visit_source(&mut self, i: &Source) {
377 visit_source(self, i);
378 }
379
380 fn visit_source_model(&mut self, i: &SourceModel) {
384 visit_source_model(self, i);
385 }
386
387 fn visit_source_table(&mut self, i: &SourceTable) {
391 visit_source_table(self, i);
392 }
393
394 fn visit_source_table_id(&mut self, i: &SourceTableId) {
398 visit_source_table_id(self, i);
399 }
400
401 fn visit_stmt(&mut self, i: &Statement) {
405 visit_stmt(self, i);
406 }
407
408 fn visit_stmt_delete(&mut self, i: &Delete) {
412 visit_stmt_delete(self, i);
413 }
414
415 fn visit_stmt_insert(&mut self, i: &Insert) {
419 visit_stmt_insert(self, i);
420 }
421
422 fn visit_stmt_query(&mut self, i: &Query) {
426 visit_stmt_query(self, i);
427 }
428
429 fn visit_stmt_select(&mut self, i: &Select) {
433 visit_stmt_select(self, i);
434 }
435
436 fn visit_stmt_update(&mut self, i: &Update) {
440 visit_stmt_update(self, i);
441 }
442
443 fn visit_table_derived(&mut self, i: &TableDerived) {
447 visit_table_derived(self, i);
448 }
449
450 fn visit_table_ref(&mut self, i: &TableRef) {
454 visit_table_ref(self, i);
455 }
456
457 fn visit_table_factor(&mut self, i: &TableFactor) {
461 visit_table_factor(self, i);
462 }
463
464 fn visit_table_with_joins(&mut self, i: &TableWithJoins) {
468 visit_table_with_joins(self, i);
469 }
470
471 fn visit_type(&mut self, i: &Type) {
475 visit_type(self, i);
476 }
477
478 fn visit_update_target(&mut self, i: &UpdateTarget) {
482 visit_update_target(self, i);
483 }
484
485 fn visit_value(&mut self, i: &Value) {
489 visit_value(self, i);
490 }
491
492 fn visit_value_record(&mut self, i: &ValueRecord) {
496 visit_value_record(self, i);
497 }
498
499 fn visit_values(&mut self, i: &Values) {
503 visit_values(self, i);
504 }
505
506 fn visit_with(&mut self, i: &With) {
510 visit_with(self, i);
511 }
512}
513
514impl<V: Visit> Visit for &mut V {
515 fn visit_assignment(&mut self, i: &Assignment) {
516 Visit::visit_assignment(&mut **self, i);
517 }
518
519 fn visit_assignments(&mut self, i: &Assignments) {
520 Visit::visit_assignments(&mut **self, i);
521 }
522
523 fn visit_association(&mut self, i: &Association) {
524 Visit::visit_association(&mut **self, i);
525 }
526
527 fn visit_cte(&mut self, i: &Cte) {
528 Visit::visit_cte(&mut **self, i);
529 }
530
531 fn visit_expr(&mut self, i: &Expr) {
532 Visit::visit_expr(&mut **self, i);
533 }
534
535 fn visit_expr_and(&mut self, i: &ExprAnd) {
536 Visit::visit_expr_and(&mut **self, i);
537 }
538
539 fn visit_expr_arg(&mut self, i: &ExprArg) {
540 Visit::visit_expr_arg(&mut **self, i);
541 }
542
543 fn visit_expr_binary_op(&mut self, i: &ExprBinaryOp) {
544 Visit::visit_expr_binary_op(&mut **self, i);
545 }
546
547 fn visit_expr_cast(&mut self, i: &ExprCast) {
548 Visit::visit_expr_cast(&mut **self, i);
549 }
550
551 fn visit_expr_column(&mut self, i: &ExprColumn) {
552 Visit::visit_expr_column(&mut **self, i);
553 }
554
555 fn visit_expr_default(&mut self) {
556 Visit::visit_expr_default(&mut **self);
557 }
558
559 fn visit_expr_error(&mut self, i: &ExprError) {
560 Visit::visit_expr_error(&mut **self, i);
561 }
562
563 fn visit_expr_exists(&mut self, i: &ExprExists) {
564 Visit::visit_expr_exists(&mut **self, i);
565 }
566
567 fn visit_expr_func(&mut self, i: &ExprFunc) {
568 Visit::visit_expr_func(&mut **self, i);
569 }
570
571 fn visit_expr_func_count(&mut self, i: &FuncCount) {
572 Visit::visit_expr_func_count(&mut **self, i);
573 }
574
575 fn visit_expr_in_list(&mut self, i: &ExprInList) {
576 Visit::visit_expr_in_list(&mut **self, i);
577 }
578
579 fn visit_expr_in_subquery(&mut self, i: &ExprInSubquery) {
580 Visit::visit_expr_in_subquery(&mut **self, i);
581 }
582
583 fn visit_expr_is_null(&mut self, i: &ExprIsNull) {
584 Visit::visit_expr_is_null(&mut **self, i);
585 }
586
587 fn visit_expr_is_variant(&mut self, i: &ExprIsVariant) {
588 Visit::visit_expr_is_variant(&mut **self, i);
589 }
590
591 fn visit_expr_let(&mut self, i: &ExprLet) {
592 Visit::visit_expr_let(&mut **self, i);
593 }
594
595 fn visit_expr_like(&mut self, i: &ExprLike) {
596 Visit::visit_expr_like(&mut **self, i);
597 }
598
599 fn visit_expr_map(&mut self, i: &ExprMap) {
600 Visit::visit_expr_map(&mut **self, i);
601 }
602
603 fn visit_expr_match(&mut self, i: &ExprMatch) {
604 Visit::visit_expr_match(&mut **self, i);
605 }
606
607 fn visit_expr_not(&mut self, i: &ExprNot) {
608 Visit::visit_expr_not(&mut **self, i);
609 }
610
611 fn visit_expr_or(&mut self, i: &ExprOr) {
612 Visit::visit_expr_or(&mut **self, i);
613 }
614
615 fn visit_expr_list(&mut self, i: &ExprList) {
616 Visit::visit_expr_list(&mut **self, i);
617 }
618
619 fn visit_expr_record(&mut self, i: &ExprRecord) {
620 Visit::visit_expr_record(&mut **self, i);
621 }
622
623 fn visit_expr_reference(&mut self, i: &ExprReference) {
624 Visit::visit_expr_reference(&mut **self, i);
625 }
626
627 fn visit_expr_set(&mut self, i: &ExprSet) {
628 Visit::visit_expr_set(&mut **self, i);
629 }
630
631 fn visit_expr_set_op(&mut self, i: &ExprSetOp) {
632 Visit::visit_expr_set_op(&mut **self, i);
633 }
634
635 fn visit_expr_starts_with(&mut self, i: &ExprStartsWith) {
636 Visit::visit_expr_starts_with(&mut **self, i);
637 }
638
639 fn visit_expr_stmt(&mut self, i: &ExprStmt) {
640 Visit::visit_expr_stmt(&mut **self, i);
641 }
642
643 fn visit_filter(&mut self, i: &Filter) {
644 Visit::visit_filter(&mut **self, i);
645 }
646
647 fn visit_condition(&mut self, i: &Condition) {
648 Visit::visit_condition(&mut **self, i);
649 }
650
651 fn visit_expr_project(&mut self, i: &ExprProject) {
652 Visit::visit_expr_project(&mut **self, i);
653 }
654
655 fn visit_insert_target(&mut self, i: &InsertTarget) {
656 Visit::visit_insert_target(&mut **self, i);
657 }
658
659 fn visit_join(&mut self, i: &Join) {
660 Visit::visit_join(&mut **self, i);
661 }
662
663 fn visit_limit(&mut self, i: &Limit) {
664 Visit::visit_limit(&mut **self, i);
665 }
666
667 fn visit_limit_cursor(&mut self, i: &LimitCursor) {
668 Visit::visit_limit_cursor(&mut **self, i);
669 }
670
671 fn visit_limit_offset(&mut self, i: &LimitOffset) {
672 Visit::visit_limit_offset(&mut **self, i);
673 }
674
675 fn visit_order_by(&mut self, i: &OrderBy) {
676 Visit::visit_order_by(&mut **self, i);
677 }
678
679 fn visit_order_by_expr(&mut self, i: &OrderByExpr) {
680 Visit::visit_order_by_expr(&mut **self, i);
681 }
682
683 fn visit_path(&mut self, i: &Path) {
684 Visit::visit_path(&mut **self, i);
685 }
686
687 fn visit_projection(&mut self, i: &Projection) {
688 Visit::visit_projection(&mut **self, i);
689 }
690
691 fn visit_returning(&mut self, i: &Returning) {
692 Visit::visit_returning(&mut **self, i);
693 }
694
695 fn visit_source(&mut self, i: &Source) {
696 Visit::visit_source(&mut **self, i);
697 }
698
699 fn visit_source_model(&mut self, i: &SourceModel) {
700 Visit::visit_source_model(&mut **self, i);
701 }
702
703 fn visit_source_table(&mut self, i: &SourceTable) {
704 Visit::visit_source_table(&mut **self, i);
705 }
706
707 fn visit_source_table_id(&mut self, i: &SourceTableId) {
708 Visit::visit_source_table_id(&mut **self, i);
709 }
710
711 fn visit_stmt(&mut self, i: &Statement) {
712 Visit::visit_stmt(&mut **self, i);
713 }
714
715 fn visit_stmt_delete(&mut self, i: &Delete) {
716 Visit::visit_stmt_delete(&mut **self, i);
717 }
718
719 fn visit_stmt_insert(&mut self, i: &Insert) {
720 Visit::visit_stmt_insert(&mut **self, i);
721 }
722
723 fn visit_stmt_query(&mut self, i: &Query) {
724 Visit::visit_stmt_query(&mut **self, i);
725 }
726
727 fn visit_stmt_select(&mut self, i: &Select) {
728 Visit::visit_stmt_select(&mut **self, i);
729 }
730
731 fn visit_stmt_update(&mut self, i: &Update) {
732 Visit::visit_stmt_update(&mut **self, i);
733 }
734
735 fn visit_table_derived(&mut self, i: &TableDerived) {
736 Visit::visit_table_derived(&mut **self, i);
737 }
738
739 fn visit_table_ref(&mut self, i: &TableRef) {
740 Visit::visit_table_ref(&mut **self, i);
741 }
742
743 fn visit_table_factor(&mut self, i: &TableFactor) {
744 Visit::visit_table_factor(&mut **self, i);
745 }
746
747 fn visit_table_with_joins(&mut self, i: &TableWithJoins) {
748 Visit::visit_table_with_joins(&mut **self, i);
749 }
750
751 fn visit_type(&mut self, i: &Type) {
752 Visit::visit_type(&mut **self, i);
753 }
754
755 fn visit_update_target(&mut self, i: &UpdateTarget) {
756 Visit::visit_update_target(&mut **self, i);
757 }
758
759 fn visit_value(&mut self, i: &Value) {
760 Visit::visit_value(&mut **self, i);
761 }
762
763 fn visit_value_record(&mut self, i: &ValueRecord) {
764 Visit::visit_value_record(&mut **self, i);
765 }
766
767 fn visit_values(&mut self, i: &Values) {
768 Visit::visit_values(&mut **self, i);
769 }
770
771 fn visit_with(&mut self, i: &With) {
772 Visit::visit_with(&mut **self, i);
773 }
774}
775
776pub fn visit_assignment<V>(v: &mut V, node: &Assignment)
778where
779 V: Visit + ?Sized,
780{
781 match node {
782 Assignment::Set(expr) | Assignment::Insert(expr) | Assignment::Remove(expr) => {
783 v.visit_expr(expr);
784 }
785 Assignment::Batch(entries) => {
786 for entry in entries {
787 visit_assignment(v, entry);
788 }
789 }
790 }
791}
792
793pub fn visit_assignments<V>(v: &mut V, node: &Assignments)
795where
796 V: Visit + ?Sized,
797{
798 for (_, assignment) in node.iter() {
799 v.visit_assignment(assignment);
800 }
801}
802
803pub fn visit_association<V>(v: &mut V, node: &Association)
805where
806 V: Visit + ?Sized,
807{
808 v.visit_stmt_query(&node.source);
809}
810
811pub fn visit_cte<V>(v: &mut V, node: &Cte)
813where
814 V: Visit + ?Sized,
815{
816 v.visit_stmt_query(&node.query);
817}
818
819pub fn visit_expr<V>(v: &mut V, node: &Expr)
821where
822 V: Visit + ?Sized,
823{
824 match node {
825 Expr::And(expr) => v.visit_expr_and(expr),
826 Expr::Any(expr) => v.visit_expr_any(expr),
827 Expr::Arg(expr) => v.visit_expr_arg(expr),
828 Expr::BinaryOp(expr) => v.visit_expr_binary_op(expr),
829 Expr::Cast(expr) => v.visit_expr_cast(expr),
830 Expr::Default => v.visit_expr_default(),
831 Expr::Error(expr) => v.visit_expr_error(expr),
832 Expr::Exists(expr) => v.visit_expr_exists(expr),
833 Expr::Func(expr) => v.visit_expr_func(expr),
834 Expr::Ident(_) => {}
835 Expr::InList(expr) => v.visit_expr_in_list(expr),
836 Expr::InSubquery(expr) => v.visit_expr_in_subquery(expr),
837 Expr::IsNull(expr) => v.visit_expr_is_null(expr),
838 Expr::IsVariant(expr) => v.visit_expr_is_variant(expr),
839 Expr::Let(expr) => v.visit_expr_let(expr),
840 Expr::Like(expr) => v.visit_expr_like(expr),
841 Expr::Map(expr) => v.visit_expr_map(expr),
842 Expr::Match(expr) => v.visit_expr_match(expr),
843 Expr::Not(expr) => v.visit_expr_not(expr),
844 Expr::Or(expr) => v.visit_expr_or(expr),
845 Expr::Project(expr) => v.visit_expr_project(expr),
846 Expr::Record(expr) => v.visit_expr_record(expr),
847 Expr::Reference(expr) => v.visit_expr_reference(expr),
848 Expr::List(expr) => v.visit_expr_list(expr),
849 Expr::StartsWith(expr) => v.visit_expr_starts_with(expr),
850 Expr::Stmt(expr) => v.visit_expr_stmt(expr),
851 Expr::Value(expr) => v.visit_value(expr),
852 }
853}
854
855pub fn visit_expr_and<V>(v: &mut V, node: &ExprAnd)
857where
858 V: Visit + ?Sized,
859{
860 for expr in node {
861 v.visit_expr(expr);
862 }
863}
864
865pub fn visit_expr_any<V>(v: &mut V, node: &ExprAny)
867where
868 V: Visit + ?Sized,
869{
870 v.visit_expr(&node.expr);
871}
872
873pub fn visit_expr_arg<V>(v: &mut V, node: &ExprArg)
875where
876 V: Visit + ?Sized,
877{
878}
879
880pub fn visit_expr_binary_op<V>(v: &mut V, node: &ExprBinaryOp)
882where
883 V: Visit + ?Sized,
884{
885 v.visit_expr(&node.lhs);
886 v.visit_expr(&node.rhs);
887}
888
889pub fn visit_expr_cast<V>(v: &mut V, node: &ExprCast)
891where
892 V: Visit + ?Sized,
893{
894 v.visit_expr(&node.expr);
895 v.visit_type(&node.ty);
896}
897
898pub fn visit_expr_column<V>(v: &mut V, node: &ExprColumn)
900where
901 V: Visit + ?Sized,
902{
903}
904
905pub fn visit_expr_default<V>(v: &mut V)
907where
908 V: Visit + ?Sized,
909{
910}
911
912pub fn visit_expr_error<V>(v: &mut V, node: &ExprError)
914where
915 V: Visit + ?Sized,
916{
917 }
919
920pub fn visit_expr_exists<V>(v: &mut V, node: &ExprExists)
922where
923 V: Visit + ?Sized,
924{
925 v.visit_stmt_query(&node.subquery);
926}
927
928pub fn visit_expr_func<V>(v: &mut V, node: &ExprFunc)
930where
931 V: Visit + ?Sized,
932{
933 match node {
934 ExprFunc::Count(func) => v.visit_expr_func_count(func),
935 ExprFunc::LastInsertId(func) => v.visit_expr_func_last_insert_id(func),
936 }
937}
938
939pub fn visit_expr_func_count<V>(v: &mut V, node: &FuncCount)
941where
942 V: Visit + ?Sized,
943{
944 if let Some(expr) = &node.arg {
945 v.visit_expr(expr);
946 }
947
948 if let Some(expr) = &node.filter {
949 v.visit_expr(expr);
950 }
951}
952
953pub fn visit_expr_func_last_insert_id<V>(_v: &mut V, _node: &FuncLastInsertId)
955where
956 V: Visit + ?Sized,
957{
958 }
960
961pub fn visit_expr_in_list<V>(v: &mut V, node: &ExprInList)
963where
964 V: Visit + ?Sized,
965{
966 v.visit_expr(&node.expr);
967 v.visit_expr(&node.list);
968}
969
970pub fn visit_expr_in_subquery<V>(v: &mut V, node: &ExprInSubquery)
972where
973 V: Visit + ?Sized,
974{
975 v.visit_expr(&node.expr);
976 v.visit_stmt_query(&node.query);
977}
978
979pub fn visit_expr_is_null<V>(v: &mut V, node: &ExprIsNull)
981where
982 V: Visit + ?Sized,
983{
984 v.visit_expr(&node.expr);
985}
986
987pub fn visit_expr_is_variant<V>(v: &mut V, node: &ExprIsVariant)
989where
990 V: Visit + ?Sized,
991{
992 v.visit_expr(&node.expr);
993}
994
995pub fn visit_expr_let<V>(v: &mut V, node: &ExprLet)
997where
998 V: Visit + ?Sized,
999{
1000 for binding in &node.bindings {
1001 v.visit_expr(binding);
1002 }
1003 v.visit_expr(&node.body);
1004}
1005
1006pub fn visit_expr_like<V>(v: &mut V, node: &ExprLike)
1008where
1009 V: Visit + ?Sized,
1010{
1011 v.visit_expr(&node.expr);
1012 v.visit_expr(&node.pattern);
1013}
1014
1015pub fn visit_expr_map<V>(v: &mut V, node: &ExprMap)
1017where
1018 V: Visit + ?Sized,
1019{
1020 v.visit_expr(&node.base);
1021 v.visit_expr(&node.map);
1022}
1023
1024pub fn visit_expr_match<V>(v: &mut V, node: &ExprMatch)
1026where
1027 V: Visit + ?Sized,
1028{
1029 v.visit_expr(&node.subject);
1030 for arm in &node.arms {
1031 v.visit_expr(&arm.expr);
1032 }
1033 v.visit_expr(&node.else_expr);
1034}
1035
1036pub fn visit_expr_not<V>(v: &mut V, node: &ExprNot)
1038where
1039 V: Visit + ?Sized,
1040{
1041 v.visit_expr(&node.expr);
1042}
1043
1044pub fn visit_expr_or<V>(v: &mut V, node: &ExprOr)
1046where
1047 V: Visit + ?Sized,
1048{
1049 for expr in node {
1050 v.visit_expr(expr);
1051 }
1052}
1053
1054pub fn visit_expr_list<V>(v: &mut V, node: &ExprList)
1056where
1057 V: Visit + ?Sized,
1058{
1059 for expr in &node.items {
1060 v.visit_expr(expr);
1061 }
1062}
1063
1064pub fn visit_expr_record<V>(v: &mut V, node: &ExprRecord)
1066where
1067 V: Visit + ?Sized,
1068{
1069 for expr in &**node {
1070 v.visit_expr(expr);
1071 }
1072}
1073
1074pub fn visit_expr_reference<V>(v: &mut V, node: &ExprReference)
1076where
1077 V: Visit + ?Sized,
1078{
1079 match node {
1080 ExprReference::Model { .. } => {}
1081 ExprReference::Field { .. } => {}
1082 ExprReference::Column(expr_column) => v.visit_expr_column(expr_column),
1083 }
1084}
1085
1086pub fn visit_expr_set<V>(v: &mut V, node: &ExprSet)
1088where
1089 V: Visit + ?Sized,
1090{
1091 match node {
1092 ExprSet::Select(expr) => v.visit_stmt_select(expr),
1093 ExprSet::SetOp(expr) => v.visit_expr_set_op(expr),
1094 ExprSet::Update(expr) => v.visit_stmt_update(expr),
1095 ExprSet::Values(expr) => v.visit_values(expr),
1096 ExprSet::Insert(expr) => v.visit_stmt_insert(expr),
1097 }
1098}
1099
1100pub fn visit_expr_set_op<V>(v: &mut V, node: &ExprSetOp)
1102where
1103 V: Visit + ?Sized,
1104{
1105 for operand in &node.operands {
1106 v.visit_expr_set(operand);
1107 }
1108}
1109
1110pub fn visit_expr_starts_with<V>(v: &mut V, node: &ExprStartsWith)
1112where
1113 V: Visit + ?Sized,
1114{
1115 v.visit_expr(&node.expr);
1116 v.visit_expr(&node.prefix);
1117}
1118
1119pub fn visit_expr_stmt<V>(v: &mut V, node: &ExprStmt)
1121where
1122 V: Visit + ?Sized,
1123{
1124 v.visit_stmt(&node.stmt);
1125}
1126
1127pub fn visit_expr_project<V>(v: &mut V, node: &ExprProject)
1129where
1130 V: Visit + ?Sized,
1131{
1132 v.visit_expr(&node.base);
1133 v.visit_projection(&node.projection);
1134}
1135
1136pub fn visit_filter<V>(v: &mut V, node: &Filter)
1138where
1139 V: Visit + ?Sized,
1140{
1141 if let Some(expr) = &node.expr {
1142 v.visit_expr(expr);
1143 }
1144}
1145
1146pub fn visit_condition<V>(v: &mut V, node: &Condition)
1148where
1149 V: Visit + ?Sized,
1150{
1151 if let Some(expr) = &node.expr {
1152 v.visit_expr(expr);
1153 }
1154}
1155
1156pub fn visit_insert_target<V>(v: &mut V, node: &InsertTarget)
1158where
1159 V: Visit + ?Sized,
1160{
1161 if let InsertTarget::Scope(stmt) = node {
1162 v.visit_stmt_query(stmt);
1163 }
1164}
1165
1166pub fn visit_join<V>(v: &mut V, node: &Join)
1168where
1169 V: Visit + ?Sized,
1170{
1171 v.visit_source_table_id(&node.table);
1172 match &node.constraint {
1173 JoinOp::Left(expr) => v.visit_expr(expr),
1174 }
1175}
1176
1177pub fn visit_limit<V>(v: &mut V, node: &Limit)
1179where
1180 V: Visit + ?Sized,
1181{
1182 match node {
1183 Limit::Cursor(cursor) => v.visit_limit_cursor(cursor),
1184 Limit::Offset(offset) => v.visit_limit_offset(offset),
1185 }
1186}
1187
1188pub fn visit_limit_cursor<V>(v: &mut V, node: &LimitCursor)
1190where
1191 V: Visit + ?Sized,
1192{
1193 v.visit_expr(&node.page_size);
1194 if let Some(after) = &node.after {
1195 v.visit_expr(after);
1196 }
1197}
1198
1199pub fn visit_limit_offset<V>(v: &mut V, node: &LimitOffset)
1201where
1202 V: Visit + ?Sized,
1203{
1204 v.visit_expr(&node.limit);
1205 if let Some(offset) = &node.offset {
1206 v.visit_expr(offset);
1207 }
1208}
1209
1210pub fn visit_order_by<V>(v: &mut V, node: &OrderBy)
1212where
1213 V: Visit + ?Sized,
1214{
1215 for expr in &node.exprs {
1216 v.visit_order_by_expr(expr);
1217 }
1218}
1219
1220pub fn visit_order_by_expr<V>(v: &mut V, node: &OrderByExpr)
1222where
1223 V: Visit + ?Sized,
1224{
1225 v.visit_expr(&node.expr);
1226}
1227
1228pub fn visit_path<V>(v: &mut V, node: &Path)
1230where
1231 V: Visit + ?Sized,
1232{
1233 v.visit_projection(&node.projection);
1234}
1235
1236pub fn visit_projection<V>(v: &mut V, node: &Projection)
1238where
1239 V: Visit + ?Sized,
1240{
1241}
1242
1243pub fn visit_returning<V>(v: &mut V, node: &Returning)
1245where
1246 V: Visit + ?Sized,
1247{
1248 match node {
1249 Returning::Model { include } => {
1250 for path in include {
1251 v.visit_path(path);
1252 }
1253 }
1254 Returning::Changed => {}
1255 Returning::Project(expr) => v.visit_expr(expr),
1256 Returning::Expr(expr) => v.visit_expr(expr),
1257 }
1258}
1259
1260pub fn visit_source<V>(v: &mut V, node: &Source)
1262where
1263 V: Visit + ?Sized,
1264{
1265 match node {
1266 Source::Model(source_model) => v.visit_source_model(source_model),
1267 Source::Table(source_table) => v.visit_source_table(source_table),
1268 }
1269}
1270
1271pub fn visit_source_model<V>(v: &mut V, node: &SourceModel)
1273where
1274 V: Visit + ?Sized,
1275{
1276 if let Some(association) = &node.via {
1277 v.visit_association(association);
1278 }
1279}
1280
1281pub fn visit_source_table<V>(v: &mut V, node: &SourceTable)
1283where
1284 V: Visit + ?Sized,
1285{
1286 for table_ref in &node.tables {
1287 v.visit_table_ref(table_ref);
1288 }
1289 for table_with_joins in &node.from {
1290 v.visit_table_with_joins(table_with_joins);
1291 }
1292}
1293
1294pub fn visit_source_table_id<V>(v: &mut V, node: &SourceTableId)
1296where
1297 V: Visit + ?Sized,
1298{
1299 }
1301
1302pub fn visit_table_factor<V>(v: &mut V, node: &TableFactor)
1304where
1305 V: Visit + ?Sized,
1306{
1307 match node {
1308 TableFactor::Table(table_id) => v.visit_source_table_id(table_id),
1309 }
1310}
1311
1312pub fn visit_stmt<V>(v: &mut V, node: &Statement)
1314where
1315 V: Visit + ?Sized,
1316{
1317 match node {
1318 Statement::Delete(stmt) => v.visit_stmt_delete(stmt),
1319 Statement::Insert(stmt) => v.visit_stmt_insert(stmt),
1320 Statement::Query(stmt) => v.visit_stmt_query(stmt),
1321 Statement::Update(stmt) => v.visit_stmt_update(stmt),
1322 }
1323}
1324
1325pub fn visit_stmt_delete<V>(v: &mut V, node: &Delete)
1327where
1328 V: Visit + ?Sized,
1329{
1330 v.visit_source(&node.from);
1331 v.visit_filter(&node.filter);
1332 v.visit_condition(&node.condition);
1333
1334 if let Some(returning) = &node.returning {
1335 v.visit_returning(returning);
1336 }
1337}
1338
1339pub fn visit_stmt_insert<V>(v: &mut V, node: &Insert)
1341where
1342 V: Visit + ?Sized,
1343{
1344 if let InsertTarget::Scope(scope) = &node.target {
1345 v.visit_stmt_query(scope);
1346 }
1347 v.visit_stmt_query(&node.source);
1348
1349 if let Some(returning) = &node.returning {
1350 v.visit_returning(returning);
1351 }
1352}
1353
1354pub fn visit_stmt_query<V>(v: &mut V, node: &Query)
1356where
1357 V: Visit + ?Sized,
1358{
1359 if let Some(with) = &node.with {
1360 v.visit_with(with);
1361 }
1362
1363 v.visit_expr_set(&node.body);
1364
1365 if let Some(order_by) = &node.order_by {
1366 v.visit_order_by(order_by);
1367 }
1368
1369 if let Some(limit) = &node.limit {
1370 v.visit_limit(limit);
1371 }
1372}
1373
1374pub fn visit_stmt_select<V>(v: &mut V, node: &Select)
1376where
1377 V: Visit + ?Sized,
1378{
1379 v.visit_source(&node.source);
1380 v.visit_filter(&node.filter);
1381 v.visit_returning(&node.returning);
1382}
1383
1384pub fn visit_stmt_update<V>(v: &mut V, node: &Update)
1386where
1387 V: Visit + ?Sized,
1388{
1389 v.visit_update_target(&node.target);
1390 v.visit_assignments(&node.assignments);
1391 v.visit_filter(&node.filter);
1392 v.visit_condition(&node.condition);
1393}
1394
1395pub fn visit_table_derived<V>(v: &mut V, node: &TableDerived)
1397where
1398 V: Visit + ?Sized,
1399{
1400 v.visit_stmt_query(&node.subquery);
1401}
1402
1403pub fn visit_table_ref<V>(v: &mut V, node: &TableRef)
1405where
1406 V: Visit + ?Sized,
1407{
1408 match node {
1409 TableRef::Cte { .. } => {}
1410 TableRef::Derived(table_derived) => v.visit_table_derived(table_derived),
1411 TableRef::Table(_) => {}
1412 TableRef::Arg(expr_arg) => v.visit_expr_arg(expr_arg),
1413 }
1414}
1415
1416pub fn visit_table_with_joins<V>(v: &mut V, node: &TableWithJoins)
1418where
1419 V: Visit + ?Sized,
1420{
1421 v.visit_table_factor(&node.relation);
1422 for join in &node.joins {
1423 v.visit_join(join);
1424 }
1425}
1426
1427pub fn visit_type<V>(v: &mut V, node: &Type)
1429where
1430 V: Visit + ?Sized,
1431{
1432 }
1434
1435pub fn visit_update_target<V>(v: &mut V, node: &UpdateTarget)
1437where
1438 V: Visit + ?Sized,
1439{
1440 if let UpdateTarget::Query(query) = node {
1441 v.visit_stmt_query(query)
1442 }
1443}
1444
1445pub fn visit_value<V>(v: &mut V, node: &Value)
1447where
1448 V: Visit + ?Sized,
1449{
1450 if let Value::Record(node) = node {
1451 v.visit_value_record(node)
1452 }
1453}
1454
1455pub fn visit_value_record<V>(v: &mut V, node: &ValueRecord)
1457where
1458 V: Visit + ?Sized,
1459{
1460 for value in node.iter() {
1461 v.visit_value(value);
1462 }
1463}
1464
1465pub fn visit_values<V>(v: &mut V, node: &Values)
1467where
1468 V: Visit + ?Sized,
1469{
1470 for expr in &node.rows {
1471 v.visit_expr(expr);
1472 }
1473}
1474
1475pub fn visit_with<V>(v: &mut V, node: &With)
1477where
1478 V: Visit + ?Sized,
1479{
1480 for cte in &node.ctes {
1481 v.visit_cte(cte);
1482 }
1483}
1484
1485pub fn for_each_expr<F>(node: &impl Node, f: F)
1490where
1491 F: FnMut(&Expr),
1492{
1493 struct ForEach<F> {
1494 f: F,
1495 }
1496
1497 impl<F> Visit for ForEach<F>
1498 where
1499 F: FnMut(&Expr),
1500 {
1501 fn visit_expr(&mut self, node: &Expr) {
1502 visit_expr(self, node);
1503 (self.f)(node);
1504 }
1505 }
1506
1507 node.visit(ForEach { f });
1508}