Skip to main content

surrealdb_expr/expr/
visit.rs

1use std::ops::Bound;
2
3use crate::expr::access_type::{BearerAccess, JwtAccessVerify};
4use crate::expr::data::Assignment;
5use crate::expr::field::Selector;
6use crate::expr::graphql_config::GraphQLConfig;
7use crate::expr::lookup::LookupSubject;
8use crate::expr::order::Ordering;
9use crate::expr::part::{DestructurePart, Recurse, RecurseInstruction};
10use crate::expr::permission::{Permission, Permissions};
11use crate::expr::reference::{Reference, ReferenceDeleteStrategy};
12use crate::expr::statements::access::{
13	AccessStatementGrant, AccessStatementPurge, AccessStatementRevoke, AccessStatementShow, Subject,
14};
15use crate::expr::statements::alter::{
16	AlterAccessStatement, AlterAnalyzerStatement, AlterApiClause, AlterApiStatement,
17	AlterBucketStatement, AlterConfigStatement, AlterDatabaseStatement, AlterDefault,
18	AlterEventStatement, AlterFieldStatement, AlterFunctionStatement, AlterIndexStatement,
19	AlterKind, AlterModuleStatement, AlterNamespaceStatement, AlterParamStatement,
20	AlterSequenceStatement, AlterSystemStatement, AlterTableStatement, AlterUserStatement,
21};
22use crate::expr::statements::define::config::ConfigInner;
23use crate::expr::statements::define::config::api::ApiConfig;
24use crate::expr::statements::define::config::defaults::DefaultConfig;
25use crate::expr::statements::define::{
26	ApiAction, DefineBucketStatement, DefineConfigStatement, DefineDefault, DefineSequenceStatement,
27};
28use crate::expr::statements::rebuild::RebuildStatement;
29use crate::expr::statements::remove::{
30	RemoveApiStatement, RemoveBucketStatement, RemoveSequenceStatement,
31};
32use crate::expr::statements::{
33	AccessStatement, AlterStatement, CreateStatement, DefineAccessStatement,
34	DefineAnalyzerStatement, DefineApiStatement, DefineDatabaseStatement, DefineEventStatement,
35	DefineFieldStatement, DefineFunctionStatement, DefineIndexStatement, DefineModelStatement,
36	DefineModuleStatement, DefineNamespaceStatement, DefineParamStatement, DefineStatement,
37	DefineTableStatement, DefineUserStatement, DeleteStatement, ForeachStatement, IfelseStatement,
38	InfoStatement, InsertStatement, KillStatement, LiveFields, LiveStatement, OptionStatement,
39	OutputStatement, RelateStatement, RemoveAccessStatement, RemoveAnalyzerStatement,
40	RemoveConfigStatement, RemoveDatabaseStatement, RemoveEventStatement, RemoveFieldStatement,
41	RemoveFunctionStatement, RemoveIndexStatement, RemoveModelStatement, RemoveModuleStatement,
42	RemoveNamespaceStatement, RemoveParamStatement, RemoveStatement, RemoveTableStatement,
43	RemoveUserStatement, SelectStatement, SetStatement, ShowStatement, SleepStatement,
44	UpdateStatement, UpsertStatement, UseStatement,
45};
46use crate::expr::table_type::{Relation, TableType};
47use crate::expr::{
48	AccessType, Block, ClosureExpr, Data, Expr, Field, Fields, Function, FunctionCall, Idiom,
49	JwtAccess, Kind, KindLiteral, Literal, Lookup, Model, Output, Param, Part, RecordAccess,
50	RecordIdKeyLit, RecordIdKeyRangeLit, RecordIdLit, TopLevelExpr, View,
51};
52
53macro_rules! implement_visitor{
54	($(fn $name:ident($this:ident, $value:ident: &$ty:ty) {
55	    $($t:tt)*
56	})*) => {
57
58		/// A trait for types which can be visited with the `expr` visitor
59		#[allow(dead_code)]
60		pub trait Visit<V: Visitor>{
61			fn visit(&self, v: &mut V) -> Result<(), V::Error>;
62		}
63
64		/// A visitor which can visit types from `expr`
65		///
66		/// Implementing a visitor is as simple as just implementing the trait and only defining
67		/// the error type. All visiting functions have default implementations so to visit a
68		/// specific type you just need to implement only the `visit_{type}` function.
69		#[allow(dead_code)]
70		pub trait Visitor: Sized {
71			type Error;
72
73			$(
74				fn $name(&mut self, $value: &$ty) -> Result<(), Self::Error>{
75					$value.visit(self)
76				}
77			)*
78		}
79
80		$(
81			impl<V: Visitor> Visit<V> for $ty {
82				#[allow(unused_variables)]
83				fn visit(&self, $this: &mut V) -> Result<(), V::Error>{
84					let $value = self;
85					$($t)*
86				}
87			}
88		)*
89	};
90}
91
92macro_rules! implement_visitor_mut{
93	($(fn $name:ident($this:ident, $value:ident: &mut $ty:ty) {
94	    $($t:tt)*
95	})*) => {
96
97		/// A trait for types which can be visited with mutable access with the `expr` visitor
98		#[allow(dead_code)]
99		pub trait VisitMut<V: MutVisitor>{
100			fn visit_mut(&mut self, v: &mut V) -> Result<(), V::Error>;
101		}
102
103		/// A mutable visitor which can visit types from `expr`
104		///
105		/// Implementing a visitor is as simple as just implementing the trait and only defining
106		/// the error type. All visiting functions have default implementations so to visit a
107		/// specific type you just need to implement only the `visit_mut_{type}` function.
108		#[allow(dead_code)]
109		pub trait MutVisitor: Sized {
110			type Error;
111
112			$(
113				fn $name(&mut self, $value: &mut $ty) -> Result<(), Self::Error>{
114					$value.visit_mut(self)
115				}
116			)*
117		}
118
119		$(
120			impl<V: MutVisitor> VisitMut<V> for $ty {
121				#[allow(unused_variables)]
122				fn visit_mut(&mut self, $this: &mut V) -> Result<(), V::Error>{
123					let $value = self;
124					$($t)*
125				}
126			}
127		)*
128	};
129}
130
131// This macro implements the visitor for the expr types.
132// When modifying also make sure to modify the mutable visitor implementation below it.
133implement_visitor! {
134	fn visit_top_level_expr(this, value: &TopLevelExpr) {
135		match value {
136			TopLevelExpr::Begin => {},
137			TopLevelExpr::Cancel => {},
138			TopLevelExpr::Commit => {},
139			TopLevelExpr::Access(s) => {this.visit_access(s)? },
140			TopLevelExpr::Kill(s) => {this.visit_kill(s)?; },
141			TopLevelExpr::Live(s) => {this.visit_live(s)?; },
142		TopLevelExpr::Option(s) =>{ this.visit_option(s)?; },
143		TopLevelExpr::Use(s) => {this.visit_use(s)?; },
144		TopLevelExpr::Show(s) => {this.visit_show(s)?; },
145		TopLevelExpr::Expr(e) => {this.visit_expr(e)?; },
146		}
147		Ok(())
148	}
149
150	fn visit_access(this, a: &AccessStatement){
151		match a {
152			AccessStatement::Grant(a) => {
153				this.visit_access_grant(a)?;
154			},
155			AccessStatement::Show(a) => {
156				this.visit_access_show(a)?;
157			},
158			AccessStatement::Revoke(a) => {
159				this.visit_access_revoke(a)?;
160			},
161			AccessStatement::Purge(a) => {
162				this.visit_access_purge(a)?;
163			},
164		}
165		Ok(())
166	}
167
168	fn visit_access_grant(this, a: &AccessStatementGrant){
169		this.visit_access_subject(&a.subject)?;
170		Ok(())
171	}
172
173	fn visit_access_subject(this, s: &Subject){
174		match s{
175			Subject::Record(r) => {
176				this.visit_record_id(r)?;
177			},
178			Subject::User(_) => { }
179		}
180		Ok(())
181	}
182
183	fn visit_access_show(this, a: &AccessStatementShow){
184		if let Some(c) = a.cond.as_ref(){
185			this.visit_expr(&c.0)?;
186		}
187		Ok(())
188	}
189	fn visit_access_revoke(this, a: &AccessStatementRevoke){
190		if let Some(c) = a.cond.as_ref(){
191			this.visit_expr(&c.0)?;
192		}
193		Ok(())
194	}
195	fn visit_access_purge(this, a: &AccessStatementPurge){
196		Ok(())
197	}
198
199
200	fn visit_kill(this, i: &KillStatement){
201		this.visit_expr(&i.id)?;
202		Ok(())
203	}
204
205	fn visit_live(this, l: &LiveStatement){
206		match &l.fields{
207			LiveFields::Diff => {},
208			LiveFields::Select(x) => {
209				this.visit_fields(x)?;
210			}
211		}
212		this.visit_expr(&l.what)?;
213		if let Some(c) = l.cond.as_ref(){
214			this.visit_expr(&c.0)?;
215		}
216		if let Some(f) = l.fetch.as_ref(){
217			for f in f.iter(){
218				this.visit_expr(&f.0)?;
219			}
220		}
221
222		Ok(())
223	}
224
225	fn visit_option(this, i: &OptionStatement){
226		Ok(())
227	}
228
229	fn visit_show(this, s: &ShowStatement){
230		Ok(())
231	}
232
233	fn visit_expr(this, s: &Expr){
234		match s {
235			Expr::Literal(literal) => {
236				this.visit_literal(literal)?;
237			}
238			Expr::Param(p) => {
239				this.visit_param(p)?;
240			}
241			Expr::Table(_) |
242			Expr::Mock(_) |
243			Expr::Constant(_) |
244			Expr::Break |
245			Expr::Continue => {},
246			Expr::Idiom(idiom) => {
247				this.visit_idiom(idiom)?;
248			}
249			Expr::Block(block) => {
250				this.visit_block(block)?;
251			}
252			Expr::Prefix { expr, .. } => {
253				this.visit_expr(expr)?;
254			},
255			Expr::Postfix { expr, op } => {
256				this.visit_expr(expr)?;
257				// A call operator carries argument expressions of its own,
258				// which are evaluated at the call site just like function-call
259				// arguments; range operators carry none.
260				match op {
261					crate::expr::operator::PostfixOperator::Range
262					| crate::expr::operator::PostfixOperator::RangeSkip => {},
263					crate::expr::operator::PostfixOperator::MethodCall(_, args)
264					| crate::expr::operator::PostfixOperator::Call(args) => {
265						for a in args.iter(){
266							this.visit_expr(a)?;
267						}
268					}
269				}
270			},
271			Expr::Binary { left, right, .. } => {
272				this.visit_expr(left)?;
273				this.visit_expr(right)?;
274			},
275			Expr::FunctionCall(f) => {
276				this.visit_function_call(f)?;
277			},
278			Expr::Closure(c) => {
279				this.visit_closure(c)?;
280			},
281			Expr::Return(o) => {
282				this.visit_output_stmt(o)?;
283			},
284			Expr::Throw(e) => {
285				this.visit_expr(e)?;
286			},
287			Expr::IfElse(s) => {
288				this.visit_if_else(s)?;
289			},
290			Expr::Select(s) => { this.visit_select(s)?; },
291			Expr::Create(s) => { this.visit_create(s)?; },
292			Expr::Update(s) => { this.visit_update(s)?; },
293			Expr::Upsert(s) => { this.visit_upsert(s)?; },
294			Expr::Delete(s) => { this.visit_delete(s)?; },
295			Expr::Relate(s) => { this.visit_relate(s)?; },
296			Expr::Insert(s) => { this.visit_insert(s)?; },
297			Expr::Define(s) => { this.visit_define(s)?; },
298			Expr::Remove(s) => { this.visit_remove(s)?; },
299			Expr::Rebuild(s) => {
300				this.visit_rebuild(s)?;
301			},
302			Expr::Alter(s) => {
303				this.visit_alter(s)?;
304			},
305			Expr::Info(s) => {
306				this.visit_info(s)?;
307			},
308			Expr::Foreach(s) => {
309				this.visit_foreach(s)?;
310			},
311		Expr::Let(s) => {
312			this.visit_set(s)?;
313		},
314		Expr::Sleep(s) => {
315			this.visit_sleep(s)?;
316		},
317		Expr::Explain { statement, .. } => {
318			this.visit_expr(statement)?;
319		},
320		Expr::Match(plan) => {
321			use crate::expr::match_plan::{MatchStage, MutationStage, UpdateData};
322			// Walk every reachable Expr across the steps (clause predicates and
323			// mutation-stage values), then the output columns/ORDER BY/SKIP/LIMIT.
324			for stage in plan.stages.iter(){
325				match stage {
326					MatchStage::Read(clause) => {
327						for predicate in clause.predicates.iter(){
328							this.visit_expr(&predicate.expr)?;
329						}
330					}
331					MatchStage::Mutate(MutationStage::Update { data, .. }) => match data {
332						UpdateData::Set(assignments) => {
333							for (_, value) in assignments.iter(){
334								this.visit_expr(value)?;
335							}
336						}
337						UpdateData::Unset(_) => {}
338						UpdateData::Content(expr) => this.visit_expr(expr)?,
339					},
340					MatchStage::Mutate(MutationStage::Delete { .. }) => {}
341					MatchStage::Mutate(MutationStage::Insert(insert)) => {
342						for node in insert.nodes.iter(){
343							this.visit_expr(&node.props)?;
344						}
345						for edge in insert.edges.iter(){
346							this.visit_expr(&edge.props)?;
347						}
348					}
349				}
350			}
351			if let Some(output) = plan.output.as_ref(){
352				for column in output.columns.iter(){
353					this.visit_expr(&column.expr)?;
354				}
355				for order in output.order.iter(){
356					this.visit_expr(&order.expr)?;
357				}
358				if let Some(skip) = output.skip.as_ref(){
359					this.visit_expr(skip)?;
360				}
361				if let Some(limit) = output.limit.as_ref(){
362					this.visit_expr(limit)?;
363				}
364			}
365		},
366	}
367
368	Ok(())
369	}
370
371	fn visit_literal(this, s: &Literal){
372		match s {
373			Literal::None |
374			Literal::Null |
375			Literal::UnboundedRange |
376			Literal::Bool(_) |
377			Literal::Float(_) |
378			Literal::Integer(_) |
379			Literal::Decimal(_) |
380			Literal::String(_) |
381			Literal::Bytes(_) |
382			Literal::Regex(_) |
383			Literal::Datetime(_) |
384			Literal::Duration(_) |
385			Literal::Uuid(_) |
386			Literal::File(_) |
387			Literal::Geometry(_) => {},
388			Literal::RecordId(r) => {
389				this.visit_record_id(r)?;
390			},
391			Literal::Array(exprs) => {
392				for expr in exprs.iter() {
393					this.visit_expr(expr)?;
394				}
395			},
396			Literal::Set(exprs) => {
397				for expr in exprs.iter() {
398					this.visit_expr(expr)?;
399				}
400			},
401			Literal::Object(items) => {
402				for entry in items{
403					this.visit_expr(&entry.value)?
404				}
405			},
406		}
407
408		Ok(())
409	}
410
411	fn visit_alter(this, a: &AlterStatement){
412		match a {
413			AlterStatement::System(a)=>{ this.visit_alter_system(a)?; },
414			AlterStatement::Namespace(a)=>{ this.visit_alter_namespace(a)?; },
415			AlterStatement::Database(a)=>{ this.visit_alter_database(a)?; },
416			AlterStatement::Table(a)=>{ this.visit_alter_table(a)?; },
417			AlterStatement::Event(a)=>{ this.visit_alter_event(a)?; },
418			AlterStatement::Index(a) => { this.visit_alter_index(a)?; },
419			AlterStatement::Sequence(a) => { this.visit_alter_sequence(a)?; },
420			AlterStatement::Field(a) => { this.visit_alter_field(a)?; },
421			AlterStatement::Param(a) => { this.visit_alter_param(a)?; },
422			AlterStatement::Bucket(a) => { this.visit_alter_bucket(a)?; },
423			AlterStatement::Config(a) => { this.visit_alter_config(a)?; },
424			AlterStatement::Analyzer(a) => { this.visit_alter_analyzer(a)?; },
425			AlterStatement::Function(a) => { this.visit_alter_function(a)?; },
426			AlterStatement::Access(a) => { this.visit_alter_access(a)?; },
427			AlterStatement::User(a) => { this.visit_alter_user(a)?; },
428			AlterStatement::Api(a) => { this.visit_alter_api(a)?; },
429			AlterStatement::Module(a) => { this.visit_alter_module(a)?; },
430		}
431		Ok(())
432	}
433
434	fn visit_alter_module(this, a: &AlterModuleStatement){
435		if let Some(ref p) = a.permissions {
436			this.visit_permission(p)?;
437		}
438		Ok(())
439	}
440
441	fn visit_alter_user(this, a: &AlterUserStatement){
442		this.visit_expr(&a.name)?;
443		Ok(())
444	}
445
446	fn visit_alter_api(this, a: &AlterApiStatement){
447		for clause in &a.clauses {
448			match clause {
449				AlterApiClause::ForAny { fallback, .. } => {
450					if let AlterKind::Set(x) = fallback {
451						this.visit_expr(x)?;
452					}
453				}
454				AlterApiClause::SetAction(action) => {
455					this.visit_expr(&action.action)?;
456				}
457				AlterApiClause::DropAction { .. } => {}
458			}
459		}
460		Ok(())
461	}
462
463	fn visit_alter_access(this, a: &AlterAccessStatement){
464		this.visit_expr(&a.name)?;
465		match a.authenticate {
466			AlterKind::None |
467			AlterKind::Drop => {},
468			AlterKind::Set(ref x) => this.visit_expr(x)?,
469		}
470		match a.context {
471			AlterKind::None |
472			AlterKind::Drop => {},
473			AlterKind::Set(ref x) => this.visit_expr(x)?,
474		}
475		Ok(())
476	}
477
478	fn visit_alter_system(this, a: &AlterSystemStatement){
479		Ok(())
480	}
481
482	fn visit_alter_namespace(this, a: &AlterNamespaceStatement){
483		Ok(())
484	}
485
486	fn visit_alter_database(this, a: &AlterDatabaseStatement){
487		Ok(())
488	}
489
490	fn visit_alter_table(this, a: &AlterTableStatement){
491		this.visit_expr(&a.name)?;
492		if let Some(p) = a.permissions.as_ref(){
493			this.visit_permissions(p)?;
494		}
495		Ok(())
496	}
497
498	fn visit_alter_event(this, a: &AlterEventStatement){
499		this.visit_expr(&a.name)?;
500		this.visit_expr(&a.what)?;
501		match a.when {
502			AlterKind::None |
503			AlterKind::Drop => {},
504			AlterKind::Set(ref x) => this.visit_expr(x)?,
505		}
506		match a.then {
507			AlterKind::None |
508			AlterKind::Drop => {},
509			AlterKind::Set(ref v) => {
510				for x in v.iter() {
511					this.visit_expr(x)?;
512				}
513			},
514		}
515		Ok(())
516	}
517
518	fn visit_alter_index(this, a: &AlterIndexStatement){
519		this.visit_expr(&a.name)?;
520		this.visit_expr(&a.table)?;
521		Ok(())
522	}
523
524	fn visit_alter_sequence(this, a: &AlterSequenceStatement){
525		this.visit_expr(&a.name)?;
526		if let Some(ref t) = a.timeout {
527			this.visit_expr(t)?;
528		}
529		Ok(())
530	}
531
532	fn visit_alter_param(this, a: &AlterParamStatement){
533		if let Some(ref x) = a.value {
534			this.visit_expr(x)?;
535		}
536		if let Some(ref p) = a.permissions {
537			this.visit_permission(p)?;
538		}
539		Ok(())
540	}
541
542	fn visit_alter_bucket(this, a: &AlterBucketStatement){
543		this.visit_expr(&a.name)?;
544		if let Some(ref p) = a.permissions {
545			this.visit_permission(p)?;
546		}
547		Ok(())
548	}
549
550	fn visit_alter_config(this, a: &AlterConfigStatement){
551		this.visit_config_inner(&a.inner)?;
552		Ok(())
553	}
554
555	fn visit_alter_analyzer(this, a: &AlterAnalyzerStatement){
556		this.visit_expr(&a.name)?;
557		Ok(())
558	}
559
560	fn visit_alter_function(this, a: &AlterFunctionStatement){
561		if let Some(ref p) = a.permissions {
562			this.visit_permission(p)?;
563		}
564		Ok(())
565	}
566
567	fn visit_alter_field(this, a: &AlterFieldStatement){
568		this.visit_expr(&a.name)?;
569		this.visit_expr(&a.what)?;
570
571		match a.value {
572			AlterKind::None |
573			AlterKind::Drop => {},
574			AlterKind::Set(ref x) => this.visit_expr(x)?,
575		}
576
577		match a.assert{
578			AlterKind::None |
579			AlterKind::Drop => {},
580			AlterKind::Set(ref x) => this.visit_expr(x)?,
581		}
582
583		match a.default{
584			AlterDefault::None |
585			AlterDefault::Drop => {},
586			AlterDefault::Set(ref x) => this.visit_expr(x)?,
587			AlterDefault::Always(ref x) => this.visit_expr(x)?,
588		}
589
590		if let Some(p) = a.permissions.as_ref(){
591			this.visit_permissions(p)?;
592		}
593
594		match a.reference{
595			AlterKind::None |
596			AlterKind::Drop => {},
597			AlterKind::Set(ref x) => this.visit_reference(x)?,
598		}
599
600		Ok(())
601	}
602
603	fn visit_upsert(this, u: &UpsertStatement){
604		for v in u.what.iter(){
605			this.visit_expr(v)?;
606		}
607		if let Some(d) = u.data.as_ref(){
608			this.visit_data(d)?;
609		}
610		if let Some(o) = u.output.as_ref(){
611			this.visit_output(o)?;
612		}
613		if let Some(c) = u.cond.as_ref(){
614			this.visit_expr(&c.0)?;
615		}
616		Ok(())
617
618	}
619
620	fn visit_rebuild(this, r: &RebuildStatement){
621		Ok(())
622	}
623
624	fn visit_use(this, t: &UseStatement){
625		Ok(())
626	}
627
628	fn visit_update(this, u: &UpdateStatement){
629		for v in u.what.iter(){
630			this.visit_expr(v)?;
631		}
632		if let Some(d) = u.data.as_ref(){
633			this.visit_data(d)?;
634		}
635		if let Some(o) = u.output.as_ref(){
636			this.visit_output(o)?;
637		}
638		if let Some(c) = u.cond.as_ref(){
639			this.visit_expr(&c.0)?;
640		}
641		Ok(())
642
643	}
644
645	fn visit_sleep(this, s: &SleepStatement){
646		Ok(())
647	}
648
649	fn visit_set(this, s: &SetStatement){
650		if let Some(k) = s.kind.as_ref(){
651			this.visit_kind(k)?;
652		}
653		this.visit_expr(&s.what)?;
654		Ok(())
655	}
656
657	fn visit_select(this, s: &SelectStatement){
658		this.visit_fields(&s.fields)?;
659		for o in s.omit.iter(){
660			this.visit_expr(o)?;
661		}
662		for v in s.what.iter(){
663			this.visit_expr(v)?;
664		}
665		if let Some(c) = s.cond.as_ref(){
666			this.visit_expr(&c.0)?;
667		}
668		if let Some(s) = s.split.as_ref(){
669			for s in s.0.iter(){
670				this.visit_idiom(&s.0)?;
671			}
672		}
673		if let Some(g) = s.group.as_ref(){
674			for g in g.0.iter(){
675				this.visit_idiom(&g.0)?;
676			}
677		}
678		if let Some(o) = s.order.as_ref(){
679			this.visit_ordering(o)?;
680		}
681		if let Some(l) = s.limit.as_ref(){
682			this.visit_expr(&l.0)?;
683		}
684		if let Some(f) = s.fetch.as_ref(){
685			for f in f.iter(){
686				this.visit_expr(&f.0)?;
687			}
688		}
689		this.visit_expr(&s.version)?;
690
691		Ok(())
692	}
693
694	fn visit_remove(this, r: &RemoveStatement){
695		match r {
696			RemoveStatement::Namespace(r) => {
697				this.visit_remove_namespace(r)?;
698			},
699			RemoveStatement::Database(r) => {
700				this.visit_remove_database(r)?;
701			},
702			RemoveStatement::Function(r) => {
703				this.visit_remove_function(r)?;
704			},
705			RemoveStatement::Analyzer(r) => {
706				this.visit_remove_analyzer(r)?;
707			},
708			RemoveStatement::Access(r) => {
709				this.visit_remove_access(r)?;
710			},
711			RemoveStatement::Param(r) => {
712				this.visit_remove_param(r)?;
713			},
714			RemoveStatement::Table(r) => {
715				this.visit_remove_table(r)?;
716			},
717			RemoveStatement::Event(r) => {
718				this.visit_remove_event(r)?;
719			},
720			RemoveStatement::Field(r) => {
721				this.visit_remove_field(r)?;
722			},
723			RemoveStatement::Index(r) => {
724				this.visit_remove_index(r)?;
725			},
726			RemoveStatement::User(r) => {
727				this.visit_remove_user(r)?;
728			},
729			RemoveStatement::Model(r) => {
730				this.visit_remove_model(r)?;
731			},
732			RemoveStatement::Api(r) => {
733				this.visit_remove_api(r)?;
734			},
735			RemoveStatement::Bucket(r) => {
736				this.visit_remove_bucket(r)?;
737			},
738			RemoveStatement::Sequence(r) => {
739				this.visit_remove_sequence(r)?;
740			},
741			RemoveStatement::Module(r) => {
742				this.visit_remove_module(r)?;
743			},
744			RemoveStatement::Config(r) => {
745				this.visit_remove_config(r)?;
746			},
747		}
748		Ok(())
749	}
750
751	fn visit_remove_namespace(this, r: &RemoveNamespaceStatement){
752		this.visit_expr(&r.name)?;
753		Ok(())
754	}
755
756	fn visit_remove_database(this, r: &RemoveDatabaseStatement){
757		this.visit_expr(&r.name)?;
758		Ok(())
759	}
760
761	fn visit_remove_function(this, r: &RemoveFunctionStatement){
762		Ok(())
763	}
764
765	fn visit_remove_module(this, r: &RemoveModuleStatement){
766		Ok(())
767	}
768
769	fn visit_remove_config(this, r: &RemoveConfigStatement){
770		Ok(())
771	}
772
773	fn visit_remove_analyzer(this, r: &RemoveAnalyzerStatement){
774		this.visit_expr(&r.name)?;
775		Ok(())
776	}
777
778	fn visit_remove_access(this, r: &RemoveAccessStatement){
779		this.visit_expr(&r.name)?;
780		Ok(())
781	}
782
783	fn visit_remove_param(this, r: &RemoveParamStatement){
784		Ok(())
785	}
786
787	fn visit_remove_table(this, r: &RemoveTableStatement){
788		this.visit_expr(&r.name)?;
789		Ok(())
790	}
791
792	fn visit_remove_event(this, r: &RemoveEventStatement){
793		this.visit_expr(&r.name)?;
794		Ok(())
795	}
796
797	fn visit_remove_field(this, r: &RemoveFieldStatement){
798		this.visit_expr(&r.name)?;
799		Ok(())
800	}
801
802	fn visit_remove_index(this, r: &RemoveIndexStatement){
803		this.visit_expr(&r.name)?;
804		this.visit_expr(&r.what)?;
805		Ok(())
806	}
807
808	fn visit_remove_user(this, r: &RemoveUserStatement){
809		this.visit_expr(&r.name)?;
810		Ok(())
811	}
812
813	fn visit_remove_model(this, r: &RemoveModelStatement){
814		Ok(())
815	}
816
817
818	fn visit_remove_api(this, r: &RemoveApiStatement){
819		this.visit_expr(&r.name)?;
820		Ok(())
821	}
822
823	fn visit_remove_bucket(this, r: &RemoveBucketStatement){
824		this.visit_expr(&r.name)?;
825		Ok(())
826	}
827
828	fn visit_remove_sequence(this, r: &RemoveSequenceStatement){
829		this.visit_expr(&r.name)?;
830		Ok(())
831	}
832
833	fn visit_relate(this, o: &RelateStatement){
834		this.visit_expr(&o.through)?;
835		this.visit_expr(&o.from)?;
836		this.visit_expr(&o.to)?;
837		if let Some(d) = o.data.as_ref(){
838			this.visit_data(d)?;
839		}
840		if let Some(o) = o.output.as_ref(){
841			this.visit_output(o)?;
842		}
843		this.visit_expr(&o.timeout)?;
844		Ok(())
845	}
846
847	fn visit_output_stmt(this, o: &OutputStatement){
848		this.visit_expr(&o.what)?;
849		if let Some(f) = o.fetch.as_ref(){
850			for f in f.iter(){
851				this.visit_expr(&f.0)?;
852			}
853		}
854		Ok(())
855	}
856
857	fn visit_insert(this, i: &InsertStatement){
858		if let Some(into) = &i.into {
859			this.visit_expr(into)?;
860		}
861		this.visit_data(&i.data)?;
862		if let Some(update) = i.update.as_ref(){
863			this.visit_data(update)?;
864		}
865		if let Some(o) = i.output.as_ref(){
866			this.visit_output(o)?;
867		}
868		this.visit_expr(&i.timeout)?;
869		Ok(())
870	}
871
872	fn visit_info(this, i: &InfoStatement){
873		match i{
874			InfoStatement::Root(_, expr) |
875			InfoStatement::Ns(_, expr) |
876			InfoStatement::Db(_, expr) => {
877				if let Some(e) = expr.as_ref(){
878					this.visit_expr(e)?;
879				}
880			},
881			InfoStatement::Tb(expr, _, expr1) => {
882				this.visit_expr(expr)?;
883				if let Some(e) = expr1.as_ref(){
884					this.visit_expr(e)?;
885				}
886			},
887			InfoStatement::User(expr, base, _) => {
888				this.visit_expr(expr)?;
889			},
890			InfoStatement::Index(expr, expr1, _) => {
891				this.visit_expr(expr)?;
892				this.visit_expr(expr1)?;
893			},
894		}
895		Ok(())
896	}
897
898	fn visit_if_else(this, i: &IfelseStatement){
899		for e in i.exprs.iter(){
900			this.visit_expr(&e.0)?;
901			this.visit_expr(&e.1)?;
902		}
903		if let Some(x) = i.close.as_ref(){
904			this.visit_expr(x)?;
905		}
906		Ok(())
907	}
908
909	fn visit_foreach(this, f: &ForeachStatement){
910		this.visit_param(&f.param)?;
911		this.visit_expr(&f.range)?;
912		this.visit_block(&f.block)?;
913		Ok(())
914	}
915
916	fn visit_delete(this, d: &DeleteStatement){
917		for v in d.what.iter(){
918			this.visit_expr(v)?;
919		}
920		if let Some(c) = d.cond.as_ref(){
921			this.visit_expr(&c.0)?;
922		}
923		if let Some(o) = d.output.as_ref(){
924			this.visit_output(o)?;
925		}
926		this.visit_expr(&d.timeout)?;
927		Ok(())
928	}
929
930	fn visit_define(this, d: &DefineStatement){
931		match d {
932			DefineStatement::Namespace(d) => {
933				this.visit_define_namespace(d)?;
934			},
935			DefineStatement::Database(d) => {
936				this.visit_define_database(d)?;
937			},
938			DefineStatement::Function(d) => {
939				this.visit_define_function(d)?;
940			},
941			DefineStatement::Analyzer(d) => {
942				this.visit_define_analyzer(d)?;
943			},
944			DefineStatement::Param(d) => {
945				this.visit_define_param(d)?;
946			},
947			DefineStatement::Table(d) => {
948				this.visit_define_table(d)?;
949			},
950			DefineStatement::Event(d) => {
951				this.visit_define_event(d)?;
952			},
953			DefineStatement::Field(d) => {
954				this.visit_define_field(d)?;
955			},
956			DefineStatement::Index(d) => {
957				this.visit_define_index(d)?;
958			},
959			DefineStatement::User(d) => {
960				this.visit_define_user(d)?;
961			},
962			DefineStatement::Model(d) => {
963				this.visit_define_model(d)?;
964			},
965			DefineStatement::Access(d) => {
966				this.visit_define_access(d)?;
967			},
968			DefineStatement::Config(d) => {
969				this.visit_define_config(d)?;
970			},
971			DefineStatement::Api(d) => {
972				this.visit_define_api(d)?;
973			},
974			DefineStatement::Bucket(d) => {
975				this.visit_define_bucket(d)?;
976			},
977			DefineStatement::Sequence(d) => {
978				this.visit_define_sequence(d)?;
979			},
980			DefineStatement::Module(d) => {
981				this.visit_define_module(d)?;
982			},
983		}
984		Ok(())
985	}
986
987	fn visit_define_sequence(this, d: &DefineSequenceStatement) {
988		this.visit_expr(&d.name)?;
989		this.visit_expr(&d.batch)?;
990		this.visit_expr(&d.start)?;
991		this.visit_expr(&d.timeout)?;
992		Ok(())
993	}
994
995	fn visit_define_bucket(this, d: &DefineBucketStatement) {
996		this.visit_expr(&d.name)?;
997		if let Some(expr) = d.backend.as_ref(){
998			this.visit_expr(expr)?;
999		}
1000		this.visit_permission(&d.permissions)?;
1001		this.visit_expr(&d.comment)?;
1002		Ok(())
1003	}
1004
1005	fn visit_define_api(this, d: &DefineApiStatement) {
1006		this.visit_expr(&d.path)?;
1007		for act in d.actions.iter(){
1008			this.visit_api_action(act)?;
1009		}
1010		if let Some(f) = d.fallback.as_ref(){
1011			this.visit_expr(f)?;
1012		}
1013		this.visit_api_config(&d.config)?;
1014		this.visit_expr(&d.comment)?;
1015
1016		Ok(())
1017	}
1018
1019	fn visit_api_action(this, a: &ApiAction){
1020		this.visit_expr(&a.action)?;
1021		this.visit_api_config(&a.config)?;
1022		Ok(())
1023	}
1024
1025
1026	fn visit_define_config(this, d: &DefineConfigStatement) {
1027		this.visit_config_inner(&d.inner)
1028	}
1029
1030	fn visit_config_inner(this, d: &ConfigInner){
1031		match d {
1032			ConfigInner::GraphQL(graph_qlconfig) => {
1033				this.visit_graphql_config(graph_qlconfig)?;
1034			},
1035			ConfigInner::Api(api_config) => {
1036				this.visit_api_config(api_config)?;
1037			},
1038			ConfigInner::Default(default_config) => {
1039				this.visit_default_config(default_config)?;
1040			},
1041		}
1042		Ok(())
1043	}
1044
1045	fn visit_graphql_config(this, d: &GraphQLConfig){
1046		Ok(())
1047	}
1048
1049
1050	fn visit_api_config(this, d: &ApiConfig){
1051		for m in d.middleware.iter(){
1052			for v in m.args.iter(){
1053				this.visit_expr(v)?;
1054			}
1055		}
1056		this.visit_permission(&d.permissions)?;
1057		Ok(())
1058	}
1059
1060	fn visit_default_config(this, d: &DefaultConfig) {
1061		this.visit_expr(&d.namespace)?;
1062		this.visit_expr(&d.database)?;
1063		Ok(())
1064	}
1065
1066	fn visit_define_access(this, d: &DefineAccessStatement) {
1067		this.visit_expr(&d.name)?;
1068		this.visit_access_type(&d.access_type)?;
1069		if let Some(v) = d.authenticate.as_ref(){
1070			this.visit_expr(v)?;
1071		}
1072		if let Some(v) = d.context.as_ref(){
1073			this.visit_expr(v)?;
1074		}
1075
1076		this.visit_expr(&d.duration.grant)?;
1077		this.visit_expr(&d.duration.token)?;
1078		this.visit_expr(&d.duration.session)?;
1079		this.visit_expr(&d.comment)?;
1080		Ok(())
1081	}
1082
1083	fn visit_access_type(this, a: &AccessType) {
1084		match a {
1085			AccessType::Record(r) => { this.visit_record_access(r)?; },
1086			AccessType::Jwt(j) => { this.visit_jwt_access(j)?; },
1087			AccessType::Bearer(b) => { this.visit_bearer_access(b)?; },
1088		}
1089		Ok(())
1090	}
1091
1092	fn visit_record_access(this, r: &RecordAccess){
1093		if let Some(e) = r.signup.as_ref(){
1094			this.visit_expr(e)?
1095		}
1096		if let Some(e) = r.signin.as_ref(){
1097			this.visit_expr(e)?
1098		}
1099
1100		this.visit_jwt_access(&r.jwt)?;
1101		if let Some(b) = r.bearer.as_ref(){
1102			this.visit_bearer_access(b)?;
1103		}
1104		Ok(())
1105	}
1106
1107	fn visit_jwt_access(this, j: &JwtAccess){
1108		match j.verify{
1109			JwtAccessVerify::Key(ref k) => {
1110				this.visit_expr(&k.key)?
1111
1112			},
1113			JwtAccessVerify::Jwks(ref j) => {
1114				this.visit_expr(&j.url)?
1115			},
1116		}
1117
1118		if let Some(i) = j.issue.as_ref(){
1119			this.visit_expr(&i.key)?
1120		}
1121
1122		if let Some(aud) = j.audience.as_ref(){
1123			for a in aud {
1124				this.visit_expr(a)?
1125			}
1126		}
1127
1128		Ok(())
1129	}
1130
1131	fn visit_bearer_access(this, r: &BearerAccess){
1132		this.visit_jwt_access(&r.jwt)?;
1133		Ok(())
1134	}
1135
1136	fn visit_define_model(this, d: &DefineModelStatement) {
1137		this.visit_permission(&d.permissions)?;
1138		this.visit_expr(&d.comment)?;
1139		Ok(())
1140	}
1141
1142	fn visit_define_module(this, d: &DefineModuleStatement) {
1143		this.visit_permission(&d.permissions)?;
1144		this.visit_expr(&d.comment)?;
1145		Ok(())
1146	}
1147
1148	fn visit_define_user(this, d: &DefineUserStatement) {
1149		this.visit_expr(&d.name)?;
1150		this.visit_expr(&d.duration.token)?;
1151		this.visit_expr(&d.duration.session)?;
1152		this.visit_expr(&d.comment)?;
1153		Ok(())
1154	}
1155
1156	fn visit_define_index(this, d: &DefineIndexStatement) {
1157		this.visit_expr(&d.name)?;
1158		this.visit_expr(&d.what)?;
1159		for c in d.cols.iter(){
1160			this.visit_expr(c)?;
1161		}
1162		this.visit_expr(&d.comment)?;
1163		Ok(())
1164	}
1165
1166	fn visit_define_field(this, d: &DefineFieldStatement) {
1167		this.visit_expr(&d.name)?;
1168		this.visit_expr(&d.what)?;
1169		if let Some(k) = d.field_kind.as_ref(){
1170			this.visit_kind(k)?;
1171		}
1172		if let Some(v) = d.value.as_ref(){
1173			this.visit_expr(v)?;
1174		}
1175		if let Some(v) = d.assert.as_ref(){
1176			this.visit_expr(v)?;
1177		}
1178		if let Some(v) = d.computed.as_ref(){
1179			this.visit_expr(v)?;
1180		}
1181		match d.default{
1182			DefineDefault::None => {},
1183			DefineDefault::Always(ref expr) |
1184			DefineDefault::Set(ref expr) => this.visit_expr(expr)?,
1185		}
1186		this.visit_permissions(&d.permissions)?;
1187		if let Some(r) = d.reference.as_ref(){
1188			this.visit_reference(r)?;
1189		}
1190		this.visit_expr(&d.comment)?;
1191		Ok(())
1192	}
1193
1194	fn visit_reference(this, d: &Reference){
1195		this.visit_delete_strategy(&d.on_delete)
1196
1197	}
1198
1199	fn visit_delete_strategy(this, d: &ReferenceDeleteStrategy){
1200		match d {
1201			ReferenceDeleteStrategy::Reject |
1202				ReferenceDeleteStrategy::Ignore |
1203				ReferenceDeleteStrategy::Cascade |
1204				ReferenceDeleteStrategy::Unset => {},
1205			ReferenceDeleteStrategy::Custom(value) => {
1206				this.visit_expr(value)?;
1207			},
1208
1209		}
1210		Ok(())
1211	}
1212
1213
1214	fn visit_define_event(this, d: &DefineEventStatement){
1215		this.visit_expr(&d.name)?;
1216		this.visit_expr(&d.target_table)?;
1217		this.visit_expr(&d.when)?;
1218		for v in d.then.iter(){
1219			this.visit_expr(v)?;
1220		}
1221		this.visit_expr(&d.comment)?;
1222		Ok(())
1223	}
1224
1225	fn visit_define_table(this, d: &DefineTableStatement){
1226		this.visit_expr(&d.name)?;
1227		if let Some(v) = d.view.as_ref(){
1228			this.visit_view(v)?;
1229		}
1230		this.visit_permissions(&d.permissions)?;
1231		this.visit_expr(&d.comment)?;
1232		this.visit_table_type(&d.table_type)?;
1233
1234		Ok(())
1235	}
1236
1237	fn visit_table_type(this, t: &TableType){
1238		match t {
1239			TableType::Any |
1240				TableType::Normal => {}
1241			TableType::Relation(relation) => {
1242				this.visit_relation(relation)?;
1243			},
1244		}
1245		Ok(())
1246	}
1247
1248	fn visit_relation(this, r: &Relation){
1249		Ok(())
1250	}
1251
1252	fn visit_permissions(this, d: &Permissions){
1253		this.visit_permission(&d.select)?;
1254		this.visit_permission(&d.create)?;
1255		this.visit_permission(&d.update)?;
1256		this.visit_permission(&d.delete)?;
1257		Ok(())
1258	}
1259
1260	fn visit_view(this, v: &View){
1261		this.visit_fields(&v.expr)?;
1262
1263		if let Some(c) = v.cond.as_ref(){
1264			this.visit_expr(&c.0)?;
1265		}
1266
1267		if let Some(g) = v.group.as_ref(){
1268			for g in g.0.iter(){
1269				this.visit_idiom(&g.0)?
1270			}
1271		}
1272
1273		Ok(())
1274	}
1275
1276	fn visit_define_param(this, d: &DefineParamStatement){
1277		this.visit_expr(&d.value)?;
1278		this.visit_expr(&d.comment)?;
1279		this.visit_permission(&d.permissions)?;
1280		Ok(())
1281	}
1282
1283	fn visit_define_analyzer(this, d: &DefineAnalyzerStatement){
1284		this.visit_expr(&d.name)?;
1285		this.visit_expr(&d.comment)?;
1286		Ok(())
1287	}
1288
1289	fn visit_define_function(this, d: &DefineFunctionStatement){
1290		for (_, k) in d.args.iter(){
1291			this.visit_kind(k)?;
1292		}
1293		this.visit_block(&d.block)?;
1294		this.visit_permission(&d.permissions)?;
1295		this.visit_expr(&d.comment)?;
1296		if let Some(k) = d.returns.as_ref(){
1297			this.visit_kind(k)?;
1298		}
1299		Ok(())
1300	}
1301
1302	fn visit_permission(this, p: &Permission){
1303		match p {
1304			Permission::None |
1305				Permission::Full => {},
1306			Permission::Specific(expr) => {
1307				// Walked directly: a statement's guard is an expression, not stored
1308				// text, so a collecting pass sees it in full with nothing to parse
1309				// and nothing that can fail.
1310				this.visit_expr(expr)?;
1311			},
1312		}
1313		Ok(())
1314	}
1315
1316	fn visit_define_database(this,  d: &DefineDatabaseStatement){
1317		this.visit_expr(&d.name)?;
1318		this.visit_expr(&d.comment)?;
1319		Ok(())
1320	}
1321
1322	fn visit_define_namespace(this,  d: &DefineNamespaceStatement){
1323		this.visit_expr(&d.name)?;
1324		this.visit_expr(&d.comment)?;
1325		Ok(())
1326	}
1327
1328	fn visit_create(this, c: &CreateStatement){
1329		for w in c.what.iter(){
1330			this.visit_expr(w)?;
1331		}
1332
1333		if let Some(data) = c.data.as_ref(){
1334			this.visit_data(data)?;
1335		}
1336
1337		if let Some(output) = c.output.as_ref(){
1338			this.visit_output(output)?;
1339		}
1340
1341		this.visit_expr(&c.timeout)?;
1342
1343		Ok(())
1344	}
1345
1346	fn visit_output(this, o: &Output){
1347		match o {
1348			Output::None |
1349				Output::Null |
1350				Output::Diff |
1351				Output::After |
1352				Output::Before => {},
1353			Output::Fields(fields) => {
1354				this.visit_fields(fields)?;
1355			},
1356		}
1357		Ok(())
1358	}
1359
1360	fn visit_data(this, d: &Data){
1361		match d {
1362			Data::EmptyExpression => {},
1363			Data::UpdateExpression(assign) |
1364				Data::SetExpression(assign) => {
1365					for a in assign{
1366						this.visit_assignment(a)?;
1367					}
1368				},
1369			Data::UnsetExpression(idioms) => {
1370				for i in idioms {
1371					this.visit_idiom(i)?;
1372				}
1373			},
1374			Data::PatchExpression(value) |
1375				Data::MergeExpression(value) |
1376				Data::ReplaceExpression(value) |
1377				Data::ContentExpression(value) |
1378				Data::SingleExpression(value) => {
1379					this.visit_expr(value)?;
1380				},
1381			Data::ValuesExpression(items) => {
1382				for (i,v) in items.iter().flat_map(|x| x.iter()){
1383					this.visit_idiom(i)?;
1384					this.visit_expr(v)?;
1385				}
1386			},
1387		}
1388		Ok(())
1389	}
1390
1391	fn visit_assignment(this, a: &Assignment){
1392		this.visit_idiom(&a.place)?;
1393		this.visit_expr(&a.value)?;
1394		Ok(())
1395	}
1396
1397	fn visit_closure(this, c: &ClosureExpr){
1398		for (_,k) in c.args.iter(){
1399			this.visit_kind(k)?;
1400		}
1401		if let Some(k) = c.returns.as_ref(){
1402			this.visit_kind(k)?;
1403		}
1404		this.visit_expr(&c.body)?;
1405		Ok(())
1406	}
1407
1408	fn visit_model(this, m: &Model) {
1409		Ok(())
1410	}
1411
1412
1413	fn visit_function_call(this, f: &FunctionCall){
1414		this.visit_function(&f.receiver)?;
1415		for a in f.arguments.iter(){
1416			this.visit_expr(a)?;
1417		}
1418		Ok(())
1419	}
1420
1421	fn visit_function(this, f: &Function){
1422		Ok(())
1423	}
1424
1425
1426	fn visit_block(this, value: &Block){
1427		for v in value.0.iter(){
1428			this.visit_expr(v)?;
1429		}
1430		Ok(())
1431
1432	}
1433
1434	fn visit_kind(this, kind: &Kind){
1435		match kind {
1436			Kind::None |
1437				Kind::Any |
1438				Kind::Null |
1439				Kind::Bool |
1440				Kind::Bytes |
1441				Kind::Datetime |
1442				Kind::Decimal |
1443				Kind::Duration |
1444				Kind::Float |
1445				Kind::Int |
1446				Kind::Number |
1447				Kind::Object |
1448				Kind::String |
1449				Kind::Uuid |
1450				Kind::Regex |
1451				Kind::Range |
1452				Kind::Record(_) |
1453				Kind::Geometry(_) |
1454				Kind::Table(_) |
1455				Kind::File(_) => {}
1456			Kind::Either(kinds) => {
1457				for k in kinds.iter() {
1458					this.visit_kind(k)?;
1459				}
1460			},
1461			Kind::Set(kind, _) => {
1462				this.visit_kind(kind)?;
1463			},
1464			Kind::Array(kind, _) => {
1465				this.visit_kind(kind)?;
1466			},
1467			Kind::Function(kinds, kind) => {
1468				if let Some(kinds) = kinds.as_ref(){
1469					for k in kinds.iter() {
1470						this.visit_kind(k)?;
1471					}
1472				}
1473				if let Some(k) = kind {
1474					this.visit_kind(k)?;
1475				}
1476			},
1477			Kind::Literal(literal) => {
1478				this.visit_kind_literal(literal)?;
1479			},
1480		}
1481		Ok(())
1482	}
1483
1484	fn visit_kind_literal(this, k: &KindLiteral){
1485		match k{
1486			KindLiteral::String(_) => {},
1487			KindLiteral::Bool(_) => {},
1488			KindLiteral::Duration(_) => {},
1489			KindLiteral::Float(_) => {},
1490			KindLiteral::Integer(_) => {},
1491			KindLiteral::Decimal(_) => {},
1492			KindLiteral::Array(kinds) => {
1493				for k in kinds.iter(){
1494					this.visit_kind(k)?;
1495				}
1496			},
1497			KindLiteral::Object(btree_map) => {
1498				for v in btree_map.values(){
1499					this.visit_kind(v)?;
1500				}
1501			},
1502		}
1503		Ok(())
1504
1505	}
1506
1507	fn visit_record_id(this, t: &RecordIdLit) {
1508		this.visit_record_id_key(&t.key)
1509	}
1510
1511	fn visit_record_id_key(this, id: &RecordIdKeyLit) {
1512		match id {
1513			RecordIdKeyLit::Number(_) => {},
1514			RecordIdKeyLit::String(_) => {},
1515			RecordIdKeyLit::Uuid(_) => {},
1516			RecordIdKeyLit::Array(array) => {
1517				for e in array.iter(){
1518					this.visit_expr(e)?;
1519				}
1520			},
1521			RecordIdKeyLit::Object(object) => {
1522				for e in object.iter(){
1523					this.visit_expr(&e.value)?;
1524				}
1525			},
1526			RecordIdKeyLit::Generate(_) => {},
1527			RecordIdKeyLit::Range(id_range) => {
1528				this.visit_record_id_key_range(id_range)?;
1529			},
1530		}
1531		Ok(())
1532	}
1533
1534	fn visit_record_id_key_range(this, id_range: &RecordIdKeyRangeLit)  {
1535		match id_range.start{
1536			Bound::Included(ref x) | Bound::Excluded(ref x) => {
1537				this.visit_record_id_key(x)?;
1538			},
1539			Bound::Unbounded => {},
1540		}
1541		match id_range.end{
1542			Bound::Included(ref x) | Bound::Excluded(ref x) => {
1543				this.visit_record_id_key(x)?;
1544			},
1545			Bound::Unbounded => {},
1546		}
1547		Ok(())
1548	}
1549
1550	fn visit_param(_this, _param: &Param) {
1551		Ok(())
1552	}
1553
1554	fn visit_idiom(this, idiom: &Idiom) {
1555		for p in idiom.0.iter(){
1556			this.visit_part(p)?;
1557		}
1558		Ok(())
1559	}
1560
1561	fn visit_part(this, part: &Part) {
1562		match part{
1563			Part::All |
1564				Part::Flatten |
1565				Part::Last |
1566				Part::First |
1567				Part::Optional |
1568				Part::Field(_) |
1569				Part::Doc |
1570				Part::RepeatRecurse  => {}
1571			Part::Where(value) | Part::Value(value) | Part::Start(value) => {
1572				this.visit_expr(value)?;
1573			},
1574			Part::Method(_, values) => {
1575				for v in values {
1576					this.visit_expr(v)?;
1577				}
1578			},
1579			Part::Destructure(destructure_parts) => {
1580				for p in destructure_parts.iter(){
1581					this.visit_destructure_part(p)?;
1582				}
1583			},
1584			Part::Recurse(recurse, idiom, recurse_instruction) => {
1585				this.visit_recurse(recurse)?;
1586				if let Some(idiom) = idiom.as_ref(){
1587					this.visit_idiom(idiom)?;
1588				}
1589				if let Some(instr) = recurse_instruction.as_ref(){
1590					this.visit_recurse_instruction(instr)?;
1591				}
1592			},
1593			Part::Lookup(l) => {
1594				this.visit_lookup(l)?;
1595			}
1596		}
1597		Ok(())
1598	}
1599
1600	fn visit_lookup(this, l: &Lookup){
1601		if let Some(f)  = l.expr.as_ref(){
1602			this.visit_fields(f)?;
1603		}
1604		for w in l.what.iter(){
1605			this.visit_lookup_subject(w)?;
1606		}
1607
1608		if let Some(c) = l.cond.as_ref(){
1609			this.visit_expr(&c.0)?;
1610		}
1611
1612		if let Some(s) = l.split.as_ref(){
1613			for s in s.0.iter(){
1614				this.visit_idiom(&s.0)?;
1615			}
1616		}
1617
1618		if let Some(groups) = l.group.as_ref() {
1619			for g in groups.0.iter(){
1620				this.visit_idiom(&g.0)?;
1621			}
1622		}
1623
1624		if let Some(order) = l.order.as_ref(){
1625			this.visit_ordering(order)?;
1626		}
1627
1628		if let Some(limit) = l.limit.as_ref(){
1629			this.visit_expr(&limit.0)?;
1630		}
1631
1632		if let Some(start) = l.start.as_ref(){
1633			this.visit_expr(&start.0)?;
1634		}
1635
1636		if let Some(alias) = l.alias.as_ref(){
1637			this.visit_idiom(alias)?;
1638		}
1639
1640		Ok(())
1641
1642	}
1643
1644	fn visit_recurse_instruction(this, r: &RecurseInstruction){
1645		match r {
1646			RecurseInstruction::Path { ..} |
1647				RecurseInstruction::Collect { ..} => {}
1648			RecurseInstruction::Shortest { expects, .. } => {
1649				this.visit_expr(expects)?;
1650			},
1651		}
1652		Ok(())
1653	}
1654
1655	fn visit_recurse(_this, _r: &Recurse){
1656		Ok(())
1657	}
1658
1659	fn visit_destructure_part(this, p: &DestructurePart) {
1660		match p {
1661			DestructurePart::All(_) |
1662				DestructurePart::Field(_) => {},
1663				DestructurePart::Aliased(_, idiom) => {
1664					this.visit_idiom(idiom)?;
1665				},
1666				DestructurePart::Destructure(_, destructure_parts) => {
1667					for p in destructure_parts{
1668						this.visit_destructure_part(p)?;
1669					}
1670				},
1671		}
1672		Ok(())
1673	}
1674
1675
1676	fn visit_ordering(this, ordering: &Ordering){
1677		match ordering{
1678			Ordering::Random => {},
1679			Ordering::Order(order_list) => {
1680				for o in order_list.0.iter(){
1681					this.visit_idiom(&o.value)?;
1682				}
1683			},
1684		}
1685		Ok(())
1686	}
1687
1688	fn visit_fields(this, fields: &Fields) {
1689		match fields {
1690			Fields::Value(field) => {
1691				this.visit_selector(field)?;
1692			},
1693			Fields::Select(fields) => {
1694				for f in fields.iter(){
1695					this.visit_field(f)?;
1696				}
1697			},
1698		}
1699
1700		Ok(())
1701	}
1702
1703	fn visit_field(this, field: &Field){
1704		match field {
1705			Field::All => {},
1706			Field::Single(s) => {
1707				this.visit_selector(s)?;
1708			},
1709		}
1710		Ok(())
1711	}
1712
1713	fn visit_selector(this, selector: &Selector){
1714		this.visit_expr(&selector.expr)?;
1715		if let Some(alias) = &selector.alias {
1716			this.visit_idiom(alias)?;
1717		}
1718		Ok(())
1719	}
1720
1721	fn visit_lookup_subject(this, subject: &LookupSubject){
1722		match subject{
1723			LookupSubject::Table { .. } => {},
1724			LookupSubject::Range { range, .. } => {
1725				this.visit_record_id_key_range(range)?;
1726			},
1727
1728		}
1729		Ok(())
1730	}
1731}
1732
1733implement_visitor_mut! {
1734	fn visit_mut_top_level_expr(this, value: &mut TopLevelExpr) {
1735		match value {
1736			TopLevelExpr::Begin => {},
1737			TopLevelExpr::Cancel => {},
1738			TopLevelExpr::Commit => {},
1739			TopLevelExpr::Access(s) => {this.visit_mut_access(s)? },
1740			TopLevelExpr::Kill(s) => {this.visit_mut_kill(s)?; },
1741			TopLevelExpr::Live(s) => {this.visit_mut_live(s)?; },
1742		TopLevelExpr::Option(s) =>{ this.visit_mut_option(s)?; },
1743		TopLevelExpr::Use(s) => {this.visit_mut_use(s)?; },
1744		TopLevelExpr::Show(s) => {this.visit_mut_show(s)?; },
1745		TopLevelExpr::Expr(e) => {this.visit_mut_expr(e)?; },
1746		}
1747		Ok(())
1748	}
1749
1750	fn visit_mut_access(this, a: &mut AccessStatement){
1751		match a {
1752			AccessStatement::Grant(a) => {
1753				this.visit_mut_access_grant(a)?;
1754			},
1755			AccessStatement::Show(a) => {
1756				this.visit_mut_access_show(a)?;
1757			},
1758			AccessStatement::Revoke(a) => {
1759				this.visit_mut_access_revoke(a)?;
1760			},
1761			AccessStatement::Purge(a) => {
1762				this.visit_mut_access_purge(a)?;
1763			},
1764		}
1765		Ok(())
1766	}
1767
1768	fn visit_mut_access_grant(this, a: &mut AccessStatementGrant){
1769		this.visit_mut_access_subject(&mut a.subject)?;
1770		Ok(())
1771	}
1772
1773	fn visit_mut_access_subject(this, s: &mut Subject){
1774		match s{
1775			Subject::Record(r) => {
1776				this.visit_mut_record_id(r)?;
1777			},
1778			Subject::User(_) => { }
1779		}
1780		Ok(())
1781	}
1782
1783	fn visit_mut_access_show(this, a: &mut AccessStatementShow){
1784		if let Some(c) = a.cond.as_mut(){
1785			this.visit_mut_expr(&mut c.0)?;
1786		}
1787		Ok(())
1788	}
1789	fn visit_mut_access_revoke(this, a: &mut AccessStatementRevoke){
1790		if let Some(c) = a.cond.as_mut(){
1791			this.visit_mut_expr(&mut c.0)?;
1792		}
1793		Ok(())
1794	}
1795	fn visit_mut_access_purge(this, a: &mut AccessStatementPurge){
1796		Ok(())
1797	}
1798
1799
1800	fn visit_mut_kill(this, i: &mut KillStatement){
1801		this.visit_mut_expr(&mut i.id)?;
1802		Ok(())
1803	}
1804
1805	fn visit_mut_live(this, l: &mut LiveStatement){
1806		match &mut l.fields{
1807			LiveFields::Diff => {},
1808			LiveFields::Select(x) => {
1809				this.visit_mut_fields(x)?;
1810			}
1811		}
1812		this.visit_mut_expr(&mut l.what)?;
1813		if let Some(c) = l.cond.as_mut(){
1814			this.visit_mut_expr(&mut c.0)?;
1815		}
1816		if let Some(f) = l.fetch.as_mut(){
1817			for f in f.iter_mut(){
1818				this.visit_mut_expr(&mut f.0)?;
1819			}
1820		}
1821
1822		Ok(())
1823	}
1824
1825	fn visit_mut_option(this, i: &mut OptionStatement){
1826		Ok(())
1827	}
1828
1829	fn visit_mut_show(this, s: &mut ShowStatement){
1830		Ok(())
1831	}
1832
1833	fn visit_mut_expr(this, s: &mut Expr){
1834		match s {
1835			Expr::Literal(literal) => {
1836				this.visit_mut_literal(literal)?;
1837			}
1838			Expr::Param(p) => {
1839				this.visit_mut_param(p)?;
1840			}
1841			Expr::Table(_) |
1842			Expr::Mock(_) |
1843			Expr::Constant(_) |
1844			Expr::Break |
1845			Expr::Continue => {},
1846			Expr::Idiom(idiom) => {
1847				this.visit_mut_idiom(idiom)?;
1848			}
1849			Expr::Block(block) => {
1850				this.visit_mut_block(block)?;
1851			}
1852			Expr::Prefix { expr, .. } => {
1853				this.visit_mut_expr(expr)?;
1854			},
1855			Expr::Postfix { expr, op } => {
1856				this.visit_mut_expr(expr)?;
1857				// Same call-argument traversal as the immutable visitor.
1858				match op {
1859					crate::expr::operator::PostfixOperator::Range
1860					| crate::expr::operator::PostfixOperator::RangeSkip => {},
1861					crate::expr::operator::PostfixOperator::MethodCall(_, args)
1862					| crate::expr::operator::PostfixOperator::Call(args) => {
1863						for a in args.iter_mut(){
1864							this.visit_mut_expr(a)?;
1865						}
1866					}
1867				}
1868			},
1869			Expr::Binary { left, right, .. } => {
1870				this.visit_mut_expr(left)?;
1871				this.visit_mut_expr(right)?;
1872			},
1873			Expr::FunctionCall(f) => {
1874				this.visit_mut_function_call(f)?;
1875			},
1876			Expr::Closure(c) => {
1877				this.visit_mut_closure(c)?;
1878			},
1879			Expr::Return(o) => {
1880				this.visit_mut_output_stmt(o)?;
1881			},
1882			Expr::Throw(e) => {
1883				this.visit_mut_expr(e)?;
1884			},
1885			Expr::IfElse(s) => {
1886				this.visit_mut_if_else(s)?;
1887			},
1888			Expr::Select(s) => { this.visit_mut_select(s)?; },
1889			Expr::Create(s) => { this.visit_mut_create(s)?; },
1890			Expr::Update(s) => { this.visit_mut_update(s)?; },
1891			Expr::Upsert(s) => { this.visit_mut_upsert(s)?; },
1892			Expr::Delete(s) => { this.visit_mut_delete(s)?; },
1893			Expr::Relate(s) => { this.visit_mut_relate(s)?; },
1894			Expr::Insert(s) => { this.visit_mut_insert(s)?; },
1895			Expr::Define(s) => { this.visit_mut_define(s)?; },
1896			Expr::Remove(s) => { this.visit_mut_remove(s)?; },
1897			Expr::Rebuild(s) => {
1898				this.visit_mut_rebuild(s)?;
1899			},
1900			Expr::Alter(s) => {
1901				this.visit_mut_alter(s)?;
1902			},
1903			Expr::Info(s) => {
1904				this.visit_mut_info(s)?;
1905			},
1906			Expr::Foreach(s) => {
1907				this.visit_mut_foreach(s)?;
1908			},
1909		Expr::Let(s) => {
1910			this.visit_mut_set(s)?;
1911		},
1912		Expr::Sleep(s) => {
1913			this.visit_mut_sleep(s)?;
1914		},
1915		Expr::Explain { statement, .. } => {
1916			this.visit_mut_expr(statement)?;
1917		},
1918		Expr::Match(plan) => {
1919			use crate::expr::match_plan::{MatchStage, MutationStage, UpdateData};
1920			// Walk every reachable Expr across the steps (clause predicates and
1921			// mutation-stage values), then the output columns/ORDER BY/SKIP/LIMIT.
1922			for stage in plan.stages.iter_mut(){
1923				match stage {
1924					MatchStage::Read(clause) => {
1925						for predicate in clause.predicates.iter_mut(){
1926							this.visit_mut_expr(&mut predicate.expr)?;
1927						}
1928					}
1929					MatchStage::Mutate(MutationStage::Update { data, .. }) => match data {
1930						UpdateData::Set(assignments) => {
1931							for (_, value) in assignments.iter_mut(){
1932								this.visit_mut_expr(value)?;
1933							}
1934						}
1935						UpdateData::Unset(_) => {}
1936						UpdateData::Content(expr) => this.visit_mut_expr(expr)?,
1937					},
1938					MatchStage::Mutate(MutationStage::Delete { .. }) => {}
1939					MatchStage::Mutate(MutationStage::Insert(insert)) => {
1940						for node in insert.nodes.iter_mut(){
1941							this.visit_mut_expr(&mut node.props)?;
1942						}
1943						for edge in insert.edges.iter_mut(){
1944							this.visit_mut_expr(&mut edge.props)?;
1945						}
1946					}
1947				}
1948			}
1949			if let Some(output) = plan.output.as_mut(){
1950				for column in output.columns.iter_mut(){
1951					this.visit_mut_expr(&mut column.expr)?;
1952				}
1953				for order in output.order.iter_mut(){
1954					this.visit_mut_expr(&mut order.expr)?;
1955				}
1956				if let Some(skip) = output.skip.as_mut(){
1957					this.visit_mut_expr(skip)?;
1958				}
1959				if let Some(limit) = output.limit.as_mut(){
1960					this.visit_mut_expr(limit)?;
1961				}
1962			}
1963		},
1964	}
1965
1966	Ok(())
1967	}
1968
1969	fn visit_mut_literal(this, s: &mut Literal){
1970		match s {
1971			Literal::None |
1972			Literal::Null |
1973			Literal::UnboundedRange |
1974			Literal::Bool(_) |
1975			Literal::Float(_) |
1976			Literal::Integer(_) |
1977			Literal::Decimal(_) |
1978			Literal::String(_) |
1979			Literal::Bytes(_) |
1980			Literal::Regex(_) |
1981			Literal::Datetime(_) |
1982			Literal::Duration(_) |
1983			Literal::Uuid(_) |
1984			Literal::File(_) |
1985			Literal::Geometry(_) => {},
1986			Literal::RecordId(r) => {
1987				this.visit_mut_record_id(r)?;
1988			},
1989			Literal::Array(exprs) => {
1990				for expr in exprs.iter_mut() {
1991					this.visit_mut_expr(expr)?;
1992				}
1993			},
1994			Literal::Set(exprs) => {
1995				for expr in exprs.iter_mut() {
1996					this.visit_mut_expr(expr)?;
1997				}
1998			},
1999			Literal::Object(items) => {
2000				for entry in items{
2001					this.visit_mut_expr(&mut entry.value)?
2002				}
2003			},
2004		}
2005
2006		Ok(())
2007	}
2008
2009	fn visit_mut_alter(this, a: &mut AlterStatement){
2010		match a {
2011			AlterStatement::System(a)=>{ this.visit_mut_alter_system(a)?;},
2012			AlterStatement::Namespace(a)=>{ this.visit_mut_alter_namespace(a)?;},
2013			AlterStatement::Database(a)=>{ this.visit_mut_alter_database(a)?;},
2014			AlterStatement::Table(a)=>{ this.visit_mut_alter_table(a)?;},
2015			AlterStatement::Event(a)=>{ this.visit_mut_alter_event(a)?;},
2016			AlterStatement::Index(a)=>{ this.visit_mut_alter_index(a)?;},
2017			AlterStatement::Sequence(a) => { this.visit_mut_alter_sequence(a)?; },
2018			AlterStatement::Field(a) => { this.visit_mut_alter_field(a)?; },
2019			AlterStatement::Param(a) => { this.visit_mut_alter_param(a)?; },
2020			AlterStatement::Bucket(a) => { this.visit_mut_alter_bucket(a)?; },
2021			AlterStatement::Config(a) => { this.visit_mut_alter_config(a)?; },
2022			AlterStatement::Analyzer(a) => { this.visit_mut_alter_analyzer(a)?; },
2023			AlterStatement::Function(a) => { this.visit_mut_alter_function(a)?; },
2024			AlterStatement::Access(a) => { this.visit_mut_alter_access(a)?; },
2025			AlterStatement::User(a) => { this.visit_mut_alter_user(a)?; },
2026			AlterStatement::Api(a) => { this.visit_mut_alter_api(a)?; },
2027			AlterStatement::Module(a) => { this.visit_mut_alter_module(a)?; },
2028		}
2029		Ok(())
2030	}
2031
2032	fn visit_mut_alter_module(this, a: &mut AlterModuleStatement){
2033		if let Some(ref mut p) = a.permissions {
2034			this.visit_mut_permission(p)?;
2035		}
2036		Ok(())
2037	}
2038
2039	fn visit_mut_alter_user(this, a: &mut AlterUserStatement){
2040		this.visit_mut_expr(&mut a.name)?;
2041		Ok(())
2042	}
2043
2044	fn visit_mut_alter_api(this, a: &mut AlterApiStatement){
2045		for clause in &mut a.clauses {
2046			match clause {
2047				AlterApiClause::ForAny { fallback, .. } => {
2048					if let AlterKind::Set(x) = fallback {
2049						this.visit_mut_expr(x)?;
2050					}
2051				}
2052				AlterApiClause::SetAction(action) => {
2053					this.visit_mut_expr(&mut action.action)?;
2054				}
2055				AlterApiClause::DropAction { .. } => {}
2056			}
2057		}
2058		Ok(())
2059	}
2060
2061	fn visit_mut_alter_access(this, a: &mut AlterAccessStatement){
2062		this.visit_mut_expr(&mut a.name)?;
2063		match a.authenticate {
2064			AlterKind::None |
2065			AlterKind::Drop => {},
2066			AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2067		}
2068		match a.context {
2069			AlterKind::None |
2070			AlterKind::Drop => {},
2071			AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2072		}
2073		Ok(())
2074	}
2075
2076	fn visit_mut_alter_system(this, a: &mut AlterSystemStatement){
2077		Ok(())
2078	}
2079
2080	fn visit_mut_alter_namespace(this, a: &mut AlterNamespaceStatement){
2081		Ok(())
2082	}
2083
2084	fn visit_mut_alter_database(this, a: &mut AlterDatabaseStatement){
2085		Ok(())
2086	}
2087
2088	fn visit_mut_alter_table(this, a: &mut AlterTableStatement){
2089		this.visit_mut_expr(&mut a.name)?;
2090		if let Some(p) = a.permissions.as_mut(){
2091			this.visit_mut_permissions(p)?;
2092		}
2093		Ok(())
2094	}
2095
2096	fn visit_mut_alter_event(this, a: &mut AlterEventStatement){
2097		this.visit_mut_expr(&mut a.name)?;
2098		this.visit_mut_expr(&mut a.what)?;
2099		match a.when {
2100			AlterKind::None |
2101			AlterKind::Drop => {},
2102			AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2103		}
2104		match a.then {
2105			AlterKind::None |
2106			AlterKind::Drop => {},
2107			AlterKind::Set(ref mut v) => {
2108				for x in v.iter_mut() {
2109					this.visit_mut_expr(x)?;
2110				}
2111			},
2112		}
2113		Ok(())
2114	}
2115
2116	fn visit_mut_alter_index(this, a: &mut AlterIndexStatement){
2117		this.visit_mut_expr(&mut a.name)?;
2118		this.visit_mut_expr(&mut a.table)?;
2119		Ok(())
2120	}
2121
2122	fn visit_mut_alter_param(this, a: &mut AlterParamStatement){
2123		if let Some(ref mut x) = a.value {
2124			this.visit_mut_expr(x)?;
2125		}
2126		if let Some(ref mut p) = a.permissions {
2127			this.visit_mut_permission(p)?;
2128		}
2129		Ok(())
2130	}
2131
2132	fn visit_mut_alter_bucket(this, a: &mut AlterBucketStatement){
2133		this.visit_mut_expr(&mut a.name)?;
2134		if let Some(ref mut p) = a.permissions {
2135			this.visit_mut_permission(p)?;
2136		}
2137		Ok(())
2138	}
2139
2140	fn visit_mut_alter_config(this, a: &mut AlterConfigStatement){
2141		this.visit_mut_config_inner(&mut a.inner)?;
2142		Ok(())
2143	}
2144
2145	fn visit_mut_alter_analyzer(this, a: &mut AlterAnalyzerStatement){
2146		this.visit_mut_expr(&mut a.name)?;
2147		Ok(())
2148	}
2149
2150	fn visit_mut_alter_function(this, a: &mut AlterFunctionStatement){
2151		if let Some(ref mut p) = a.permissions {
2152			this.visit_mut_permission(p)?;
2153		}
2154		Ok(())
2155	}
2156
2157	fn visit_mut_alter_sequence(this, a: &mut AlterSequenceStatement){
2158		this.visit_mut_expr(&mut a.name)?;
2159		if let Some(ref mut t) = a.timeout {
2160			this.visit_mut_expr(t)?;
2161		}
2162		Ok(())
2163	}
2164
2165	fn visit_mut_alter_field(this, a: &mut AlterFieldStatement){
2166		this.visit_mut_expr(&mut a.name)?;
2167		this.visit_mut_expr(&mut a.what)?;
2168
2169		match a.value {
2170			AlterKind::None |
2171			AlterKind::Drop => {},
2172			AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2173		}
2174
2175		match a.assert{
2176			AlterKind::None |
2177			AlterKind::Drop => {},
2178			AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2179		}
2180
2181		match a.default{
2182			AlterDefault::None |
2183			AlterDefault::Drop => {},
2184			AlterDefault::Set(ref mut x) => this.visit_mut_expr(x)?,
2185			AlterDefault::Always(ref mut x) => this.visit_mut_expr(x)?,
2186		}
2187
2188		if let Some(p) = a.permissions.as_mut(){
2189			this.visit_mut_permissions(p)?;
2190		}
2191
2192		match a.reference{
2193			AlterKind::None |
2194			AlterKind::Drop => {},
2195			AlterKind::Set(ref mut x) => this.visit_mut_reference(x)?,
2196		}
2197
2198		Ok(())
2199	}
2200
2201	fn visit_mut_upsert(this, u: &mut UpsertStatement){
2202		for v in u.what.iter_mut(){
2203			this.visit_mut_expr(v)?;
2204		}
2205		if let Some(d) = u.data.as_mut(){
2206			this.visit_mut_data(d)?;
2207		}
2208		if let Some(o) = u.output.as_mut(){
2209			this.visit_mut_output(o)?;
2210		}
2211		if let Some(c) = u.cond.as_mut(){
2212			this.visit_mut_expr(&mut c.0)?;
2213		}
2214		Ok(())
2215
2216	}
2217
2218	fn visit_mut_rebuild(this, r: &mut RebuildStatement){
2219		Ok(())
2220	}
2221
2222	fn visit_mut_use(this, t: &mut UseStatement){
2223		Ok(())
2224	}
2225
2226	fn visit_mut_update(this, u: &mut UpdateStatement){
2227		for v in u.what.iter_mut(){
2228			this.visit_mut_expr(v)?;
2229		}
2230		if let Some(d) = u.data.as_mut(){
2231			this.visit_mut_data(d)?;
2232		}
2233		if let Some(o) = u.output.as_mut(){
2234			this.visit_mut_output(o)?;
2235		}
2236		if let Some(c) = u.cond.as_mut(){
2237			this.visit_mut_expr(&mut c.0)?;
2238		}
2239		Ok(())
2240
2241	}
2242
2243	fn visit_mut_sleep(this, s: &mut SleepStatement){
2244		Ok(())
2245	}
2246
2247	fn visit_mut_set(this, s: &mut SetStatement){
2248		if let Some(k) = s.kind.as_mut(){
2249			this.visit_mut_kind(k)?;
2250		}
2251		this.visit_mut_expr(&mut s.what)?;
2252		Ok(())
2253	}
2254
2255	fn visit_mut_select(this, s: &mut SelectStatement){
2256		this.visit_mut_fields(&mut s.fields)?;
2257		for o in s.omit.iter_mut(){
2258			this.visit_mut_expr(o)?;
2259		}
2260		for v in s.what.iter_mut(){
2261			this.visit_mut_expr(v)?;
2262		}
2263		if let Some(c) = s.cond.as_mut(){
2264			this.visit_mut_expr(&mut c.0)?;
2265		}
2266		if let Some(s) = s.split.as_mut(){
2267			for s in s.0.iter_mut(){
2268				this.visit_mut_idiom(&mut s.0)?;
2269			}
2270		}
2271		if let Some(g) = s.group.as_mut(){
2272			for g in g.0.iter_mut(){
2273				this.visit_mut_idiom(&mut g.0)?;
2274			}
2275		}
2276		if let Some(o) = s.order.as_mut(){
2277			this.visit_mut_ordering(o)?;
2278		}
2279		if let Some(l) = s.limit.as_mut(){
2280			this.visit_mut_expr(&mut l.0)?;
2281		}
2282		if let Some(f) = s.fetch.as_mut(){
2283			for f in f.iter_mut(){
2284				this.visit_mut_expr(&mut f.0)?;
2285			}
2286		}
2287		this.visit_mut_expr(&mut s.version)?;
2288
2289		Ok(())
2290	}
2291
2292	fn visit_mut_remove(this, r: &mut RemoveStatement){
2293		match r {
2294			RemoveStatement::Namespace(r) => {
2295				this.visit_mut_remove_namespace(r)?;
2296			},
2297			RemoveStatement::Database(r) => {
2298				this.visit_mut_remove_database(r)?;
2299			},
2300			RemoveStatement::Function(r) => {
2301				this.visit_mut_remove_function(r)?;
2302			},
2303			RemoveStatement::Analyzer(r) => {
2304				this.visit_mut_remove_analyzer(r)?;
2305			},
2306			RemoveStatement::Access(r) => {
2307				this.visit_mut_remove_access(r)?;
2308			},
2309			RemoveStatement::Param(r) => {
2310				this.visit_mut_remove_param(r)?;
2311			},
2312			RemoveStatement::Table(r) => {
2313				this.visit_mut_remove_table(r)?;
2314			},
2315			RemoveStatement::Event(r) => {
2316				this.visit_mut_remove_event(r)?;
2317			},
2318			RemoveStatement::Field(r) => {
2319				this.visit_mut_remove_field(r)?;
2320			},
2321			RemoveStatement::Index(r) => {
2322				this.visit_mut_remove_index(r)?;
2323			},
2324			RemoveStatement::User(r) => {
2325				this.visit_mut_remove_user(r)?;
2326			},
2327			RemoveStatement::Model(r) => {
2328				this.visit_mut_remove_model(r)?;
2329			},
2330			RemoveStatement::Api(r) => {
2331				this.visit_mut_remove_api(r)?;
2332			},
2333			RemoveStatement::Bucket(r) => {
2334				this.visit_mut_remove_bucket(r)?;
2335			},
2336			RemoveStatement::Sequence(r) => {
2337				this.visit_mut_remove_sequence(r)?;
2338			},
2339			RemoveStatement::Module(r) => {
2340				this.visit_mut_remove_module(r)?;
2341			},
2342			RemoveStatement::Config(r) => {
2343				this.visit_mut_remove_config(r)?;
2344			},
2345		}
2346		Ok(())
2347	}
2348
2349	fn visit_mut_remove_namespace(this, r: &mut RemoveNamespaceStatement){
2350		this.visit_mut_expr(&mut r.name)?;
2351		Ok(())
2352	}
2353
2354	fn visit_mut_remove_database(this, r: &mut RemoveDatabaseStatement){
2355		this.visit_mut_expr(&mut r.name)?;
2356		Ok(())
2357	}
2358
2359	fn visit_mut_remove_function(this, r: &mut RemoveFunctionStatement){
2360		Ok(())
2361	}
2362
2363	fn visit_mut_remove_module(this, r: &mut RemoveModuleStatement){
2364		Ok(())
2365	}
2366
2367	fn visit_mut_remove_config(this, r: &mut RemoveConfigStatement){
2368		Ok(())
2369	}
2370
2371	fn visit_mut_remove_analyzer(this, r: &mut RemoveAnalyzerStatement){
2372		this.visit_mut_expr(&mut r.name)?;
2373		Ok(())
2374	}
2375
2376	fn visit_mut_remove_access(this, r: &mut RemoveAccessStatement){
2377		this.visit_mut_expr(&mut r.name)?;
2378		Ok(())
2379	}
2380
2381	fn visit_mut_remove_param(this, r: &mut RemoveParamStatement){
2382		Ok(())
2383	}
2384
2385	fn visit_mut_remove_table(this, r: &mut RemoveTableStatement){
2386		this.visit_mut_expr(&mut r.name)?;
2387		Ok(())
2388	}
2389
2390	fn visit_mut_remove_event(this, r: &mut RemoveEventStatement){
2391		this.visit_mut_expr(&mut r.name)?;
2392		Ok(())
2393	}
2394
2395	fn visit_mut_remove_field(this, r: &mut RemoveFieldStatement){
2396		this.visit_mut_expr(&mut r.name)?;
2397		Ok(())
2398	}
2399
2400	fn visit_mut_remove_index(this, r: &mut RemoveIndexStatement){
2401		this.visit_mut_expr(&mut r.name)?;
2402		this.visit_mut_expr(&mut r.what)?;
2403		Ok(())
2404	}
2405
2406	fn visit_mut_remove_user(this, r: &mut RemoveUserStatement){
2407		this.visit_mut_expr(&mut r.name)?;
2408		Ok(())
2409	}
2410
2411	fn visit_mut_remove_model(this, r: &mut RemoveModelStatement){
2412		Ok(())
2413	}
2414
2415
2416	fn visit_mut_remove_api(this, r: &mut RemoveApiStatement){
2417		this.visit_mut_expr(&mut r.name)?;
2418		Ok(())
2419	}
2420
2421	fn visit_mut_remove_bucket(this, r: &mut RemoveBucketStatement){
2422		this.visit_mut_expr(&mut r.name)?;
2423		Ok(())
2424	}
2425
2426	fn visit_mut_remove_sequence(this, r: &mut RemoveSequenceStatement){
2427		this.visit_mut_expr(&mut r.name)?;
2428		Ok(())
2429	}
2430
2431	fn visit_mut_relate(this, o: &mut RelateStatement){
2432		this.visit_mut_expr(&mut o.through)?;
2433		this.visit_mut_expr(&mut o.from)?;
2434		this.visit_mut_expr(&mut o.to)?;
2435		if let Some(d) = o.data.as_mut(){
2436			this.visit_mut_data(d)?;
2437		}
2438		if let Some(o) = o.output.as_mut(){
2439			this.visit_mut_output(o)?;
2440		}
2441		this.visit_mut_expr(&mut o.timeout)?;
2442		Ok(())
2443	}
2444
2445	fn visit_mut_output_stmt(this, o: &mut OutputStatement){
2446		this.visit_mut_expr(&mut o.what)?;
2447		if let Some(f) = o.fetch.as_mut(){
2448			for f in f.iter_mut(){
2449				this.visit_mut_expr(&mut f.0)?;
2450			}
2451		}
2452		Ok(())
2453	}
2454
2455	fn visit_mut_insert(this, i: &mut InsertStatement){
2456		if let Some(into) = &mut i.into {
2457			this.visit_mut_expr(into)?;
2458		}
2459		this.visit_mut_data(&mut i.data)?;
2460		if let Some(update) = i.update.as_mut(){
2461			this.visit_mut_data(update)?;
2462		}
2463		if let Some(o) = i.output.as_mut(){
2464			this.visit_mut_output(o)?;
2465		}
2466		this.visit_mut_expr(&mut i.timeout)?;
2467		Ok(())
2468	}
2469
2470	fn visit_mut_info(this, i: &mut InfoStatement){
2471		match i{
2472			InfoStatement::Root(_, expr) |
2473			InfoStatement::Ns(_, expr) |
2474			InfoStatement::Db(_, expr) => {
2475				if let Some(e) = expr.as_mut(){
2476					this.visit_mut_expr(e)?;
2477				}
2478			},
2479			InfoStatement::Tb(expr, _, expr1) => {
2480				this.visit_mut_expr(expr)?;
2481				if let Some(e) = expr1.as_mut(){
2482					this.visit_mut_expr(e)?;
2483				}
2484			},
2485			InfoStatement::User(expr, base, _) => {
2486				this.visit_mut_expr(expr)?;
2487			},
2488			InfoStatement::Index(expr, expr1, _) => {
2489				this.visit_mut_expr(expr)?;
2490				this.visit_mut_expr(expr1)?;
2491			},
2492		}
2493		Ok(())
2494	}
2495
2496	fn visit_mut_if_else(this, i: &mut IfelseStatement){
2497		for e in i.exprs.iter_mut(){
2498			this.visit_mut_expr(&mut e.0)?;
2499			this.visit_mut_expr(&mut e.1)?;
2500		}
2501		if let Some(x) = i.close.as_mut(){
2502			this.visit_mut_expr(x)?;
2503		}
2504		Ok(())
2505	}
2506
2507	fn visit_mut_foreach(this, f: &mut ForeachStatement){
2508		this.visit_mut_param(&mut f.param)?;
2509		this.visit_mut_expr(&mut f.range)?;
2510		this.visit_mut_block(&mut f.block)?;
2511		Ok(())
2512	}
2513
2514	fn visit_mut_delete(this, d: &mut DeleteStatement){
2515		for v in d.what.iter_mut(){
2516			this.visit_mut_expr(v)?;
2517		}
2518		if let Some(c) = d.cond.as_mut(){
2519			this.visit_mut_expr(&mut c.0)?;
2520		}
2521		if let Some(o) = d.output.as_mut(){
2522			this.visit_mut_output(o)?;
2523		}
2524		this.visit_mut_expr(&mut d.timeout)?;
2525		Ok(())
2526	}
2527
2528	fn visit_mut_define(this, d: &mut DefineStatement){
2529		match d {
2530			DefineStatement::Namespace(d) => {
2531				this.visit_mut_define_namespace(d)?;
2532			},
2533			DefineStatement::Database(d) => {
2534				this.visit_mut_define_database(d)?;
2535			},
2536			DefineStatement::Function(d) => {
2537				this.visit_mut_define_function(d)?;
2538			},
2539			DefineStatement::Analyzer(d) => {
2540				this.visit_mut_define_analyzer(d)?;
2541			},
2542			DefineStatement::Param(d) => {
2543				this.visit_mut_define_param(d)?;
2544			},
2545			DefineStatement::Table(d) => {
2546				this.visit_mut_define_table(d)?;
2547			},
2548			DefineStatement::Event(d) => {
2549				this.visit_mut_define_event(d)?;
2550			},
2551			DefineStatement::Field(d) => {
2552				this.visit_mut_define_field(d)?;
2553			},
2554			DefineStatement::Index(d) => {
2555				this.visit_mut_define_index(d)?;
2556			},
2557			DefineStatement::User(d) => {
2558				this.visit_mut_define_user(d)?;
2559			},
2560			DefineStatement::Model(d) => {
2561				this.visit_mut_define_model(d)?;
2562			},
2563			DefineStatement::Access(d) => {
2564				this.visit_mut_define_access(d)?;
2565			},
2566			DefineStatement::Config(d) => {
2567				this.visit_mut_define_config(d)?;
2568			},
2569			DefineStatement::Api(d) => {
2570				this.visit_mut_define_api(d)?;
2571			},
2572			DefineStatement::Bucket(d) => {
2573				this.visit_mut_define_bucket(d)?;
2574			},
2575			DefineStatement::Sequence(d) => {
2576				this.visit_mut_define_sequence(d)?;
2577			},
2578			DefineStatement::Module(d) => {
2579				this.visit_mut_define_module(d)?;
2580			},
2581		}
2582		Ok(())
2583	}
2584
2585	fn visit_mut_define_sequence(this, d: &mut DefineSequenceStatement) {
2586		this.visit_mut_expr(&mut d.name)?;
2587		this.visit_mut_expr(&mut d.batch)?;
2588		this.visit_mut_expr(&mut d.start)?;
2589
2590		this.visit_mut_expr(&mut d.timeout)?;
2591		Ok(())
2592	}
2593
2594	fn visit_mut_define_bucket(this, d: &mut DefineBucketStatement) {
2595		this.visit_mut_expr(&mut d.name)?;
2596		if let Some(expr) = d.backend.as_mut(){
2597			this.visit_mut_expr(expr)?;
2598		}
2599		this.visit_mut_permission(&mut d.permissions)?;
2600		this.visit_mut_expr(&mut d.comment)?;
2601		Ok(())
2602	}
2603
2604	fn visit_mut_define_api(this, d: &mut DefineApiStatement) {
2605		this.visit_mut_expr(&mut d.path)?;
2606		for act in d.actions.iter_mut(){
2607			this.visit_mut_api_action(act)?;
2608		}
2609		if let Some(f) = d.fallback.as_mut(){
2610			this.visit_mut_expr(f)?;
2611		}
2612		this.visit_mut_api_config(&mut d.config)?;
2613		this.visit_mut_expr(&mut d.comment)?;
2614
2615		Ok(())
2616	}
2617
2618	fn visit_mut_api_action(this, a: &mut ApiAction){
2619		this.visit_mut_expr(&mut a.action)?;
2620		this.visit_mut_api_config(&mut a.config)?;
2621		Ok(())
2622	}
2623
2624
2625	fn visit_mut_define_config(this, d: &mut DefineConfigStatement) {
2626		this.visit_mut_config_inner(&mut d.inner)
2627	}
2628
2629	fn visit_mut_config_inner(this, d: &mut ConfigInner){
2630		match d {
2631			ConfigInner::GraphQL(graph_qlconfig) => {
2632				this.visit_mut_graphql_config(graph_qlconfig)?;
2633			},
2634			ConfigInner::Api(api_config) => {
2635				this.visit_mut_api_config(api_config)?;
2636			},
2637			ConfigInner::Default(default_config) => {
2638				this.visit_mut_default_config(default_config)?;
2639			},
2640		}
2641		Ok(())
2642	}
2643
2644	fn visit_mut_graphql_config(this, d: &mut GraphQLConfig){
2645		Ok(())
2646	}
2647
2648	fn visit_mut_api_config(this, d: &mut ApiConfig){
2649		for m in d.middleware.iter_mut(){
2650			for v in m.args.iter_mut(){
2651				this.visit_mut_expr(v)?;
2652			}
2653		}
2654		this.visit_mut_permission(&mut d.permissions)?;
2655		Ok(())
2656	}
2657
2658	fn visit_mut_default_config(this, d: &mut DefaultConfig) {
2659		this.visit_mut_expr(&mut d.namespace)?;
2660		this.visit_mut_expr(&mut d.database)?;
2661		Ok(())
2662	}
2663
2664	fn visit_mut_define_access(this, d: &mut DefineAccessStatement) {
2665		this.visit_mut_expr(&mut d.name)?;
2666		this.visit_mut_access_type(&mut d.access_type)?;
2667		if let Some(v) = d.authenticate.as_mut(){
2668			this.visit_mut_expr(v)?;
2669		}
2670		if let Some(v) = d.context.as_mut(){
2671			this.visit_mut_expr(v)?;
2672		}
2673		this.visit_mut_expr(&mut d.duration.grant)?;
2674		this.visit_mut_expr(&mut d.duration.token)?;
2675		this.visit_mut_expr(&mut d.duration.session)?;
2676		this.visit_mut_expr(&mut d.comment)?;
2677		Ok(())
2678	}
2679
2680	fn visit_mut_access_type(this, a: &mut AccessType) {
2681		match a {
2682			AccessType::Record(r) => { this.visit_mut_record_access(r)?; },
2683			AccessType::Jwt(j) => { this.visit_mut_jwt_access(j)?; },
2684			AccessType::Bearer(b) => { this.visit_mut_bearer_access(b)?; },
2685		}
2686		Ok(())
2687	}
2688
2689	fn visit_mut_record_access(this, r: &mut RecordAccess){
2690		if let Some(e) = r.signup.as_mut(){
2691			this.visit_mut_expr(e)?
2692		}
2693		if let Some(e) = r.signin.as_mut(){
2694			this.visit_mut_expr(e)?
2695		}
2696
2697		this.visit_mut_jwt_access(&mut r.jwt)?;
2698		if let Some(b) = r.bearer.as_mut(){
2699			this.visit_mut_bearer_access(b)?;
2700		}
2701		Ok(())
2702	}
2703
2704	fn visit_mut_jwt_access(this, j: &mut JwtAccess){
2705		match j.verify{
2706			JwtAccessVerify::Key(ref mut k) => {
2707				this.visit_mut_expr(&mut k.key)?
2708
2709			},
2710			JwtAccessVerify::Jwks(ref mut j) => {
2711				this.visit_mut_expr(&mut j.url)?
2712			},
2713		}
2714
2715		if let Some(i) = j.issue.as_mut(){
2716			this.visit_mut_expr(&mut i.key)?
2717		}
2718
2719		Ok(())
2720	}
2721
2722	fn visit_mut_bearer_access(this, r: &mut BearerAccess){
2723		this.visit_mut_jwt_access(&mut r.jwt)?;
2724		Ok(())
2725	}
2726
2727	fn visit_mut_define_model(this, d: &mut DefineModelStatement) {
2728		this.visit_mut_permission(&mut d.permissions)?;
2729		this.visit_mut_expr(&mut d.comment)?;
2730		Ok(())
2731	}
2732
2733	fn visit_mut_define_module(this, d: &mut DefineModuleStatement) {
2734		this.visit_mut_permission(&mut d.permissions)?;
2735		this.visit_mut_expr(&mut d.comment)?;
2736		Ok(())
2737	}
2738
2739	fn visit_mut_define_user(this, d: &mut DefineUserStatement) {
2740		this.visit_mut_expr(&mut d.name)?;
2741		this.visit_mut_expr(&mut d.duration.token)?;
2742		this.visit_mut_expr(&mut d.duration.session)?;
2743		this.visit_mut_expr(&mut d.comment)?;
2744		Ok(())
2745	}
2746
2747	fn visit_mut_define_index(this, d: &mut DefineIndexStatement) {
2748		this.visit_mut_expr(&mut d.name)?;
2749		this.visit_mut_expr(&mut d.what)?;
2750		for c in d.cols.iter_mut(){
2751			this.visit_mut_expr(c)?;
2752		}
2753		this.visit_mut_expr(&mut d.comment)?;
2754		Ok(())
2755	}
2756
2757	fn visit_mut_define_field(this, d: &mut DefineFieldStatement) {
2758		this.visit_mut_expr(&mut d.name)?;
2759		this.visit_mut_expr(&mut d.what)?;
2760		if let Some(k) = d.field_kind.as_mut(){
2761			this.visit_mut_kind(k)?;
2762		}
2763		if let Some(v) = d.value.as_mut(){
2764			this.visit_mut_expr(v)?;
2765		}
2766		if let Some(v) = d.assert.as_mut(){
2767			this.visit_mut_expr(v)?;
2768		}
2769		if let Some(v) = d.computed.as_mut(){
2770			this.visit_mut_expr(v)?;
2771		}
2772		match d.default{
2773			DefineDefault::None => {},
2774			DefineDefault::Always(ref mut expr) |
2775			DefineDefault::Set(ref mut expr) => this.visit_mut_expr(expr)?,
2776		}
2777		this.visit_mut_permissions(&mut d.permissions)?;
2778		if let Some(r) = d.reference.as_mut(){
2779			this.visit_mut_reference(r)?;
2780		}
2781		this.visit_mut_expr(&mut d.comment)?;
2782		Ok(())
2783	}
2784
2785	fn visit_mut_reference(this, d: &mut Reference){
2786		this.visit_mut_delete_strategy(&mut d.on_delete)
2787
2788	}
2789
2790	fn visit_mut_delete_strategy(this, d: &mut ReferenceDeleteStrategy){
2791		match d {
2792			ReferenceDeleteStrategy::Reject |
2793				ReferenceDeleteStrategy::Ignore |
2794				ReferenceDeleteStrategy::Cascade |
2795				ReferenceDeleteStrategy::Unset => {},
2796			ReferenceDeleteStrategy::Custom(value) => {
2797				this.visit_mut_expr(value)?;
2798			},
2799
2800		}
2801		Ok(())
2802	}
2803
2804
2805	fn visit_mut_define_event(this, d: &mut DefineEventStatement){
2806		this.visit_mut_expr(&mut d.name)?;
2807		this.visit_mut_expr(&mut d.target_table)?;
2808		this.visit_mut_expr(&mut d.when)?;
2809		for v in d.then.iter_mut(){
2810			this.visit_mut_expr(v)?;
2811		}
2812		this.visit_mut_expr(&mut d.comment)?;
2813		Ok(())
2814	}
2815
2816	fn visit_mut_define_table(this, d: &mut DefineTableStatement){
2817		this.visit_mut_expr(&mut d.name)?;
2818		if let Some(v) = d.view.as_mut(){
2819			this.visit_mut_view(v)?;
2820		}
2821		this.visit_mut_permissions(&mut d.permissions)?;
2822		this.visit_mut_expr(&mut d.comment)?;
2823
2824		this.visit_mut_table_type(&mut d.table_type)?;
2825
2826		Ok(())
2827	}
2828
2829	fn visit_mut_table_type(this, t: &mut TableType){
2830		match t {
2831			TableType::Any |
2832				TableType::Normal => {}
2833			TableType::Relation(relation) => {
2834				this.visit_mut_relation(relation)?;
2835			},
2836		}
2837		Ok(())
2838	}
2839
2840	fn visit_mut_relation(this, r: &mut Relation){
2841		Ok(())
2842	}
2843
2844	fn visit_mut_permissions(this, d: &mut Permissions){
2845		this.visit_mut_permission(&mut d.select)?;
2846		this.visit_mut_permission(&mut d.create)?;
2847		this.visit_mut_permission(&mut d.update)?;
2848		this.visit_mut_permission(&mut d.delete)?;
2849		Ok(())
2850	}
2851
2852	fn visit_mut_view(this, v: &mut View){
2853		this.visit_mut_fields(&mut v.expr)?;
2854
2855		if let Some(c) = v.cond.as_mut(){
2856			this.visit_mut_expr(&mut c.0)?;
2857		}
2858
2859		if let Some(g) = v.group.as_mut(){
2860			for g in g.0.iter_mut(){
2861				this.visit_mut_idiom(&mut g.0)?
2862			}
2863		}
2864
2865		Ok(())
2866	}
2867
2868	fn visit_mut_define_param(this, d: &mut DefineParamStatement){
2869		this.visit_mut_expr(&mut d.value)?;
2870		this.visit_mut_expr(&mut d.comment)?;
2871		this.visit_mut_permission(&mut d.permissions)?;
2872		Ok(())
2873	}
2874
2875	fn visit_mut_define_analyzer(this, d: &mut DefineAnalyzerStatement){
2876		this.visit_mut_expr(&mut d.name)?;
2877		this.visit_mut_expr(&mut d.comment)?;
2878		Ok(())
2879	}
2880
2881	fn visit_mut_define_function(this, d: &mut DefineFunctionStatement){
2882		for (_, k) in d.args.iter_mut(){
2883			this.visit_mut_kind(k)?;
2884		}
2885		this.visit_mut_block(&mut d.block)?;
2886		this.visit_mut_permission(&mut d.permissions)?;
2887		this.visit_mut_expr(&mut d.comment)?;
2888		if let Some(k) = d.returns.as_mut(){
2889			this.visit_mut_kind(k)?;
2890		}
2891		Ok(())
2892	}
2893
2894	fn visit_mut_permission(this, p: &mut Permission){
2895		match p {
2896			Permission::None |
2897				Permission::Full => {},
2898			Permission::Specific(expr) => {
2899				// A statement's guard is an expression, so a mutating pass walks it
2900				// directly. It becomes canonical text only when the definition it
2901				// belongs to is written, which is why nothing here compiles, renders,
2902				// or has to decide whether the tree changed.
2903				this.visit_mut_expr(expr)?;
2904			},
2905		}
2906		Ok(())
2907	}
2908
2909	fn visit_mut_define_database(this,  d: &mut DefineDatabaseStatement){
2910		this.visit_mut_expr(&mut d.name)?;
2911		this.visit_mut_expr(&mut d.comment)?;
2912		Ok(())
2913	}
2914
2915	fn visit_mut_define_namespace(this,  d: &mut DefineNamespaceStatement){
2916		this.visit_mut_expr(&mut d.name)?;
2917		this.visit_mut_expr(&mut d.comment)?;
2918		Ok(())
2919	}
2920
2921	fn visit_mut_create(this, c: &mut CreateStatement){
2922		for w in c.what.iter_mut(){
2923			this.visit_mut_expr(w)?;
2924		}
2925
2926		if let Some(data) = c.data.as_mut(){
2927			this.visit_mut_data(data)?;
2928		}
2929
2930		if let Some(output) = c.output.as_mut(){
2931			this.visit_mut_output(output)?;
2932		}
2933
2934		this.visit_mut_expr(&mut c.timeout)?;
2935
2936		Ok(())
2937	}
2938
2939	fn visit_mut_output(this, o: &mut Output){
2940		match o {
2941			Output::None |
2942				Output::Null |
2943				Output::Diff |
2944				Output::After |
2945				Output::Before => {},
2946			Output::Fields(fields) => {
2947				this.visit_mut_fields(fields)?;
2948			},
2949		}
2950		Ok(())
2951	}
2952
2953	fn visit_mut_data(this, d: &mut Data){
2954		match d {
2955			Data::EmptyExpression => {},
2956			Data::UpdateExpression(assign) |
2957				Data::SetExpression(assign) => {
2958					for a in assign{
2959						this.visit_mut_assignment(a)?;
2960					}
2961				},
2962			Data::UnsetExpression(idioms) => {
2963				for i in idioms {
2964					this.visit_mut_idiom(i)?;
2965				}
2966			},
2967			Data::PatchExpression(value) |
2968				Data::MergeExpression(value) |
2969				Data::ReplaceExpression(value) |
2970				Data::ContentExpression(value) |
2971				Data::SingleExpression(value) => {
2972					this.visit_mut_expr(value)?;
2973				},
2974			Data::ValuesExpression(items) => {
2975				for (i,v) in items.iter_mut().flat_map(|x| x.iter_mut()){
2976					this.visit_mut_idiom(i)?;
2977					this.visit_mut_expr(v)?;
2978				}
2979			},
2980		}
2981		Ok(())
2982	}
2983
2984	fn visit_mut_assignment(this, a: &mut Assignment){
2985		this.visit_mut_idiom(&mut a.place)?;
2986		this.visit_mut_expr(&mut a.value)?;
2987		Ok(())
2988	}
2989
2990
2991	/*fn visit_mut_refs(this, r: &mut Refs){
2992		for (_,i) in r.0.iter_mut(){
2993			if let Some(i) = i.as_mut(){
2994				this.visit_mut_idiom(i)?;
2995			}
2996		}
2997		Ok(())
2998	}*/
2999
3000
3001	fn visit_mut_closure(this, c: &mut ClosureExpr){
3002		for (_,k) in c.args.iter_mut(){
3003			this.visit_mut_kind(k)?;
3004		}
3005		if let Some(k) = c.returns.as_mut(){
3006			this.visit_mut_kind(k)?;
3007		}
3008		this.visit_mut_expr(&mut c.body)?;
3009		Ok(())
3010	}
3011
3012	fn visit_mut_model(this, m: &mut Model) {
3013		Ok(())
3014	}
3015
3016
3017	fn visit_mut_function_call(this, f: &mut FunctionCall){
3018		this.visit_mut_function(&mut f.receiver)?;
3019		for a in f.arguments.iter_mut(){
3020			this.visit_mut_expr(a)?;
3021		}
3022		Ok(())
3023	}
3024
3025	fn visit_mut_function(this, f: &mut Function){
3026		Ok(())
3027	}
3028
3029
3030	fn visit_mut_block(this, value: &mut Block){
3031		for v in value.0.iter_mut(){
3032			this.visit_mut_expr(v)?;
3033		}
3034		Ok(())
3035
3036	}
3037
3038	fn visit_mut_kind(this, kind: &mut Kind){
3039		match kind {
3040			Kind::None |
3041				Kind::Any |
3042				Kind::Null |
3043				Kind::Bool |
3044				Kind::Bytes |
3045				Kind::Datetime |
3046				Kind::Decimal |
3047				Kind::Duration |
3048				Kind::Float |
3049				Kind::Int |
3050				Kind::Number |
3051				Kind::Object |
3052				Kind::String |
3053				Kind::Uuid |
3054				Kind::Regex |
3055				Kind::Range |
3056				Kind::Record(_) |
3057				Kind::Geometry(_) |
3058				Kind::Table(_) |
3059				Kind::File(_) => {}
3060			Kind::Either(kinds) => {
3061				for k in kinds.iter_mut() {
3062					this.visit_mut_kind(k)?;
3063				}
3064			},
3065			Kind::Set(kind, _) => {
3066				this.visit_mut_kind(kind)?;
3067			},
3068			Kind::Array(kind, _) => {
3069				this.visit_mut_kind(kind)?;
3070			},
3071			Kind::Function(kinds, kind) => {
3072				if let Some(kinds) = kinds.as_mut(){
3073					for k in kinds.iter_mut() {
3074						this.visit_mut_kind(k)?;
3075					}
3076				}
3077				if let Some(k) = kind {
3078					this.visit_mut_kind(k)?;
3079				}
3080			},
3081			Kind::Literal(literal) => {
3082				this.visit_mut_kind_literal(literal)?;
3083			},
3084		}
3085		Ok(())
3086	}
3087
3088	fn visit_mut_kind_literal(this, k: &mut KindLiteral){
3089		match k{
3090			KindLiteral::String(_) => {},
3091			KindLiteral::Bool(_) => {},
3092			KindLiteral::Duration(_) => {},
3093			KindLiteral::Float(_) => {},
3094			KindLiteral::Integer(_) => {},
3095			KindLiteral::Decimal(_) => {},
3096			KindLiteral::Array(kinds) => {
3097				for k in kinds.iter_mut(){
3098					this.visit_mut_kind(k)?;
3099				}
3100			},
3101			KindLiteral::Object(btree_map) => {
3102				for v in btree_map.values_mut(){
3103					this.visit_mut_kind(v)?;
3104				}
3105			},
3106		}
3107		Ok(())
3108
3109	}
3110
3111	fn visit_mut_record_id(this, t: &mut RecordIdLit) {
3112		this.visit_mut_record_id_key(&mut t.key)
3113	}
3114
3115	fn visit_mut_record_id_key(this, id: &mut RecordIdKeyLit) {
3116		match id {
3117			RecordIdKeyLit::Number(_) => {},
3118			RecordIdKeyLit::String(_) => {},
3119			RecordIdKeyLit::Uuid(_) => {},
3120			RecordIdKeyLit::Array(array) => {
3121				for e in array.iter_mut(){
3122					this.visit_mut_expr(e)?;
3123				}
3124			},
3125			RecordIdKeyLit::Object(object) => {
3126				for e in object.iter_mut(){
3127					this.visit_mut_expr(&mut e.value)?;
3128				}
3129			},
3130			RecordIdKeyLit::Generate(_) => {},
3131			RecordIdKeyLit::Range(id_range) => {
3132				this.visit_mut_record_id_key_range(id_range)?;
3133			},
3134		}
3135		Ok(())
3136	}
3137
3138	fn visit_mut_record_id_key_range(this, id_range: &mut RecordIdKeyRangeLit)  {
3139		match id_range.start{
3140			Bound::Included(ref mut x) | Bound::Excluded(ref mut x) => {
3141				this.visit_mut_record_id_key(x)?;
3142			},
3143			Bound::Unbounded => {},
3144		}
3145		match id_range.end{
3146			Bound::Included(ref mut x) | Bound::Excluded(ref mut x) => {
3147				this.visit_mut_record_id_key(x)?;
3148			},
3149			Bound::Unbounded => {},
3150		}
3151		Ok(())
3152	}
3153
3154	fn visit_mut_param(_this, _param: &mut Param) {
3155		Ok(())
3156	}
3157
3158	fn visit_mut_idiom(this, idiom: &mut Idiom) {
3159		for p in idiom.0.iter_mut(){
3160			this.visit_mut_part(p)?;
3161		}
3162		Ok(())
3163	}
3164
3165	fn visit_mut_part(this, part: &mut Part) {
3166		match part{
3167			Part::All |
3168				Part::Flatten |
3169				Part::Last |
3170				Part::First |
3171				Part::Optional |
3172				Part::Field(_) |
3173				Part::Doc |
3174				Part::RepeatRecurse  => {}
3175			Part::Where(value) | Part::Value(value) | Part::Start(value) => {
3176				this.visit_mut_expr(value)?;
3177			},
3178			Part::Method(_, values) => {
3179				for v in values {
3180					this.visit_mut_expr(v)?;
3181				}
3182			},
3183			Part::Destructure(destructure_parts) => {
3184				for p in destructure_parts.iter_mut(){
3185					this.visit_mut_destructure_part(p)?;
3186				}
3187			},
3188			Part::Recurse(recurse, idiom, recurse_instruction) => {
3189				this.visit_mut_recurse(recurse)?;
3190				if let Some(idiom) = idiom.as_mut(){
3191					this.visit_mut_idiom(idiom)?;
3192				}
3193				if let Some(instr) = recurse_instruction.as_mut(){
3194					this.visit_mut_recurse_instruction(instr)?;
3195				}
3196			},
3197			Part::Lookup(l) => {
3198				this.visit_mut_lookup(l)?;
3199			}
3200		}
3201		Ok(())
3202	}
3203
3204	fn visit_mut_lookup(this, l: &mut Lookup){
3205		if let Some(f)  = l.expr.as_mut(){
3206			this.visit_mut_fields(f)?;
3207		}
3208		for w in l.what.iter_mut(){
3209			this.visit_mut_lookup_subject(w)?;
3210		}
3211
3212		if let Some(c) = l.cond.as_mut(){
3213			this.visit_mut_expr(&mut c.0)?;
3214		}
3215
3216		if let Some(s) = l.split.as_mut(){
3217			for s in s.0.iter_mut(){
3218				this.visit_mut_idiom(&mut s.0)?;
3219			}
3220		}
3221
3222		if let Some(groups) = l.group.as_mut() {
3223			for g in groups.0.iter_mut(){
3224				this.visit_mut_idiom(&mut g.0)?;
3225			}
3226		}
3227
3228		if let Some(order) = l.order.as_mut(){
3229			this.visit_mut_ordering(order)?;
3230		}
3231
3232		if let Some(limit) = l.limit.as_mut(){
3233			this.visit_mut_expr(&mut limit.0)?;
3234		}
3235
3236		if let Some(start) = l.start.as_mut(){
3237			this.visit_mut_expr(&mut start.0)?;
3238		}
3239
3240		if let Some(alias) = l.alias.as_mut(){
3241			this.visit_mut_idiom(alias)?;
3242		}
3243
3244		Ok(())
3245
3246	}
3247
3248	fn visit_mut_recurse_instruction(this, r: &mut RecurseInstruction){
3249		match r {
3250			RecurseInstruction::Path { ..} |
3251				RecurseInstruction::Collect { ..} => {}
3252			RecurseInstruction::Shortest { expects, .. } => {
3253				this.visit_mut_expr(expects)?;
3254			},
3255		}
3256		Ok(())
3257	}
3258
3259	fn visit_mut_recurse(_this, _r: &mut Recurse){
3260		Ok(())
3261	}
3262
3263	fn visit_mut_destructure_part(this, p: &mut DestructurePart) {
3264		match p {
3265			DestructurePart::All(_) |
3266				DestructurePart::Field(_) => {},
3267				DestructurePart::Aliased(_, idiom) => {
3268					this.visit_mut_idiom(idiom)?;
3269				},
3270				DestructurePart::Destructure(_, destructure_parts) => {
3271					for p in destructure_parts{
3272						this.visit_mut_destructure_part(p)?;
3273					}
3274				},
3275		}
3276		Ok(())
3277	}
3278
3279
3280	fn visit_mut_ordering(this, ordering: &mut Ordering){
3281		match ordering{
3282			Ordering::Random => {},
3283			Ordering::Order(order_list) => {
3284				for o in order_list.0.iter_mut(){
3285					this.visit_mut_idiom(&mut o.value)?;
3286				}
3287			},
3288		}
3289		Ok(())
3290	}
3291
3292	fn visit_mut_fields(this, fields: &mut Fields) {
3293		match fields {
3294			Fields::Value(field) => {
3295				this.visit_mut_selector(field)?;
3296			},
3297			Fields::Select(fields) => {
3298				for f in fields.iter_mut(){
3299					this.visit_mut_field(f)?;
3300				}
3301			},
3302		}
3303
3304		Ok(())
3305	}
3306
3307	fn visit_mut_field(this, field: &mut Field){
3308		match field {
3309			Field::All => {},
3310			Field::Single(s) => this.visit_mut_selector(s)?,
3311		}
3312		Ok(())
3313	}
3314
3315	fn visit_mut_selector(this, selector: &mut Selector){
3316		this.visit_mut_expr(&mut selector.expr)?;
3317		if let Some(alias) = &mut selector.alias{
3318			this.visit_mut_idiom(alias)?;
3319		}
3320		Ok(())
3321	}
3322
3323	fn visit_mut_lookup_subject(this, subject: &mut LookupSubject){
3324		match subject{
3325			LookupSubject::Table { .. } => {},
3326			LookupSubject::Range { range, .. } => {
3327				this.visit_mut_record_id_key_range(range)?;
3328			},
3329		}
3330		Ok(())
3331	}
3332}
3333
3334#[cfg(test)]
3335mod tests {
3336	use std::convert::Infallible;
3337
3338	use super::{MutVisitor, VisitMut};
3339	use crate::expr::permission::Permission;
3340	use crate::expr::{Expr, Literal};
3341
3342	fn guard(p: &Permission) -> &Expr {
3343		let Permission::Specific(expr) = p else {
3344			panic!("expected a specific permission");
3345		};
3346		expr
3347	}
3348
3349	/// A mutating pass reaches the guard expression and its mutation sticks.
3350	///
3351	/// A statement's guard is an expression, so this is a plain walk. It used to
3352	/// be a compile of stored text followed by a re-render, which is what made a
3353	/// no-op pass able to rewrite persisted definition text and made the
3354	/// rewrite depend on `Expr` equality.
3355	#[test]
3356	fn mutating_walk_reaches_the_guard() {
3357		struct Increment;
3358		impl MutVisitor for Increment {
3359			type Error = Infallible;
3360
3361			fn visit_mut_expr(&mut self, e: &mut Expr) -> Result<(), Self::Error> {
3362				if let Expr::Literal(Literal::Integer(i)) = e {
3363					*i += 1;
3364				}
3365				e.visit_mut(self)
3366			}
3367		}
3368
3369		let mut p = Permission::Specific(Expr::Literal(Literal::Integer(1)));
3370		p.visit_mut(&mut Increment).unwrap();
3371		assert_eq!(guard(&p), &Expr::Literal(Literal::Integer(2)));
3372	}
3373
3374	/// A pass that changes nothing leaves the guard untouched. There is no
3375	/// render step to accidentally trigger, so this holds by construction — it
3376	/// is pinned because the previous shape could not offer it.
3377	#[test]
3378	fn non_mutating_walk_leaves_the_guard_untouched() {
3379		struct Noop;
3380		impl MutVisitor for Noop {
3381			type Error = Infallible;
3382		}
3383
3384		let original = Expr::Literal(Literal::Integer(1));
3385		let mut p = Permission::Specific(original.clone());
3386		p.visit_mut(&mut Noop).unwrap();
3387		assert_eq!(guard(&p), &original);
3388	}
3389}