1use std::collections::HashMap;
21
22use rudb_common::{Error, IdentifierCase, Result, Span, Value};
23
24use crate::ast::{
25 Ast, BinaryOp, CaseArm, ColumnDef, CreateTable, CreateView, Cte, Distinct, DropTable, Expr,
26 ExprRef, Insert, JoinKind, LiteralKind, Nulls, Order, OrderItem, Quantifier, Query, QueryBody,
27 QueryRef, Scope, Select, SelectRef, SetOp, Setting, Slice, Source, SourceRef, Statement,
28 StrRef, Target, UnaryOp, WindowBound, WindowExclude, WindowRef, WindowSpec, WindowUnit,
29};
30use crate::generated::rules::PROGRAM;
31use crate::matcher::{NONE, Tree, parse_tokens};
32use crate::token::{Kind, Token};
33use crate::tokenize::tokenize;
34
35pub fn parse_ast(query: &str) -> Result<Ast> {
41 parse_ast_with_case(query, IdentifierCase::Preserve)
42}
43
44pub fn parse_ast_with_case(query: &str, identifier_case: IdentifierCase) -> Result<Ast> {
46 let tokens = tokenize(query)?;
47 let tree = parse_tokens(query, &tokens, PROGRAM, true)?;
48 transform_with_case(query, &tokens, &tree, identifier_case)
49}
50
51pub fn transform(query: &str, tokens: &[Token], tree: &Tree) -> Result<Ast> {
53 transform_with_case(query, tokens, tree, IdentifierCase::Preserve)
54}
55
56pub fn transform_with_case(
58 query: &str,
59 tokens: &[Token],
60 tree: &Tree,
61 identifier_case: IdentifierCase,
62) -> Result<Ast> {
63 let mut transform = Transform {
64 query,
65 tokens,
66 tree,
67 ast: Ast::default(),
68 interned: HashMap::new(),
69 anonymous: 0,
70 identifier_case,
71 current_span: Span::new(0, 0),
72 ctes: Vec::new(),
73 named_windows: Vec::new(),
74 };
75 transform.program(tree.root())?;
76 Ok(transform.ast)
77}
78
79fn is_statement(name: &str) -> bool {
92 let folded = name.to_ascii_lowercase();
93 folded.starts_with("enable_")
94 || folded.starts_with("disable_")
95 || folded == "force_checkpoint"
96 || folded == "verify_parallelism"
97}
98
99struct Transform<'a> {
100 query: &'a str,
101 tokens: &'a [Token],
102 tree: &'a Tree,
103 ast: Ast,
104 interned: HashMap<String, StrRef>,
105 anonymous: u32,
107 identifier_case: IdentifierCase,
108 current_span: Span,
109 ctes: Vec<(StrRef, Held, Slice)>,
117 named_windows: Vec<(StrRef, WindowRef, bool)>,
124}
125
126#[derive(Debug, Clone, Copy)]
128enum Held {
129 Inline(QueryRef),
131 Once(u32),
133}
134
135impl<'a> Transform<'a> {
136 fn text(&self, node: u32) -> &'a str {
140 self.tree.text(node, self.query, self.tokens)
141 }
142
143 fn span(&self, node: u32) -> Span {
145 let parsed = self.tree.node(node);
146 if parsed.start >= parsed.end {
147 let at = self
148 .tokens
149 .get(parsed.start as usize)
150 .map_or(self.query.len() as u32, |token| token.start);
151 return Span::new(at, at);
152 }
153 let first = self.tokens[parsed.start as usize];
154 let last = self.tokens[parsed.end as usize - 1];
155 Span::new(first.start, last.end)
156 }
157
158 fn name(&self, node: u32) -> &'static str {
160 self.tree.name(node)
161 }
162
163 fn kids(&self, node: u32) -> impl Iterator<Item = u32> + use<'a> {
169 let tree = self.tree;
170 tree.children(node)
171 }
172
173 fn count(&self, node: u32) -> usize {
175 self.kids(node).count()
176 }
177
178 fn nth(&self, node: u32, n: usize) -> u32 {
180 self.kids(node).nth(n).unwrap_or(NONE)
181 }
182
183 fn first(&self, node: u32) -> u32 {
185 self.nth(node, 0)
186 }
187
188 fn find(&self, node: u32, name: &str) -> u32 {
195 self.kids(node).find(|&kid| self.name(kid) == name).unwrap_or(NONE)
196 }
197
198 fn descendant(&self, node: u32, name: &str) -> u32 {
200 if self.name(node) == name {
201 return node;
202 }
203 self.kids(node)
204 .map(|kid| self.descendant(kid, name))
205 .find(|&found| found != NONE)
206 .unwrap_or(NONE)
207 }
208
209 fn contains(&self, node: u32, name: &str) -> bool {
211 self.name(node) == name || self.kids(node).any(|kid| self.contains(kid, name))
212 }
213
214 fn leaves(&self, node: u32, out: &mut Vec<u32>) {
221 let mut any = false;
222 for kid in self.kids(node) {
223 any = true;
224 self.leaves(kid, &mut *out);
225 }
226 if !any {
227 out.push(node);
228 }
229 }
230
231 fn intern(&mut self, text: &str) -> StrRef {
235 if let Some(&index) = self.interned.get(text) {
236 return index;
237 }
238 let index = u32::try_from(self.ast.strings.len())
239 .map_err(|_| Error::internal("more than four billion strings in one query"))
240 .unwrap_or(NONE);
241 self.ast.strings.push(text.to_string());
242 self.interned.insert(text.to_string(), index);
243 index
244 }
245
246 fn push(&mut self, expr: Expr) -> ExprRef {
248 let index = self.ast.exprs.len() as u32;
249 self.ast.exprs.push(expr);
250 self.ast.expr_spans.push(self.current_span);
251 index
252 }
253
254 fn push_source(&mut self, source: Source) -> SourceRef {
256 let index = self.ast.sources.len() as u32;
257 self.ast.sources.push(source);
258 index
259 }
260
261 fn push_query(&mut self, query: Query) -> QueryRef {
263 let index = self.ast.queries.len() as u32;
264 self.ast.queries.push(query);
265 self.ast.query_spans.push(self.current_span);
266 index
267 }
268
269 fn push_select(&mut self, select: Select) -> SelectRef {
271 let index = self.ast.selects.len() as u32;
272 self.ast.selects.push(select);
273 index
274 }
275
276 fn push_window(&mut self, spec: WindowSpec) -> WindowRef {
278 let index = self.ast.windows.len() as u32;
279 self.ast.windows.push(spec);
280 index
281 }
282
283 fn order_slice(&mut self, items: Vec<OrderItem>) -> Slice {
285 let start = self.ast.order_items.len() as u32;
286 self.ast.order_items.extend(items);
287 Slice { start, len: self.ast.order_items.len() as u32 - start }
288 }
289
290 fn expr_slice(&mut self, items: Vec<ExprRef>) -> Slice {
292 let start = self.ast.expr_lists.len() as u32;
293 self.ast.expr_lists.extend(items);
294 Slice { start, len: self.ast.expr_lists.len() as u32 - start }
295 }
296
297 fn part_slice(&mut self, items: Vec<StrRef>) -> Slice {
299 let start = self.ast.parts.len() as u32;
300 self.ast.parts.extend(items);
301 Slice { start, len: self.ast.parts.len() as u32 - start }
302 }
303
304 fn cte_slice(&mut self, items: Vec<u32>) -> Slice {
306 let start = self.ast.cte_lists.len() as u32;
307 self.ast.cte_lists.extend(items);
308 Slice { start, len: self.ast.cte_lists.len() as u32 - start }
309 }
310
311 fn column_def_slice(&mut self, items: Vec<ColumnDef>) -> Slice {
313 let start = self.ast.column_defs.len() as u32;
314 self.ast.column_defs.extend(items);
315 Slice { start, len: self.ast.column_defs.len() as u32 - start }
316 }
317
318 fn target_slice(&mut self, items: Vec<Target>) -> Slice {
320 let start = self.ast.targets.len() as u32;
321 self.ast.targets.extend(items);
322 Slice { start, len: self.ast.targets.len() as u32 - start }
323 }
324
325 fn name_list_slice(&mut self, items: Vec<Slice>) -> Slice {
327 let start = self.ast.name_lists.len() as u32;
328 self.ast.name_lists.extend(items);
329 Slice { start, len: self.ast.name_lists.len() as u32 - start }
330 }
331
332 fn unsupported<T>(&self, node: u32) -> Result<T> {
337 let text = self.text(node);
338 let text = if text.chars().count() > 60 {
339 let cut = text.char_indices().nth(60).map_or(text.len(), |(at, _)| at);
340 format!("{}...", &text[..cut])
341 } else {
342 text.to_string()
343 };
344 Err(Error::not_implemented(format!(
345 "{text} is not supported yet, the grammar rule is {}",
346 self.name(node)
347 )))
348 }
349
350 fn identifier(&mut self, node: u32) -> StrRef {
354 let mut leaves = Vec::new();
355 self.leaves(node, &mut leaves);
356 let text = leaves.last().map_or("", |&leaf| self.text(leaf));
357 let text = self.fold_identifier(text.strip_suffix('.').unwrap_or(text));
358 self.intern(&text)
359 }
360
361 fn name_parts(&mut self, node: u32) -> Slice {
363 let mut leaves = Vec::new();
364 self.leaves(node, &mut leaves);
365 let mut parts = Vec::with_capacity(leaves.len());
366 for leaf in leaves {
367 let text = self.text(leaf);
368 if text.is_empty() || text == "*" {
371 continue;
372 }
373 let text = self.fold_identifier(text.strip_suffix('.').unwrap_or(text));
374 let interned = self.intern(&text);
375 parts.push(interned);
376 }
377 self.part_slice(parts)
378 }
379
380 fn fold_identifier(&self, text: &str) -> String {
381 if text.starts_with(['"', '\'']) {
382 return unquote(text);
383 }
384 match self.identifier_case {
385 IdentifierCase::Preserve => text.to_string(),
386 IdentifierCase::Lower => text.to_ascii_lowercase(),
387 IdentifierCase::Upper => text.to_ascii_uppercase(),
388 }
389 }
390
391 fn program(&mut self, node: u32) -> Result<()> {
395 for top in self.kids(node) {
396 let Some(statement) = self.kids(top).find(|&kid| self.name(kid) == "Statement") else {
401 continue;
402 };
403 let statement = self.statement(statement)?;
404 self.ast.statements.push(statement);
405 }
406 Ok(())
407 }
408
409 fn statement(&mut self, node: u32) -> Result<Statement> {
411 let inner = self.first(node);
412 match self.name(inner) {
413 "SelectStatement" => {
414 let query = self.query(self.first(inner))?;
415 Ok(Statement::Query(query))
416 }
417 "CreateStatement" => self.create_statement(inner),
418 "DropStatement" => self.drop_statement(inner),
419 "InsertStatement" => self.insert_statement(inner),
420 "SetStatement" => self.set_statement(inner),
421 "ResetStatement" => self.reset_statement(inner),
422 "PragmaStatement" => self.pragma_statement(inner),
423 "ExplainStatement" => self.explain_statement(inner),
424 "CheckpointStatement" => Ok(Statement::Checkpoint),
425 _ => self.unsupported(inner),
426 }
427 }
428
429 fn explain_statement(&mut self, node: u32) -> Result<Statement> {
440 let analyze = self.find(node, "AnalyzeKeyword") != NONE;
441 let options = self.find(node, "ExplainOptionList");
442 if options != NONE {
443 return self.unsupported(options);
444 }
445 let inner = self.first(self.find(node, "ExplainableStatements"));
446 if self.name(inner) != "ExplainSelectStatement" {
447 return self.unsupported(inner);
448 }
449 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
450 Ok(Statement::Explain { query, analyze })
451 }
452
453 fn set_statement(&mut self, node: u32) -> Result<Statement> {
460 let inner = self.first(self.find(node, "SetAssignmentOrTimeZone"));
461 if self.name(inner) == "SetTimeZone" {
462 return self.set_time_zone(inner);
463 }
464 if self.name(inner) != "StandardAssignment" {
465 return self.unsupported(inner);
466 }
467 let (name, scope) = self.setting_name(self.find(inner, "SetVariableOrSetting"))?;
468 let assignment = self.find(inner, "SetAssignment");
469 let list = self.find(assignment, "VariableList");
470 let kids: Vec<u32> = self.kids(list).collect();
471 if kids.len() == 1 && self.contains(list, "DefaultExpression") {
472 let index = self.ast.settings.len() as u32;
473 self.ast.settings.push(Setting { name, scope, value: NONE, pragma: false });
474 return Ok(Statement::Reset(index));
475 }
476 let mut values = Vec::new();
477 for kid in kids {
478 values.push(self.expr(kid)?);
479 }
480 let [value] = values[..] else {
484 return self.unsupported(list);
485 };
486 let index = self.ast.settings.len() as u32;
487 self.ast.settings.push(Setting { name, scope, value, pragma: false });
488 Ok(Statement::Set(index))
489 }
490
491 fn set_time_zone(&mut self, node: u32) -> Result<Statement> {
493 let zone = self.first(self.find(node, "ZoneValue"));
494 let name = self.intern("TimeZone");
495 if matches!(self.name(zone), "ZoneDefault" | "ZoneLocal") {
496 let index = self.ast.settings.len() as u32;
497 self.ast.settings.push(Setting {
498 name,
499 scope: Scope::Unwritten,
500 value: NONE,
501 pragma: false,
502 });
503 return Ok(Statement::Reset(index));
504 }
505 let text = match self.name(zone) {
506 "ZoneStringLiteral" => self.string_value(self.find(zone, "StringLiteral"))?,
507 "ZoneIdentifier" => {
508 let identifier = self.find(zone, "Identifier");
509 let identifier = self.identifier(identifier);
510 self.ast.string(identifier).to_string()
511 }
512 _ => return self.unsupported(zone),
513 };
514 let text = self.intern(&text);
515 let value = self.push(Expr::Literal { kind: LiteralKind::String, text });
516 let index = self.ast.settings.len() as u32;
517 self.ast.settings.push(Setting { name, scope: Scope::Unwritten, value, pragma: false });
518 Ok(Statement::Set(index))
519 }
520
521 fn reset_statement(&mut self, node: u32) -> Result<Statement> {
523 let (name, scope) = self.setting_name(self.find(node, "SetVariableOrSetting"))?;
524 let index = self.ast.settings.len() as u32;
525 self.ast.settings.push(Setting { name, scope, value: NONE, pragma: false });
526 Ok(Statement::Reset(index))
527 }
528
529 fn pragma_statement(&mut self, node: u32) -> Result<Statement> {
542 let inner = self.first(self.find(node, "PragmaAssignOrFunction"));
543 match self.name(inner) {
544 "PragmaAssign" => self.pragma_assign(inner),
545 "PragmaFunction" => self.pragma_function(inner),
546 _ => self.unsupported(inner),
547 }
548 }
549
550 fn pragma_assign(&mut self, node: u32) -> Result<Statement> {
552 let name = self.identifier(self.find(node, "SettingName"));
553 let list = self.find(node, "VariableList");
554 let mut values = Vec::new();
555 for kid in self.kids(list) {
556 values.push(self.expr(kid)?);
557 }
558 let [value] = values[..] else {
561 return self.unsupported(list);
562 };
563 let index = self.ast.settings.len() as u32;
564 self.ast.settings.push(Setting { name, scope: Scope::Unwritten, value, pragma: false });
565 Ok(Statement::Set(index))
566 }
567
568 fn pragma_function(&mut self, node: u32) -> Result<Statement> {
584 let interned = self.identifier(self.find(node, "PragmaName"));
585 let written = self.ast.string(interned).to_string();
586 let parameters = self.find(node, "PragmaParameters");
589 if parameters == NONE && is_statement(&written) {
590 let index = self.ast.settings.len() as u32;
591 self.ast.settings.push(Setting {
592 name: interned,
593 scope: Scope::Unwritten,
594 value: NONE,
595 pragma: true,
596 });
597 return Ok(Statement::Set(index));
598 }
599 let part = self.intern(&format!("pragma_{written}"));
600 let name = self.part_slice(vec![part]);
601 let mut args = Vec::new();
602 if parameters != NONE {
603 for kid in self.kids(parameters) {
604 let expr = self.expr(kid)?;
605 args.push(Target { expr: self.quoted(expr), alias: NONE });
606 }
607 }
608 let args = self.target_slice(args);
609 let source = self.push_source(Source::Function {
610 name,
611 args,
612 alias: NONE,
613 columns: Slice::default(),
614 pragma: true,
615 });
616 Ok(Statement::Query(self.star_over(source)))
617 }
618
619 fn quoted(&mut self, expr: ExprRef) -> ExprRef {
626 let Expr::Column { name } = self.ast.exprs[expr as usize] else {
627 return expr;
628 };
629 let written: Vec<&str> = self.ast.name(name).collect();
630 let joined = written.join(".");
631 let text = self.intern(&joined);
632 self.push(Expr::Literal { kind: LiteralKind::String, text })
633 }
634
635 fn setting_name(&mut self, node: u32) -> Result<(StrRef, Scope)> {
641 let inner = self.first(node);
642 if self.name(inner) != "SetSetting" {
643 return self.unsupported(inner);
644 }
645 let written = self.find(inner, "SettingScope");
646 let scope = if written == NONE {
647 Scope::Unwritten
648 } else {
649 match self.name(self.first(written)) {
650 "GlobalScope" => Scope::Global,
651 "SessionScope" => Scope::Session,
652 "LocalScope" => Scope::Local,
653 _ => return self.unsupported(written),
654 }
655 };
656 Ok((self.identifier(self.find(inner, "SettingName")), scope))
657 }
658
659 fn create_statement(&mut self, node: u32) -> Result<Statement> {
665 let or_replace = self.find(node, "OrReplace") != NONE;
666 let temporary = self.find(node, "Temporary") != NONE;
667 let variation = self.find(node, "CreateStatementVariation");
668 let inner = self.first(variation);
669 if or_replace && self.find(inner, "IfNotExists") != NONE {
673 return Err(Error::parser(
674 "Cannot specify both OR REPLACE and IF NOT EXISTS within single create statement",
675 ));
676 }
677 match self.name(inner) {
678 "CreateTableStmt" => self.create_table_statement(inner, or_replace, temporary),
679 "CreateViewStmt" => self.create_view_statement(inner, or_replace, temporary),
680 _ => self.unsupported(inner),
681 }
682 }
683
684 fn create_table_statement(
686 &mut self,
687 inner: u32,
688 or_replace: bool,
689 temporary: bool,
690 ) -> Result<Statement> {
691 let name = self.name_parts(self.find(inner, "QualifiedName"));
692 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
693 let definition = self.find(inner, "CreateTableDefinition");
694 let body = self.first(definition);
695 let (columns, query) = match self.name(body) {
696 "CreateColumnList" => (self.column_list(body)?, NONE),
697 "CreateTableAs" => self.create_table_as(body)?,
698 _ => return self.unsupported(body),
699 };
700 let index = self.ast.create_tables.len() as u32;
701 self.ast.create_tables.push(CreateTable {
702 name,
703 columns,
704 query,
705 if_not_exists,
706 or_replace,
707 temporary,
708 });
709 Ok(Statement::CreateTable(index))
710 }
711
712 fn create_view_statement(
719 &mut self,
720 inner: u32,
721 or_replace: bool,
722 temporary: bool,
723 ) -> Result<Statement> {
724 for kid in self.kids(inner) {
725 if matches!(self.name(kid), "CreateSecure" | "CreateRecursive" | "WithList") {
729 return self.unsupported(kid);
730 }
731 }
732 let name = self.name_parts(self.find(inner, "QualifiedName"));
733 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
734 let list = self.find(inner, "InsertColumnList");
735 let columns = if list == NONE {
736 Slice::default()
737 } else {
738 let mut parts = Vec::new();
739 for kid in self.kids(self.find(list, "ColumnList")) {
740 parts.push(self.identifier(kid));
741 }
742 self.part_slice(parts)
743 };
744 let body = self.find(inner, "SelectStatementInternal");
745 let sql = self.text(body).to_string();
746 let sql = self.intern(&sql);
747 let query = self.query(body)?;
748 let index = self.ast.create_views.len() as u32;
749 self.ast.create_views.push(CreateView {
750 name,
751 columns,
752 query,
753 sql,
754 if_not_exists,
755 or_replace,
756 temporary,
757 });
758 Ok(Statement::CreateView(index))
759 }
760
761 fn column_list(&mut self, node: u32) -> Result<Slice> {
763 for kid in self.kids(node) {
764 if matches!(self.name(kid), "PartitionOptions" | "SortedOptions" | "WithList") {
765 return self.unsupported(kid);
766 }
767 }
768 let list = self.find(node, "CreateTableColumnList");
769 if list == NONE {
770 return Ok(Slice::default());
773 }
774 let mut defs = Vec::new();
775 for element in self.kids(list) {
776 let inner = self.first(element);
777 if self.name(inner) != "CreateTableColumnDefinition" {
778 return self.unsupported(inner);
782 }
783 defs.push(self.column_definition(self.first(inner))?);
784 }
785 Ok(self.column_def_slice(defs))
786 }
787
788 fn column_definition(&mut self, node: u32) -> Result<ColumnDef> {
791 let name = self.identifier(self.find(node, "DottedIdentifier"));
792 let type_node = self.find(node, "Type");
793 let ty = if type_node == NONE {
794 NONE
795 } else {
796 let text = self.text(type_node).to_string();
797 self.intern(&text)
798 };
799 if self.find(node, "GeneratedColumn") != NONE {
800 return self.unsupported(self.find(node, "GeneratedColumn"));
801 }
802 let mut not_null = false;
803 for kid in self.kids(node) {
804 if self.name(kid) != "ColumnConstraint" {
805 continue;
806 }
807 let constraint = self.first(kid);
808 match self.name(constraint) {
809 "NotNullConstraint" => {
810 not_null = self.name(self.first(constraint)) == "NotNullColumnConstraint";
811 }
812 _ => return self.unsupported(constraint),
813 }
814 }
815 Ok(ColumnDef { name, ty, not_null })
816 }
817
818 fn create_table_as(&mut self, node: u32) -> Result<(Slice, QueryRef)> {
824 for kid in self.kids(node) {
825 if matches!(
826 self.name(kid),
827 "PartitionOptions" | "SortedOptions" | "WithList" | "WithData"
828 ) {
829 return self.unsupported(kid);
830 }
831 }
832 let names = self.find(node, "IdentifierList");
833 let columns = if names == NONE {
834 Slice::default()
835 } else {
836 let mut defs = Vec::new();
837 for kid in self.kids(names) {
838 let name = self.identifier(kid);
839 defs.push(ColumnDef { name, ty: NONE, not_null: false });
840 }
841 self.column_def_slice(defs)
842 };
843 let statement = self.find(node, "Statement");
844 let inner = self.first(statement);
845 if self.name(inner) != "SelectStatement" {
846 return self.unsupported(inner);
847 }
848 let query = self.query(self.first(inner))?;
849 Ok((columns, query))
850 }
851
852 fn drop_statement(&mut self, node: u32) -> Result<Statement> {
858 if self.find(node, "DropBehavior") != NONE {
859 return self.unsupported(self.find(node, "DropBehavior"));
860 }
861 let entries = self.find(node, "DropEntries");
862 let inner = self.first(entries);
863 if self.name(inner) != "DropTable" {
864 return self.unsupported(inner);
865 }
866 let kind = self.find(inner, "TableOrView");
867 let view = match self.name(self.first(kind)) {
868 "CommentTable" => false,
869 "CommentView" => true,
870 _ => return self.unsupported(kind),
871 };
872 let if_exists = self.find(inner, "IfExists") != NONE;
873 let mut names = Vec::new();
874 for kid in self.kids(inner) {
875 if self.name(kid) == "BaseTableName" {
876 names.push(self.name_parts(kid));
877 }
878 }
879 let names = self.name_list_slice(names);
880 let index = self.ast.drop_tables.len() as u32;
881 self.ast.drop_tables.push(DropTable { names, if_exists, view });
882 Ok(Statement::DropTable(index))
883 }
884
885 fn insert_statement(&mut self, node: u32) -> Result<Statement> {
892 for kid in self.kids(node) {
893 if matches!(
894 self.name(kid),
895 "InsertTarget" | "InsertColumnList" | "InsertValues" | "WithClause"
896 ) {
897 continue;
898 }
899 return self.unsupported(kid);
900 }
901 if self.find(node, "WithClause") != NONE {
902 return self.unsupported(self.find(node, "WithClause"));
903 }
904 let name = self.name_parts(self.find(self.find(node, "InsertTarget"), "BaseTableName"));
905 let list = self.find(node, "InsertColumnList");
906 let columns = if list == NONE {
907 Slice::default()
908 } else {
909 let mut parts = Vec::new();
910 for kid in self.kids(self.find(list, "ColumnList")) {
911 parts.push(self.identifier(kid));
912 }
913 self.part_slice(parts)
914 };
915 let values = self.find(node, "InsertValues");
916 let inner = self.first(values);
917 if self.name(inner) != "SelectInsertValues" {
918 return self.unsupported(inner);
919 }
920 let source = self.query(self.find(inner, "SelectStatementInternal"))?;
921 let index = self.ast.inserts.len() as u32;
922 self.ast.inserts.push(Insert { name, columns, source });
923 Ok(Statement::Insert(index))
924 }
925
926 fn query(&mut self, node: u32) -> Result<QueryRef> {
928 let span = self.span(node);
929 let outer = std::mem::replace(&mut self.current_span, span);
930 let result = self.query_inner(node);
931 self.current_span = outer;
932 result
933 }
934
935 fn query_inner(&mut self, node: u32) -> Result<QueryRef> {
936 let mark = self.ctes.len();
937 let mut once = Vec::new();
938 let with = self.find(node, "WithClause");
939 if with != NONE {
940 if self.find(with, "Recursive") != NONE {
941 return self.unsupported(self.find(with, "Recursive"));
942 }
943 for statement in self.kids(with) {
944 if self.name(statement) != "WithStatement" {
945 continue;
946 }
947 let materialized = self.find(statement, "Materialized");
962 let materialized = materialized != NONE
963 && !self.text(materialized).eq_ignore_ascii_case("NOT MATERIALIZED");
964 let name = self.identifier(self.first(statement));
965 let list = self.find(statement, "InsertColumnList");
966 let columns = if list == NONE {
967 Slice::default()
968 } else {
969 let mut names = Vec::new();
970 for kid in self.kids(self.find(list, "ColumnList")) {
971 names.push(self.identifier(kid));
972 }
973 self.part_slice(names)
974 };
975 let body = self.find(statement, "CTEBody");
976 let select = self.first(body);
977 if self.name(select) != "CTESelectBody" {
978 return self.unsupported(body);
979 }
980 let query = self.query(self.first(select))?;
981 if materialized {
982 let index = self.ast.ctes.len() as u32;
983 self.ast.ctes.push(Cte { name, query, columns });
984 once.push(index);
985 self.ctes.push((name, Held::Once(index), columns));
986 } else {
987 self.ctes.push((name, Held::Inline(query), columns));
988 }
989 }
990 }
991 let chain = self.find(node, "SelectSetOpChain");
992 if chain == NONE {
993 return self.unsupported(node);
994 }
995 let query = self.set_op_chain(chain)?;
996 let modifiers = self.find(node, "ResultModifiers");
997 if modifiers != NONE {
998 self.result_modifiers(query, modifiers)?;
999 }
1000 if !once.is_empty() {
1001 let slice = self.cte_slice(once);
1002 self.ast.queries[query as usize].ctes = slice;
1003 }
1004 self.ctes.truncate(mark);
1005 Ok(query)
1006 }
1007
1008 fn set_op_chain(&mut self, node: u32) -> Result<QueryRef> {
1010 let mut kids = self.kids(node);
1011 let head = kids.next().unwrap_or(NONE);
1012 let mut left = self.intersect_chain(head)?;
1013 for tail in kids {
1014 let clause = self.first(tail);
1016 let (op, quantifier, by_name) = self.setop_clause(clause)?;
1017 let right = self.intersect_chain(self.nth(tail, 1))?;
1018 left = self.push_query(Query::bare(QueryBody::SetOp {
1019 op,
1020 quantifier,
1021 by_name,
1022 left,
1023 right,
1024 }));
1025 }
1026 Ok(left)
1027 }
1028
1029 fn intersect_chain(&mut self, node: u32) -> Result<QueryRef> {
1031 let mut kids = self.kids(node);
1032 let head = kids.next().unwrap_or(NONE);
1033 let mut left = self.select_atom(head)?;
1034 for tail in kids {
1035 let clause = self.first(tail);
1037 let quantifier = self.quantifier(self.find(clause, "DistinctOrAll"));
1038 let right = self.select_atom(self.nth(tail, 1))?;
1039 left = self.push_query(Query::bare(QueryBody::SetOp {
1040 op: SetOp::Intersect,
1041 quantifier,
1042 by_name: false,
1043 left,
1044 right,
1045 }));
1046 }
1047 Ok(left)
1048 }
1049
1050 fn setop_clause(&mut self, node: u32) -> Result<(SetOp, Quantifier, bool)> {
1052 let kind = self.find(node, "SetopType");
1053 let op = match self.name(self.first(kind)) {
1054 "SetopUnion" => SetOp::Union,
1055 "SetopExcept" => SetOp::Except,
1056 _ => return self.unsupported(kind),
1057 };
1058 let quantifier = self.quantifier(self.find(node, "DistinctOrAll"));
1059 Ok((op, quantifier, self.find(node, "ByName") != NONE))
1060 }
1061
1062 fn quantifier(&self, node: u32) -> Quantifier {
1064 if node == NONE {
1065 return Quantifier::Unstated;
1066 }
1067 match self.name(self.first(node)) {
1068 "DistinctKeyword" => Quantifier::Distinct,
1069 "AllKeyword" => Quantifier::All,
1070 _ => Quantifier::Unstated,
1071 }
1072 }
1073
1074 fn select_atom(&mut self, node: u32) -> Result<QueryRef> {
1076 let inner = self.first(node);
1077 match self.name(inner) {
1078 "SelectParens" => self.query(self.first(inner)),
1081 "SelectStatementType" => {
1082 let kind = self.first(inner);
1083 match self.name(kind) {
1084 "OptionalParensSimpleSelect" => {
1085 let select = self.simple_select(self.unwrap_parens(kind))?;
1086 Ok(self.push_query(Query::bare(QueryBody::Select(select))))
1087 }
1088 "ValuesClause" => {
1089 let rows = self.values_clause(kind)?;
1090 Ok(self.push_query(Query::bare(QueryBody::Values(rows))))
1091 }
1092 "DescribeStatement" => self.describe_statement(kind),
1093 _ => self.unsupported(kind),
1094 }
1095 }
1096 _ => self.unsupported(inner),
1097 }
1098 }
1099
1100 fn describe_statement(&mut self, node: u32) -> Result<QueryRef> {
1113 let inner = self.first(node);
1114 match self.name(inner) {
1115 "DescribeSelect" => {
1116 self.describe_and_not_summarize(inner)?;
1117 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
1118 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
1119 }
1120 "DescribeByName" => {
1121 self.describe_and_not_summarize(inner)?;
1122 let target = self.find(inner, "DescribeTarget");
1123 if target == NONE {
1124 return self.unsupported(inner);
1125 }
1126 let name = self.name_parts(target);
1127 if let Some(query) = self.special_form(name) {
1128 return Ok(query);
1129 }
1130 let source = self.describe_target(target)?;
1131 let query = self.star_over(source);
1132 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
1133 }
1134 "ShowAllTables" => Ok(self.pragma_query("pragma_show_tables_expanded")),
1135 "ShowByName" => {
1136 let target = self.find(inner, "ShowTarget");
1137 if target == NONE {
1138 return self.unsupported(inner);
1139 }
1140 let name = self.name_parts(target);
1141 if let Some(query) = self.special_form(name) {
1142 return Ok(query);
1143 }
1144 let source = self.push_source(Source::Table {
1145 name,
1146 alias: NONE,
1147 columns: Slice::default(),
1148 });
1149 let relation = self.star_over(source);
1150 Ok(self.push_query(Query::bare(QueryBody::Show { name, relation })))
1151 }
1152 _ => self.unsupported(inner),
1153 }
1154 }
1155
1156 fn special_form(&mut self, name: Slice) -> Option<QueryRef> {
1163 if name.len != 1 {
1164 return None;
1165 }
1166 let written = self.ast.name_text(name);
1167 let pragma = match written.to_ascii_lowercase().as_str() {
1168 "tables" => "pragma_show_tables",
1169 "databases" => "pragma_show_databases",
1170 _ => return None,
1171 };
1172 Some(self.pragma_query(pragma))
1173 }
1174
1175 fn pragma_query(&mut self, pragma: &str) -> QueryRef {
1180 let part = self.intern(pragma);
1181 let name = self.part_slice(vec![part]);
1182 let args = self.target_slice(Vec::new());
1183 let source = self.push_source(Source::Function {
1184 name,
1185 args,
1186 alias: NONE,
1187 columns: Slice::default(),
1188 pragma: true,
1189 });
1190 self.star_over(source)
1191 }
1192
1193 fn describe_and_not_summarize(&mut self, node: u32) -> Result<()> {
1195 let word = self.find(node, "DescribeOrSummarize");
1196 if word == NONE || self.name(self.first(word)) != "DescribeRule" {
1197 return self.unsupported(if word == NONE { node } else { word });
1198 }
1199 Ok(())
1200 }
1201
1202 fn describe_target(&mut self, node: u32) -> Result<SourceRef> {
1208 let inner = self.first(node);
1209 let name = match self.name(inner) {
1210 "DescribeBaseTableName" => self.name_parts(self.find(inner, "BaseTableName")),
1211 "DescribeStringLiteral" => {
1212 let text = self.string_value(self.find(inner, "StringLiteral"))?;
1213 let part = self.intern(&text);
1214 self.part_slice(vec![part])
1215 }
1216 _ => return self.unsupported(inner),
1217 };
1218 Ok(self.push_source(Source::Table { name, alias: NONE, columns: Slice::default() }))
1219 }
1220
1221 fn star_over(&mut self, source: SourceRef) -> QueryRef {
1223 let star =
1224 self.push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
1225 let targets = self.target_slice(vec![Target { expr: star, alias: NONE }]);
1226 let start = self.ast.source_lists.len() as u32;
1227 self.ast.source_lists.push(source);
1228 let from = Slice { start, len: 1 };
1229 let select = self.push_select(Select { targets, from, ..Select::empty() });
1230 self.push_query(Query::bare(QueryBody::Select(select)))
1231 }
1232
1233 fn values_clause(&mut self, node: u32) -> Result<Slice> {
1239 let mut rows = Vec::new();
1240 for kid in self.kids(node) {
1241 if self.name(kid) != "ValuesExpressions" {
1242 continue;
1243 }
1244 let mut items = Vec::new();
1245 for expr in self.kids(kid) {
1246 items.push(self.expr(expr)?);
1247 }
1248 let slice = self.expr_slice(items);
1249 rows.push(slice);
1250 }
1251 let start = self.ast.rows.len() as u32;
1252 self.ast.rows.extend(rows);
1253 Ok(Slice { start, len: self.ast.rows.len() as u32 - start })
1254 }
1255
1256 fn unwrap_parens(&self, node: u32) -> u32 {
1258 let mut node = self.first(node);
1259 while self.name(node) == "SimpleSelectParens" {
1260 node = self.first(node);
1261 }
1262 node
1263 }
1264
1265 fn result_modifiers(&mut self, query: QueryRef, node: u32) -> Result<()> {
1267 let order = self.find(node, "OrderByClause");
1268 if order != NONE {
1269 let (items, all) = self.order_by(order)?;
1270 self.ast.queries[query as usize].order_by = self.order_slice(items);
1271 self.ast.queries[query as usize].order_by_all = all;
1272 }
1273 let limit = self.find(node, "LimitOffset");
1274 if limit != NONE {
1275 self.limit_offset(query, self.first(limit))?;
1276 }
1277 Ok(())
1278 }
1279
1280 fn limit_offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
1282 match self.name(node) {
1283 "LimitOffsetClause" | "OffsetLimitClause" => {
1284 let limit = self.find(node, "LimitClause");
1285 if limit != NONE {
1286 self.limit(query, limit)?;
1287 }
1288 let offset = self.find(node, "OffsetClause");
1289 if offset != NONE {
1290 self.offset(query, offset)?;
1291 }
1292 Ok(())
1293 }
1294 _ => self.unsupported(node),
1295 }
1296 }
1297
1298 fn limit(&mut self, query: QueryRef, node: u32) -> Result<()> {
1300 let value = self.first(node);
1301 let inner = self.first(value);
1302 match self.name(inner) {
1303 "LimitAll" => Ok(()),
1305 "LimitExpression" => {
1309 let expr = self.expr(self.first(inner))?;
1310 self.ast.queries[query as usize].limit = expr;
1311 self.ast.queries[query as usize].limit_percent = self.text(inner).ends_with('%');
1312 Ok(())
1313 }
1314 "LimitLiteralPercent" => {
1315 let expr = self.expr(self.first(inner))?;
1316 self.ast.queries[query as usize].limit = expr;
1317 self.ast.queries[query as usize].limit_percent = true;
1318 Ok(())
1319 }
1320 _ => self.unsupported(inner),
1321 }
1322 }
1323
1324 fn offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
1326 let value = self.first(node);
1327 let expr = self.expr(self.first(value))?;
1328 self.ast.queries[query as usize].offset = expr;
1329 Ok(())
1330 }
1331
1332 fn simple_select(&mut self, node: u32) -> Result<SelectRef> {
1335 for name in ["QualifyClause", "SampleClause"] {
1336 let clause = self.find(node, name);
1337 if clause != NONE {
1338 return self.unsupported(clause);
1339 }
1340 }
1341 let mark = self.named_windows.len();
1344 let windows = self.find(node, "WindowClause");
1345 if windows != NONE {
1346 self.window_clause(windows)?;
1347 }
1348 let mut select = Select::empty();
1349 self.select_from(&mut select, self.first(node))?;
1350 let filter = self.find(node, "WhereClause");
1351 if filter != NONE {
1352 select.filter = self.expr(self.first(filter))?;
1353 }
1354 let group = self.find(node, "GroupByClause");
1355 if group != NONE {
1356 self.group_by(&mut select, self.first(group))?;
1357 }
1358 let having = self.find(node, "HavingClause");
1359 if having != NONE {
1360 select.having = self.expr(self.first(having))?;
1361 }
1362 self.named_windows.truncate(mark);
1363 Ok(self.push_select(select))
1364 }
1365
1366 fn select_from(&mut self, select: &mut Select, node: u32) -> Result<()> {
1369 let clause = self.first(node);
1370 let targets = self.find(clause, "SelectClause");
1371 let from = self.find(clause, "FromClause");
1372 if from != NONE {
1373 select.from = self.sources(from)?;
1374 }
1375 if targets == NONE {
1376 let star = self
1380 .push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
1381 let start = self.ast.targets.len() as u32;
1382 self.ast.targets.push(Target { expr: star, alias: NONE });
1383 select.targets = Slice { start, len: 1 };
1384 return Ok(());
1385 }
1386 self.select_clause(select, targets)
1387 }
1388
1389 fn select_clause(&mut self, select: &mut Select, node: u32) -> Result<()> {
1391 let distinct = self.find(node, "DistinctClause");
1392 if distinct != NONE {
1393 let inner = self.first(distinct);
1394 select.distinct = match self.name(inner) {
1395 "DistinctAll" => Distinct::No,
1397 "DistinctOn" => {
1398 let on = self.find(inner, "DistinctOnTargets");
1399 if on == NONE {
1400 Distinct::Yes
1401 } else {
1402 let mut items = Vec::new();
1403 for kid in self.kids(on) {
1404 items.push(self.expr(kid)?);
1405 }
1406 Distinct::On(self.expr_slice(items))
1407 }
1408 }
1409 _ => return self.unsupported(inner),
1410 };
1411 }
1412 let list = self.find(node, "TargetList");
1413 if list == NONE {
1414 return Ok(());
1415 }
1416 let mut targets = Vec::new();
1417 for kid in self.kids(list) {
1418 targets.push(self.target(kid)?);
1419 }
1420 select.targets = self.target_slice(targets);
1421 Ok(())
1422 }
1423
1424 fn target(&mut self, node: u32) -> Result<Target> {
1426 let inner = self.first(node);
1427 match self.name(inner) {
1428 "ColIdExpression" => {
1430 let alias = self.identifier(self.first(inner));
1431 let expr = self.expr(self.nth(inner, 1))?;
1432 Ok(Target { expr, alias })
1433 }
1434 "ExpressionAsCollabel" => {
1435 let expr = self.expr(self.first(inner))?;
1436 let alias = self.identifier(self.nth(inner, 1));
1437 Ok(Target { expr, alias })
1438 }
1439 "ExpressionOptIdentifier" => {
1440 let expr = self.expr(self.first(inner))?;
1441 let alias =
1442 if self.count(inner) > 1 { self.identifier(self.nth(inner, 1)) } else { NONE };
1443 Ok(Target { expr, alias })
1444 }
1445 _ => self.unsupported(inner),
1446 }
1447 }
1448
1449 fn group_by(&mut self, select: &mut Select, node: u32) -> Result<()> {
1451 let inner = self.first(node);
1452 match self.name(inner) {
1453 "GroupByAll" => {
1454 select.group_by_all = true;
1455 Ok(())
1456 }
1457 "GroupByList" => {
1458 let mut items = Vec::new();
1459 for kid in self.kids(inner) {
1460 let expression = self.first(kid);
1463 if self.name(expression) != "GroupByBaseExpression" {
1464 return self.unsupported(expression);
1465 }
1466 items.push(self.expr(self.first(expression))?);
1467 }
1468 select.group_by = self.expr_slice(items);
1469 Ok(())
1470 }
1471 _ => self.unsupported(inner),
1472 }
1473 }
1474
1475 fn order_by(&mut self, node: u32) -> Result<(Vec<OrderItem>, bool)> {
1478 let inner = self.first(self.first(node));
1479 match self.name(inner) {
1480 "OrderByAll" => {
1481 let (order, nulls) = self.sort_options(inner);
1482 Ok((vec![OrderItem { expr: NONE, order, nulls }], true))
1483 }
1484 "OrderByExpressionList" => {
1485 let mut items = Vec::new();
1486 for kid in self.kids(inner) {
1487 let expr = self.expr(self.first(kid))?;
1489 let (order, nulls) = self.sort_options(kid);
1490 items.push(OrderItem { expr, order, nulls });
1491 }
1492 Ok((items, false))
1493 }
1494 _ => self.unsupported(inner),
1495 }
1496 }
1497
1498 fn sort_options(&self, node: u32) -> (Order, Nulls) {
1500 let direction = self.find(node, "DescOrAsc");
1501 let order = if direction == NONE {
1502 Order::Unstated
1503 } else if self.name(self.first(direction)) == "DescendingOrder" {
1504 Order::Descending
1505 } else {
1506 Order::Ascending
1507 };
1508 let placement = self.find(node, "NullsFirstOrLast");
1509 let nulls = if placement == NONE {
1510 Nulls::Unstated
1511 } else if self.name(self.first(placement)) == "NullsFirst" {
1512 Nulls::First
1513 } else {
1514 Nulls::Last
1515 };
1516 (order, nulls)
1517 }
1518
1519 fn sources(&mut self, node: u32) -> Result<Slice> {
1523 let mut items = Vec::new();
1524 for kid in self.kids(node) {
1525 items.push(self.table_ref(kid)?);
1526 }
1527 let start = self.ast.source_lists.len() as u32;
1528 self.ast.source_lists.extend(items);
1529 Ok(Slice { start, len: self.ast.source_lists.len() as u32 - start })
1530 }
1531
1532 fn table_ref(&mut self, node: u32) -> Result<SourceRef> {
1534 let mut kids = self.kids(node);
1535 let head = kids.next().unwrap_or(NONE);
1536 let mut left = self.inner_table_ref(head)?;
1537 for tail in kids {
1538 let clause = self.first(tail);
1539 if self.name(clause) != "JoinClause" {
1540 return self.unsupported(clause);
1541 }
1542 left = self.join(left, self.first(clause))?;
1543 }
1544 Ok(left)
1545 }
1546
1547 fn inner_table_ref(&mut self, node: u32) -> Result<SourceRef> {
1549 let inner = if self.name(node) == "InnerTableRef" { self.first(node) } else { node };
1550 match self.name(inner) {
1551 "BaseTableRef" => {
1552 if self.find(inner, "TableAliasColon") != NONE {
1553 return self.unsupported(inner);
1554 }
1555 for name in ["AtClause", "SampleClause"] {
1556 let clause = self.find(inner, name);
1557 if clause != NONE {
1558 return self.unsupported(clause);
1559 }
1560 }
1561 let name = self.name_parts(self.find(inner, "BaseTableName"));
1562 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1563 if name.len == 1 {
1564 let part = self.ast.parts[name.start as usize];
1565 if let Some(&(_, held, declared)) =
1566 self.ctes.iter().rev().find(|&&(cte, _, _)| {
1567 self.ast.string(cte).eq_ignore_ascii_case(self.ast.string(part))
1568 })
1569 {
1570 match held {
1571 Held::Inline(query) => {
1572 let alias = if alias == NONE { part } else { alias };
1573 let columns = if columns.is_empty() { declared } else { columns };
1574 return Ok(self.push_source(Source::Subquery {
1575 query,
1576 alias,
1577 columns,
1578 }));
1579 }
1580 Held::Once(cte) => {
1584 return Ok(self.push_source(Source::Cte { cte, alias, columns }));
1585 }
1586 }
1587 }
1588 }
1589 Ok(self.push_source(Source::Table { name, alias, columns }))
1590 }
1591 "TableSubquery" => {
1595 if self.find(inner, "TableAliasColon") != NONE {
1596 return self.unsupported(inner);
1597 }
1598 let reference = self.find(inner, "SubqueryReference");
1600 let query = self.query(self.first(reference))?;
1601 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1602 Ok(self.push_source(Source::Subquery { query, alias, columns }))
1603 }
1604 "TableFunction" => {
1610 let form = self.first(inner);
1611 for name in ["TableAliasColon", "WithOrdinality", "SampleClause"] {
1612 let clause = self.find(form, name);
1613 if clause != NONE {
1614 return self.unsupported(clause);
1615 }
1616 }
1617 let name = self.name_parts(self.find(form, "QualifiedTableFunction"));
1618 let mut args = Vec::new();
1619 let list = self.find(form, "TableFunctionArguments");
1622 for kid in self.kids(list) {
1623 args.push(self.table_argument(kid)?);
1624 }
1625 let args = self.target_slice(args);
1626 let (alias, columns) = self.table_alias(self.find(form, "TableAlias"));
1627 Ok(self.push_source(Source::Function { name, args, alias, columns, pragma: false }))
1628 }
1629 "ValuesRef" => {
1630 if self.find(inner, "TableAliasColon") != NONE {
1631 return self.unsupported(inner);
1632 }
1633 let rows = self.values_clause(self.find(inner, "ValuesClause"))?;
1634 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1635 Ok(self.push_source(Source::Values { rows, alias, columns }))
1636 }
1637 "ParensTableRef" => {
1638 if self.find(inner, "TableAliasColon") != NONE
1639 || self.find(inner, "SampleClause") != NONE
1640 || self.find(inner, "TableAlias") != NONE
1641 {
1642 return self.unsupported(inner);
1643 }
1644 self.table_ref(self.find(inner, "TableRef"))
1645 }
1646 _ => self.unsupported(inner),
1647 }
1648 }
1649
1650 fn table_alias(&mut self, node: u32) -> (StrRef, Slice) {
1652 if node == NONE {
1653 return (NONE, Slice::default());
1654 }
1655 let inner = self.first(node);
1656 let alias = self.identifier(self.first(inner));
1657 let list = self.find(inner, "ColumnAliases");
1658 if list == NONE {
1659 return (alias, Slice::default());
1660 }
1661 let mut columns = Vec::new();
1662 for kid in self.kids(list) {
1663 let name = self.identifier(kid);
1664 columns.push(name);
1665 }
1666 (alias, self.part_slice(columns))
1667 }
1668
1669 fn join(&mut self, left: SourceRef, node: u32) -> Result<SourceRef> {
1671 match self.name(node) {
1672 "RegularJoinClause" => {
1674 if self.find(node, "Asof") != NONE {
1675 return self.unsupported(node);
1676 }
1677 let kind = self.join_type(self.find(node, "JoinType"));
1678 let right = self.table_ref(self.find(node, "TableRef"))?;
1679 let (on, using) = self.join_qualifier(self.find(node, "JoinQualifier"))?;
1680 Ok(self.push_source(Source::Join { left, right, kind, natural: false, on, using }))
1681 }
1682 "JoinWithoutOnClause" => {
1685 let prefix = self.first(self.find(node, "JoinPrefix"));
1686 let (kind, natural) = match self.name(prefix) {
1687 "CrossJoinPrefix" => (JoinKind::Cross, false),
1688 "PositionalJoinPrefix" => (JoinKind::Positional, false),
1689 "NaturalJoinPrefix" => (self.join_type(self.find(prefix, "JoinType")), true),
1690 _ => return self.unsupported(prefix),
1691 };
1692 let right = self.inner_table_ref(self.find(node, "InnerTableRef"))?;
1693 Ok(self.push_source(Source::Join {
1694 left,
1695 right,
1696 kind,
1697 natural,
1698 on: NONE,
1699 using: Slice::default(),
1700 }))
1701 }
1702 _ => self.unsupported(node),
1703 }
1704 }
1705
1706 fn join_type(&self, node: u32) -> JoinKind {
1709 if node == NONE {
1710 return JoinKind::Inner;
1711 }
1712 match self.name(self.first(node)) {
1713 "FullJoin" => JoinKind::Full,
1714 "LeftJoin" => JoinKind::Left,
1715 "RightJoin" => JoinKind::Right,
1716 "SemiJoin" => JoinKind::Semi,
1717 "AntiJoin" => JoinKind::Anti,
1718 _ => JoinKind::Inner,
1719 }
1720 }
1721
1722 fn join_qualifier(&mut self, node: u32) -> Result<(ExprRef, Slice)> {
1724 let inner = self.first(node);
1725 match self.name(inner) {
1726 "OnClause" => Ok((self.expr(self.first(inner))?, Slice::default())),
1727 "UsingClause" => {
1728 let mut columns = Vec::new();
1729 for kid in self.kids(inner) {
1730 let name = self.identifier(kid);
1731 columns.push(name);
1732 }
1733 Ok((NONE, self.part_slice(columns)))
1734 }
1735 _ => self.unsupported(inner),
1736 }
1737 }
1738
1739 fn expr(&mut self, node: u32) -> Result<ExprRef> {
1757 let span = self.span(node);
1758 let outer = std::mem::replace(&mut self.current_span, span);
1759 let result = self.expr_inner(node);
1760 self.current_span = outer;
1761 result
1762 }
1763
1764 fn expr_inner(&mut self, node: u32) -> Result<ExprRef> {
1765 let mut node = node;
1766 loop {
1767 let count = self.count(node);
1768 let name = self.name(node);
1769 match name {
1770 "LogicalOrExpression" if count > 1 => return self.logical(node, BinaryOp::Or),
1771 "LogicalAndExpression" if count > 1 => return self.logical(node, BinaryOp::And),
1772 "LogicalNotExpression" if count > 1 => return self.logical_not(node),
1773 "IsExpression" if count > 1 => return self.is_expression(node),
1774 "BetweenInLikeExpression" if count > 1 => return self.between_in_like(node),
1775 "PrefixExpression" if count > 1 => return self.prefix(node),
1776 "BaseExpression" if count > 1 => return self.indirection(node),
1777 "LambdaArrowExpression"
1778 | "IsDistinctFromExpression"
1779 | "ComparisonExpression"
1780 | "OtherOperatorExpression"
1781 | "BitwiseExpression"
1782 | "AdditiveExpression"
1783 | "MultiplicativeExpression"
1784 | "ExponentiationExpression"
1785 | "CollateExpression"
1786 | "AtTimeZoneExpression"
1787 if count > 1 =>
1788 {
1789 return self.tail_chain(node);
1790 }
1791 "ColumnReference" => {
1792 let name = self.name_parts(node);
1793 return Ok(self.push(Expr::Column { name }));
1794 }
1795 "StarExpression" => return self.star(node),
1796 "NumberLiteral" => {
1797 let text = self.text(node).to_string();
1798 let text = self.intern(&text);
1799 return Ok(self.push(Expr::Literal { kind: LiteralKind::Number, text }));
1800 }
1801 "StringLiteral" => return self.string_literal(node),
1802 "NullLiteral" | "TrueLiteral" | "FalseLiteral" => {
1803 let kind = match name {
1804 "NullLiteral" => LiteralKind::Null,
1805 "TrueLiteral" => LiteralKind::True,
1806 _ => LiteralKind::False,
1807 };
1808 return Ok(self.push(Expr::Literal { kind, text: NONE }));
1809 }
1810 "FunctionExpression" => return self.function(node),
1811 "CoalesceExpression" => return self.coalesce(node),
1812 "NullIfExpression" => return self.null_if(node),
1813 "SubstringExpression" => return self.substring(node),
1814 "PositionExpression" => return self.position(node),
1815 "TrimExpression" => return self.trim(node),
1816 "OverlayExpression" => return self.overlay(node),
1817 "ExtractExpression" => return self.extract(node),
1818 "CastExpression" => return self.cast(node),
1819 "TypeLiteral" => return self.typed_literal(node),
1820 "IntervalLiteral" => return self.interval_literal(node),
1821 "CaseExpression" => return self.case(node),
1822 "ParenthesisExpression" => return self.row(node),
1823 "ParensExpression" if count == 1 => node = self.first(node),
1829 "BoundedListExpression" => return self.list(node),
1830 "QuestionMarkNumberedParameter"
1831 | "AnonymousParameter"
1832 | "NumberedParameter"
1833 | "ColLabelParameter" => return self.parameter(node),
1834 "SubqueryExpression" => return self.subquery(node),
1835 _ if count == 1 && self.text(self.first(node)) == self.text(node) => {
1836 node = self.first(node);
1837 }
1838 _ => return self.unsupported(node),
1839 }
1840 }
1841 }
1842
1843 fn tail_chain(&mut self, node: u32) -> Result<ExprRef> {
1845 let mut kids = self.kids(node);
1846 let head = kids.next().unwrap_or(NONE);
1847 let mut left = self.expr(head)?;
1848 for tail in kids {
1849 let operator = self.first(tail);
1850 let operand = self.kids(tail).last().unwrap_or(NONE);
1854 if self.count(tail) > 2 {
1855 return self.unsupported(tail);
1856 }
1857 if self.contains(operator, "AnyAllParsedOperator") {
1858 let any_op = self.descendant(operator, "AnyOp");
1859 let op = self.binary_op(any_op)?;
1860 let reference = self.descendant(operand, "SubqueryReference");
1861 if reference == NONE {
1862 return self.unsupported(operand);
1863 }
1864 let query = self.query(self.first(reference))?;
1865 let all = self.contains(operator, "SubqueryAll");
1866 left = self.push(Expr::QuantifiedSubquery { operand: left, op, query, all });
1867 continue;
1868 }
1869 let op = self.binary_op(operator)?;
1870 let right = self.expr(operand)?;
1871 left = self.push(Expr::Binary { op, left, right });
1872 }
1873 Ok(left)
1874 }
1875
1876 fn binary_op(&mut self, node: u32) -> Result<BinaryOp> {
1878 let mut leaf = node;
1884 while self.count(leaf) == 1 {
1885 leaf = self.first(leaf);
1886 }
1887 let text = self.text(node);
1888 let upper = text.to_ascii_uppercase();
1889 let op = match upper.as_str() {
1890 "OR" => BinaryOp::Or,
1891 "AND" => BinaryOp::And,
1892 "=" | "==" => BinaryOp::Eq,
1893 "!=" | "<>" => BinaryOp::NotEq,
1894 "<" => BinaryOp::Lt,
1895 ">" => BinaryOp::Gt,
1896 "<=" => BinaryOp::LtEq,
1897 ">=" => BinaryOp::GtEq,
1898 "+" => BinaryOp::Add,
1899 "-" => BinaryOp::Subtract,
1900 "*" => BinaryOp::Multiply,
1901 "/" => BinaryOp::Divide,
1902 "//" => BinaryOp::IntegerDivide,
1903 "%" => BinaryOp::Modulo,
1904 "^" | "**" => BinaryOp::Power,
1905 "&" => BinaryOp::BitAnd,
1906 "|" => BinaryOp::BitOr,
1907 "<<" => BinaryOp::ShiftLeft,
1908 ">>" => BinaryOp::ShiftRight,
1909 "||" => BinaryOp::Concat,
1910 "COLLATE" => BinaryOp::Collate,
1911 "->" => BinaryOp::Arrow,
1912 "->>" => BinaryOp::LongArrow,
1913 "@>" => BinaryOp::Contains,
1914 "<@" => BinaryOp::ContainedBy,
1915 "&&" => BinaryOp::Overlaps,
1916 "^@" => BinaryOp::StartsWith,
1917 "<<=" => BinaryOp::InetContainedByOrEq,
1918 ">>=" => BinaryOp::InetContainsOrEq,
1919 _ if self.name(leaf) == "AtTimeZoneOperator" => BinaryOp::AtTimeZone,
1920 _ if self.name(leaf) == "IsDistinctFromOp" => {
1923 if upper.split_whitespace().any(|word| word == "NOT") {
1924 BinaryOp::IsNotDistinctFrom
1925 } else {
1926 BinaryOp::IsDistinctFrom
1927 }
1928 }
1929 _ if self.name(leaf) == "OperatorLiteral" => {
1936 let interned = self.intern(text);
1937 BinaryOp::Named(interned)
1938 }
1939 _ => return self.unsupported(node),
1940 };
1941 Ok(op)
1942 }
1943
1944 fn logical(&mut self, node: u32, op: BinaryOp) -> Result<ExprRef> {
1949 let mut kids = self.kids(node);
1950 let head = kids.next().unwrap_or(NONE);
1951 let mut left = self.expr(head)?;
1952 for tail in kids {
1953 let right = self.expr(self.first(tail))?;
1954 left = self.push(Expr::Binary { op, left, right });
1955 }
1956 Ok(left)
1957 }
1958
1959 fn logical_not(&mut self, node: u32) -> Result<ExprRef> {
1964 let negations = self.count(self.first(node));
1965 let mut expr = self.expr(self.nth(node, 1))?;
1966 for _ in 0..negations {
1967 expr = self.push(Expr::Unary { op: UnaryOp::Not, operand: expr });
1968 }
1969 Ok(expr)
1970 }
1971
1972 fn is_expression(&mut self, node: u32) -> Result<ExprRef> {
1974 let mut kids = self.kids(node);
1975 let head = kids.next().unwrap_or(NONE);
1976 let mut expr = self.expr(head)?;
1977 for test in kids {
1978 let inner = self.first(test);
1979 let negated = self.text(inner).to_ascii_uppercase().contains("NOT");
1980 let op = match self.name(inner) {
1981 "NotNull" => UnaryOp::IsNotNull,
1982 "IsNull" => UnaryOp::IsNull,
1983 "IsLiteral" => match self.name(self.first(self.first(inner))) {
1986 "NullLiteral" if negated => UnaryOp::IsNotNull,
1987 "NullLiteral" => UnaryOp::IsNull,
1988 "TrueLiteral" if negated => UnaryOp::IsNotTrue,
1989 "TrueLiteral" => UnaryOp::IsTrue,
1990 "FalseLiteral" if negated => UnaryOp::IsNotFalse,
1991 "FalseLiteral" => UnaryOp::IsFalse,
1992 "UnknownLiteral" if negated => UnaryOp::IsNotUnknown,
1993 "UnknownLiteral" => UnaryOp::IsUnknown,
1994 _ => return self.unsupported(inner),
1995 },
1996 _ => return self.unsupported(inner),
1997 };
1998 expr = self.push(Expr::Unary { op, operand: expr });
1999 }
2000 Ok(expr)
2001 }
2002
2003 fn between_in_like(&mut self, node: u32) -> Result<ExprRef> {
2005 let operand = self.expr(self.first(node))?;
2006 let op = self.nth(node, 1);
2009 let negated = self.text(op).to_ascii_uppercase().starts_with("NOT");
2010 let inner = self.first(self.first(op));
2011 match self.name(inner) {
2012 "BetweenClause" => {
2014 let low = self.expr(self.first(inner))?;
2015 let high = self.expr(self.nth(inner, 1))?;
2016 Ok(self.push(Expr::Between { operand, low, high, negated }))
2017 }
2018 "InClause" => {
2020 let expression = self.first(self.first(inner));
2021 match self.name(expression) {
2022 "InExpressionList" => {
2023 let mut items = Vec::new();
2024 for kid in self.kids(expression) {
2025 items.push(self.expr(kid)?);
2026 }
2027 let list = self.expr_slice(items);
2028 Ok(self.push(Expr::In { operand, list, negated }))
2029 }
2030 "InSelectStatement" => {
2031 let query = self.query(self.first(expression))?;
2032 Ok(self.push(Expr::InSubquery { operand, query, negated }))
2033 }
2034 _ => self.unsupported(expression),
2035 }
2036 }
2037 "LikeClause" => {
2039 if self.find(inner, "EscapeClause") != NONE {
2040 return self.unsupported(inner);
2041 }
2042 let variation = self.name(self.first(self.first(inner)));
2043 let op = match (variation, negated) {
2044 ("LikeToken", false) | ("NotLikeOp", true) => BinaryOp::Like,
2045 ("LikeToken", true) | ("NotLikeOp", false) => BinaryOp::NotLike,
2046 ("ILikeToken", false) | ("NotILikeOp", true) => BinaryOp::ILike,
2047 ("ILikeToken", true) | ("NotILikeOp", false) => BinaryOp::NotILike,
2048 ("GlobToken", _) => BinaryOp::Glob,
2051 ("RegexMatchToken", _) => BinaryOp::Regex,
2052 ("SimilarToToken", false) => BinaryOp::SimilarTo,
2053 ("SimilarToToken", true) => BinaryOp::NotSimilarTo,
2054 ("NotSimilarToOp", false) => BinaryOp::NotRegex,
2055 ("NotSimilarToOp", true) => BinaryOp::Regex,
2056 ("RegexInsensitiveMatchToken", false)
2057 | ("NotRegexInsensitiveMatchOp", true) => BinaryOp::RegexInsensitive,
2058 ("RegexInsensitiveMatchToken", true)
2059 | ("NotRegexInsensitiveMatchOp", false) => BinaryOp::NotRegexInsensitive,
2060 _ => return self.unsupported(inner),
2061 };
2062 let right = self.expr(self.nth(inner, 1))?;
2063 let expr = self.push(Expr::Binary { op, left: operand, right });
2064 if negated && matches!(op, BinaryOp::Glob | BinaryOp::Regex) {
2067 return Ok(self.push(Expr::Unary { op: UnaryOp::Not, operand: expr }));
2068 }
2069 Ok(expr)
2070 }
2071 _ => self.unsupported(inner),
2072 }
2073 }
2074
2075 fn prefix(&mut self, node: u32) -> Result<ExprRef> {
2077 let kids: Vec<u32> = self.kids(node).collect();
2078 let mut expr = self.expr(kids[kids.len() - 1])?;
2079 for &operator in kids[..kids.len() - 1].iter().rev() {
2080 let op = match self.name(self.first(operator)) {
2081 "MinusPrefixOperator" => UnaryOp::Negate,
2082 "PlusPrefixOperator" => UnaryOp::Plus,
2083 "TildePrefixOperator" => UnaryOp::BitNot,
2084 _ => return self.unsupported(operator),
2085 };
2086 expr = self.push(Expr::Unary { op, operand: expr });
2087 }
2088 Ok(expr)
2089 }
2090
2091 fn indirection(&mut self, node: u32) -> Result<ExprRef> {
2093 let mut expr = self.expr(self.first(node))?;
2094 for step in self.kids(self.nth(node, 1)) {
2095 let inner = self.first(step);
2096 expr = match self.name(inner) {
2097 "CastOperator" => {
2099 let text = self.text(self.first(inner)).to_string();
2100 let ty = self.intern(&text);
2101 self.push(Expr::Cast { operand: expr, ty, try_cast: false })
2102 }
2103 "DotOperator" => {
2104 let dot = self.first(inner);
2105 match self.name(dot) {
2106 "DotColumnOperator" => {
2111 let field = self.identifier(self.first(dot));
2112 let text = self.ast.string(field).to_string();
2113 let literal = self.intern(&text);
2114 let key = self
2115 .push(Expr::Literal { kind: LiteralKind::String, text: literal });
2116 let name = self.function_name("struct_extract");
2117 let args = self.expr_slice(vec![expr, key]);
2118 self.push(Expr::Function { name, args, distinct: false, filter: NONE })
2119 }
2120 "DotMethodOperator" => {
2122 let method = self.first(dot);
2123 let text = self.text(self.first(method)).to_string();
2124 let text = unquote(&text);
2125 let name = self.function_name(&text);
2126 let mut args = vec![expr];
2127 let list = self.find(method, "MethodExpressionArguments");
2128 if list != NONE {
2129 let inner = self.first(list);
2130 let arguments = self.find(inner, "MethodFunctionArguments");
2131 if arguments != NONE {
2132 for kid in self.kids(arguments) {
2133 args.push(self.argument(kid)?);
2134 }
2135 }
2136 }
2137 let args = self.expr_slice(args);
2138 self.push(Expr::Function { name, args, distinct: false, filter: NONE })
2139 }
2140 _ => return self.unsupported(dot),
2141 }
2142 }
2143 "SliceExpression" => self.subscript(inner, expr)?,
2148 "PostfixOperator" => {
2150 self.push(Expr::Unary { op: UnaryOp::Factorial, operand: expr })
2151 }
2152 _ => return self.unsupported(inner),
2153 };
2154 }
2155 Ok(expr)
2156 }
2157
2158 fn subscript(&mut self, node: u32, target: ExprRef) -> Result<ExprRef> {
2177 let bound = self.first(node);
2178 let (mut begin, mut end, mut step) = (NONE, NONE, NONE);
2179 for kid in self.kids(bound) {
2180 match self.name(kid) {
2181 "EndSliceBound" => end = kid,
2182 "StepSliceBound" => step = kid,
2183 _ => begin = kid,
2184 }
2185 }
2186 if end == NONE && step == NONE {
2187 if begin == NONE {
2188 return Err(Error::parser("Empty subscript '[]' is not allowed"));
2189 }
2190 let index = self.expr(begin)?;
2191 let name = self.function_name("array_extract");
2192 let args = self.expr_slice(vec![target, index]);
2193 return Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }));
2194 }
2195 let first = if begin == NONE { self.literal_number("1") } else { self.expr(begin)? };
2196 let value = if end == NONE { NONE } else { self.find(end, "EndSliceValue") };
2199 let written = if value == NONE { NONE } else { self.first(value) };
2200 let last = if written == NONE || self.name(written) == "EndSliceMinus" {
2201 self.literal_number("-1")
2202 } else {
2203 self.expr(written)?
2204 };
2205 let mut args = vec![target, first, last];
2206 if step != NONE {
2207 let by = self.first(step);
2208 args.push(if by == NONE {
2209 self.push(Expr::List { items: Slice::default() })
2210 } else {
2211 self.expr(by)?
2212 });
2213 }
2214 let name = self.function_name("array_slice");
2215 let args = self.expr_slice(args);
2216 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2217 }
2218
2219 fn literal_number(&mut self, digits: &str) -> ExprRef {
2221 let text = self.intern(digits);
2222 self.push(Expr::Literal { kind: LiteralKind::Number, text })
2223 }
2224
2225 fn function_name(&mut self, name: &str) -> Slice {
2227 let interned = self.intern(name);
2228 self.part_slice(vec![interned])
2229 }
2230
2231 fn star(&mut self, node: u32) -> Result<ExprRef> {
2233 for name in ["ExcludeList", "RenameList"] {
2234 let list = self.find(node, name);
2235 if list != NONE {
2236 return self.unsupported(list);
2237 }
2238 }
2239 let replace = self.find(node, "ReplaceList");
2240 let replacements =
2241 if replace == NONE { Slice::default() } else { self.replacements(replace)? };
2242 let qualifier = self.find(node, "StarQualifierList");
2243 let qualifier =
2244 if qualifier == NONE { Slice::default() } else { self.name_parts(qualifier) };
2245 Ok(self.push(Expr::Star { qualifier, replacements }))
2246 }
2247
2248 fn replacements(&mut self, node: u32) -> Result<Slice> {
2255 let entries = self.first(self.first(node));
2258 let listed: Vec<u32> =
2259 self.kids(entries).filter(|&kid| self.name(kid) == "ReplaceEntry").collect();
2260 let mut replacements = Vec::with_capacity(listed.len());
2261 for entry in listed {
2262 let expr = self.expr(self.first(entry))?;
2263 let alias = self.identifier(self.nth(entry, 1));
2264 let written = self.ast.string(alias).to_string();
2265 if replacements
2266 .iter()
2267 .any(|held: &Target| self.ast.string(held.alias).eq_ignore_ascii_case(&written))
2268 {
2269 return Err(Error::parser(format!(
2270 "Duplicate entry \"{written}\" in REPLACE list"
2271 )));
2272 }
2273 replacements.push(Target { expr, alias });
2274 }
2275 Ok(self.target_slice(replacements))
2276 }
2277
2278 fn function(&mut self, node: u32) -> Result<ExprRef> {
2281 for name in ["WithinGroupClause", "ExportClause"] {
2282 let clause = self.find(node, name);
2283 if clause != NONE {
2284 return self.unsupported(clause);
2285 }
2286 }
2287 let clause = self.find(node, "FilterClause");
2291 let written =
2292 if clause == NONE { NONE } else { self.descendant(clause, "FilterClauseContents") };
2293 let filter = if written == NONE {
2294 NONE
2295 } else {
2296 let predicate = self.kids(written).last().unwrap_or(NONE);
2297 self.expr(predicate)?
2298 };
2299 let over = self.find(node, "OverClause");
2300 let name = self.name_parts(self.first(node));
2301 let list = self.first(self.nth(node, 1));
2305 if self.find(list, "OrderByClause") != NONE {
2306 return self.unsupported(self.find(list, "OrderByClause"));
2307 }
2308 let nulls = self.find(list, "IgnoreOrRespectNulls");
2311 if nulls != NONE && over == NONE {
2312 return Err(Error::parser(
2313 "RESPECT/IGNORE NULLS is not supported for non-window functions",
2314 ));
2315 }
2316 let ignore_nulls = nulls != NONE && self.name(self.first(nulls)) == "IgnoreNulls";
2317 let distinct = self.quantifier(self.find(list, "DistinctOrAll")) == Quantifier::Distinct;
2318 let mut args = Vec::new();
2319 let arguments = self.find(list, "FunctionArgumentList");
2320 if arguments != NONE {
2321 for kid in self.kids(arguments) {
2322 args.push(self.argument(kid)?);
2323 }
2324 }
2325 if over != NONE {
2330 let args = self.expr_slice(args);
2331 let spec = self.over(over)?;
2332 return Ok(self.push(Expr::Window {
2333 name,
2334 args,
2335 distinct,
2336 filter,
2337 ignore_nulls,
2338 spec,
2339 }));
2340 }
2341 if self.ast.name(name).last().is_some_and(|part| part.eq_ignore_ascii_case("ifnull")) {
2347 if args.len() != 2 {
2348 return Err(Error::parser("Wrong number of arguments to IFNULL."));
2349 }
2350 let args = self.expr_slice(args);
2351 let name = self.function_name("coalesce");
2352 return Ok(self.push(Expr::Function { name, args, distinct, filter }));
2353 }
2354 let args = self.expr_slice(args);
2355 Ok(self.push(Expr::Function { name, args, distinct, filter }))
2356 }
2357
2358 fn window_clause(&mut self, node: u32) -> Result<()> {
2366 for kid in self.kids(node) {
2367 if self.name(kid) != "WindowDefinition" {
2368 continue;
2369 }
2370 let name = self.identifier(self.first(kid));
2371 let definition = self.find(kid, "WindowFrameDefinition");
2372 if definition == NONE {
2373 return self.unsupported(kid);
2374 }
2375 let (spec, framed) = self.window_definition(definition)?;
2376 let spec = self.push_window(spec);
2377 self.named_windows.push((name, spec, framed));
2378 }
2379 Ok(())
2380 }
2381
2382 fn over(&mut self, node: u32) -> Result<WindowRef> {
2391 let mut frame = self.first(node);
2392 if self.name(frame) == "WindowFrame" {
2393 frame = self.first(frame);
2394 }
2395 match self.name(frame) {
2396 "ParensIdentifier" | "IdentifierWindowFrame" => {
2397 let name = self.identifier(self.first(frame));
2398 let (spec, _) = self.named_window(name)?;
2399 Ok(spec)
2400 }
2401 "WindowFrameDefinition" => {
2402 let (spec, _) = self.window_definition(frame)?;
2403 Ok(self.push_window(spec))
2404 }
2405 _ => self.unsupported(frame),
2406 }
2407 }
2408
2409 fn named_window(&self, name: StrRef) -> Result<(WindowRef, bool)> {
2411 let written = self.ast.string(name);
2412 let found = self
2413 .named_windows
2414 .iter()
2415 .rev()
2416 .find(|&&(defined, _, _)| self.ast.string(defined).eq_ignore_ascii_case(written));
2417 match found {
2418 Some(&(_, spec, framed)) => Ok((spec, framed)),
2419 None => Err(Error::parser(format!("window \"\"{written}\"\" does not exist"))),
2423 }
2424 }
2425
2426 fn window_definition(&mut self, node: u32) -> Result<(WindowSpec, bool)> {
2433 let held = self.first(self.first(node));
2434 let (base, contents) = match self.name(held) {
2435 "WindowFrameNameContents" => {
2436 (self.find(held, "BaseWindowName"), self.find(held, "WindowFrameContents"))
2437 }
2438 "WindowFrameContents" => (NONE, held),
2439 _ => return self.unsupported(held),
2440 };
2441 if contents == NONE {
2442 return self.unsupported(node);
2443 }
2444 let partition = self.find(contents, "WindowPartition");
2445 let order = self.find(contents, "OrderByClause");
2446 let frame = self.find(contents, "FrameClause");
2447 let mut spec = WindowSpec::empty();
2448 if base != NONE {
2449 let name = self.identifier(self.first(base));
2450 let written = self.ast.string(name).to_string();
2451 let (found, framed) = self.named_window(name)?;
2452 if framed {
2456 return Err(Error::parser(format!(
2457 "cannot copy window \"{written}\" because it has a frame clause"
2458 )));
2459 }
2460 spec = self.ast.window(found);
2461 if partition != NONE && !spec.partition.is_empty() {
2462 return Err(Error::parser(format!(
2463 "Cannot override PARTITION BY clause of window \"{written}\""
2464 )));
2465 }
2466 if order != NONE && !spec.order.is_empty() {
2467 return Err(Error::parser(format!(
2468 "Cannot override ORDER BY clause of window \"{written}\""
2469 )));
2470 }
2471 }
2472 if partition != NONE {
2473 let mut items = Vec::new();
2474 for kid in self.kids(partition) {
2475 items.push(self.expr(kid)?);
2476 }
2477 spec.partition = self.expr_slice(items);
2478 }
2479 if order != NONE {
2480 let (items, all) = self.order_by(order)?;
2481 if all {
2482 return self.unsupported(order);
2483 }
2484 spec.order = self.order_slice(items);
2485 }
2486 if frame != NONE {
2487 self.frame_clause(&mut spec, frame)?;
2488 }
2489 Ok((spec, frame != NONE))
2490 }
2491
2492 fn frame_clause(&mut self, spec: &mut WindowSpec, node: u32) -> Result<()> {
2500 let framing = self.first(self.find(node, "Framing"));
2501 spec.unit = match self.name(framing) {
2502 "RowsFraming" => WindowUnit::Rows,
2503 "RangeFraming" => WindowUnit::Range,
2504 "GroupsFraming" => WindowUnit::Groups,
2505 _ => return self.unsupported(framing),
2506 };
2507 let extent = self.first(self.find(node, "FrameExtent"));
2508 match self.name(extent) {
2509 "SingleFrameExtent" => {
2512 spec.start = self.frame_bound(self.first(extent))?;
2513 spec.end = WindowBound::CurrentRow;
2514 }
2515 "BetweenFrameExtent" => {
2517 spec.start = self.frame_bound(self.first(extent))?;
2518 spec.end = self.frame_bound(self.nth(extent, 1))?;
2519 }
2520 _ => return self.unsupported(extent),
2521 }
2522 let exclude = self.find(node, "WindowExcludeClause");
2523 if exclude != NONE {
2524 let element = self.first(self.first(exclude));
2525 spec.exclude = match self.name(element) {
2526 "ExcludeCurrentRow" => WindowExclude::CurrentRow,
2527 "ExcludeGroup" => WindowExclude::Group,
2528 "ExcludeTies" => WindowExclude::Ties,
2529 "ExcludeNoOthers" => WindowExclude::NoOthers,
2530 _ => return self.unsupported(element),
2531 };
2532 }
2533 if spec.start == WindowBound::UnboundedPreceding
2534 && spec.end == WindowBound::UnboundedFollowing
2535 {
2536 spec.unit = WindowUnit::Rows;
2537 }
2538 Ok(())
2539 }
2540
2541 fn frame_bound(&mut self, node: u32) -> Result<WindowBound> {
2543 let inner = if self.name(node) == "FrameBound" { self.first(node) } else { node };
2544 match self.name(inner) {
2545 "FrameCurrentRow" => Ok(WindowBound::CurrentRow),
2546 "FrameUnbounded" => {
2548 if self.preceding(self.first(inner)) {
2549 Ok(WindowBound::UnboundedPreceding)
2550 } else {
2551 Ok(WindowBound::UnboundedFollowing)
2552 }
2553 }
2554 "FrameExpression" => {
2556 let offset = self.expr(self.first(inner))?;
2557 if self.preceding(self.nth(inner, 1)) {
2558 Ok(WindowBound::Preceding(offset))
2559 } else {
2560 Ok(WindowBound::Following(offset))
2561 }
2562 }
2563 _ => self.unsupported(inner),
2564 }
2565 }
2566
2567 fn preceding(&self, node: u32) -> bool {
2569 self.name(self.first(node)) == "PrecedingFrame"
2570 }
2571
2572 fn coalesce(&mut self, node: u32) -> Result<ExprRef> {
2583 let mut args = Vec::new();
2584 for kid in self.kids(node) {
2585 args.push(self.expr(kid)?);
2586 }
2587 let args = self.expr_slice(args);
2588 let name = self.function_name("coalesce");
2589 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2590 }
2591
2592 fn null_if(&mut self, node: u32) -> Result<ExprRef> {
2602 let arguments = self.find(node, "NullIfArguments");
2603 if arguments == NONE {
2604 return self.unsupported(node);
2605 }
2606 let mut args = Vec::new();
2607 for kid in self.kids(arguments) {
2608 args.push(self.expr(kid)?);
2609 }
2610 let args = self.expr_slice(args);
2611 let name = self.function_name("nullif");
2612 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2613 }
2614
2615 fn substring(&mut self, node: u32) -> Result<ExprRef> {
2624 let shape = self.first(self.first(node));
2625 let mut args = Vec::new();
2626 match self.name(shape) {
2627 "SubstringExpressionList" => {
2628 for kid in self.kids(shape) {
2629 args.push(self.expr(kid)?);
2630 }
2631 }
2632 "SubstringParameters" => {
2633 args.push(self.expr(self.first(shape))?);
2634 let bounds = self.first(self.nth(shape, 1));
2638 let from = self.find(bounds, "FromExpression");
2639 let start =
2640 if from == NONE { self.number("1") } else { self.expr(self.first(from))? };
2641 args.push(start);
2642 let count = self.find(bounds, "ForExpression");
2643 if count != NONE {
2644 args.push(self.expr(self.first(count))?);
2645 }
2646 }
2647 _ => return self.unsupported(shape),
2648 }
2649 let args = self.expr_slice(args);
2650 let name = self.function_name("substring");
2651 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2652 }
2653
2654 fn position(&mut self, node: u32) -> Result<ExprRef> {
2661 let arguments = self.first(node);
2662 if self.count(arguments) != 2 {
2663 return self.unsupported(arguments);
2664 }
2665 let needle = self.expr(self.first(arguments))?;
2666 let haystack = self.expr(self.nth(arguments, 1))?;
2667 let args = self.expr_slice(vec![haystack, needle]);
2668 let name = self.function_name("position");
2669 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2670 }
2671
2672 fn trim(&mut self, node: u32) -> Result<ExprRef> {
2681 let arguments = self.first(node);
2682 let direction = self.find(arguments, "TrimDirection");
2683 let name = match direction {
2684 NONE => "trim",
2685 held => match self.name(self.first(held)) {
2686 "TrimLeading" => "ltrim",
2687 "TrimTrailing" => "rtrim",
2688 _ => "trim",
2689 },
2690 };
2691 let mut args = Vec::new();
2692 for kid in self.kids(arguments) {
2693 if matches!(self.name(kid), "TrimDirection" | "TrimSource") {
2694 continue;
2695 }
2696 args.push(self.expr(kid)?);
2697 }
2698 let source = self.find(arguments, "TrimSource");
2701 if source != NONE && self.count(source) == 1 {
2702 args.push(self.expr(self.first(source))?);
2703 }
2704 let args = self.expr_slice(args);
2705 let name = self.function_name(name);
2706 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2707 }
2708
2709 fn overlay(&mut self, node: u32) -> Result<ExprRef> {
2717 let shape = self.first(self.first(node));
2718 if !matches!(self.name(shape), "OverlayParameters" | "OverlayExpressionList") {
2719 return self.unsupported(shape);
2720 }
2721 let mut args = Vec::new();
2722 for kid in self.kids(shape) {
2723 let kid = match self.name(kid) {
2724 "FromExpression" | "ForExpression" => self.first(kid),
2725 _ => kid,
2726 };
2727 args.push(self.expr(kid)?);
2728 }
2729 let args = self.expr_slice(args);
2730 let name = self.function_name("overlay");
2731 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2732 }
2733
2734 fn number(&mut self, text: &str) -> ExprRef {
2736 let text = self.intern(text);
2737 self.push(Expr::Literal { kind: LiteralKind::Number, text })
2738 }
2739
2740 fn extract(&mut self, node: u32) -> Result<ExprRef> {
2749 let arguments = self.find(node, "ExtractArguments");
2750 if arguments == NONE {
2751 return self.unsupported(node);
2752 }
2753 let argument = self.first(self.first(arguments));
2754 let part = match self.name(argument) {
2755 "ExtractStringArgument" => self.string_value(argument)?,
2756 "ExtractDatePartArgument" => date_part(self.text(argument)),
2761 "ExtractIdentifierArgument" => self.text(argument).to_string(),
2764 _ => return self.unsupported(argument),
2765 };
2766 let text = self.intern(&part);
2767 let part = self.push(Expr::Literal { kind: LiteralKind::String, text });
2768 let operand = self.expr(self.nth(arguments, 1))?;
2769 let name = self.function_name("date_part");
2770 let args = self.expr_slice(vec![part, operand]);
2771 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2772 }
2773
2774 fn argument(&mut self, node: u32) -> Result<ExprRef> {
2776 let inner = self.first(node);
2777 match self.name(inner) {
2778 "PositionalFunctionArgument" => self.expr(self.first(inner)),
2779 _ => self.unsupported(inner),
2780 }
2781 }
2782
2783 fn table_argument(&mut self, node: u32) -> Result<Target> {
2798 let inner = self.first(node);
2799 if self.name(inner) == "NamedFunctionArgument" {
2800 let named = self.first(inner);
2801 if self.count(named) != 3 {
2802 return self.unsupported(named);
2805 }
2806 let alias = self.identifier(self.first(named));
2807 let expr = self.expr(self.nth(named, 2))?;
2808 return Ok(Target { expr, alias });
2809 }
2810 let expr = self.expr(self.first(inner))?;
2811 if let Expr::Binary { op: BinaryOp::Eq, left, right } = self.ast.expr(expr) {
2812 if let Expr::Column { name } = self.ast.expr(left) {
2813 if name.len == 1 {
2814 let alias = self.ast.parts[name.start as usize];
2815 return Ok(Target { expr: right, alias });
2816 }
2817 }
2818 }
2819 Ok(Target { expr, alias: NONE })
2820 }
2821
2822 fn cast(&mut self, node: u32) -> Result<ExprRef> {
2824 let try_cast = self.name(self.first(self.first(node))) == "TryCastKeyword";
2825 let arguments = self.nth(node, 1);
2827 let operand = self.expr(self.first(arguments))?;
2828 let text = self.text(self.nth(arguments, 1)).to_string();
2829 let ty = self.intern(&text);
2830 Ok(self.push(Expr::Cast { operand, ty, try_cast }))
2831 }
2832
2833 fn typed_literal(&mut self, node: u32) -> Result<ExprRef> {
2843 let text = self.text(self.first(node)).to_string();
2844 let ty = self.intern(&text);
2845 let operand = self.expr(self.nth(node, 1))?;
2846 Ok(self.push(Expr::Cast { operand, ty, try_cast: false }))
2847 }
2848
2849 fn interval_literal(&mut self, node: u32) -> Result<ExprRef> {
2867 let parameter = self.find(node, "IntervalParameter");
2868 if parameter == NONE {
2869 return self.unsupported(node);
2870 }
2871 let operand = self.expr(self.first(parameter))?;
2872 let unit = self.find(node, "Interval");
2873 if unit == NONE {
2874 let ty = self.intern("INTERVAL");
2875 return Ok(self.push(Expr::Cast { operand, ty, try_cast: false }));
2876 }
2877 let spelling = self.name(self.first(unit));
2878 if spelling == "IntervalToInterval" {
2882 let pair = self.name(self.first(self.first(unit)));
2883 return Err(Error::parser(format!("{} is not supported", worded(pair))));
2884 }
2885 let Some(&(_, function, width)) = UNITS.iter().find(|(rule, _, _)| *rule == spelling)
2886 else {
2887 return self.unsupported(unit);
2888 };
2889 let double = self.intern("DOUBLE");
2890 let mut count = self.push(Expr::Cast { operand, ty: double, try_cast: false });
2891 if let Some(width) = width {
2892 let name = self.function_name("trunc");
2893 let args = self.expr_slice(vec![count]);
2894 let whole = self.push(Expr::Function { name, args, distinct: false, filter: NONE });
2895 let ty = self.intern(width);
2896 count = self.push(Expr::Cast { operand: whole, ty, try_cast: false });
2897 }
2898 let name = self.function_name(function);
2899 let args = self.expr_slice(vec![count]);
2900 Ok(self.push(Expr::Function { name, args, distinct: false, filter: NONE }))
2901 }
2902
2903 fn case(&mut self, node: u32) -> Result<ExprRef> {
2905 let mut operand = NONE;
2906 let mut arms = Vec::new();
2907 let mut otherwise = NONE;
2908 for kid in self.kids(node) {
2909 match self.name(kid) {
2910 "CaseWhenThen" => {
2912 let when = self.expr(self.first(kid))?;
2913 let then = self.expr(self.nth(kid, 1))?;
2914 arms.push(CaseArm { when, then });
2915 }
2916 "CaseElse" => otherwise = self.expr(self.first(kid))?,
2918 _ => operand = self.expr(kid)?,
2920 }
2921 }
2922 let start = self.ast.case_arms.len() as u32;
2923 self.ast.case_arms.extend(arms);
2924 let arms = Slice { start, len: self.ast.case_arms.len() as u32 - start };
2925 Ok(self.push(Expr::Case { operand, arms, otherwise }))
2926 }
2927
2928 fn row(&mut self, node: u32) -> Result<ExprRef> {
2933 let mut items = Vec::new();
2934 for kid in self.kids(node) {
2935 items.push(self.expr(kid)?);
2936 }
2937 if items.len() == 1 {
2938 return Ok(items[0]);
2939 }
2940 let items = self.expr_slice(items);
2941 Ok(self.push(Expr::Row { items }))
2942 }
2943
2944 fn parameter(&mut self, node: u32) -> Result<ExprRef> {
2951 let written = self.text(node).trim();
2952 let written = written.trim_start_matches(['?', '$']).trim();
2953 let name = if written.is_empty() {
2954 self.anonymous += 1;
2955 self.anonymous.to_string()
2956 } else {
2957 written.to_string()
2958 };
2959 let name = self.intern(&name);
2960 Ok(self.push(Expr::Parameter { name }))
2961 }
2962
2963 fn list(&mut self, node: u32) -> Result<ExprRef> {
2968 let mut items = Vec::new();
2969 for kid in self.kids(node) {
2970 items.push(self.expr(kid)?);
2971 }
2972 let items = self.expr_slice(items);
2973 Ok(self.push(Expr::List { items }))
2974 }
2975
2976 fn subquery(&mut self, node: u32) -> Result<ExprRef> {
2978 let negated = self.find(node, "SubqueryNot") != NONE;
2979 let exists = self.find(node, "SubqueryExists") != NONE;
2980 let reference = self.find(node, "SubqueryReference");
2981 let query = self.query(self.first(reference))?;
2982 Ok(if exists {
2983 self.push(Expr::Exists { query, negated })
2984 } else if negated {
2985 return self.unsupported(node);
2986 } else {
2987 self.push(Expr::Subquery { query })
2988 })
2989 }
2990
2991 fn string_value(&self, node: u32) -> Result<String> {
2997 let span = self.tree.node(node);
2998 let mut value = String::new();
2999 for token in &self.tokens[span.start as usize..span.end as usize] {
3000 if token.kind == Kind::String {
3001 value.push_str(&string_token(token.text(self.query))?);
3002 }
3003 }
3004 Ok(value)
3005 }
3006
3007 fn first_string(&self, node: u32) -> &'a str {
3013 let span = self.tree.node(node);
3014 self.tokens[span.start as usize..span.end as usize]
3015 .iter()
3016 .find(|token| token.kind == Kind::String)
3017 .map_or("", |token| token.text(self.query))
3018 }
3019
3020 fn string_literal(&mut self, node: u32) -> Result<ExprRef> {
3029 let token = self.first_string(node);
3030 let prefix = match token.as_bytes() {
3031 [prefix, b'\'', ..] => *prefix,
3032 _ => 0,
3033 };
3034 if matches!(prefix, b'X' | b'x') {
3035 if let Some(body) = token.get(1..).and_then(quoted_body) {
3036 let text = blob_text(body.as_bytes())?;
3037 let text = self.intern(&text);
3038 return Ok(self.push(Expr::Literal { kind: LiteralKind::Blob, text }));
3039 }
3040 }
3041 let value = self.string_value(node)?;
3042 let text = self.intern(&value);
3043 let literal = self.push(Expr::Literal { kind: LiteralKind::String, text });
3044 if matches!(prefix, b'N' | b'n') {
3045 let ty = self.intern("VARCHAR");
3046 return Ok(self.push(Expr::Cast { operand: literal, ty, try_cast: false }));
3047 }
3048 Ok(literal)
3049 }
3050}
3051
3052const UNITS: &[(&str, &str, Option<&str>)] = &[
3060 ("YearKeyword", "to_years", Some("INTEGER")),
3061 ("MonthKeyword", "to_months", Some("INTEGER")),
3062 ("QuarterKeyword", "to_quarters", Some("INTEGER")),
3063 ("DecadeKeyword", "to_decades", Some("INTEGER")),
3064 ("CenturyKeyword", "to_centuries", Some("INTEGER")),
3065 ("MillenniumKeyword", "to_millennia", Some("INTEGER")),
3066 ("DayKeyword", "to_days", Some("INTEGER")),
3067 ("WeekKeyword", "to_weeks", Some("INTEGER")),
3068 ("HourKeyword", "to_hours", Some("BIGINT")),
3069 ("MinuteKeyword", "to_minutes", Some("BIGINT")),
3070 ("MicrosecondKeyword", "to_microseconds", Some("BIGINT")),
3071 ("SecondKeyword", "to_seconds", None),
3072 ("MillisecondKeyword", "to_milliseconds", None),
3073];
3074
3075fn date_part(written: &str) -> String {
3086 const PARTS: &[(&str, &str)] = &[
3087 ("YEAR", "YEAR"),
3088 ("YEARS", "YEAR"),
3089 ("MONTH", "MONTH"),
3090 ("MONTHS", "MONTH"),
3091 ("DAY", "DAY"),
3092 ("DAYS", "DAY"),
3093 ("HOUR", "HOUR"),
3094 ("HOURS", "HOUR"),
3095 ("MINUTE", "MINUTE"),
3096 ("MINUTES", "MINUTE"),
3097 ("SECOND", "SECOND"),
3098 ("SECONDS", "SECOND"),
3099 ("MILLISECOND", "MILLISECONDS"),
3100 ("MILLISECONDS", "MILLISECONDS"),
3101 ("MICROSECOND", "MICROSECONDS"),
3102 ("MICROSECONDS", "MICROSECONDS"),
3103 ("WEEK", "WEEK"),
3104 ("WEEKS", "WEEK"),
3105 ("QUARTER", "QUARTER"),
3106 ("QUARTERS", "QUARTER"),
3107 ("DECADE", "DECADE"),
3108 ("DECADES", "DECADE"),
3109 ("CENTURY", "CENTURY"),
3110 ("CENTURIES", "CENTURY"),
3111 ("MILLENNIUM", "MILLENNIUM"),
3112 ("MILLENNIA", "MILLENNIUM"),
3113 ];
3114 PARTS
3115 .iter()
3116 .find(|(spelling, _)| spelling.eq_ignore_ascii_case(written))
3117 .map_or_else(|| written.to_string(), |(_, name)| (*name).to_string())
3118}
3119
3120fn worded(rule: &str) -> String {
3122 let mut out = String::new();
3123 for character in rule.chars() {
3124 if character.is_ascii_uppercase() && !out.is_empty() {
3125 out.push(' ');
3126 }
3127 out.push(character.to_ascii_uppercase());
3128 }
3129 out
3130}
3131
3132fn string_token(text: &str) -> Result<String> {
3139 if let Some(body) = dollar_body(text) {
3140 return Ok(body.to_string());
3141 }
3142 if let Some(body) = quoted_body(text) {
3143 return Ok(body.replace("''", "'"));
3144 }
3145 let Some(body) = text.get(1..).and_then(quoted_body) else {
3146 return Ok(text.to_string());
3147 };
3148 match text.as_bytes()[0] {
3149 b'E' | b'e' => escaped(body),
3150 b'N' | b'n' => Ok(body.replace("''", "'")),
3152 b'B' | b'b' => Ok(format!("b{}", body.replace("''", "'"))),
3156 _ => Err(Error::not_implemented(format!("the string literal {text} is not supported yet"))),
3159 }
3160}
3161
3162fn blob_text(body: &[u8]) -> Result<String> {
3174 if body.len() % 2 != 0 {
3175 return Err(Error::parser("Hex string literal must have an even number of hex digits"));
3176 }
3177 let digit = |byte: u8| (byte as char).to_digit(16).map(|digit| digit as u8);
3178 let bytes: Option<Vec<u8>> =
3179 body.chunks(2).map(|pair| Some(digit(pair[0])? * 16 + digit(pair[1])?)).collect();
3180 match bytes {
3181 Some(bytes) => Ok(Value::Blob(bytes).to_string()),
3182 None => {
3183 Ok(body.chunks(2).map(|pair| format!("\\x{}", String::from_utf8_lossy(pair))).collect())
3184 }
3185 }
3186}
3187
3188fn quoted_body(text: &str) -> Option<&str> {
3193 text.strip_prefix('\'').filter(|rest| !rest.is_empty()).and_then(|rest| rest.strip_suffix('\''))
3194}
3195
3196fn escaped(body: &str) -> Result<String> {
3209 let bytes = body.as_bytes();
3210 let mut out = Vec::with_capacity(bytes.len());
3211 let mut at = 0;
3212 while at < bytes.len() {
3213 let byte = bytes[at];
3214 at += 1;
3215 if byte == b'\'' && bytes.get(at) == Some(&b'\'') {
3216 out.push(b'\'');
3217 at += 1;
3218 continue;
3219 }
3220 if byte != b'\\' || at == bytes.len() {
3221 out.push(byte);
3222 continue;
3223 }
3224 let escape = bytes[at];
3225 at += 1;
3226 match escape {
3227 b'n' => out.push(b'\n'),
3228 b't' => out.push(b'\t'),
3229 b'r' => out.push(b'\r'),
3230 b'b' => out.push(0x08),
3231 b'f' => out.push(0x0c),
3232 b'x' => match digits(bytes, &mut at, 16, 2) {
3233 Some(value) => out.push(value as u8),
3234 None => out.push(b'x'),
3235 },
3236 b'0'..=b'7' => {
3237 at -= 1;
3238 let value = digits(bytes, &mut at, 8, 3).unwrap_or(0);
3239 out.push(value as u8);
3240 }
3241 b'u' => match four_hex(bytes, at).and_then(char::from_u32).filter(|c| *c != '\0') {
3242 Some(c) => {
3243 at += 4;
3244 out.extend_from_slice(c.encode_utf8(&mut [0; 4]).as_bytes());
3245 }
3246 None => out.push(b'u'),
3247 },
3248 other => out.push(other),
3249 }
3250 }
3251 if out.contains(&0) {
3252 return Err(Error::parser("Null character not permitted in escape string literal"));
3253 }
3254 String::from_utf8(out).map_err(|error| {
3255 Error::parser(format!(
3256 "Invalid UTF-8 in escape string literal at byte offset {}: byte mismatch",
3257 error.utf8_error().valid_up_to()
3258 ))
3259 })
3260}
3261
3262fn digits(bytes: &[u8], at: &mut usize, radix: u32, most: usize) -> Option<u32> {
3267 let mut value = None;
3268 for _ in 0..most {
3269 let Some(digit) = bytes.get(*at).and_then(|byte| (*byte as char).to_digit(radix)) else {
3270 break;
3271 };
3272 value = Some(value.unwrap_or(0) * radix + digit);
3273 *at += 1;
3274 }
3275 value
3276}
3277
3278fn four_hex(bytes: &[u8], at: usize) -> Option<u32> {
3284 let digits = bytes.get(at..at + 4)?;
3285 if !digits.iter().all(u8::is_ascii_hexdigit) {
3286 return None;
3287 }
3288 u32::from_str_radix(std::str::from_utf8(digits).ok()?, 16).ok()
3289}
3290
3291fn dollar_body(text: &str) -> Option<&str> {
3300 let rest = text.strip_prefix('$')?;
3301 let close = rest.find('$')?;
3302 let (tag, body) = (&rest[..close], &rest[close + 1..]);
3303 body.strip_suffix(&format!("${tag}$"))
3304}
3305
3306fn unquote(text: &str) -> String {
3316 if let Some(body) = text.strip_prefix('"').and_then(|rest| rest.strip_suffix('"')) {
3317 return body.replace("\"\"", "\"");
3318 }
3319 match text.strip_prefix('\'').and_then(|rest| rest.strip_suffix('\'')) {
3320 Some(body) => body.replace("''", "'"),
3321 None => text.to_string(),
3322 }
3323}
3324
3325#[cfg(test)]
3326mod tests {
3327 use super::*;
3328 use crate::corpus::CORPUS;
3329 use crate::matcher::parse;
3330
3331 fn show(ast: &Ast, expr: ExprRef) -> String {
3339 if expr == NONE {
3340 return "-".to_string();
3341 }
3342 fn shown_filter(ast: &Ast, filter: ExprRef) -> String {
3344 if filter == NONE { String::new() } else { format!(" FILTER [{}]", show(ast, filter)) }
3345 }
3346 let list = |slice: Slice| {
3347 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
3348 };
3349 match ast.expr(expr) {
3350 Expr::Star { qualifier, replacements } => {
3351 let star = if qualifier.is_empty() {
3352 "*".to_string()
3353 } else {
3354 format!("{}.*", ast.name_text(qualifier))
3355 };
3356 if replacements.is_empty() {
3357 return star;
3358 }
3359 let entries: Vec<String> = ast
3360 .target_list(replacements)
3361 .iter()
3362 .map(|target| {
3363 format!("{} AS {}", show(ast, target.expr), ast.string(target.alias))
3364 })
3365 .collect();
3366 format!("{star} REPLACE ({})", entries.join(", "))
3367 }
3368 Expr::Column { name } => ast.name_text(name),
3369 Expr::Literal { kind, text } => match kind {
3370 LiteralKind::Number => ast.string(text).to_string(),
3371 LiteralKind::String => format!("'{}'", ast.string(text)),
3372 LiteralKind::Blob => format!("'{}'::BLOB", ast.string(text)),
3373 other => format!("{other:?}").to_uppercase(),
3374 },
3375 Expr::Unary { op, operand } => format!("({op:?} {})", show(ast, operand)),
3376 Expr::Binary { op, left, right } => {
3377 let op = match op {
3378 BinaryOp::Named(name) => ast.string(name).to_string(),
3379 other => format!("{other:?}"),
3380 };
3381 format!("({} {op} {})", show(ast, left), show(ast, right))
3382 }
3383 Expr::Function { name, args, distinct, filter } => {
3384 let distinct = if distinct { "DISTINCT " } else { "" };
3385 let filter = shown_filter(ast, filter);
3386 format!("{}({distinct}{}){filter}", ast.name_text(name), list(args))
3387 }
3388 Expr::Window { name, args, distinct, filter, ignore_nulls, spec } => {
3389 let distinct = if distinct { "DISTINCT " } else { "" };
3390 let filter = shown_filter(ast, filter);
3391 let nulls = if ignore_nulls { " IGNORE NULLS" } else { "" };
3392 let held = ast.window(spec);
3393 let order = ast
3394 .order_list(held.order)
3395 .iter()
3396 .map(|item| {
3397 format!("{} {:?} {:?}", show(ast, item.expr), item.order, item.nulls)
3398 })
3399 .collect::<Vec<_>>()
3400 .join(", ");
3401 let bound = |end: WindowBound| match end {
3402 WindowBound::Preceding(offset) => format!("Preceding({})", show(ast, offset)),
3403 WindowBound::Following(offset) => format!("Following({})", show(ast, offset)),
3404 other => format!("{other:?}"),
3405 };
3406 format!(
3407 "{}({distinct}{}{nulls}){filter} OVER [{}] [{order}] [{:?} {} {} {:?}]",
3408 ast.name_text(name),
3409 list(args),
3410 list(held.partition),
3411 held.unit,
3412 bound(held.start),
3413 bound(held.end),
3414 held.exclude
3415 )
3416 }
3417 Expr::Cast { operand, ty, try_cast } => {
3418 let word = if try_cast { "TRY_CAST" } else { "CAST" };
3419 format!("{word}({} AS {})", show(ast, operand), ast.string(ty))
3420 }
3421 Expr::Case { operand, arms, otherwise } => {
3422 let arms = ast
3423 .arm_list(arms)
3424 .iter()
3425 .map(|arm| format!("WHEN {} THEN {}", show(ast, arm.when), show(ast, arm.then)))
3426 .collect::<Vec<_>>()
3427 .join(" ");
3428 format!("CASE {} {arms} ELSE {} END", show(ast, operand), show(ast, otherwise))
3429 }
3430 Expr::Between { operand, low, high, negated } => {
3431 let not = if negated { "NOT " } else { "" };
3432 format!(
3433 "({not}{} BETWEEN {} AND {})",
3434 show(ast, operand),
3435 show(ast, low),
3436 show(ast, high)
3437 )
3438 }
3439 Expr::In { operand, list: items, negated } => {
3440 let not = if negated { "NOT " } else { "" };
3441 format!("({not}{} IN [{}])", show(ast, operand), list(items))
3442 }
3443 Expr::List { items } => format!("[{}]", list(items)),
3444 Expr::Parameter { name } => format!("${}", ast.string(name)),
3445 Expr::Row { items } => format!("ROW({})", list(items)),
3446 Expr::Subquery { query } => format!("({})", show_query(ast, query)),
3447 Expr::Exists { query, negated } => {
3448 let exists = format!("EXISTS ({})", show_query(ast, query));
3449 if negated { format!("NOT {exists}") } else { exists }
3450 }
3451 Expr::InSubquery { operand, query, negated } => {
3452 let written = format!("{} IN ({})", show(ast, operand), show_query(ast, query));
3453 if negated { format!("NOT {written}") } else { written }
3454 }
3455 Expr::QuantifiedSubquery { operand, op, query, all } => {
3456 let quantifier = if all { "ALL" } else { "ANY" };
3457 format!("{} {op:?} {quantifier} ({})", show(ast, operand), show_query(ast, query))
3458 }
3459 }
3460 }
3461
3462 fn show_source(ast: &Ast, source: SourceRef) -> String {
3464 let alias = |alias: StrRef| match alias {
3465 NONE => String::new(),
3466 other => format!(" AS {}", ast.string(other)),
3467 };
3468 match ast.source(source) {
3469 Source::Table { name, alias: name_alias, .. } => {
3470 format!("{}{}", ast.name_text(name), alias(name_alias))
3471 }
3472 Source::Function { name, args, alias: call_alias, .. } => {
3473 let args = ast
3474 .target_list(args)
3475 .iter()
3476 .map(|item| match item.alias {
3477 NONE => show(ast, item.expr),
3478 named => format!("{} := {}", ast.string(named), show(ast, item.expr)),
3479 })
3480 .collect::<Vec<_>>()
3481 .join(", ");
3482 format!("{}({args}){}", ast.name_text(name), alias(call_alias))
3483 }
3484 Source::Subquery { query, alias: query_alias, .. } => {
3485 format!("({}){}", show_query(ast, query), alias(query_alias))
3486 }
3487 Source::Cte { cte, alias: cte_alias, .. } => {
3488 format!("{}{}", ast.string(ast.cte(cte).name), alias(cte_alias))
3489 }
3490 Source::Values { rows, alias: values_alias, .. } => {
3491 format!("{}{}", show_rows(ast, rows), alias(values_alias))
3492 }
3493 Source::Join { left, right, kind, natural, on, using } => {
3494 let natural = if natural { "NATURAL " } else { "" };
3495 let on = if on == NONE { String::new() } else { format!(" ON {}", show(ast, on)) };
3496 let using = if using.is_empty() {
3497 String::new()
3498 } else {
3499 format!(" USING ({})", ast.name_text(using))
3500 };
3501 format!(
3502 "({} {natural}{kind:?} JOIN {}{on}{using})",
3503 show_source(ast, left),
3504 show_source(ast, right)
3505 )
3506 }
3507 }
3508 }
3509
3510 fn show_rows(ast: &Ast, rows: Slice) -> String {
3512 let rows = ast
3513 .rows(rows)
3514 .iter()
3515 .map(|&row| {
3516 let items = ast
3517 .expr_list(row)
3518 .iter()
3519 .map(|&item| show(ast, item))
3520 .collect::<Vec<_>>()
3521 .join(", ");
3522 format!("({items})")
3523 })
3524 .collect::<Vec<_>>()
3525 .join(", ");
3526 format!("VALUES {rows}")
3527 }
3528
3529 fn show_query(ast: &Ast, index: QueryRef) -> String {
3531 let query = ast.query(index);
3532 let list = |slice: Slice| {
3533 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
3534 };
3535 let mut out = String::new();
3536 for &index in ast.cte_list(query.ctes) {
3537 let cte = ast.cte(index);
3538 let columns = ast.name(cte.columns).collect::<Vec<_>>().join(", ");
3539 let columns = if columns.is_empty() { columns } else { format!("({columns})") };
3540 out += &format!(
3541 "WITH {}{columns} AS MATERIALIZED ({}) ",
3542 ast.string(cte.name),
3543 show_query(ast, cte.query)
3544 );
3545 }
3546 out += &match query.body {
3547 QueryBody::SetOp { op, quantifier, by_name, left, right } => {
3548 let by_name = if by_name { " BY NAME" } else { "" };
3549 format!(
3550 "({} {op:?} {quantifier:?}{by_name} {})",
3551 show_query(ast, left),
3552 show_query(ast, right)
3553 )
3554 }
3555 QueryBody::Select(index) => {
3556 let select = ast.select(index);
3557 let distinct = match select.distinct {
3558 Distinct::No => String::new(),
3559 Distinct::Yes => " DISTINCT".to_string(),
3560 Distinct::On(on) => format!(" DISTINCT ON ({})", list(on)),
3561 };
3562 let targets = ast
3563 .target_list(select.targets)
3564 .iter()
3565 .map(|target| match target.alias {
3566 NONE => show(ast, target.expr),
3567 alias => format!("{} AS {}", show(ast, target.expr), ast.string(alias)),
3568 })
3569 .collect::<Vec<_>>()
3570 .join(", ");
3571 let mut out = format!("SELECT{distinct} {targets}");
3572 if !select.from.is_empty() {
3573 let from = ast
3574 .source_list(select.from)
3575 .iter()
3576 .map(|&source| show_source(ast, source))
3577 .collect::<Vec<_>>()
3578 .join(", ");
3579 out += &format!(" FROM {from}");
3580 }
3581 if select.filter != NONE {
3582 out += &format!(" WHERE {}", show(ast, select.filter));
3583 }
3584 if select.group_by_all {
3585 out += " GROUP BY ALL";
3586 } else if !select.group_by.is_empty() {
3587 out += &format!(" GROUP BY {}", list(select.group_by));
3588 }
3589 if select.having != NONE {
3590 out += &format!(" HAVING {}", show(ast, select.having));
3591 }
3592 out
3593 }
3594 QueryBody::Values(rows) => show_rows(ast, rows),
3595 QueryBody::Describe(inner) => format!("DESCRIBE {}", show_query(ast, inner)),
3596 QueryBody::Show { name, .. } => format!("SHOW {}", ast.name_text(name)),
3597 };
3598 if query.order_by_all {
3599 out += " ORDER BY ALL";
3600 } else if !query.order_by.is_empty() {
3601 let items = ast
3602 .order_list(query.order_by)
3603 .iter()
3604 .map(|item| format!("{} {:?} {:?}", show(ast, item.expr), item.order, item.nulls))
3605 .collect::<Vec<_>>()
3606 .join(", ");
3607 out += &format!(" ORDER BY {items}");
3608 }
3609 if query.limit != NONE {
3610 let percent = if query.limit_percent { "%" } else { "" };
3611 out += &format!(" LIMIT {}{percent}", show(ast, query.limit));
3612 }
3613 if query.offset != NONE {
3614 out += &format!(" OFFSET {}", show(ast, query.offset));
3615 }
3616 out
3617 }
3618
3619 fn round(query: &str) -> String {
3621 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
3622 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
3623 let Statement::Query(index) = ast.statements[0] else {
3624 panic!("{query} is not a query");
3625 };
3626 show_query(&ast, index)
3627 }
3628
3629 fn round_with_case(query: &str, case: IdentifierCase) -> String {
3630 let ast =
3631 parse_ast_with_case(query, case).unwrap_or_else(|error| panic!("{query}: {error}"));
3632 let Statement::Query(index) = ast.statements[0] else {
3633 panic!("{query} is not a query");
3634 };
3635 show_query(&ast, index)
3636 }
3637
3638 fn round_statement(query: &str) -> String {
3640 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
3641 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
3642 match ast.statements[0] {
3643 Statement::Query(index) => show_query(&ast, index),
3644 Statement::CreateTable(index) => {
3645 let create = ast.create_table(index);
3646 let mut out = "CREATE".to_string();
3647 if create.or_replace {
3648 out += " OR REPLACE";
3649 }
3650 if create.temporary {
3651 out += " TEMPORARY";
3652 }
3653 out += " TABLE";
3654 if create.if_not_exists {
3655 out += " IF NOT EXISTS";
3656 }
3657 out += &format!(" {}", ast.name_text(create.name));
3658 let columns = ast
3659 .column_defs(create.columns)
3660 .iter()
3661 .map(|def| {
3662 let ty = match def.ty {
3663 NONE => String::new(),
3664 other => format!(" {}", ast.string(other)),
3665 };
3666 let null = if def.not_null { " NOT NULL" } else { "" };
3667 format!("{}{ty}{null}", ast.string(def.name))
3668 })
3669 .collect::<Vec<_>>()
3670 .join(", ");
3671 if !columns.is_empty() || create.query == NONE {
3672 out += &format!(" ({columns})");
3673 }
3674 if create.query != NONE {
3675 out += &format!(" AS {}", show_query(&ast, create.query));
3676 }
3677 out
3678 }
3679 Statement::CreateView(index) => {
3680 let create = ast.create_view(index);
3681 let mut out = "CREATE".to_string();
3682 if create.or_replace {
3683 out += " OR REPLACE";
3684 }
3685 if create.temporary {
3686 out += " TEMPORARY";
3687 }
3688 out += " VIEW";
3689 if create.if_not_exists {
3690 out += " IF NOT EXISTS";
3691 }
3692 out += &format!(" {}", ast.name_text(create.name));
3693 if !create.columns.is_empty() {
3694 let columns = ast.name(create.columns).collect::<Vec<_>>().join(", ");
3695 out += &format!(" ({columns})");
3696 }
3697 out + &format!(" AS {}", show_query(&ast, create.query))
3698 }
3699 Statement::DropTable(index) => {
3700 let drop = ast.drop_table(index);
3701 let mut out = if drop.view { "DROP VIEW" } else { "DROP TABLE" }.to_string();
3702 if drop.if_exists {
3703 out += " IF EXISTS";
3704 }
3705 let names = ast
3706 .name_list(drop.names)
3707 .iter()
3708 .map(|&name| ast.name_text(name))
3709 .collect::<Vec<_>>()
3710 .join(", ");
3711 out + &format!(" {names}")
3712 }
3713 Statement::Insert(index) => {
3714 let insert = ast.insert(index);
3715 let mut out = format!("INSERT INTO {}", ast.name_text(insert.name));
3716 if !insert.columns.is_empty() {
3717 let columns = ast.name(insert.columns).collect::<Vec<_>>().join(", ");
3718 out += &format!(" ({columns})");
3719 }
3720 out + &format!(" {}", show_query(&ast, insert.source))
3721 }
3722 Statement::Set(index) if ast.setting(index).pragma => {
3723 format!("PRAGMA {}", ast.string(ast.setting(index).name))
3724 }
3725 Statement::Set(index) => {
3726 let setting = ast.setting(index);
3727 let scope = match setting.scope.keyword() {
3728 "" => String::new(),
3729 word => format!(" {word}"),
3730 };
3731 format!("SET{scope} {} = {}", ast.string(setting.name), show(&ast, setting.value))
3732 }
3733 Statement::Reset(index) => {
3734 let setting = ast.setting(index);
3735 let scope = match setting.scope.keyword() {
3736 "" => String::new(),
3737 word => format!(" {word}"),
3738 };
3739 format!("RESET{scope} {}", ast.string(setting.name))
3740 }
3741 Statement::Checkpoint => "CHECKPOINT".to_string(),
3742 Statement::Explain { query, analyze } => {
3743 let analyze = if analyze { "ANALYZE " } else { "" };
3744 format!("EXPLAIN {analyze}{}", show_query(&ast, query))
3745 }
3746 }
3747 }
3748
3749 #[test]
3750 fn expressions_and_queries_keep_their_source_ranges() {
3751 let sql = "SELECT 1 + 22";
3752 let ast = parse_ast(sql).expect("the query parses");
3753 let Statement::Query(query) = ast.statements[0] else { panic!("a query") };
3754 assert_eq!(ast.query_span(query), Span::new(0, sql.len() as u32));
3755 let twenty_two = ast
3756 .exprs
3757 .iter()
3758 .enumerate()
3759 .find_map(|(at, expr)| match *expr {
3760 Expr::Literal { kind: LiteralKind::Number, text } if ast.string(text) == "22" => {
3761 Some(at as u32)
3762 }
3763 _ => None,
3764 })
3765 .expect("the literal is in the arena");
3766 assert_eq!(ast.expr_span(twenty_two), Span::new(11, 13));
3767 }
3768
3769 #[test]
3770 fn an_explain_keeps_the_query_it_was_asked_about() {
3771 assert_eq!(
3772 round_statement("EXPLAIN SELECT a FROM t WHERE a > 1"),
3773 "EXPLAIN SELECT a FROM t WHERE (a Gt 1)"
3774 );
3775 assert_eq!(round_statement("explain select 1"), "EXPLAIN SELECT 1");
3776 assert_eq!(round_statement("explain analyze select 1"), "EXPLAIN ANALYZE SELECT 1");
3777 }
3778
3779 #[test]
3780 fn the_parts_of_an_explain_that_are_not_the_query_are_refused_by_name() {
3781 for (query, named) in [
3784 ("EXPLAIN (FORMAT JSON) SELECT 1", "ExplainOptionList"),
3785 ("EXPLAIN INSERT INTO t VALUES (1)", "InsertStatement"),
3786 ("EXPLAIN CREATE TABLE u (a INTEGER)", "CreateStatement"),
3787 ] {
3788 let error = parse_ast(query).expect_err(query).to_string();
3789 assert!(error.contains(named), "{query}: {error}");
3790 }
3791 }
3792
3793 #[test]
3794 fn a_set_keeps_its_name_its_scope_and_its_value() {
3795 assert_eq!(round_statement("SET memory_limit = '1GB'"), "SET memory_limit = '1GB'");
3796 assert_eq!(round_statement("set threads=4"), "SET threads = 4");
3797 assert_eq!(round_statement("SET GLOBAL threads = 4"), "SET GLOBAL threads = 4");
3798 assert_eq!(round_statement("SET SESSION threads = 4"), "SET SESSION threads = 4");
3799 assert_eq!(round_statement("SET LOCAL threads = 4"), "SET LOCAL threads = 4");
3800 assert_eq!(round_statement("RESET memory_limit"), "RESET memory_limit");
3801 assert_eq!(round_statement("RESET GLOBAL memory_limit"), "RESET GLOBAL memory_limit");
3802 assert_eq!(
3803 round_statement("SET TIME ZONE 'Asia/Kathmandu'"),
3804 "SET TimeZone = 'Asia/Kathmandu'"
3805 );
3806 assert_eq!(round_statement("SET TIME ZONE UTC"), "SET TimeZone = 'UTC'");
3807 assert_eq!(round_statement("SET TIME ZONE DEFAULT"), "RESET TimeZone");
3808 assert_eq!(round_statement("SET TIME ZONE LOCAL"), "RESET TimeZone");
3809 }
3810
3811 #[test]
3812 fn the_two_other_things_the_word_set_starts_are_refused_rather_than_read_as_settings() {
3813 for statement in ["SET VARIABLE x = 1", "SET SCHEMA 'main'"] {
3817 let error = parse_ast(statement).expect_err(statement);
3818 assert_eq!(error.code().duckdb_name(), "Not implemented Error", "{statement}");
3819 }
3820 }
3821
3822 #[test]
3823 fn a_setting_written_with_a_list_of_values_is_refused_rather_than_taking_the_first() {
3824 let error = parse_ast("SET search_path = a, b").expect_err("a list of two");
3825 assert_eq!(error.code().duckdb_name(), "Not implemented Error");
3826 }
3827
3828 #[test]
3829 fn the_query_m0_has_to_run_transforms() {
3830 assert_eq!(round("SELECT * FROM t WHERE x > 5"), "SELECT * FROM t WHERE (x Gt 5)");
3831 }
3832
3833 #[test]
3834 fn a_replace_list_rides_on_the_star_it_changes() {
3835 assert_eq!(
3838 round("SELECT * REPLACE (a + 1 AS a) FROM t"),
3839 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3840 );
3841 assert_eq!(
3842 round("SELECT * REPLACE a + 1 AS a FROM t"),
3843 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3844 );
3845 assert_eq!(
3846 round("SELECT t.* REPLACE (make_date(a) AS a, b * 2 AS b) FROM t"),
3847 "SELECT t.* REPLACE (make_date(a) AS a, (b Multiply 2) AS b) FROM t"
3848 );
3849 }
3850
3851 #[test]
3852 fn one_column_cannot_be_replaced_twice() {
3853 let error = parse_ast("SELECT * REPLACE (a + 1 AS a, a + 2 AS A) FROM t").unwrap_err();
3856 assert_eq!(error.to_string(), "Parser Error: Duplicate entry \"A\" in REPLACE list");
3857 }
3858
3859 #[test]
3860 fn a_table_function_argument_can_have_a_name_written_in_front_of_it() {
3861 for spelling in
3864 ["binary_as_string := True", "binary_as_string => True", "binary_as_string = True"]
3865 {
3866 assert_eq!(
3867 round(&format!("SELECT * FROM read_parquet('f.parquet', {spelling})")),
3868 "SELECT * FROM read_parquet('f.parquet', binary_as_string := TRUE)",
3869 "{spelling}"
3870 );
3871 }
3872 }
3873
3874 #[test]
3875 fn an_equality_that_is_not_a_bare_name_stays_an_argument() {
3876 assert_eq!(round("SELECT * FROM f(t.a = 1)"), "SELECT * FROM f((t.a Eq 1))");
3879 assert_eq!(round("SELECT * FROM f(1 = 1)"), "SELECT * FROM f((1 Eq 1))");
3880 }
3881
3882 #[test]
3883 fn a_create_table_keeps_its_types_as_text() {
3884 assert_eq!(
3885 round_statement("CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"),
3886 "CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"
3887 );
3888 assert_eq!(
3892 round_statement("CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"),
3893 "CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"
3894 );
3895 }
3896
3897 #[test]
3898 fn the_modifiers_on_a_create_table_survive() {
3899 assert_eq!(
3900 round_statement("CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"),
3901 "CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"
3902 );
3903 assert_eq!(
3904 round_statement("CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"),
3905 "CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"
3906 );
3907 }
3908
3909 #[test]
3910 fn or_replace_and_if_not_exists_in_one_statement_is_refused_here_and_not_later() {
3911 for sql in [
3915 "CREATE OR REPLACE TABLE IF NOT EXISTS t (a INT)",
3916 "CREATE OR REPLACE VIEW IF NOT EXISTS v AS SELECT 1",
3917 ] {
3918 let error = parse_ast(sql).unwrap_err().to_string();
3919 assert_eq!(
3920 error,
3921 "Parser Error: Cannot specify both OR REPLACE and IF NOT EXISTS within single \
3922 create statement"
3923 );
3924 }
3925 }
3926
3927 #[test]
3928 fn a_create_table_as_carries_the_query_and_not_the_types() {
3929 assert_eq!(
3930 round_statement("CREATE TABLE t AS SELECT a FROM u"),
3931 "CREATE TABLE t AS SELECT a FROM u"
3932 );
3933 assert_eq!(
3936 round_statement("CREATE TABLE t (x, y) AS SELECT a, b FROM u"),
3937 "CREATE TABLE t (x, y) AS SELECT a, b FROM u"
3938 );
3939 }
3940
3941 #[test]
3942 fn a_create_view_carries_its_body_twice_over() {
3943 assert_eq!(
3944 round_statement("CREATE VIEW v AS SELECT a FROM u"),
3945 "CREATE VIEW v AS SELECT a FROM u"
3946 );
3947 assert_eq!(
3948 round_statement("CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"),
3949 "CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"
3950 );
3951 let ast = parse_ast("CREATE VIEW v (x) AS SELECT a FROM u WHERE a > 1").expect("parses");
3954 let Statement::CreateView(index) = ast.statements[0] else {
3955 panic!("not a create view");
3956 };
3957 assert_eq!(ast.string(ast.create_view(index).sql), "SELECT a FROM u WHERE a > 1");
3958 }
3959
3960 #[test]
3961 fn a_drop_view_is_not_a_drop_table() {
3962 assert_eq!(round_statement("DROP VIEW IF EXISTS a, b"), "DROP VIEW IF EXISTS a, b");
3963 assert_eq!(round_statement("DROP TABLE a"), "DROP TABLE a");
3964 }
3965
3966 #[test]
3967 fn a_drop_table_is_a_list_of_qualified_names() {
3968 assert_eq!(round_statement("DROP TABLE t"), "DROP TABLE t");
3969 assert_eq!(round_statement("DROP TABLE IF EXISTS a, b.c"), "DROP TABLE IF EXISTS a, b.c");
3970 }
3971
3972 #[test]
3973 fn dropping_something_that_is_neither_a_table_nor_a_view_is_refused() {
3974 let error = parse_ast("DROP MATERIALIZED VIEW v").unwrap_err().to_string();
3978 assert!(error.starts_with("Not implemented Error"), "{error}");
3979 }
3980
3981 #[test]
3982 fn both_spellings_of_insert_arrive_at_a_query() {
3983 assert_eq!(
3984 round_statement("INSERT INTO t VALUES (1, 'a'), (2, 'b')"),
3985 "INSERT INTO t VALUES (1, 'a'), (2, 'b')"
3986 );
3987 assert_eq!(
3988 round_statement("INSERT INTO t (a, b) SELECT x, y FROM u"),
3989 "INSERT INTO t (a, b) SELECT x, y FROM u"
3990 );
3991 }
3992
3993 #[test]
3994 fn an_insert_clause_that_changes_the_answer_is_refused() {
3995 for query in [
3996 "INSERT INTO t VALUES (1) RETURNING *",
3997 "INSERT OR REPLACE INTO t VALUES (1)",
3998 "INSERT INTO t BY NAME SELECT 1 AS a",
3999 "INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING",
4000 "INSERT INTO t DEFAULT VALUES",
4001 ] {
4002 let error = parse_ast(query).unwrap_err().to_string();
4003 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
4004 }
4005 }
4006
4007 #[test]
4008 fn a_column_constraint_that_is_not_not_null_is_refused() {
4009 for query in [
4013 "CREATE TABLE t (a INT PRIMARY KEY)",
4014 "CREATE TABLE t (a INT UNIQUE)",
4015 "CREATE TABLE t (a INT CHECK (a > 0))",
4016 "CREATE TABLE t (a INT DEFAULT 1)",
4017 "CREATE TABLE t (a INT REFERENCES u (b))",
4018 "CREATE TABLE t (a INT, PRIMARY KEY (a))",
4019 ] {
4020 let error = parse_ast(query).unwrap_err().to_string();
4021 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
4022 }
4023 }
4024
4025 #[test]
4026 fn values_is_a_query_on_its_own_and_in_a_from() {
4027 assert_eq!(round("VALUES (1), (2)"), "VALUES (1), (2)");
4028 assert_eq!(
4032 round("SELECT * FROM (VALUES (1, 2), (3, 4)) t(a, b)"),
4033 "SELECT * FROM (VALUES (1, 2), (3, 4)) AS t"
4034 );
4035 assert_eq!(
4036 round("SELECT * FROM VALUES (1, 2), (3, 4) AS t(a, b)"),
4037 "SELECT * FROM VALUES (1, 2), (3, 4) AS t"
4038 );
4039 assert_eq!(round("VALUES (1), (2, 3)"), "VALUES (1), (2, 3)");
4042 }
4043
4044 #[test]
4045 fn non_recursive_ctes_inline_and_semantic_variants_are_explicit() {
4046 assert_eq!(
4047 round("WITH t AS (SELECT 1 AS x) SELECT x FROM t"),
4048 "SELECT x FROM (SELECT 1 AS x) AS t"
4049 );
4050 assert_eq!(
4051 round("WITH t(x) AS NOT MATERIALIZED (SELECT 1) SELECT x FROM t"),
4052 "SELECT x FROM (SELECT 1) AS t"
4053 );
4054 let query = "WITH RECURSIVE t(x) AS (SELECT 1) SELECT x FROM t";
4055 let error = parse_ast(query).expect_err("the unsupported CTE shape is refused");
4056 assert!(error.to_string().starts_with("Not implemented Error"), "{query}: {error}");
4057 }
4058
4059 #[test]
4061 fn a_materialized_cte_stays_a_definition_and_its_references_stay_references() {
4062 assert_eq!(
4063 round("WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT x FROM t"),
4064 "WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT x FROM t"
4065 );
4066 assert_eq!(
4067 round("WITH t(y) AS MATERIALIZED (SELECT 1) SELECT y FROM t"),
4068 "WITH t(y) AS MATERIALIZED (SELECT 1) SELECT y FROM t"
4069 );
4070 assert_eq!(
4073 round("WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT * FROM t a, t b"),
4074 "WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT * FROM t AS a, t AS b"
4075 );
4076 assert_eq!(
4078 round(
4079 "WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT (WITH t AS (SELECT 2 AS x) \
4080 SELECT x FROM t) AS inner"
4081 ),
4082 "WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT (SELECT x FROM (SELECT 2 AS x) AS t) \
4083 AS inner"
4084 );
4085 assert_eq!(
4088 round(
4089 "WITH a AS MATERIALIZED (SELECT 1 AS x), b AS MATERIALIZED (SELECT x + 1 AS y \
4090 FROM a) SELECT y FROM b"
4091 ),
4092 "WITH a AS MATERIALIZED (SELECT 1 AS x) WITH b AS MATERIALIZED (SELECT (x Add 1) \
4093 AS y FROM a) SELECT y FROM b"
4094 );
4095 }
4096
4097 #[test]
4105 fn describe_rewrites_a_name_into_a_star_over_it() {
4106 assert_eq!(round("DESCRIBE SELECT 1 AS a"), "DESCRIBE SELECT 1 AS a");
4107 assert_eq!(round("DESCRIBE t"), "DESCRIBE SELECT * FROM t");
4108 assert_eq!(round("DESC t"), "DESCRIBE SELECT * FROM t");
4109 assert_eq!(round("DESCRIBE 'x.parquet'"), "DESCRIBE SELECT * FROM x.parquet");
4110 assert_eq!(
4112 round("SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"),
4113 "SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"
4114 );
4115 assert_eq!(round("DESCRIBE DESCRIBE SELECT 1 AS a"), "DESCRIBE DESCRIBE SELECT 1 AS a");
4116 }
4117
4118 #[test]
4125 fn summarize_is_refused_even_though_it_parses_as_a_describe() {
4126 for query in ["SUMMARIZE t", "SUMMARIZE SELECT 1"] {
4127 let error = parse_ast(query).expect_err("summarize is not implemented");
4128 let message = error.to_string();
4129 assert!(message.starts_with("Not implemented Error"), "{query} failed with {message}");
4130 }
4131 }
4132
4133 #[test]
4134 fn every_statement_in_the_corpus_gets_a_defined_answer() {
4135 let mut done = 0;
4140 for query in CORPUS {
4141 match parse_ast(query) {
4142 Ok(ast) => {
4143 assert_eq!(ast.statements.len(), 1, "{query}");
4144 done += 1;
4145 }
4146 Err(error) => {
4147 let message = error.to_string();
4148 assert!(
4149 message.starts_with("Not implemented Error"),
4150 "{query} failed with {message}, which is not a not-implemented error"
4151 );
4152 }
4153 }
4154 }
4155 assert!(done >= 31, "only {done} of the corpus transforms, which is fewer than it was");
4158 }
4159
4160 #[test]
4161 fn the_ast_is_far_smaller_than_the_parse_tree() {
4162 let query = CORPUS[4];
4163 let tree = parse(query).unwrap();
4164 let ast = parse_ast(query).unwrap();
4165 assert!(
4168 ast.node_count() * 20 < tree.arena_len(),
4169 "{} ast nodes against {} parse nodes",
4170 ast.node_count(),
4171 tree.arena_len()
4172 );
4173 }
4174
4175 #[test]
4176 fn precedence_comes_out_of_the_chain_and_into_the_tree() {
4177 assert_eq!(round("SELECT 1 + 2 * 3"), "SELECT (1 Add (2 Multiply 3))");
4178 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
4179 assert_eq!(round("SELECT 1 + 2 + 3"), "SELECT ((1 Add 2) Add 3)");
4180 assert_eq!(round("SELECT 1 - 2 - 3"), "SELECT ((1 Subtract 2) Subtract 3)");
4181 assert_eq!(
4182 round("SELECT a OR b AND c"),
4183 "SELECT (a Or (b And c))",
4184 "and binds tighter than or"
4185 );
4186 }
4187
4188 #[test]
4189 fn a_double_negation_is_two_nodes_and_not_none() {
4190 assert_eq!(round("SELECT NOT NOT a"), "SELECT (Not (Not a))");
4194 }
4195
4196 #[test]
4197 fn a_parenthesised_single_expression_is_not_a_row() {
4198 assert_eq!(round("SELECT (a)"), "SELECT a");
4199 assert_eq!(round("SELECT (a, b)"), "SELECT ROW(a, b)");
4200 }
4201
4202 #[test]
4203 fn a_bracketed_list_is_a_list_of_however_many_items_were_written() {
4204 assert_eq!(round("SELECT [a]"), "SELECT [a]");
4207 assert_eq!(round("SELECT [1, 2, 3]"), "SELECT [1, 2, 3]");
4208 assert_eq!(round("SELECT []"), "SELECT []");
4209 assert_eq!(round("SELECT ['a.parquet', 'b.parquet']"), "SELECT ['a.parquet', 'b.parquet']");
4210 }
4211
4212 #[test]
4213 fn a_parameter_carries_its_identifier_however_it_was_written() {
4214 assert_eq!(round("SELECT $1"), "SELECT $1");
4215 assert_eq!(round("SELECT ?1"), "SELECT $1");
4216 assert_eq!(round("SELECT $name"), "SELECT $name");
4217 assert_eq!(round("SELECT ? + $2"), "SELECT ($1 Add $2)");
4220 assert_eq!(round("SELECT ?, ?, ?"), "SELECT $1, $2, $3");
4221 }
4222
4223 #[test]
4224 fn the_parameters_of_a_statement_are_listed_once_each_in_written_order() {
4225 let ast = parse_ast("SELECT $b, $a, $b WHERE $a").expect("parses");
4226 assert_eq!(ast.parameters(), vec!["b", "a"]);
4227 assert!(parse_ast("SELECT 1").expect("parses").parameters().is_empty());
4228 }
4229
4230 #[test]
4231 fn the_three_ways_to_write_an_alias_all_arrive() {
4232 assert_eq!(round("SELECT a AS b"), "SELECT a AS b");
4233 assert_eq!(round("SELECT a b"), "SELECT a AS b");
4234 assert_eq!(round("SELECT b: a"), "SELECT a AS b");
4235 assert_eq!(round("SELECT a"), "SELECT a", "and no alias when none was written");
4236 }
4237
4238 #[test]
4239 fn a_from_with_no_select_selects_everything() {
4240 assert_eq!(round("FROM t"), "SELECT * FROM t");
4243 assert_eq!(round("FROM t SELECT a"), "SELECT a FROM t");
4244 }
4245
4246 #[test]
4247 fn joins_nest_to_the_left() {
4248 assert_eq!(
4249 round("SELECT * FROM a JOIN b ON a.i = b.i LEFT JOIN c USING (k)"),
4250 "SELECT * FROM ((a Inner JOIN b ON (a.i Eq b.i)) Left JOIN c USING (k))"
4251 );
4252 assert_eq!(
4253 round("SELECT * FROM a NATURAL JOIN b"),
4254 "SELECT * FROM (a NATURAL Inner JOIN b)"
4255 );
4256 assert_eq!(round("SELECT * FROM a CROSS JOIN b"), "SELECT * FROM (a Cross JOIN b)");
4257 assert_eq!(
4258 round("SELECT * FROM a POSITIONAL JOIN b"),
4259 "SELECT * FROM (a Positional JOIN b)"
4260 );
4261 assert_eq!(round("SELECT * FROM a, b"), "SELECT * FROM a, b", "a comma is not a join node");
4262 }
4263
4264 #[test]
4265 fn a_qualified_name_keeps_its_parts_however_it_was_spelled() {
4266 assert_eq!(round("SELECT a"), "SELECT a");
4270 assert_eq!(round("SELECT t.a"), "SELECT t.a");
4271 assert_eq!(round("SELECT s.t.a"), "SELECT s.t.a");
4272 assert_eq!(round("SELECT c.s.t.a"), "SELECT c.s.t.a");
4273 assert_eq!(round("SELECT * FROM s.t"), "SELECT * FROM s.t");
4274 }
4275
4276 #[test]
4277 fn a_star_can_be_qualified() {
4278 assert_eq!(round("SELECT *"), "SELECT *");
4279 assert_eq!(round("SELECT t.*"), "SELECT t.*");
4280 assert_eq!(round("SELECT s.t.*"), "SELECT s.t.*");
4281 }
4282
4283 #[test]
4284 fn a_quoted_identifier_keeps_its_case_and_loses_its_quotes() {
4285 let ast = parse_ast("SELECT \"Mixed Case\", \"a\"\"b\"").unwrap();
4289 assert_eq!(ast.strings[0], "Mixed Case");
4290 assert_eq!(ast.strings[1], "a\"b");
4291 }
4292
4293 #[test]
4294 fn a_string_literal_is_decoded_and_adjacent_ones_are_joined() {
4295 assert_eq!(round("SELECT 'it''s'"), "SELECT 'it's'");
4296 assert_eq!(round("SELECT 'a'\n'b'"), "SELECT 'ab'", "the standard's adjacency rule");
4297 }
4298
4299 #[test]
4301 fn a_dollar_quoted_string_loses_its_dollars_and_its_tag() {
4302 assert_eq!(round("SELECT $$dollar quoted$$"), "SELECT 'dollar quoted'");
4303 assert_eq!(round("SELECT $tag$body$tag$"), "SELECT 'body'");
4304 assert_eq!(round("SELECT $$$$"), "SELECT ''", "an empty tag and an empty body");
4305 assert_eq!(round("SELECT $tag$it''s $other$ fine$tag$"), "SELECT 'it''s $other$ fine'");
4308 assert_eq!(round("SELECT $$open"), "SELECT '$$open'");
4310 }
4311
4312 #[test]
4318 fn an_escape_string_resolves_its_backslashes() {
4319 assert_eq!(round("SELECT E'a\\nb'"), "SELECT 'a\nb'");
4320 assert_eq!(round("SELECT e'a\\tb'"), "SELECT 'a\tb'", "the prefix is a letter, not a name");
4321 assert_eq!(round("SELECT E'a\\rb'"), "SELECT 'a\rb'");
4322 assert_eq!(round("SELECT E'a\\bb'"), "SELECT 'a\u{8}b'");
4323 assert_eq!(round("SELECT E'a\\fb'"), "SELECT 'a\u{c}b'");
4324 assert_eq!(round("SELECT E'a\\\\b'"), "SELECT 'a\\b'");
4325 assert_eq!(round("SELECT E'a\\'b'"), "SELECT 'a'b'", "a quote, the same as ''");
4326 assert_eq!(round("SELECT E'a''b'"), "SELECT 'a'b'", "and '' still means a quote here");
4327 assert_eq!(round("SELECT E'a\\vb'"), "SELECT 'avb'");
4330 assert_eq!(round("SELECT E'a\\qb'"), "SELECT 'aqb'");
4331 }
4332
4333 #[test]
4335 fn a_numeric_escape_writes_the_byte_or_the_character_it_names() {
4336 assert_eq!(round("SELECT E'\\x41'"), "SELECT 'A'");
4337 assert_eq!(round("SELECT E'\\x4142'"), "SELECT 'A42'", "two digits at the most");
4338 assert_eq!(
4339 round("SELECT E'a\\x'"),
4340 "SELECT 'ax'",
4341 "and one at the least, or it is a letter"
4342 );
4343 assert_eq!(round("SELECT E'\\101'"), "SELECT 'A'");
4344 assert_eq!(round("SELECT E'\\1011'"), "SELECT 'A1'", "three digits at the most");
4345 assert_eq!(round("SELECT E'\\8'"), "SELECT '8'", "8 is not an octal digit");
4346 assert_eq!(round("SELECT E'\\xc3\\xa9'"), "SELECT 'é'");
4348 assert_eq!(round("SELECT E'\\u00e9'"), "SELECT 'é'");
4349 assert_eq!(round("SELECT E'a\\u41'"), "SELECT 'au41'", "four digits or it is a letter");
4350 assert_eq!(round("SELECT E'a\\uZZZZ'"), "SELECT 'auZZZZ'");
4351 assert_eq!(
4352 round("SELECT E'\\ud83d\\ude00'"),
4353 "SELECT 'ud83dude00'",
4354 "surrogates are not it"
4355 );
4356 }
4357
4358 #[test]
4360 fn an_escape_string_that_is_not_a_string_raises() {
4361 let error = parse_ast("SELECT E'a\\x00'").unwrap_err().to_string();
4362 assert_eq!(error, "Parser Error: Null character not permitted in escape string literal");
4363 let error = parse_ast("SELECT E'a\\377'").unwrap_err().to_string();
4364 assert_eq!(
4365 error,
4366 "Parser Error: Invalid UTF-8 in escape string literal at byte offset 1: byte mismatch",
4367 "the offset is where the bytes stop being a string, not where the escape was written"
4368 );
4369 }
4370
4371 #[test]
4373 fn the_other_string_prefixes_are_what_upstream_makes_of_them() {
4374 assert_eq!(round("SELECT N'abc'"), "SELECT CAST('abc' AS VARCHAR)");
4376 assert_eq!(round("SELECT n'abc'"), "SELECT CAST('abc' AS VARCHAR)");
4377 assert_eq!(round("SELECT B'101'"), "SELECT 'b101'");
4379 assert_eq!(round("SELECT b'abc'"), "SELECT 'babc'");
4380 assert_eq!(round("SELECT B''"), "SELECT 'b'", "an empty one is the letter on its own");
4381 }
4382
4383 #[test]
4389 fn a_hex_string_is_a_blob_and_not_a_string() {
4390 assert_eq!(round("SELECT x'4142'"), "SELECT 'AB'::BLOB");
4391 assert_eq!(round("SELECT X'4142'"), "SELECT 'AB'::BLOB");
4392 assert_eq!(round("SELECT x'ff41'"), "SELECT '\\xFFA'::BLOB", "a byte that does not print");
4393 assert_eq!(round("SELECT x''"), "SELECT ''::BLOB", "an empty one is an empty blob");
4394 assert_eq!(round("SELECT x'2741'"), "SELECT '\\x27A'::BLOB");
4397 assert_eq!(round("SELECT x'5c7834314141'"), "SELECT '\\x5Cx41AA'::BLOB");
4398 let error = parse_ast("SELECT x'4'").unwrap_err().to_string();
4401 assert_eq!(
4402 error,
4403 "Parser Error: Hex string literal must have an even number of hex digits"
4404 );
4405 assert_eq!(round("SELECT x'41zz'"), "SELECT '\\x41\\xzz'::BLOB");
4406 }
4407
4408 #[test]
4409 fn the_null_and_boolean_tests_are_postfix_unary_operators() {
4410 assert_eq!(round("SELECT x IS NULL"), "SELECT (IsNull x)");
4411 assert_eq!(round("SELECT x IS NOT NULL"), "SELECT (IsNotNull x)");
4412 assert_eq!(round("SELECT x ISNULL"), "SELECT (IsNull x)");
4413 assert_eq!(round("SELECT x NOTNULL"), "SELECT (IsNotNull x)");
4414 assert_eq!(round("SELECT x IS TRUE"), "SELECT (IsTrue x)");
4415 assert_eq!(round("SELECT x IS NOT FALSE"), "SELECT (IsNotFalse x)");
4416 assert_eq!(round("SELECT x IS DISTINCT FROM y"), "SELECT (x IsDistinctFrom y)");
4417 assert_eq!(round("SELECT x IS NOT DISTINCT FROM y"), "SELECT (x IsNotDistinctFrom y)");
4418 }
4419
4420 #[test]
4421 fn the_like_family_folds_its_negation_into_the_operator() {
4422 assert_eq!(round("SELECT x LIKE 'a'"), "SELECT (x Like 'a')");
4423 assert_eq!(round("SELECT x NOT LIKE 'a'"), "SELECT (x NotLike 'a')");
4424 assert_eq!(round("SELECT x ILIKE 'a'"), "SELECT (x ILike 'a')");
4425 assert_eq!(round("SELECT x ~~ 'a'"), "SELECT (x Like 'a')", "the operator spelling");
4426 assert_eq!(round("SELECT x !~~ 'a'"), "SELECT (x NotLike 'a')");
4427 assert_eq!(round("SELECT x SIMILAR TO 'a'"), "SELECT (x SimilarTo 'a')");
4428 assert_eq!(round("SELECT x NOT GLOB 'a'"), "SELECT (Not (x Glob 'a'))");
4430 }
4431
4432 #[test]
4433 fn between_and_in_carry_their_negation_as_a_flag() {
4434 assert_eq!(round("SELECT x BETWEEN 1 AND 2"), "SELECT (x BETWEEN 1 AND 2)");
4435 assert_eq!(round("SELECT x NOT BETWEEN 1 AND 2"), "SELECT (NOT x BETWEEN 1 AND 2)");
4436 assert_eq!(round("SELECT x IN (1, 2)"), "SELECT (x IN [1, 2])");
4437 assert_eq!(round("SELECT x NOT IN (1, 2)"), "SELECT (NOT x IN [1, 2])");
4438 }
4439
4440 #[test]
4441 fn both_spellings_of_a_cast_are_the_same_node() {
4442 assert_eq!(round("SELECT CAST(x AS BIGINT)"), "SELECT CAST(x AS BIGINT)");
4443 assert_eq!(round("SELECT x::BIGINT"), "SELECT CAST(x AS BIGINT)");
4444 assert_eq!(round("SELECT TRY_CAST(x AS BIGINT)"), "SELECT TRY_CAST(x AS BIGINT)");
4445 assert_eq!(
4446 round("SELECT x::DECIMAL(18, 3)"),
4447 "SELECT CAST(x AS DECIMAL(18, 3))",
4448 "the type is kept as text because parsing it is the type system's job"
4449 );
4450 }
4451
4452 #[test]
4453 fn a_typed_literal_is_a_third_spelling_of_the_same_cast() {
4454 assert_eq!(round("SELECT DATE '1995-09-01'"), "SELECT CAST('1995-09-01' AS DATE)");
4455 assert_eq!(
4456 round("SELECT date '1995-09-01'"),
4457 "SELECT CAST('1995-09-01' AS date)",
4458 "the type is kept as written, the same as it is in the other two spellings"
4459 );
4460 assert_eq!(
4461 round("SELECT TIMESTAMP '2020-01-01 03:04:05'"),
4462 "SELECT CAST('2020-01-01 03:04:05' AS TIMESTAMP)"
4463 );
4464 assert_eq!(
4465 round("SELECT DECIMAL(5, 2) '1.5'"),
4466 "SELECT CAST('1.5' AS DECIMAL(5, 2))",
4467 "any type the cast takes is a typed literal, parameters and all"
4468 );
4469 assert_eq!(
4470 round("SELECT VARCHAR 'hi' FROM t"),
4471 "SELECT CAST('hi' AS VARCHAR) FROM t",
4472 "including the ones where the cast has nothing to do"
4473 );
4474 }
4475
4476 #[test]
4477 fn a_case_keeps_its_arms_in_order() {
4478 assert_eq!(
4479 round("SELECT CASE WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"),
4480 "SELECT CASE - WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"
4481 );
4482 assert_eq!(
4483 round("SELECT CASE x WHEN 1 THEN 'a' END"),
4484 "SELECT CASE x WHEN 1 THEN 'a' ELSE - END",
4485 "a simple case keeps the operand and a missing else is not an implicit null yet"
4486 );
4487 }
4488
4489 #[test]
4490 fn a_field_access_and_a_method_call_are_ordinary_function_calls() {
4491 assert_eq!(round("SELECT (f(x)).y"), "SELECT struct_extract(f(x), 'y')");
4494 assert_eq!(round("SELECT a[1]"), "SELECT array_extract(a, 1)");
4495 }
4496
4497 #[test]
4499 fn a_range_gets_the_bounds_the_query_left_out() {
4500 assert_eq!(round("SELECT a[1:2]"), "SELECT array_slice(a, 1, 2)");
4501 assert_eq!(round("SELECT a[:2]"), "SELECT array_slice(a, 1, 2)");
4502 assert_eq!(round("SELECT a[2:]"), "SELECT array_slice(a, 2, -1)");
4503 assert_eq!(round("SELECT a[:]"), "SELECT array_slice(a, 1, -1)");
4504 assert_eq!(round("SELECT a[1:-]"), "SELECT array_slice(a, 1, -1)");
4506 assert_eq!(round("SELECT a[1:2:3]"), "SELECT array_slice(a, 1, 2, 3)");
4507 assert_eq!(round("SELECT a[1:2:]"), "SELECT array_slice(a, 1, 2, [])");
4510 }
4511
4512 #[test]
4514 fn an_empty_subscript_is_not_a_subscript() {
4515 let error = parse_ast("SELECT a[]").expect_err("an empty subscript");
4516 assert_eq!(error.message(), "Empty subscript '[]' is not allowed");
4517 }
4518
4519 #[test]
4522 fn a_keyword_is_not_stepped_through_on_the_way_to_its_one_argument() {
4523 for (sql, rule) in [
4524 ("SELECT row(1)", "RowExpression"),
4525 ("SELECT try(1)", "TryExpression"),
4526 ("SELECT unpack([1])", "UnpackExpression"),
4527 ("SELECT columns('a')", "ColumnsExpression"),
4528 ] {
4529 let error = parse_ast(sql).expect_err(sql);
4530 assert!(error.message().ends_with(rule), "{sql}: {error}");
4531 }
4532 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
4535 assert_eq!(round("SELECT -(7)"), "SELECT (Negate 7)");
4536 }
4537
4538 #[test]
4540 fn the_null_checks_are_calls_by_the_names_duckdb_prints() {
4541 assert_eq!(round("SELECT COALESCE(a, b, 1)"), "SELECT coalesce(a, b, 1)");
4544 assert_eq!(round("SELECT coalesce(a)"), "SELECT coalesce(a)");
4545 assert_eq!(round("SELECT NULLIF(a, 1)"), "SELECT nullif(a, 1)");
4546 assert_eq!(round("SELECT ifnull(a, 1)"), "SELECT coalesce(a, 1)");
4548 assert_eq!(round("SELECT main.ifnull(a, 1)"), "SELECT coalesce(a, 1)");
4549 let error = parse_ast("SELECT ifnull(a)").expect_err("one argument to ifnull");
4550 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
4551 let error = parse_ast("SELECT ifnull(a, b, c)").expect_err("three arguments to ifnull");
4552 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
4553 }
4554
4555 #[test]
4558 fn the_string_keywords_are_the_calls_duckdb_prints() {
4559 assert_eq!(round("SELECT substring(s, 2, 3)"), "SELECT substring(s, 2, 3)");
4560 assert_eq!(round("SELECT SUBSTRING(s FROM 2 FOR 3)"), "SELECT substring(s, 2, 3)");
4561 assert_eq!(round("SELECT substring(s FROM 2)"), "SELECT substring(s, 2)");
4562 assert_eq!(round("SELECT substring(s FOR 3)"), "SELECT substring(s, 1, 3)");
4564 assert_eq!(round("SELECT position('c' IN s)"), "SELECT position(s, 'c')");
4566 assert_eq!(round("SELECT trim(s)"), "SELECT trim(s)");
4567 assert_eq!(round("SELECT trim(BOTH 'x' FROM s)"), "SELECT trim(s, 'x')");
4568 assert_eq!(round("SELECT trim(BOTH FROM s)"), "SELECT trim(s)");
4569 assert_eq!(round("SELECT trim(s, 'xy')"), "SELECT trim(s, 'xy')");
4570 assert_eq!(round("SELECT trim(LEADING FROM s)"), "SELECT ltrim(s)");
4572 assert_eq!(round("SELECT trim(TRAILING FROM s)"), "SELECT rtrim(s)");
4573 assert_eq!(round("SELECT trim(LEADING 'x' FROM s)"), "SELECT ltrim(s, 'x')");
4574 assert_eq!(round("SELECT trim(TRAILING 'x' FROM s)"), "SELECT rtrim(s, 'x')");
4575 assert_eq!(
4576 round("SELECT overlay(s PLACING 'X' FROM 2 FOR 1)"),
4577 "SELECT overlay(s, 'X', 2, 1)"
4578 );
4579 assert_eq!(round("SELECT overlay(s PLACING 'X' FROM 2)"), "SELECT overlay(s, 'X', 2)");
4580 assert_eq!(round("SELECT overlay(s, 'X', 2, 1)"), "SELECT overlay(s, 'X', 2, 1)");
4581 }
4582
4583 #[test]
4584 fn an_aggregate_keeps_its_distinct() {
4585 assert_eq!(round("SELECT count(*)"), "SELECT count(*)");
4586 assert_eq!(round("SELECT count(DISTINCT x)"), "SELECT count(DISTINCT x)");
4587 assert_eq!(round("SELECT count(ALL x)"), "SELECT count(x)");
4588 assert_eq!(round("SELECT main.count(x)"), "SELECT main.count(x)");
4589 }
4590
4591 #[test]
4592 fn a_call_keeps_the_filter_it_was_written_with_and_the_word_where_is_optional() {
4593 assert_eq!(round("SELECT sum(x) FILTER (WHERE y > 1)"), "SELECT sum(x) FILTER [(y Gt 1)]");
4597 assert_eq!(round("SELECT sum(x) FILTER (y > 1)"), "SELECT sum(x) FILTER [(y Gt 1)]");
4598 assert_eq!(round("SELECT count(*) FILTER (WHERE b)"), "SELECT count(*) FILTER [b]");
4599 assert_eq!(
4600 round("SELECT sum(DISTINCT x) FILTER (WHERE b)"),
4601 "SELECT sum(DISTINCT x) FILTER [b]"
4602 );
4603 assert_eq!(round("SELECT abs(x) FILTER (WHERE b)"), "SELECT abs(x) FILTER [b]");
4604 }
4605
4606 #[test]
4608 fn a_window_call_carries_its_filter_in_front_of_its_over() {
4609 assert_eq!(
4610 round("SELECT sum(x) FILTER (WHERE b) OVER ()"),
4611 "SELECT sum(x) FILTER [b] OVER [] [] [Range UnboundedPreceding CurrentRow NoOthers]"
4612 );
4613 }
4614
4615 #[test]
4616 fn the_modifiers_hang_off_the_query_and_not_off_the_select() {
4617 assert_eq!(
4621 round("SELECT 1 UNION ALL SELECT 2 ORDER BY 1"),
4622 "(SELECT 1 Union All SELECT 2) ORDER BY 1 Unstated Unstated"
4623 );
4624 assert_eq!(
4625 round("SELECT a FROM t UNION SELECT b FROM u EXCEPT SELECT c FROM v"),
4626 "((SELECT a FROM t Union Unstated SELECT b FROM u) Except Unstated SELECT c FROM v)",
4627 "set operators are left associative"
4628 );
4629 assert_eq!(
4630 round("SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"),
4631 "(SELECT 1 Union Unstated (SELECT 2 Intersect Unstated SELECT 3))",
4632 "and intersect binds tighter than the other two"
4633 );
4634 }
4635
4636 #[test]
4637 fn the_sort_and_limit_clauses_keep_what_was_written() {
4638 assert_eq!(
4639 round("SELECT a FROM t ORDER BY a"),
4640 "SELECT a FROM t ORDER BY a Unstated Unstated"
4641 );
4642 assert_eq!(
4643 round("SELECT a FROM t ORDER BY a DESC NULLS LAST"),
4644 "SELECT a FROM t ORDER BY a Descending Last"
4645 );
4646 assert_eq!(round("SELECT a FROM t ORDER BY ALL"), "SELECT a FROM t ORDER BY ALL");
4647 assert_eq!(round("SELECT a FROM t GROUP BY ALL"), "SELECT a FROM t GROUP BY ALL");
4648 assert_eq!(round("SELECT a FROM t LIMIT 10 OFFSET 5"), "SELECT a FROM t LIMIT 10 OFFSET 5");
4649 assert_eq!(round("SELECT a FROM t OFFSET 5 LIMIT 10"), "SELECT a FROM t LIMIT 10 OFFSET 5");
4650 assert_eq!(round("SELECT a FROM t LIMIT 10%"), "SELECT a FROM t LIMIT 10%");
4651 assert_eq!(round("SELECT a FROM t LIMIT ALL"), "SELECT a FROM t", "which is no limit");
4652 }
4653
4654 #[test]
4655 fn a_subquery_appears_in_both_places_it_can() {
4656 assert_eq!(
4657 round("SELECT * FROM (SELECT x FROM t) AS s"),
4658 "SELECT * FROM (SELECT x FROM t) AS s"
4659 );
4660 assert_eq!(round("SELECT (SELECT 1)"), "SELECT (SELECT 1)");
4661 }
4662
4663 #[test]
4664 fn distinct_on_keeps_its_expressions() {
4665 assert_eq!(round("SELECT DISTINCT a"), "SELECT DISTINCT a");
4666 assert_eq!(round("SELECT ALL a"), "SELECT a", "which is the default written out");
4667 assert_eq!(round("SELECT DISTINCT ON (a, b) a"), "SELECT DISTINCT ON (a, b) a");
4668 }
4669
4670 #[test]
4671 fn an_operator_the_dialect_does_not_name_is_kept_by_name() {
4672 assert_eq!(round("SELECT a <=> b"), "SELECT (a <=> b)");
4678 assert!(parse_ast("SELECT a foo b").is_err(), "a bare word is not an operator");
4679 }
4680
4681 #[test]
4682 fn a_script_is_a_list_of_statements() {
4683 let ast = parse_ast("SELECT 1; SELECT 2;").unwrap();
4684 assert_eq!(ast.statements.len(), 2);
4685 let Statement::Query(second) = ast.statements[1] else {
4689 panic!("the second statement is a query");
4690 };
4691 assert_eq!(show_query(&ast, second), "SELECT 2");
4692 }
4693
4694 #[test]
4695 fn an_unsupported_construct_names_itself_and_what_was_written() {
4696 let error = parse_ast("ALTER TABLE t ADD COLUMN a INTEGER").unwrap_err().to_string();
4697 assert!(error.starts_with("Not implemented Error"), "{error}");
4698 assert!(error.contains("ALTER TABLE t ADD COLUMN a INTEGER"), "{error}");
4699 assert!(error.contains("AlterStatement"), "{error}");
4700 }
4701
4702 #[test]
4703 fn a_long_construct_is_cut_short_in_the_message() {
4704 let query = format!("ALTER TABLE t ADD COLUMN {} INTEGER", "a".repeat(80));
4705 let error = parse_ast(&query).unwrap_err().to_string();
4706 assert!(error.contains("..."), "{error}");
4707 assert!(error.len() < 200, "{error}");
4708 }
4709
4710 #[test]
4711 fn the_transformer_never_panics_on_anything_the_matcher_accepts() {
4712 for query in [
4716 "SELECT",
4717 "FROM t SELECT",
4718 "SELECT * FROM t WHERE",
4719 "SELECT ()",
4720 "SELECT a FROM t GROUP BY ()",
4721 ] {
4722 let answer = parse_ast(query);
4723 if let Err(error) = answer {
4724 let message = error.to_string();
4725 assert!(
4726 message.starts_with("Not implemented Error")
4727 || message.starts_with("Parser Error"),
4728 "{query} failed with {message}"
4729 );
4730 }
4731 }
4732 }
4733
4734 #[test]
4735 fn a_file_name_in_a_from_clause_is_a_table_name_with_the_quotes_off() {
4736 assert_eq!(round("SELECT * FROM 'hits.parquet'"), "SELECT * FROM hits.parquet");
4740 assert_eq!(round("SELECT * FROM \"hits.parquet\""), "SELECT * FROM hits.parquet");
4741 assert_eq!(round("SELECT * FROM 'hits.parquet' AS h"), "SELECT * FROM hits.parquet AS h");
4742 assert_eq!(
4743 round_with_case("SELECT Mixed FROM 'NoSuch/Mixed/File.csv'", IdentifierCase::Lower),
4744 "SELECT mixed FROM NoSuch/Mixed/File.csv"
4745 );
4746 assert_eq!(
4747 round_with_case("SELECT Mixed FROM \"QuotedTable\"", IdentifierCase::Upper),
4748 "SELECT MIXED FROM QuotedTable"
4749 );
4750 }
4751
4752 #[test]
4753 fn a_function_call_in_a_from_clause_is_a_source_and_not_an_expression() {
4754 assert_eq!(round("SELECT * FROM range(3)"), "SELECT * FROM range(3)");
4755 assert_eq!(round("SELECT * FROM range(1, 10, 2)"), "SELECT * FROM range(1, 10, 2)");
4756 assert_eq!(round("SELECT * FROM main.range(3)"), "SELECT * FROM main.range(3)");
4757 assert_eq!(round("SELECT * FROM range(3) AS t"), "SELECT * FROM range(3) AS t");
4758 assert_eq!(round("SELECT * FROM some_function()"), "SELECT * FROM some_function()");
4761 assert_eq!(round("SELECT * FROM LATERAL range(3)"), "SELECT * FROM range(3)");
4764 assert_eq!(
4765 round("SELECT * FROM t, LATERAL (SELECT t.x) AS v"),
4766 "SELECT * FROM t, (SELECT t.x) AS v"
4767 );
4768 }
4769
4770 #[test]
4771 fn the_forms_of_a_table_function_this_does_not_cover_are_turned_away_by_name() {
4772 for query in ["SELECT * FROM range(3) WITH ORDINALITY", "SELECT * FROM t: range(3)"] {
4773 let error = parse_ast(query).unwrap_err().to_string();
4774 assert!(error.contains("grammar rule"), "{query} failed with {error}");
4775 }
4776 }
4777
4778 #[test]
4779 fn a_pragma_is_the_call_it_stands_for_by_the_time_it_leaves_here() {
4780 assert_eq!(round("PRAGMA version"), "SELECT * FROM pragma_version()");
4781 assert_eq!(round("PRAGMA database_size"), "SELECT * FROM pragma_database_size()");
4782 assert_eq!(round("PRAGMA VERSION"), "SELECT * FROM pragma_VERSION()");
4785 assert_eq!(round("PRAGMA table_info('t')"), "SELECT * FROM pragma_table_info('t')");
4786 }
4787
4788 #[test]
4789 fn a_pragma_that_is_a_statement_stays_one_rather_than_becoming_a_call() {
4790 assert_eq!(round_statement("PRAGMA disable_optimizer"), "PRAGMA disable_optimizer");
4793 assert_eq!(round_statement("PRAGMA enable_profiling"), "PRAGMA enable_profiling");
4794 assert_eq!(round_statement("PRAGMA force_checkpoint"), "PRAGMA force_checkpoint");
4795 assert_eq!(round_statement("PRAGMA verify_parallelism"), "PRAGMA verify_parallelism");
4796 assert_eq!(round_statement("PRAGMA enable_nothing_at_all"), "PRAGMA enable_nothing_at_all");
4799 assert_eq!(
4801 round("PRAGMA disable_optimizer('x')"),
4802 "SELECT * FROM pragma_disable_optimizer('x')"
4803 );
4804 }
4805
4806 #[test]
4807 fn a_bare_name_in_a_pragmas_parentheses_is_a_name_and_not_a_column() {
4808 assert_eq!(round("PRAGMA table_info(t)"), "SELECT * FROM pragma_table_info('t')");
4811 assert_eq!(round("PRAGMA table_info(main.t)"), "SELECT * FROM pragma_table_info('main.t')");
4812 assert_eq!(round("PRAGMA table_info(\"T\")"), "SELECT * FROM pragma_table_info('T')");
4813 assert_eq!(round("PRAGMA table_info(1)"), "SELECT * FROM pragma_table_info(1)");
4816 }
4817
4818 #[test]
4819 fn a_pragma_with_an_equals_sign_is_a_set_and_nothing_else() {
4820 assert_eq!(round_statement("PRAGMA memory_limit = '1GB'"), "SET memory_limit = '1GB'");
4821 assert_eq!(round_statement("PRAGMA threads = 4"), "SET threads = 4");
4822 }
4823
4824 #[test]
4825 fn a_pragma_with_empty_parentheses_does_not_parse_on_either_engine() {
4826 let error = parse_ast("PRAGMA version()").unwrap_err().to_string();
4829 assert!(error.contains("syntax error at or near \")\""), "{error}");
4830 }
4831
4832 #[test]
4833 fn a_window_call_carries_its_partition_its_order_and_its_frame() {
4834 assert_eq!(
4835 round("SELECT row_number() OVER () FROM t"),
4836 "SELECT row_number() OVER [] [] [Range UnboundedPreceding CurrentRow NoOthers] FROM t"
4837 );
4838 assert_eq!(
4839 round("SELECT sum(a) OVER (PARTITION BY b, c ORDER BY d DESC NULLS FIRST) FROM t"),
4840 "SELECT sum(a) OVER [b, c] [d Descending First] \
4841 [Range UnboundedPreceding CurrentRow NoOthers] FROM t"
4842 );
4843 assert_eq!(
4844 round(
4845 "SELECT sum(a) OVER (ORDER BY b GROUPS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE TIES) FROM t"
4846 ),
4847 "SELECT sum(a) OVER [] [b Unstated Unstated] \
4848 [Groups Preceding(1) Following(2) Ties] FROM t"
4849 );
4850 }
4851
4852 #[test]
4855 fn a_frame_with_both_ends_unbounded_is_counted_in_rows() {
4856 for unit in ["ROWS", "RANGE", "GROUPS"] {
4857 let query = format!(
4858 "SELECT sum(a) OVER (ORDER BY b {unit} BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t"
4859 );
4860 assert_eq!(
4861 round(&query),
4862 "SELECT sum(a) OVER [] [b Unstated Unstated] \
4863 [Rows UnboundedPreceding UnboundedFollowing NoOthers] FROM t"
4864 );
4865 }
4866 }
4867
4868 #[test]
4871 fn a_frame_written_with_one_bound_ends_at_the_current_row() {
4872 assert_eq!(
4873 round("SELECT sum(a) OVER (ORDER BY b ROWS UNBOUNDED PRECEDING) FROM t"),
4874 round(
4875 "SELECT sum(a) OVER (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t"
4876 )
4877 );
4878 }
4879
4880 #[test]
4881 fn a_named_window_is_resolved_here_and_not_carried_any_further() {
4882 let inlined = round("SELECT sum(a) OVER (PARTITION BY b ORDER BY c) FROM t");
4883 assert_eq!(
4884 round("SELECT sum(a) OVER w FROM t WINDOW w AS (PARTITION BY b ORDER BY c)"),
4885 inlined
4886 );
4887 assert_eq!(
4888 round("SELECT sum(a) OVER (w) FROM t WINDOW w AS (PARTITION BY b ORDER BY c)"),
4889 inlined
4890 );
4891 assert_eq!(
4894 round("SELECT sum(a) OVER v FROM t WINDOW w AS (PARTITION BY b), v AS (w ORDER BY c)"),
4895 inlined
4896 );
4897 assert_eq!(
4898 round("SELECT sum(a) OVER (w ORDER BY c) FROM t WINDOW w AS (PARTITION BY b)"),
4899 inlined
4900 );
4901 assert_eq!(
4903 round("SELECT sum(a) OVER W FROM t WINDOW w AS (PARTITION BY b ORDER BY c)"),
4904 inlined
4905 );
4906 }
4907
4908 #[test]
4911 fn a_named_window_reaches_a_subquery_written_in_the_same_block() {
4912 let ast = parse_ast("SELECT (SELECT sum(b) OVER w FROM u) FROM t WINDOW w AS (ORDER BY b)");
4913 assert!(ast.is_ok(), "{:?}", ast.err());
4914 let error =
4916 parse_ast("SELECT 1 FROM t WINDOW w AS (ORDER BY b); SELECT sum(a) OVER w FROM u;")
4917 .unwrap_err()
4918 .to_string();
4919 assert!(error.contains("window \"\"w\"\" does not exist"), "{error}");
4920 }
4921
4922 #[test]
4925 fn the_four_complaints_about_a_named_window_are_upstreams() {
4926 let cases = [
4927 ("SELECT sum(a) OVER w FROM t", "window \"\"w\"\" does not exist"),
4928 (
4929 "SELECT sum(a) OVER (w PARTITION BY b) FROM t WINDOW w AS (PARTITION BY b)",
4930 "Cannot override PARTITION BY clause of window \"w\"",
4931 ),
4932 (
4933 "SELECT sum(a) OVER (w ORDER BY b) FROM t WINDOW w AS (ORDER BY b)",
4934 "Cannot override ORDER BY clause of window \"w\"",
4935 ),
4936 (
4937 "SELECT sum(a) OVER (w ROWS UNBOUNDED PRECEDING) FROM t WINDOW w AS (ORDER BY b ROWS UNBOUNDED PRECEDING)",
4938 "cannot copy window \"w\" because it has a frame clause",
4939 ),
4940 ];
4941 for (query, expected) in cases {
4942 let error = parse_ast(query).expect_err(query).to_string();
4943 assert!(error.contains(expected), "{query}: {error}");
4944 }
4945 }
4946
4947 #[test]
4950 fn the_modifiers_that_only_a_window_takes_are_turned_down_without_one() {
4951 let error = parse_ast("SELECT first_value(a IGNORE NULLS) FROM t").unwrap_err().to_string();
4952 assert!(
4953 error.contains("RESPECT/IGNORE NULLS is not supported for non-window functions"),
4954 "{error}"
4955 );
4956 let error = parse_ast("SELECT sum(a) OVER (ORDER BY b EXCLUDE TIES) FROM t")
4957 .unwrap_err()
4958 .to_string();
4959 assert!(error.contains("syntax error at or near \"EXCLUDE\""), "{error}");
4960 }
4961
4962 #[test]
4965 fn a_window_call_is_not_put_through_the_rewrites_a_plain_call_is() {
4966 assert_eq!(
4967 round("SELECT ifnull(1) OVER () FROM t"),
4968 "SELECT ifnull(1) OVER [] [] [Range UnboundedPreceding CurrentRow NoOthers] FROM t"
4969 );
4970 let error = parse_ast("SELECT ifnull(1) FROM t").unwrap_err().to_string();
4971 assert!(error.contains("Wrong number of arguments to IFNULL."), "{error}");
4972 }
4973
4974 #[test]
4975 fn interning_means_a_name_written_twice_is_stored_once() {
4976 let ast = parse_ast("SELECT a, a, a FROM t WHERE a = a").unwrap();
4977 assert_eq!(ast.strings.iter().filter(|text| *text == "a").count(), 1);
4978 }
4979}