1use std::collections::HashMap;
21
22use rudb_common::{Error, IdentifierCase, Result, Span, Value};
23
24use crate::ast::{
25 Ast, BinaryOp, CaseArm, ColumnDef, CreateTable, CreateView, Distinct, DropTable, Expr, ExprRef,
26 Insert, JoinKind, LiteralKind, Nulls, Order, OrderItem, Quantifier, Query, QueryBody, QueryRef,
27 Scope, Select, SelectRef, SetOp, Setting, Slice, Source, SourceRef, Statement, StrRef, Target,
28 UnaryOp,
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 };
74 transform.program(tree.root())?;
75 Ok(transform.ast)
76}
77
78struct Transform<'a> {
79 query: &'a str,
80 tokens: &'a [Token],
81 tree: &'a Tree,
82 ast: Ast,
83 interned: HashMap<String, StrRef>,
84 anonymous: u32,
86 identifier_case: IdentifierCase,
87 current_span: Span,
88 ctes: Vec<(StrRef, QueryRef, Slice)>,
94}
95
96impl<'a> Transform<'a> {
97 fn text(&self, node: u32) -> &'a str {
101 self.tree.text(node, self.query, self.tokens)
102 }
103
104 fn span(&self, node: u32) -> Span {
106 let parsed = self.tree.node(node);
107 if parsed.start >= parsed.end {
108 let at = self
109 .tokens
110 .get(parsed.start as usize)
111 .map_or(self.query.len() as u32, |token| token.start);
112 return Span::new(at, at);
113 }
114 let first = self.tokens[parsed.start as usize];
115 let last = self.tokens[parsed.end as usize - 1];
116 Span::new(first.start, last.end)
117 }
118
119 fn name(&self, node: u32) -> &'static str {
121 self.tree.name(node)
122 }
123
124 fn kids(&self, node: u32) -> impl Iterator<Item = u32> + use<'a> {
130 let tree = self.tree;
131 tree.children(node)
132 }
133
134 fn count(&self, node: u32) -> usize {
136 self.kids(node).count()
137 }
138
139 fn nth(&self, node: u32, n: usize) -> u32 {
141 self.kids(node).nth(n).unwrap_or(NONE)
142 }
143
144 fn first(&self, node: u32) -> u32 {
146 self.nth(node, 0)
147 }
148
149 fn find(&self, node: u32, name: &str) -> u32 {
156 self.kids(node).find(|&kid| self.name(kid) == name).unwrap_or(NONE)
157 }
158
159 fn descendant(&self, node: u32, name: &str) -> u32 {
161 if self.name(node) == name {
162 return node;
163 }
164 self.kids(node)
165 .map(|kid| self.descendant(kid, name))
166 .find(|&found| found != NONE)
167 .unwrap_or(NONE)
168 }
169
170 fn contains(&self, node: u32, name: &str) -> bool {
172 self.name(node) == name || self.kids(node).any(|kid| self.contains(kid, name))
173 }
174
175 fn leaves(&self, node: u32, out: &mut Vec<u32>) {
182 let mut any = false;
183 for kid in self.kids(node) {
184 any = true;
185 self.leaves(kid, &mut *out);
186 }
187 if !any {
188 out.push(node);
189 }
190 }
191
192 fn intern(&mut self, text: &str) -> StrRef {
196 if let Some(&index) = self.interned.get(text) {
197 return index;
198 }
199 let index = u32::try_from(self.ast.strings.len())
200 .map_err(|_| Error::internal("more than four billion strings in one query"))
201 .unwrap_or(NONE);
202 self.ast.strings.push(text.to_string());
203 self.interned.insert(text.to_string(), index);
204 index
205 }
206
207 fn push(&mut self, expr: Expr) -> ExprRef {
209 let index = self.ast.exprs.len() as u32;
210 self.ast.exprs.push(expr);
211 self.ast.expr_spans.push(self.current_span);
212 index
213 }
214
215 fn push_source(&mut self, source: Source) -> SourceRef {
217 let index = self.ast.sources.len() as u32;
218 self.ast.sources.push(source);
219 index
220 }
221
222 fn push_query(&mut self, query: Query) -> QueryRef {
224 let index = self.ast.queries.len() as u32;
225 self.ast.queries.push(query);
226 self.ast.query_spans.push(self.current_span);
227 index
228 }
229
230 fn push_select(&mut self, select: Select) -> SelectRef {
232 let index = self.ast.selects.len() as u32;
233 self.ast.selects.push(select);
234 index
235 }
236
237 fn expr_slice(&mut self, items: Vec<ExprRef>) -> Slice {
239 let start = self.ast.expr_lists.len() as u32;
240 self.ast.expr_lists.extend(items);
241 Slice { start, len: self.ast.expr_lists.len() as u32 - start }
242 }
243
244 fn part_slice(&mut self, items: Vec<StrRef>) -> Slice {
246 let start = self.ast.parts.len() as u32;
247 self.ast.parts.extend(items);
248 Slice { start, len: self.ast.parts.len() as u32 - start }
249 }
250
251 fn column_def_slice(&mut self, items: Vec<ColumnDef>) -> Slice {
253 let start = self.ast.column_defs.len() as u32;
254 self.ast.column_defs.extend(items);
255 Slice { start, len: self.ast.column_defs.len() as u32 - start }
256 }
257
258 fn target_slice(&mut self, items: Vec<Target>) -> Slice {
260 let start = self.ast.targets.len() as u32;
261 self.ast.targets.extend(items);
262 Slice { start, len: self.ast.targets.len() as u32 - start }
263 }
264
265 fn name_list_slice(&mut self, items: Vec<Slice>) -> Slice {
267 let start = self.ast.name_lists.len() as u32;
268 self.ast.name_lists.extend(items);
269 Slice { start, len: self.ast.name_lists.len() as u32 - start }
270 }
271
272 fn unsupported<T>(&self, node: u32) -> Result<T> {
277 let text = self.text(node);
278 let text = if text.chars().count() > 60 {
279 let cut = text.char_indices().nth(60).map_or(text.len(), |(at, _)| at);
280 format!("{}...", &text[..cut])
281 } else {
282 text.to_string()
283 };
284 Err(Error::not_implemented(format!(
285 "{text} is not supported yet, the grammar rule is {}",
286 self.name(node)
287 )))
288 }
289
290 fn identifier(&mut self, node: u32) -> StrRef {
294 let mut leaves = Vec::new();
295 self.leaves(node, &mut leaves);
296 let text = leaves.last().map_or("", |&leaf| self.text(leaf));
297 let text = self.fold_identifier(text.strip_suffix('.').unwrap_or(text));
298 self.intern(&text)
299 }
300
301 fn name_parts(&mut self, node: u32) -> Slice {
303 let mut leaves = Vec::new();
304 self.leaves(node, &mut leaves);
305 let mut parts = Vec::with_capacity(leaves.len());
306 for leaf in leaves {
307 let text = self.text(leaf);
308 if text.is_empty() || text == "*" {
311 continue;
312 }
313 let text = self.fold_identifier(text.strip_suffix('.').unwrap_or(text));
314 let interned = self.intern(&text);
315 parts.push(interned);
316 }
317 self.part_slice(parts)
318 }
319
320 fn fold_identifier(&self, text: &str) -> String {
321 if text.starts_with(['"', '\'']) {
322 return unquote(text);
323 }
324 match self.identifier_case {
325 IdentifierCase::Preserve => text.to_string(),
326 IdentifierCase::Lower => text.to_ascii_lowercase(),
327 IdentifierCase::Upper => text.to_ascii_uppercase(),
328 }
329 }
330
331 fn program(&mut self, node: u32) -> Result<()> {
335 for top in self.kids(node) {
336 let Some(statement) = self.kids(top).find(|&kid| self.name(kid) == "Statement") else {
341 continue;
342 };
343 let statement = self.statement(statement)?;
344 self.ast.statements.push(statement);
345 }
346 Ok(())
347 }
348
349 fn statement(&mut self, node: u32) -> Result<Statement> {
351 let inner = self.first(node);
352 match self.name(inner) {
353 "SelectStatement" => {
354 let query = self.query(self.first(inner))?;
355 Ok(Statement::Query(query))
356 }
357 "CreateStatement" => self.create_statement(inner),
358 "DropStatement" => self.drop_statement(inner),
359 "InsertStatement" => self.insert_statement(inner),
360 "SetStatement" => self.set_statement(inner),
361 "ResetStatement" => self.reset_statement(inner),
362 "PragmaStatement" => self.pragma_statement(inner),
363 "ExplainStatement" => self.explain_statement(inner),
364 "CheckpointStatement" => Ok(Statement::Checkpoint),
365 _ => self.unsupported(inner),
366 }
367 }
368
369 fn explain_statement(&mut self, node: u32) -> Result<Statement> {
380 let analyze = self.find(node, "AnalyzeKeyword") != NONE;
381 let options = self.find(node, "ExplainOptionList");
382 if options != NONE {
383 return self.unsupported(options);
384 }
385 let inner = self.first(self.find(node, "ExplainableStatements"));
386 if self.name(inner) != "ExplainSelectStatement" {
387 return self.unsupported(inner);
388 }
389 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
390 Ok(Statement::Explain { query, analyze })
391 }
392
393 fn set_statement(&mut self, node: u32) -> Result<Statement> {
400 let inner = self.first(self.find(node, "SetAssignmentOrTimeZone"));
401 if self.name(inner) == "SetTimeZone" {
402 return self.set_time_zone(inner);
403 }
404 if self.name(inner) != "StandardAssignment" {
405 return self.unsupported(inner);
406 }
407 let (name, scope) = self.setting_name(self.find(inner, "SetVariableOrSetting"))?;
408 let assignment = self.find(inner, "SetAssignment");
409 let list = self.find(assignment, "VariableList");
410 let kids: Vec<u32> = self.kids(list).collect();
411 if kids.len() == 1 && self.contains(list, "DefaultExpression") {
412 let index = self.ast.settings.len() as u32;
413 self.ast.settings.push(Setting { name, scope, value: NONE });
414 return Ok(Statement::Reset(index));
415 }
416 let mut values = Vec::new();
417 for kid in kids {
418 values.push(self.expr(kid)?);
419 }
420 let [value] = values[..] else {
424 return self.unsupported(list);
425 };
426 let index = self.ast.settings.len() as u32;
427 self.ast.settings.push(Setting { name, scope, value });
428 Ok(Statement::Set(index))
429 }
430
431 fn set_time_zone(&mut self, node: u32) -> Result<Statement> {
433 let zone = self.first(self.find(node, "ZoneValue"));
434 let name = self.intern("TimeZone");
435 if matches!(self.name(zone), "ZoneDefault" | "ZoneLocal") {
436 let index = self.ast.settings.len() as u32;
437 self.ast.settings.push(Setting { name, scope: Scope::Unwritten, value: NONE });
438 return Ok(Statement::Reset(index));
439 }
440 let text = match self.name(zone) {
441 "ZoneStringLiteral" => self.string_value(self.find(zone, "StringLiteral"))?,
442 "ZoneIdentifier" => {
443 let identifier = self.find(zone, "Identifier");
444 let identifier = self.identifier(identifier);
445 self.ast.string(identifier).to_string()
446 }
447 _ => return self.unsupported(zone),
448 };
449 let text = self.intern(&text);
450 let value = self.push(Expr::Literal { kind: LiteralKind::String, text });
451 let index = self.ast.settings.len() as u32;
452 self.ast.settings.push(Setting { name, scope: Scope::Unwritten, value });
453 Ok(Statement::Set(index))
454 }
455
456 fn reset_statement(&mut self, node: u32) -> Result<Statement> {
458 let (name, scope) = self.setting_name(self.find(node, "SetVariableOrSetting"))?;
459 let index = self.ast.settings.len() as u32;
460 self.ast.settings.push(Setting { name, scope, value: NONE });
461 Ok(Statement::Reset(index))
462 }
463
464 fn pragma_statement(&mut self, node: u32) -> Result<Statement> {
477 let inner = self.first(self.find(node, "PragmaAssignOrFunction"));
478 match self.name(inner) {
479 "PragmaAssign" => self.pragma_assign(inner),
480 "PragmaFunction" => self.pragma_function(inner),
481 _ => self.unsupported(inner),
482 }
483 }
484
485 fn pragma_assign(&mut self, node: u32) -> Result<Statement> {
487 let name = self.identifier(self.find(node, "SettingName"));
488 let list = self.find(node, "VariableList");
489 let mut values = Vec::new();
490 for kid in self.kids(list) {
491 values.push(self.expr(kid)?);
492 }
493 let [value] = values[..] else {
496 return self.unsupported(list);
497 };
498 let index = self.ast.settings.len() as u32;
499 self.ast.settings.push(Setting { name, scope: Scope::Unwritten, value });
500 Ok(Statement::Set(index))
501 }
502
503 fn pragma_function(&mut self, node: u32) -> Result<Statement> {
514 let interned = self.identifier(self.find(node, "PragmaName"));
515 let written = self.ast.string(interned).to_string();
516 let part = self.intern(&format!("pragma_{written}"));
517 let name = self.part_slice(vec![part]);
518 let parameters = self.find(node, "PragmaParameters");
521 let mut args = Vec::new();
522 if parameters != NONE {
523 for kid in self.kids(parameters) {
524 let expr = self.expr(kid)?;
525 args.push(Target { expr: self.quoted(expr), alias: NONE });
526 }
527 }
528 let args = self.target_slice(args);
529 let source = self.push_source(Source::Function {
530 name,
531 args,
532 alias: NONE,
533 columns: Slice::default(),
534 pragma: true,
535 });
536 Ok(Statement::Query(self.star_over(source)))
537 }
538
539 fn quoted(&mut self, expr: ExprRef) -> ExprRef {
546 let Expr::Column { name } = self.ast.exprs[expr as usize] else {
547 return expr;
548 };
549 let written: Vec<&str> = self.ast.name(name).collect();
550 let joined = written.join(".");
551 let text = self.intern(&joined);
552 self.push(Expr::Literal { kind: LiteralKind::String, text })
553 }
554
555 fn setting_name(&mut self, node: u32) -> Result<(StrRef, Scope)> {
561 let inner = self.first(node);
562 if self.name(inner) != "SetSetting" {
563 return self.unsupported(inner);
564 }
565 let written = self.find(inner, "SettingScope");
566 let scope = if written == NONE {
567 Scope::Unwritten
568 } else {
569 match self.name(self.first(written)) {
570 "GlobalScope" => Scope::Global,
571 "SessionScope" => Scope::Session,
572 "LocalScope" => Scope::Local,
573 _ => return self.unsupported(written),
574 }
575 };
576 Ok((self.identifier(self.find(inner, "SettingName")), scope))
577 }
578
579 fn create_statement(&mut self, node: u32) -> Result<Statement> {
585 let or_replace = self.find(node, "OrReplace") != NONE;
586 let temporary = self.find(node, "Temporary") != NONE;
587 let variation = self.find(node, "CreateStatementVariation");
588 let inner = self.first(variation);
589 if or_replace && self.find(inner, "IfNotExists") != NONE {
593 return Err(Error::parser(
594 "Cannot specify both OR REPLACE and IF NOT EXISTS within single create statement",
595 ));
596 }
597 match self.name(inner) {
598 "CreateTableStmt" => self.create_table_statement(inner, or_replace, temporary),
599 "CreateViewStmt" => self.create_view_statement(inner, or_replace, temporary),
600 _ => self.unsupported(inner),
601 }
602 }
603
604 fn create_table_statement(
606 &mut self,
607 inner: u32,
608 or_replace: bool,
609 temporary: bool,
610 ) -> Result<Statement> {
611 let name = self.name_parts(self.find(inner, "QualifiedName"));
612 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
613 let definition = self.find(inner, "CreateTableDefinition");
614 let body = self.first(definition);
615 let (columns, query) = match self.name(body) {
616 "CreateColumnList" => (self.column_list(body)?, NONE),
617 "CreateTableAs" => self.create_table_as(body)?,
618 _ => return self.unsupported(body),
619 };
620 let index = self.ast.create_tables.len() as u32;
621 self.ast.create_tables.push(CreateTable {
622 name,
623 columns,
624 query,
625 if_not_exists,
626 or_replace,
627 temporary,
628 });
629 Ok(Statement::CreateTable(index))
630 }
631
632 fn create_view_statement(
639 &mut self,
640 inner: u32,
641 or_replace: bool,
642 temporary: bool,
643 ) -> Result<Statement> {
644 for kid in self.kids(inner) {
645 if matches!(self.name(kid), "CreateSecure" | "CreateRecursive" | "WithList") {
649 return self.unsupported(kid);
650 }
651 }
652 let name = self.name_parts(self.find(inner, "QualifiedName"));
653 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
654 let list = self.find(inner, "InsertColumnList");
655 let columns = if list == NONE {
656 Slice::default()
657 } else {
658 let mut parts = Vec::new();
659 for kid in self.kids(self.find(list, "ColumnList")) {
660 parts.push(self.identifier(kid));
661 }
662 self.part_slice(parts)
663 };
664 let body = self.find(inner, "SelectStatementInternal");
665 let sql = self.text(body).to_string();
666 let sql = self.intern(&sql);
667 let query = self.query(body)?;
668 let index = self.ast.create_views.len() as u32;
669 self.ast.create_views.push(CreateView {
670 name,
671 columns,
672 query,
673 sql,
674 if_not_exists,
675 or_replace,
676 temporary,
677 });
678 Ok(Statement::CreateView(index))
679 }
680
681 fn column_list(&mut self, node: u32) -> Result<Slice> {
683 for kid in self.kids(node) {
684 if matches!(self.name(kid), "PartitionOptions" | "SortedOptions" | "WithList") {
685 return self.unsupported(kid);
686 }
687 }
688 let list = self.find(node, "CreateTableColumnList");
689 if list == NONE {
690 return Ok(Slice::default());
693 }
694 let mut defs = Vec::new();
695 for element in self.kids(list) {
696 let inner = self.first(element);
697 if self.name(inner) != "CreateTableColumnDefinition" {
698 return self.unsupported(inner);
702 }
703 defs.push(self.column_definition(self.first(inner))?);
704 }
705 Ok(self.column_def_slice(defs))
706 }
707
708 fn column_definition(&mut self, node: u32) -> Result<ColumnDef> {
711 let name = self.identifier(self.find(node, "DottedIdentifier"));
712 let type_node = self.find(node, "Type");
713 let ty = if type_node == NONE {
714 NONE
715 } else {
716 let text = self.text(type_node).to_string();
717 self.intern(&text)
718 };
719 if self.find(node, "GeneratedColumn") != NONE {
720 return self.unsupported(self.find(node, "GeneratedColumn"));
721 }
722 let mut not_null = false;
723 for kid in self.kids(node) {
724 if self.name(kid) != "ColumnConstraint" {
725 continue;
726 }
727 let constraint = self.first(kid);
728 match self.name(constraint) {
729 "NotNullConstraint" => {
730 not_null = self.name(self.first(constraint)) == "NotNullColumnConstraint";
731 }
732 _ => return self.unsupported(constraint),
733 }
734 }
735 Ok(ColumnDef { name, ty, not_null })
736 }
737
738 fn create_table_as(&mut self, node: u32) -> Result<(Slice, QueryRef)> {
744 for kid in self.kids(node) {
745 if matches!(
746 self.name(kid),
747 "PartitionOptions" | "SortedOptions" | "WithList" | "WithData"
748 ) {
749 return self.unsupported(kid);
750 }
751 }
752 let names = self.find(node, "IdentifierList");
753 let columns = if names == NONE {
754 Slice::default()
755 } else {
756 let mut defs = Vec::new();
757 for kid in self.kids(names) {
758 let name = self.identifier(kid);
759 defs.push(ColumnDef { name, ty: NONE, not_null: false });
760 }
761 self.column_def_slice(defs)
762 };
763 let statement = self.find(node, "Statement");
764 let inner = self.first(statement);
765 if self.name(inner) != "SelectStatement" {
766 return self.unsupported(inner);
767 }
768 let query = self.query(self.first(inner))?;
769 Ok((columns, query))
770 }
771
772 fn drop_statement(&mut self, node: u32) -> Result<Statement> {
778 if self.find(node, "DropBehavior") != NONE {
779 return self.unsupported(self.find(node, "DropBehavior"));
780 }
781 let entries = self.find(node, "DropEntries");
782 let inner = self.first(entries);
783 if self.name(inner) != "DropTable" {
784 return self.unsupported(inner);
785 }
786 let kind = self.find(inner, "TableOrView");
787 let view = match self.name(self.first(kind)) {
788 "CommentTable" => false,
789 "CommentView" => true,
790 _ => return self.unsupported(kind),
791 };
792 let if_exists = self.find(inner, "IfExists") != NONE;
793 let mut names = Vec::new();
794 for kid in self.kids(inner) {
795 if self.name(kid) == "BaseTableName" {
796 names.push(self.name_parts(kid));
797 }
798 }
799 let names = self.name_list_slice(names);
800 let index = self.ast.drop_tables.len() as u32;
801 self.ast.drop_tables.push(DropTable { names, if_exists, view });
802 Ok(Statement::DropTable(index))
803 }
804
805 fn insert_statement(&mut self, node: u32) -> Result<Statement> {
812 for kid in self.kids(node) {
813 if matches!(
814 self.name(kid),
815 "InsertTarget" | "InsertColumnList" | "InsertValues" | "WithClause"
816 ) {
817 continue;
818 }
819 return self.unsupported(kid);
820 }
821 if self.find(node, "WithClause") != NONE {
822 return self.unsupported(self.find(node, "WithClause"));
823 }
824 let name = self.name_parts(self.find(self.find(node, "InsertTarget"), "BaseTableName"));
825 let list = self.find(node, "InsertColumnList");
826 let columns = if list == NONE {
827 Slice::default()
828 } else {
829 let mut parts = Vec::new();
830 for kid in self.kids(self.find(list, "ColumnList")) {
831 parts.push(self.identifier(kid));
832 }
833 self.part_slice(parts)
834 };
835 let values = self.find(node, "InsertValues");
836 let inner = self.first(values);
837 if self.name(inner) != "SelectInsertValues" {
838 return self.unsupported(inner);
839 }
840 let source = self.query(self.find(inner, "SelectStatementInternal"))?;
841 let index = self.ast.inserts.len() as u32;
842 self.ast.inserts.push(Insert { name, columns, source });
843 Ok(Statement::Insert(index))
844 }
845
846 fn query(&mut self, node: u32) -> Result<QueryRef> {
848 let span = self.span(node);
849 let outer = std::mem::replace(&mut self.current_span, span);
850 let result = self.query_inner(node);
851 self.current_span = outer;
852 result
853 }
854
855 fn query_inner(&mut self, node: u32) -> Result<QueryRef> {
856 let mark = self.ctes.len();
857 let with = self.find(node, "WithClause");
858 if with != NONE {
859 if self.find(with, "Recursive") != NONE {
860 return self.unsupported(self.find(with, "Recursive"));
861 }
862 for statement in self.kids(with) {
863 if self.name(statement) != "WithStatement" {
864 continue;
865 }
866 let materialized = self.find(statement, "Materialized");
867 if materialized != NONE
868 && !self.text(materialized).eq_ignore_ascii_case("NOT MATERIALIZED")
869 {
870 return self.unsupported(materialized);
871 }
872 let name = self.identifier(self.first(statement));
873 let list = self.find(statement, "InsertColumnList");
874 let columns = if list == NONE {
875 Slice::default()
876 } else {
877 let mut names = Vec::new();
878 for kid in self.kids(self.find(list, "ColumnList")) {
879 names.push(self.identifier(kid));
880 }
881 self.part_slice(names)
882 };
883 let body = self.find(statement, "CTEBody");
884 let select = self.first(body);
885 if self.name(select) != "CTESelectBody" {
886 return self.unsupported(body);
887 }
888 let query = self.query(self.first(select))?;
889 self.ctes.push((name, query, columns));
890 }
891 }
892 let chain = self.find(node, "SelectSetOpChain");
893 if chain == NONE {
894 return self.unsupported(node);
895 }
896 let query = self.set_op_chain(chain)?;
897 let modifiers = self.find(node, "ResultModifiers");
898 if modifiers != NONE {
899 self.result_modifiers(query, modifiers)?;
900 }
901 self.ctes.truncate(mark);
902 Ok(query)
903 }
904
905 fn set_op_chain(&mut self, node: u32) -> Result<QueryRef> {
907 let mut kids = self.kids(node);
908 let head = kids.next().unwrap_or(NONE);
909 let mut left = self.intersect_chain(head)?;
910 for tail in kids {
911 let clause = self.first(tail);
913 let (op, quantifier, by_name) = self.setop_clause(clause)?;
914 let right = self.intersect_chain(self.nth(tail, 1))?;
915 left = self.push_query(Query::bare(QueryBody::SetOp {
916 op,
917 quantifier,
918 by_name,
919 left,
920 right,
921 }));
922 }
923 Ok(left)
924 }
925
926 fn intersect_chain(&mut self, node: u32) -> Result<QueryRef> {
928 let mut kids = self.kids(node);
929 let head = kids.next().unwrap_or(NONE);
930 let mut left = self.select_atom(head)?;
931 for tail in kids {
932 let clause = self.first(tail);
934 let quantifier = self.quantifier(self.find(clause, "DistinctOrAll"));
935 let right = self.select_atom(self.nth(tail, 1))?;
936 left = self.push_query(Query::bare(QueryBody::SetOp {
937 op: SetOp::Intersect,
938 quantifier,
939 by_name: false,
940 left,
941 right,
942 }));
943 }
944 Ok(left)
945 }
946
947 fn setop_clause(&mut self, node: u32) -> Result<(SetOp, Quantifier, bool)> {
949 let kind = self.find(node, "SetopType");
950 let op = match self.name(self.first(kind)) {
951 "SetopUnion" => SetOp::Union,
952 "SetopExcept" => SetOp::Except,
953 _ => return self.unsupported(kind),
954 };
955 let quantifier = self.quantifier(self.find(node, "DistinctOrAll"));
956 Ok((op, quantifier, self.find(node, "ByName") != NONE))
957 }
958
959 fn quantifier(&self, node: u32) -> Quantifier {
961 if node == NONE {
962 return Quantifier::Unstated;
963 }
964 match self.name(self.first(node)) {
965 "DistinctKeyword" => Quantifier::Distinct,
966 "AllKeyword" => Quantifier::All,
967 _ => Quantifier::Unstated,
968 }
969 }
970
971 fn select_atom(&mut self, node: u32) -> Result<QueryRef> {
973 let inner = self.first(node);
974 match self.name(inner) {
975 "SelectParens" => self.query(self.first(inner)),
978 "SelectStatementType" => {
979 let kind = self.first(inner);
980 match self.name(kind) {
981 "OptionalParensSimpleSelect" => {
982 let select = self.simple_select(self.unwrap_parens(kind))?;
983 Ok(self.push_query(Query::bare(QueryBody::Select(select))))
984 }
985 "ValuesClause" => {
986 let rows = self.values_clause(kind)?;
987 Ok(self.push_query(Query::bare(QueryBody::Values(rows))))
988 }
989 "DescribeStatement" => self.describe_statement(kind),
990 _ => self.unsupported(kind),
991 }
992 }
993 _ => self.unsupported(inner),
994 }
995 }
996
997 fn describe_statement(&mut self, node: u32) -> Result<QueryRef> {
1010 let inner = self.first(node);
1011 match self.name(inner) {
1012 "DescribeSelect" => {
1013 self.describe_and_not_summarize(inner)?;
1014 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
1015 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
1016 }
1017 "DescribeByName" => {
1018 self.describe_and_not_summarize(inner)?;
1019 let target = self.find(inner, "DescribeTarget");
1020 if target == NONE {
1021 return self.unsupported(inner);
1022 }
1023 let source = self.describe_target(target)?;
1024 let query = self.star_over(source);
1025 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
1026 }
1027 "ShowByName" => {
1028 let target = self.find(inner, "ShowTarget");
1029 if target == NONE {
1030 return self.unsupported(inner);
1031 }
1032 let name = self.name_parts(target);
1033 let source = self.push_source(Source::Table {
1034 name,
1035 alias: NONE,
1036 columns: Slice::default(),
1037 });
1038 let relation = self.star_over(source);
1039 Ok(self.push_query(Query::bare(QueryBody::Show { name, relation })))
1040 }
1041 _ => self.unsupported(inner),
1042 }
1043 }
1044
1045 fn describe_and_not_summarize(&mut self, node: u32) -> Result<()> {
1047 let word = self.find(node, "DescribeOrSummarize");
1048 if word == NONE || self.name(self.first(word)) != "DescribeRule" {
1049 return self.unsupported(if word == NONE { node } else { word });
1050 }
1051 Ok(())
1052 }
1053
1054 fn describe_target(&mut self, node: u32) -> Result<SourceRef> {
1060 let inner = self.first(node);
1061 let name = match self.name(inner) {
1062 "DescribeBaseTableName" => self.name_parts(self.find(inner, "BaseTableName")),
1063 "DescribeStringLiteral" => {
1064 let text = self.string_value(self.find(inner, "StringLiteral"))?;
1065 let part = self.intern(&text);
1066 self.part_slice(vec![part])
1067 }
1068 _ => return self.unsupported(inner),
1069 };
1070 Ok(self.push_source(Source::Table { name, alias: NONE, columns: Slice::default() }))
1071 }
1072
1073 fn star_over(&mut self, source: SourceRef) -> QueryRef {
1075 let star =
1076 self.push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
1077 let targets = self.target_slice(vec![Target { expr: star, alias: NONE }]);
1078 let start = self.ast.source_lists.len() as u32;
1079 self.ast.source_lists.push(source);
1080 let from = Slice { start, len: 1 };
1081 let select = self.push_select(Select { targets, from, ..Select::empty() });
1082 self.push_query(Query::bare(QueryBody::Select(select)))
1083 }
1084
1085 fn values_clause(&mut self, node: u32) -> Result<Slice> {
1091 let mut rows = Vec::new();
1092 for kid in self.kids(node) {
1093 if self.name(kid) != "ValuesExpressions" {
1094 continue;
1095 }
1096 let mut items = Vec::new();
1097 for expr in self.kids(kid) {
1098 items.push(self.expr(expr)?);
1099 }
1100 let slice = self.expr_slice(items);
1101 rows.push(slice);
1102 }
1103 let start = self.ast.rows.len() as u32;
1104 self.ast.rows.extend(rows);
1105 Ok(Slice { start, len: self.ast.rows.len() as u32 - start })
1106 }
1107
1108 fn unwrap_parens(&self, node: u32) -> u32 {
1110 let mut node = self.first(node);
1111 while self.name(node) == "SimpleSelectParens" {
1112 node = self.first(node);
1113 }
1114 node
1115 }
1116
1117 fn result_modifiers(&mut self, query: QueryRef, node: u32) -> Result<()> {
1119 let order = self.find(node, "OrderByClause");
1120 if order != NONE {
1121 let (items, all) = self.order_by(order)?;
1122 let start = self.ast.order_items.len() as u32;
1123 self.ast.order_items.extend(items);
1124 self.ast.queries[query as usize].order_by =
1125 Slice { start, len: self.ast.order_items.len() as u32 - start };
1126 self.ast.queries[query as usize].order_by_all = all;
1127 }
1128 let limit = self.find(node, "LimitOffset");
1129 if limit != NONE {
1130 self.limit_offset(query, self.first(limit))?;
1131 }
1132 Ok(())
1133 }
1134
1135 fn limit_offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
1137 match self.name(node) {
1138 "LimitOffsetClause" | "OffsetLimitClause" => {
1139 let limit = self.find(node, "LimitClause");
1140 if limit != NONE {
1141 self.limit(query, limit)?;
1142 }
1143 let offset = self.find(node, "OffsetClause");
1144 if offset != NONE {
1145 self.offset(query, offset)?;
1146 }
1147 Ok(())
1148 }
1149 _ => self.unsupported(node),
1150 }
1151 }
1152
1153 fn limit(&mut self, query: QueryRef, node: u32) -> Result<()> {
1155 let value = self.first(node);
1156 let inner = self.first(value);
1157 match self.name(inner) {
1158 "LimitAll" => Ok(()),
1160 "LimitExpression" => {
1164 let expr = self.expr(self.first(inner))?;
1165 self.ast.queries[query as usize].limit = expr;
1166 self.ast.queries[query as usize].limit_percent = self.text(inner).ends_with('%');
1167 Ok(())
1168 }
1169 "LimitLiteralPercent" => {
1170 let expr = self.expr(self.first(inner))?;
1171 self.ast.queries[query as usize].limit = expr;
1172 self.ast.queries[query as usize].limit_percent = true;
1173 Ok(())
1174 }
1175 _ => self.unsupported(inner),
1176 }
1177 }
1178
1179 fn offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
1181 let value = self.first(node);
1182 let expr = self.expr(self.first(value))?;
1183 self.ast.queries[query as usize].offset = expr;
1184 Ok(())
1185 }
1186
1187 fn simple_select(&mut self, node: u32) -> Result<SelectRef> {
1190 for name in ["WindowClause", "QualifyClause", "SampleClause"] {
1191 let clause = self.find(node, name);
1192 if clause != NONE {
1193 return self.unsupported(clause);
1194 }
1195 }
1196 let mut select = Select::empty();
1197 self.select_from(&mut select, self.first(node))?;
1198 let filter = self.find(node, "WhereClause");
1199 if filter != NONE {
1200 select.filter = self.expr(self.first(filter))?;
1201 }
1202 let group = self.find(node, "GroupByClause");
1203 if group != NONE {
1204 self.group_by(&mut select, self.first(group))?;
1205 }
1206 let having = self.find(node, "HavingClause");
1207 if having != NONE {
1208 select.having = self.expr(self.first(having))?;
1209 }
1210 Ok(self.push_select(select))
1211 }
1212
1213 fn select_from(&mut self, select: &mut Select, node: u32) -> Result<()> {
1216 let clause = self.first(node);
1217 let targets = self.find(clause, "SelectClause");
1218 let from = self.find(clause, "FromClause");
1219 if from != NONE {
1220 select.from = self.sources(from)?;
1221 }
1222 if targets == NONE {
1223 let star = self
1227 .push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
1228 let start = self.ast.targets.len() as u32;
1229 self.ast.targets.push(Target { expr: star, alias: NONE });
1230 select.targets = Slice { start, len: 1 };
1231 return Ok(());
1232 }
1233 self.select_clause(select, targets)
1234 }
1235
1236 fn select_clause(&mut self, select: &mut Select, node: u32) -> Result<()> {
1238 let distinct = self.find(node, "DistinctClause");
1239 if distinct != NONE {
1240 let inner = self.first(distinct);
1241 select.distinct = match self.name(inner) {
1242 "DistinctAll" => Distinct::No,
1244 "DistinctOn" => {
1245 let on = self.find(inner, "DistinctOnTargets");
1246 if on == NONE {
1247 Distinct::Yes
1248 } else {
1249 let mut items = Vec::new();
1250 for kid in self.kids(on) {
1251 items.push(self.expr(kid)?);
1252 }
1253 Distinct::On(self.expr_slice(items))
1254 }
1255 }
1256 _ => return self.unsupported(inner),
1257 };
1258 }
1259 let list = self.find(node, "TargetList");
1260 if list == NONE {
1261 return Ok(());
1262 }
1263 let mut targets = Vec::new();
1264 for kid in self.kids(list) {
1265 targets.push(self.target(kid)?);
1266 }
1267 select.targets = self.target_slice(targets);
1268 Ok(())
1269 }
1270
1271 fn target(&mut self, node: u32) -> Result<Target> {
1273 let inner = self.first(node);
1274 match self.name(inner) {
1275 "ColIdExpression" => {
1277 let alias = self.identifier(self.first(inner));
1278 let expr = self.expr(self.nth(inner, 1))?;
1279 Ok(Target { expr, alias })
1280 }
1281 "ExpressionAsCollabel" => {
1282 let expr = self.expr(self.first(inner))?;
1283 let alias = self.identifier(self.nth(inner, 1));
1284 Ok(Target { expr, alias })
1285 }
1286 "ExpressionOptIdentifier" => {
1287 let expr = self.expr(self.first(inner))?;
1288 let alias =
1289 if self.count(inner) > 1 { self.identifier(self.nth(inner, 1)) } else { NONE };
1290 Ok(Target { expr, alias })
1291 }
1292 _ => self.unsupported(inner),
1293 }
1294 }
1295
1296 fn group_by(&mut self, select: &mut Select, node: u32) -> Result<()> {
1298 let inner = self.first(node);
1299 match self.name(inner) {
1300 "GroupByAll" => {
1301 select.group_by_all = true;
1302 Ok(())
1303 }
1304 "GroupByList" => {
1305 let mut items = Vec::new();
1306 for kid in self.kids(inner) {
1307 let expression = self.first(kid);
1310 if self.name(expression) != "GroupByBaseExpression" {
1311 return self.unsupported(expression);
1312 }
1313 items.push(self.expr(self.first(expression))?);
1314 }
1315 select.group_by = self.expr_slice(items);
1316 Ok(())
1317 }
1318 _ => self.unsupported(inner),
1319 }
1320 }
1321
1322 fn order_by(&mut self, node: u32) -> Result<(Vec<OrderItem>, bool)> {
1325 let inner = self.first(self.first(node));
1326 match self.name(inner) {
1327 "OrderByAll" => {
1328 let (order, nulls) = self.sort_options(inner);
1329 Ok((vec![OrderItem { expr: NONE, order, nulls }], true))
1330 }
1331 "OrderByExpressionList" => {
1332 let mut items = Vec::new();
1333 for kid in self.kids(inner) {
1334 let expr = self.expr(self.first(kid))?;
1336 let (order, nulls) = self.sort_options(kid);
1337 items.push(OrderItem { expr, order, nulls });
1338 }
1339 Ok((items, false))
1340 }
1341 _ => self.unsupported(inner),
1342 }
1343 }
1344
1345 fn sort_options(&self, node: u32) -> (Order, Nulls) {
1347 let direction = self.find(node, "DescOrAsc");
1348 let order = if direction == NONE {
1349 Order::Unstated
1350 } else if self.name(self.first(direction)) == "DescendingOrder" {
1351 Order::Descending
1352 } else {
1353 Order::Ascending
1354 };
1355 let placement = self.find(node, "NullsFirstOrLast");
1356 let nulls = if placement == NONE {
1357 Nulls::Unstated
1358 } else if self.name(self.first(placement)) == "NullsFirst" {
1359 Nulls::First
1360 } else {
1361 Nulls::Last
1362 };
1363 (order, nulls)
1364 }
1365
1366 fn sources(&mut self, node: u32) -> Result<Slice> {
1370 let mut items = Vec::new();
1371 for kid in self.kids(node) {
1372 items.push(self.table_ref(kid)?);
1373 }
1374 let start = self.ast.source_lists.len() as u32;
1375 self.ast.source_lists.extend(items);
1376 Ok(Slice { start, len: self.ast.source_lists.len() as u32 - start })
1377 }
1378
1379 fn table_ref(&mut self, node: u32) -> Result<SourceRef> {
1381 let mut kids = self.kids(node);
1382 let head = kids.next().unwrap_or(NONE);
1383 let mut left = self.inner_table_ref(head)?;
1384 for tail in kids {
1385 let clause = self.first(tail);
1386 if self.name(clause) != "JoinClause" {
1387 return self.unsupported(clause);
1388 }
1389 left = self.join(left, self.first(clause))?;
1390 }
1391 Ok(left)
1392 }
1393
1394 fn inner_table_ref(&mut self, node: u32) -> Result<SourceRef> {
1396 let inner = if self.name(node) == "InnerTableRef" { self.first(node) } else { node };
1397 match self.name(inner) {
1398 "BaseTableRef" => {
1399 if self.find(inner, "TableAliasColon") != NONE {
1400 return self.unsupported(inner);
1401 }
1402 for name in ["AtClause", "SampleClause"] {
1403 let clause = self.find(inner, name);
1404 if clause != NONE {
1405 return self.unsupported(clause);
1406 }
1407 }
1408 let name = self.name_parts(self.find(inner, "BaseTableName"));
1409 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1410 if name.len == 1 {
1411 let part = self.ast.parts[name.start as usize];
1412 if let Some(&(_, query, declared)) =
1413 self.ctes.iter().rev().find(|&&(cte, _, _)| {
1414 self.ast.string(cte).eq_ignore_ascii_case(self.ast.string(part))
1415 })
1416 {
1417 let alias = if alias == NONE { part } else { alias };
1418 let columns = if columns.is_empty() { declared } else { columns };
1419 return Ok(self.push_source(Source::Subquery { query, alias, columns }));
1420 }
1421 }
1422 Ok(self.push_source(Source::Table { name, alias, columns }))
1423 }
1424 "TableSubquery" => {
1425 if self.find(inner, "TableAliasColon") != NONE
1426 || self.find(inner, "Lateral") != NONE
1427 {
1428 return self.unsupported(inner);
1429 }
1430 let reference = self.find(inner, "SubqueryReference");
1432 let query = self.query(self.first(reference))?;
1433 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1434 Ok(self.push_source(Source::Subquery { query, alias, columns }))
1435 }
1436 "TableFunction" => {
1441 let form = self.first(inner);
1442 for name in ["TableAliasColon", "Lateral", "WithOrdinality", "SampleClause"] {
1443 let clause = self.find(form, name);
1444 if clause != NONE {
1445 return self.unsupported(clause);
1446 }
1447 }
1448 let name = self.name_parts(self.find(form, "QualifiedTableFunction"));
1449 let mut args = Vec::new();
1450 let list = self.find(form, "TableFunctionArguments");
1453 for kid in self.kids(list) {
1454 args.push(self.table_argument(kid)?);
1455 }
1456 let args = self.target_slice(args);
1457 let (alias, columns) = self.table_alias(self.find(form, "TableAlias"));
1458 Ok(self.push_source(Source::Function { name, args, alias, columns, pragma: false }))
1459 }
1460 "ValuesRef" => {
1461 if self.find(inner, "TableAliasColon") != NONE {
1462 return self.unsupported(inner);
1463 }
1464 let rows = self.values_clause(self.find(inner, "ValuesClause"))?;
1465 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1466 Ok(self.push_source(Source::Values { rows, alias, columns }))
1467 }
1468 "ParensTableRef" => {
1469 if self.find(inner, "TableAliasColon") != NONE
1470 || self.find(inner, "SampleClause") != NONE
1471 || self.find(inner, "TableAlias") != NONE
1472 {
1473 return self.unsupported(inner);
1474 }
1475 self.table_ref(self.find(inner, "TableRef"))
1476 }
1477 _ => self.unsupported(inner),
1478 }
1479 }
1480
1481 fn table_alias(&mut self, node: u32) -> (StrRef, Slice) {
1483 if node == NONE {
1484 return (NONE, Slice::default());
1485 }
1486 let inner = self.first(node);
1487 let alias = self.identifier(self.first(inner));
1488 let list = self.find(inner, "ColumnAliases");
1489 if list == NONE {
1490 return (alias, Slice::default());
1491 }
1492 let mut columns = Vec::new();
1493 for kid in self.kids(list) {
1494 let name = self.identifier(kid);
1495 columns.push(name);
1496 }
1497 (alias, self.part_slice(columns))
1498 }
1499
1500 fn join(&mut self, left: SourceRef, node: u32) -> Result<SourceRef> {
1502 match self.name(node) {
1503 "RegularJoinClause" => {
1505 if self.find(node, "Asof") != NONE {
1506 return self.unsupported(node);
1507 }
1508 let kind = self.join_type(self.find(node, "JoinType"));
1509 let right = self.table_ref(self.find(node, "TableRef"))?;
1510 let (on, using) = self.join_qualifier(self.find(node, "JoinQualifier"))?;
1511 Ok(self.push_source(Source::Join { left, right, kind, natural: false, on, using }))
1512 }
1513 "JoinWithoutOnClause" => {
1516 let prefix = self.first(self.find(node, "JoinPrefix"));
1517 let (kind, natural) = match self.name(prefix) {
1518 "CrossJoinPrefix" => (JoinKind::Cross, false),
1519 "PositionalJoinPrefix" => (JoinKind::Positional, false),
1520 "NaturalJoinPrefix" => (self.join_type(self.find(prefix, "JoinType")), true),
1521 _ => return self.unsupported(prefix),
1522 };
1523 let right = self.inner_table_ref(self.find(node, "InnerTableRef"))?;
1524 Ok(self.push_source(Source::Join {
1525 left,
1526 right,
1527 kind,
1528 natural,
1529 on: NONE,
1530 using: Slice::default(),
1531 }))
1532 }
1533 _ => self.unsupported(node),
1534 }
1535 }
1536
1537 fn join_type(&self, node: u32) -> JoinKind {
1540 if node == NONE {
1541 return JoinKind::Inner;
1542 }
1543 match self.name(self.first(node)) {
1544 "FullJoin" => JoinKind::Full,
1545 "LeftJoin" => JoinKind::Left,
1546 "RightJoin" => JoinKind::Right,
1547 "SemiJoin" => JoinKind::Semi,
1548 "AntiJoin" => JoinKind::Anti,
1549 _ => JoinKind::Inner,
1550 }
1551 }
1552
1553 fn join_qualifier(&mut self, node: u32) -> Result<(ExprRef, Slice)> {
1555 let inner = self.first(node);
1556 match self.name(inner) {
1557 "OnClause" => Ok((self.expr(self.first(inner))?, Slice::default())),
1558 "UsingClause" => {
1559 let mut columns = Vec::new();
1560 for kid in self.kids(inner) {
1561 let name = self.identifier(kid);
1562 columns.push(name);
1563 }
1564 Ok((NONE, self.part_slice(columns)))
1565 }
1566 _ => self.unsupported(inner),
1567 }
1568 }
1569
1570 fn expr(&mut self, node: u32) -> Result<ExprRef> {
1588 let span = self.span(node);
1589 let outer = std::mem::replace(&mut self.current_span, span);
1590 let result = self.expr_inner(node);
1591 self.current_span = outer;
1592 result
1593 }
1594
1595 fn expr_inner(&mut self, node: u32) -> Result<ExprRef> {
1596 let mut node = node;
1597 loop {
1598 let count = self.count(node);
1599 let name = self.name(node);
1600 match name {
1601 "LogicalOrExpression" if count > 1 => return self.logical(node, BinaryOp::Or),
1602 "LogicalAndExpression" if count > 1 => return self.logical(node, BinaryOp::And),
1603 "LogicalNotExpression" if count > 1 => return self.logical_not(node),
1604 "IsExpression" if count > 1 => return self.is_expression(node),
1605 "BetweenInLikeExpression" if count > 1 => return self.between_in_like(node),
1606 "PrefixExpression" if count > 1 => return self.prefix(node),
1607 "BaseExpression" if count > 1 => return self.indirection(node),
1608 "LambdaArrowExpression"
1609 | "IsDistinctFromExpression"
1610 | "ComparisonExpression"
1611 | "OtherOperatorExpression"
1612 | "BitwiseExpression"
1613 | "AdditiveExpression"
1614 | "MultiplicativeExpression"
1615 | "ExponentiationExpression"
1616 | "CollateExpression"
1617 | "AtTimeZoneExpression"
1618 if count > 1 =>
1619 {
1620 return self.tail_chain(node);
1621 }
1622 "ColumnReference" => {
1623 let name = self.name_parts(node);
1624 return Ok(self.push(Expr::Column { name }));
1625 }
1626 "StarExpression" => return self.star(node),
1627 "NumberLiteral" => {
1628 let text = self.text(node).to_string();
1629 let text = self.intern(&text);
1630 return Ok(self.push(Expr::Literal { kind: LiteralKind::Number, text }));
1631 }
1632 "StringLiteral" => return self.string_literal(node),
1633 "NullLiteral" | "TrueLiteral" | "FalseLiteral" => {
1634 let kind = match name {
1635 "NullLiteral" => LiteralKind::Null,
1636 "TrueLiteral" => LiteralKind::True,
1637 _ => LiteralKind::False,
1638 };
1639 return Ok(self.push(Expr::Literal { kind, text: NONE }));
1640 }
1641 "FunctionExpression" => return self.function(node),
1642 "CoalesceExpression" => return self.coalesce(node),
1643 "NullIfExpression" => return self.null_if(node),
1644 "SubstringExpression" => return self.substring(node),
1645 "PositionExpression" => return self.position(node),
1646 "TrimExpression" => return self.trim(node),
1647 "OverlayExpression" => return self.overlay(node),
1648 "ExtractExpression" => return self.extract(node),
1649 "CastExpression" => return self.cast(node),
1650 "TypeLiteral" => return self.typed_literal(node),
1651 "IntervalLiteral" => return self.interval_literal(node),
1652 "CaseExpression" => return self.case(node),
1653 "ParenthesisExpression" => return self.row(node),
1654 "ParensExpression" if count == 1 => node = self.first(node),
1660 "BoundedListExpression" => return self.list(node),
1661 "QuestionMarkNumberedParameter"
1662 | "AnonymousParameter"
1663 | "NumberedParameter"
1664 | "ColLabelParameter" => return self.parameter(node),
1665 "SubqueryExpression" => return self.subquery(node),
1666 _ if count == 1 && self.text(self.first(node)) == self.text(node) => {
1667 node = self.first(node);
1668 }
1669 _ => return self.unsupported(node),
1670 }
1671 }
1672 }
1673
1674 fn tail_chain(&mut self, node: u32) -> Result<ExprRef> {
1676 let mut kids = self.kids(node);
1677 let head = kids.next().unwrap_or(NONE);
1678 let mut left = self.expr(head)?;
1679 for tail in kids {
1680 let operator = self.first(tail);
1681 let operand = self.kids(tail).last().unwrap_or(NONE);
1685 if self.count(tail) > 2 {
1686 return self.unsupported(tail);
1687 }
1688 if self.contains(operator, "AnyAllParsedOperator") {
1689 let any_op = self.descendant(operator, "AnyOp");
1690 let op = self.binary_op(any_op)?;
1691 let reference = self.descendant(operand, "SubqueryReference");
1692 if reference == NONE {
1693 return self.unsupported(operand);
1694 }
1695 let query = self.query(self.first(reference))?;
1696 let all = self.contains(operator, "SubqueryAll");
1697 left = self.push(Expr::QuantifiedSubquery { operand: left, op, query, all });
1698 continue;
1699 }
1700 let op = self.binary_op(operator)?;
1701 let right = self.expr(operand)?;
1702 left = self.push(Expr::Binary { op, left, right });
1703 }
1704 Ok(left)
1705 }
1706
1707 fn binary_op(&mut self, node: u32) -> Result<BinaryOp> {
1709 let mut leaf = node;
1715 while self.count(leaf) == 1 {
1716 leaf = self.first(leaf);
1717 }
1718 let text = self.text(node);
1719 let upper = text.to_ascii_uppercase();
1720 let op = match upper.as_str() {
1721 "OR" => BinaryOp::Or,
1722 "AND" => BinaryOp::And,
1723 "=" | "==" => BinaryOp::Eq,
1724 "!=" | "<>" => BinaryOp::NotEq,
1725 "<" => BinaryOp::Lt,
1726 ">" => BinaryOp::Gt,
1727 "<=" => BinaryOp::LtEq,
1728 ">=" => BinaryOp::GtEq,
1729 "+" => BinaryOp::Add,
1730 "-" => BinaryOp::Subtract,
1731 "*" => BinaryOp::Multiply,
1732 "/" => BinaryOp::Divide,
1733 "//" => BinaryOp::IntegerDivide,
1734 "%" => BinaryOp::Modulo,
1735 "^" | "**" => BinaryOp::Power,
1736 "&" => BinaryOp::BitAnd,
1737 "|" => BinaryOp::BitOr,
1738 "<<" => BinaryOp::ShiftLeft,
1739 ">>" => BinaryOp::ShiftRight,
1740 "||" => BinaryOp::Concat,
1741 "COLLATE" => BinaryOp::Collate,
1742 "->" => BinaryOp::Arrow,
1743 "->>" => BinaryOp::LongArrow,
1744 "@>" => BinaryOp::Contains,
1745 "<@" => BinaryOp::ContainedBy,
1746 "&&" => BinaryOp::Overlaps,
1747 "^@" => BinaryOp::StartsWith,
1748 "<<=" => BinaryOp::InetContainedByOrEq,
1749 ">>=" => BinaryOp::InetContainsOrEq,
1750 _ if self.name(leaf) == "AtTimeZoneOperator" => BinaryOp::AtTimeZone,
1751 _ if self.name(leaf) == "IsDistinctFromOp" => {
1754 if upper.split_whitespace().any(|word| word == "NOT") {
1755 BinaryOp::IsNotDistinctFrom
1756 } else {
1757 BinaryOp::IsDistinctFrom
1758 }
1759 }
1760 _ if self.name(leaf) == "OperatorLiteral" => {
1767 let interned = self.intern(text);
1768 BinaryOp::Named(interned)
1769 }
1770 _ => return self.unsupported(node),
1771 };
1772 Ok(op)
1773 }
1774
1775 fn logical(&mut self, node: u32, op: BinaryOp) -> Result<ExprRef> {
1780 let mut kids = self.kids(node);
1781 let head = kids.next().unwrap_or(NONE);
1782 let mut left = self.expr(head)?;
1783 for tail in kids {
1784 let right = self.expr(self.first(tail))?;
1785 left = self.push(Expr::Binary { op, left, right });
1786 }
1787 Ok(left)
1788 }
1789
1790 fn logical_not(&mut self, node: u32) -> Result<ExprRef> {
1795 let negations = self.count(self.first(node));
1796 let mut expr = self.expr(self.nth(node, 1))?;
1797 for _ in 0..negations {
1798 expr = self.push(Expr::Unary { op: UnaryOp::Not, operand: expr });
1799 }
1800 Ok(expr)
1801 }
1802
1803 fn is_expression(&mut self, node: u32) -> Result<ExprRef> {
1805 let mut kids = self.kids(node);
1806 let head = kids.next().unwrap_or(NONE);
1807 let mut expr = self.expr(head)?;
1808 for test in kids {
1809 let inner = self.first(test);
1810 let negated = self.text(inner).to_ascii_uppercase().contains("NOT");
1811 let op = match self.name(inner) {
1812 "NotNull" => UnaryOp::IsNotNull,
1813 "IsNull" => UnaryOp::IsNull,
1814 "IsLiteral" => match self.name(self.first(self.first(inner))) {
1817 "NullLiteral" if negated => UnaryOp::IsNotNull,
1818 "NullLiteral" => UnaryOp::IsNull,
1819 "TrueLiteral" if negated => UnaryOp::IsNotTrue,
1820 "TrueLiteral" => UnaryOp::IsTrue,
1821 "FalseLiteral" if negated => UnaryOp::IsNotFalse,
1822 "FalseLiteral" => UnaryOp::IsFalse,
1823 "UnknownLiteral" if negated => UnaryOp::IsNotUnknown,
1824 "UnknownLiteral" => UnaryOp::IsUnknown,
1825 _ => return self.unsupported(inner),
1826 },
1827 _ => return self.unsupported(inner),
1828 };
1829 expr = self.push(Expr::Unary { op, operand: expr });
1830 }
1831 Ok(expr)
1832 }
1833
1834 fn between_in_like(&mut self, node: u32) -> Result<ExprRef> {
1836 let operand = self.expr(self.first(node))?;
1837 let op = self.nth(node, 1);
1840 let negated = self.text(op).to_ascii_uppercase().starts_with("NOT");
1841 let inner = self.first(self.first(op));
1842 match self.name(inner) {
1843 "BetweenClause" => {
1845 let low = self.expr(self.first(inner))?;
1846 let high = self.expr(self.nth(inner, 1))?;
1847 Ok(self.push(Expr::Between { operand, low, high, negated }))
1848 }
1849 "InClause" => {
1851 let expression = self.first(self.first(inner));
1852 match self.name(expression) {
1853 "InExpressionList" => {
1854 let mut items = Vec::new();
1855 for kid in self.kids(expression) {
1856 items.push(self.expr(kid)?);
1857 }
1858 let list = self.expr_slice(items);
1859 Ok(self.push(Expr::In { operand, list, negated }))
1860 }
1861 "InSelectStatement" => {
1862 let query = self.query(self.first(expression))?;
1863 Ok(self.push(Expr::InSubquery { operand, query, negated }))
1864 }
1865 _ => self.unsupported(expression),
1866 }
1867 }
1868 "LikeClause" => {
1870 if self.find(inner, "EscapeClause") != NONE {
1871 return self.unsupported(inner);
1872 }
1873 let variation = self.name(self.first(self.first(inner)));
1874 let op = match (variation, negated) {
1875 ("LikeToken", false) | ("NotLikeOp", true) => BinaryOp::Like,
1876 ("LikeToken", true) | ("NotLikeOp", false) => BinaryOp::NotLike,
1877 ("ILikeToken", false) | ("NotILikeOp", true) => BinaryOp::ILike,
1878 ("ILikeToken", true) | ("NotILikeOp", false) => BinaryOp::NotILike,
1879 ("GlobToken", _) => BinaryOp::Glob,
1882 ("RegexMatchToken", _) => BinaryOp::Regex,
1883 ("SimilarToToken", false) => BinaryOp::SimilarTo,
1884 ("SimilarToToken", true) => BinaryOp::NotSimilarTo,
1885 ("NotSimilarToOp", false) => BinaryOp::NotRegex,
1886 ("NotSimilarToOp", true) => BinaryOp::Regex,
1887 ("RegexInsensitiveMatchToken", false)
1888 | ("NotRegexInsensitiveMatchOp", true) => BinaryOp::RegexInsensitive,
1889 ("RegexInsensitiveMatchToken", true)
1890 | ("NotRegexInsensitiveMatchOp", false) => BinaryOp::NotRegexInsensitive,
1891 _ => return self.unsupported(inner),
1892 };
1893 let right = self.expr(self.nth(inner, 1))?;
1894 let expr = self.push(Expr::Binary { op, left: operand, right });
1895 if negated && matches!(op, BinaryOp::Glob | BinaryOp::Regex) {
1898 return Ok(self.push(Expr::Unary { op: UnaryOp::Not, operand: expr }));
1899 }
1900 Ok(expr)
1901 }
1902 _ => self.unsupported(inner),
1903 }
1904 }
1905
1906 fn prefix(&mut self, node: u32) -> Result<ExprRef> {
1908 let kids: Vec<u32> = self.kids(node).collect();
1909 let mut expr = self.expr(kids[kids.len() - 1])?;
1910 for &operator in kids[..kids.len() - 1].iter().rev() {
1911 let op = match self.name(self.first(operator)) {
1912 "MinusPrefixOperator" => UnaryOp::Negate,
1913 "PlusPrefixOperator" => UnaryOp::Plus,
1914 "TildePrefixOperator" => UnaryOp::BitNot,
1915 _ => return self.unsupported(operator),
1916 };
1917 expr = self.push(Expr::Unary { op, operand: expr });
1918 }
1919 Ok(expr)
1920 }
1921
1922 fn indirection(&mut self, node: u32) -> Result<ExprRef> {
1924 let mut expr = self.expr(self.first(node))?;
1925 for step in self.kids(self.nth(node, 1)) {
1926 let inner = self.first(step);
1927 expr = match self.name(inner) {
1928 "CastOperator" => {
1930 let text = self.text(self.first(inner)).to_string();
1931 let ty = self.intern(&text);
1932 self.push(Expr::Cast { operand: expr, ty, try_cast: false })
1933 }
1934 "DotOperator" => {
1935 let dot = self.first(inner);
1936 match self.name(dot) {
1937 "DotColumnOperator" => {
1942 let field = self.identifier(self.first(dot));
1943 let text = self.ast.string(field).to_string();
1944 let literal = self.intern(&text);
1945 let key = self
1946 .push(Expr::Literal { kind: LiteralKind::String, text: literal });
1947 let name = self.function_name("struct_extract");
1948 let args = self.expr_slice(vec![expr, key]);
1949 self.push(Expr::Function { name, args, distinct: false })
1950 }
1951 "DotMethodOperator" => {
1953 let method = self.first(dot);
1954 let text = self.text(self.first(method)).to_string();
1955 let text = unquote(&text);
1956 let name = self.function_name(&text);
1957 let mut args = vec![expr];
1958 let list = self.find(method, "MethodExpressionArguments");
1959 if list != NONE {
1960 let inner = self.first(list);
1961 let arguments = self.find(inner, "MethodFunctionArguments");
1962 if arguments != NONE {
1963 for kid in self.kids(arguments) {
1964 args.push(self.argument(kid)?);
1965 }
1966 }
1967 }
1968 let args = self.expr_slice(args);
1969 self.push(Expr::Function { name, args, distinct: false })
1970 }
1971 _ => return self.unsupported(dot),
1972 }
1973 }
1974 "SliceExpression" => self.subscript(inner, expr)?,
1979 "PostfixOperator" => {
1981 self.push(Expr::Unary { op: UnaryOp::Factorial, operand: expr })
1982 }
1983 _ => return self.unsupported(inner),
1984 };
1985 }
1986 Ok(expr)
1987 }
1988
1989 fn subscript(&mut self, node: u32, target: ExprRef) -> Result<ExprRef> {
2008 let bound = self.first(node);
2009 let (mut begin, mut end, mut step) = (NONE, NONE, NONE);
2010 for kid in self.kids(bound) {
2011 match self.name(kid) {
2012 "EndSliceBound" => end = kid,
2013 "StepSliceBound" => step = kid,
2014 _ => begin = kid,
2015 }
2016 }
2017 if end == NONE && step == NONE {
2018 if begin == NONE {
2019 return Err(Error::parser("Empty subscript '[]' is not allowed"));
2020 }
2021 let index = self.expr(begin)?;
2022 let name = self.function_name("array_extract");
2023 let args = self.expr_slice(vec![target, index]);
2024 return Ok(self.push(Expr::Function { name, args, distinct: false }));
2025 }
2026 let first = if begin == NONE { self.literal_number("1") } else { self.expr(begin)? };
2027 let value = if end == NONE { NONE } else { self.find(end, "EndSliceValue") };
2030 let written = if value == NONE { NONE } else { self.first(value) };
2031 let last = if written == NONE || self.name(written) == "EndSliceMinus" {
2032 self.literal_number("-1")
2033 } else {
2034 self.expr(written)?
2035 };
2036 let mut args = vec![target, first, last];
2037 if step != NONE {
2038 let by = self.first(step);
2039 args.push(if by == NONE {
2040 self.push(Expr::List { items: Slice::default() })
2041 } else {
2042 self.expr(by)?
2043 });
2044 }
2045 let name = self.function_name("array_slice");
2046 let args = self.expr_slice(args);
2047 Ok(self.push(Expr::Function { name, args, distinct: false }))
2048 }
2049
2050 fn literal_number(&mut self, digits: &str) -> ExprRef {
2052 let text = self.intern(digits);
2053 self.push(Expr::Literal { kind: LiteralKind::Number, text })
2054 }
2055
2056 fn function_name(&mut self, name: &str) -> Slice {
2058 let interned = self.intern(name);
2059 self.part_slice(vec![interned])
2060 }
2061
2062 fn star(&mut self, node: u32) -> Result<ExprRef> {
2064 for name in ["ExcludeList", "RenameList"] {
2065 let list = self.find(node, name);
2066 if list != NONE {
2067 return self.unsupported(list);
2068 }
2069 }
2070 let replace = self.find(node, "ReplaceList");
2071 let replacements =
2072 if replace == NONE { Slice::default() } else { self.replacements(replace)? };
2073 let qualifier = self.find(node, "StarQualifierList");
2074 let qualifier =
2075 if qualifier == NONE { Slice::default() } else { self.name_parts(qualifier) };
2076 Ok(self.push(Expr::Star { qualifier, replacements }))
2077 }
2078
2079 fn replacements(&mut self, node: u32) -> Result<Slice> {
2086 let entries = self.first(self.first(node));
2089 let listed: Vec<u32> =
2090 self.kids(entries).filter(|&kid| self.name(kid) == "ReplaceEntry").collect();
2091 let mut replacements = Vec::with_capacity(listed.len());
2092 for entry in listed {
2093 let expr = self.expr(self.first(entry))?;
2094 let alias = self.identifier(self.nth(entry, 1));
2095 let written = self.ast.string(alias).to_string();
2096 if replacements
2097 .iter()
2098 .any(|held: &Target| self.ast.string(held.alias).eq_ignore_ascii_case(&written))
2099 {
2100 return Err(Error::parser(format!(
2101 "Duplicate entry \"{written}\" in REPLACE list"
2102 )));
2103 }
2104 replacements.push(Target { expr, alias });
2105 }
2106 Ok(self.target_slice(replacements))
2107 }
2108
2109 fn function(&mut self, node: u32) -> Result<ExprRef> {
2112 for name in ["WithinGroupClause", "FilterClause", "ExportClause", "OverClause"] {
2113 let clause = self.find(node, name);
2114 if clause != NONE {
2115 return self.unsupported(clause);
2116 }
2117 }
2118 let name = self.name_parts(self.first(node));
2119 let list = self.first(self.nth(node, 1));
2123 for name in ["OrderByClause", "IgnoreOrRespectNulls"] {
2124 let clause = self.find(list, name);
2125 if clause != NONE {
2126 return self.unsupported(clause);
2127 }
2128 }
2129 let distinct = self.quantifier(self.find(list, "DistinctOrAll")) == Quantifier::Distinct;
2130 let mut args = Vec::new();
2131 let arguments = self.find(list, "FunctionArgumentList");
2132 if arguments != NONE {
2133 for kid in self.kids(arguments) {
2134 args.push(self.argument(kid)?);
2135 }
2136 }
2137 if self.ast.name(name).last().is_some_and(|part| part.eq_ignore_ascii_case("ifnull")) {
2143 if args.len() != 2 {
2144 return Err(Error::parser("Wrong number of arguments to IFNULL."));
2145 }
2146 let args = self.expr_slice(args);
2147 let name = self.function_name("coalesce");
2148 return Ok(self.push(Expr::Function { name, args, distinct }));
2149 }
2150 let args = self.expr_slice(args);
2151 Ok(self.push(Expr::Function { name, args, distinct }))
2152 }
2153
2154 fn coalesce(&mut self, node: u32) -> Result<ExprRef> {
2165 let mut args = Vec::new();
2166 for kid in self.kids(node) {
2167 args.push(self.expr(kid)?);
2168 }
2169 let args = self.expr_slice(args);
2170 let name = self.function_name("coalesce");
2171 Ok(self.push(Expr::Function { name, args, distinct: false }))
2172 }
2173
2174 fn null_if(&mut self, node: u32) -> Result<ExprRef> {
2184 let arguments = self.find(node, "NullIfArguments");
2185 if arguments == NONE {
2186 return self.unsupported(node);
2187 }
2188 let mut args = Vec::new();
2189 for kid in self.kids(arguments) {
2190 args.push(self.expr(kid)?);
2191 }
2192 let args = self.expr_slice(args);
2193 let name = self.function_name("nullif");
2194 Ok(self.push(Expr::Function { name, args, distinct: false }))
2195 }
2196
2197 fn substring(&mut self, node: u32) -> Result<ExprRef> {
2206 let shape = self.first(self.first(node));
2207 let mut args = Vec::new();
2208 match self.name(shape) {
2209 "SubstringExpressionList" => {
2210 for kid in self.kids(shape) {
2211 args.push(self.expr(kid)?);
2212 }
2213 }
2214 "SubstringParameters" => {
2215 args.push(self.expr(self.first(shape))?);
2216 let bounds = self.first(self.nth(shape, 1));
2220 let from = self.find(bounds, "FromExpression");
2221 let start =
2222 if from == NONE { self.number("1") } else { self.expr(self.first(from))? };
2223 args.push(start);
2224 let count = self.find(bounds, "ForExpression");
2225 if count != NONE {
2226 args.push(self.expr(self.first(count))?);
2227 }
2228 }
2229 _ => return self.unsupported(shape),
2230 }
2231 let args = self.expr_slice(args);
2232 let name = self.function_name("substring");
2233 Ok(self.push(Expr::Function { name, args, distinct: false }))
2234 }
2235
2236 fn position(&mut self, node: u32) -> Result<ExprRef> {
2243 let arguments = self.first(node);
2244 if self.count(arguments) != 2 {
2245 return self.unsupported(arguments);
2246 }
2247 let needle = self.expr(self.first(arguments))?;
2248 let haystack = self.expr(self.nth(arguments, 1))?;
2249 let args = self.expr_slice(vec![haystack, needle]);
2250 let name = self.function_name("position");
2251 Ok(self.push(Expr::Function { name, args, distinct: false }))
2252 }
2253
2254 fn trim(&mut self, node: u32) -> Result<ExprRef> {
2263 let arguments = self.first(node);
2264 let direction = self.find(arguments, "TrimDirection");
2265 let name = match direction {
2266 NONE => "trim",
2267 held => match self.name(self.first(held)) {
2268 "TrimLeading" => "ltrim",
2269 "TrimTrailing" => "rtrim",
2270 _ => "trim",
2271 },
2272 };
2273 let mut args = Vec::new();
2274 for kid in self.kids(arguments) {
2275 if matches!(self.name(kid), "TrimDirection" | "TrimSource") {
2276 continue;
2277 }
2278 args.push(self.expr(kid)?);
2279 }
2280 let source = self.find(arguments, "TrimSource");
2283 if source != NONE && self.count(source) == 1 {
2284 args.push(self.expr(self.first(source))?);
2285 }
2286 let args = self.expr_slice(args);
2287 let name = self.function_name(name);
2288 Ok(self.push(Expr::Function { name, args, distinct: false }))
2289 }
2290
2291 fn overlay(&mut self, node: u32) -> Result<ExprRef> {
2299 let shape = self.first(self.first(node));
2300 if !matches!(self.name(shape), "OverlayParameters" | "OverlayExpressionList") {
2301 return self.unsupported(shape);
2302 }
2303 let mut args = Vec::new();
2304 for kid in self.kids(shape) {
2305 let kid = match self.name(kid) {
2306 "FromExpression" | "ForExpression" => self.first(kid),
2307 _ => kid,
2308 };
2309 args.push(self.expr(kid)?);
2310 }
2311 let args = self.expr_slice(args);
2312 let name = self.function_name("overlay");
2313 Ok(self.push(Expr::Function { name, args, distinct: false }))
2314 }
2315
2316 fn number(&mut self, text: &str) -> ExprRef {
2318 let text = self.intern(text);
2319 self.push(Expr::Literal { kind: LiteralKind::Number, text })
2320 }
2321
2322 fn extract(&mut self, node: u32) -> Result<ExprRef> {
2331 let arguments = self.find(node, "ExtractArguments");
2332 if arguments == NONE {
2333 return self.unsupported(node);
2334 }
2335 let argument = self.first(self.first(arguments));
2336 let part = match self.name(argument) {
2337 "ExtractStringArgument" => self.string_value(argument)?,
2338 "ExtractDatePartArgument" => date_part(self.text(argument)),
2343 "ExtractIdentifierArgument" => self.text(argument).to_string(),
2346 _ => return self.unsupported(argument),
2347 };
2348 let text = self.intern(&part);
2349 let part = self.push(Expr::Literal { kind: LiteralKind::String, text });
2350 let operand = self.expr(self.nth(arguments, 1))?;
2351 let name = self.function_name("date_part");
2352 let args = self.expr_slice(vec![part, operand]);
2353 Ok(self.push(Expr::Function { name, args, distinct: false }))
2354 }
2355
2356 fn argument(&mut self, node: u32) -> Result<ExprRef> {
2358 let inner = self.first(node);
2359 match self.name(inner) {
2360 "PositionalFunctionArgument" => self.expr(self.first(inner)),
2361 _ => self.unsupported(inner),
2362 }
2363 }
2364
2365 fn table_argument(&mut self, node: u32) -> Result<Target> {
2380 let inner = self.first(node);
2381 if self.name(inner) == "NamedFunctionArgument" {
2382 let named = self.first(inner);
2383 if self.count(named) != 3 {
2384 return self.unsupported(named);
2387 }
2388 let alias = self.identifier(self.first(named));
2389 let expr = self.expr(self.nth(named, 2))?;
2390 return Ok(Target { expr, alias });
2391 }
2392 let expr = self.expr(self.first(inner))?;
2393 if let Expr::Binary { op: BinaryOp::Eq, left, right } = self.ast.expr(expr) {
2394 if let Expr::Column { name } = self.ast.expr(left) {
2395 if name.len == 1 {
2396 let alias = self.ast.parts[name.start as usize];
2397 return Ok(Target { expr: right, alias });
2398 }
2399 }
2400 }
2401 Ok(Target { expr, alias: NONE })
2402 }
2403
2404 fn cast(&mut self, node: u32) -> Result<ExprRef> {
2406 let try_cast = self.name(self.first(self.first(node))) == "TryCastKeyword";
2407 let arguments = self.nth(node, 1);
2409 let operand = self.expr(self.first(arguments))?;
2410 let text = self.text(self.nth(arguments, 1)).to_string();
2411 let ty = self.intern(&text);
2412 Ok(self.push(Expr::Cast { operand, ty, try_cast }))
2413 }
2414
2415 fn typed_literal(&mut self, node: u32) -> Result<ExprRef> {
2425 let text = self.text(self.first(node)).to_string();
2426 let ty = self.intern(&text);
2427 let operand = self.expr(self.nth(node, 1))?;
2428 Ok(self.push(Expr::Cast { operand, ty, try_cast: false }))
2429 }
2430
2431 fn interval_literal(&mut self, node: u32) -> Result<ExprRef> {
2449 let parameter = self.find(node, "IntervalParameter");
2450 if parameter == NONE {
2451 return self.unsupported(node);
2452 }
2453 let operand = self.expr(self.first(parameter))?;
2454 let unit = self.find(node, "Interval");
2455 if unit == NONE {
2456 let ty = self.intern("INTERVAL");
2457 return Ok(self.push(Expr::Cast { operand, ty, try_cast: false }));
2458 }
2459 let spelling = self.name(self.first(unit));
2460 if spelling == "IntervalToInterval" {
2464 let pair = self.name(self.first(self.first(unit)));
2465 return Err(Error::parser(format!("{} is not supported", worded(pair))));
2466 }
2467 let Some(&(_, function, width)) = UNITS.iter().find(|(rule, _, _)| *rule == spelling)
2468 else {
2469 return self.unsupported(unit);
2470 };
2471 let double = self.intern("DOUBLE");
2472 let mut count = self.push(Expr::Cast { operand, ty: double, try_cast: false });
2473 if let Some(width) = width {
2474 let name = self.function_name("trunc");
2475 let args = self.expr_slice(vec![count]);
2476 let whole = self.push(Expr::Function { name, args, distinct: false });
2477 let ty = self.intern(width);
2478 count = self.push(Expr::Cast { operand: whole, ty, try_cast: false });
2479 }
2480 let name = self.function_name(function);
2481 let args = self.expr_slice(vec![count]);
2482 Ok(self.push(Expr::Function { name, args, distinct: false }))
2483 }
2484
2485 fn case(&mut self, node: u32) -> Result<ExprRef> {
2487 let mut operand = NONE;
2488 let mut arms = Vec::new();
2489 let mut otherwise = NONE;
2490 for kid in self.kids(node) {
2491 match self.name(kid) {
2492 "CaseWhenThen" => {
2494 let when = self.expr(self.first(kid))?;
2495 let then = self.expr(self.nth(kid, 1))?;
2496 arms.push(CaseArm { when, then });
2497 }
2498 "CaseElse" => otherwise = self.expr(self.first(kid))?,
2500 _ => operand = self.expr(kid)?,
2502 }
2503 }
2504 let start = self.ast.case_arms.len() as u32;
2505 self.ast.case_arms.extend(arms);
2506 let arms = Slice { start, len: self.ast.case_arms.len() as u32 - start };
2507 Ok(self.push(Expr::Case { operand, arms, otherwise }))
2508 }
2509
2510 fn row(&mut self, node: u32) -> Result<ExprRef> {
2515 let mut items = Vec::new();
2516 for kid in self.kids(node) {
2517 items.push(self.expr(kid)?);
2518 }
2519 if items.len() == 1 {
2520 return Ok(items[0]);
2521 }
2522 let items = self.expr_slice(items);
2523 Ok(self.push(Expr::Row { items }))
2524 }
2525
2526 fn parameter(&mut self, node: u32) -> Result<ExprRef> {
2533 let written = self.text(node).trim();
2534 let written = written.trim_start_matches(['?', '$']).trim();
2535 let name = if written.is_empty() {
2536 self.anonymous += 1;
2537 self.anonymous.to_string()
2538 } else {
2539 written.to_string()
2540 };
2541 let name = self.intern(&name);
2542 Ok(self.push(Expr::Parameter { name }))
2543 }
2544
2545 fn list(&mut self, node: u32) -> Result<ExprRef> {
2550 let mut items = Vec::new();
2551 for kid in self.kids(node) {
2552 items.push(self.expr(kid)?);
2553 }
2554 let items = self.expr_slice(items);
2555 Ok(self.push(Expr::List { items }))
2556 }
2557
2558 fn subquery(&mut self, node: u32) -> Result<ExprRef> {
2560 let negated = self.find(node, "SubqueryNot") != NONE;
2561 let exists = self.find(node, "SubqueryExists") != NONE;
2562 let reference = self.find(node, "SubqueryReference");
2563 let query = self.query(self.first(reference))?;
2564 Ok(if exists {
2565 self.push(Expr::Exists { query, negated })
2566 } else if negated {
2567 return self.unsupported(node);
2568 } else {
2569 self.push(Expr::Subquery { query })
2570 })
2571 }
2572
2573 fn string_value(&self, node: u32) -> Result<String> {
2579 let span = self.tree.node(node);
2580 let mut value = String::new();
2581 for token in &self.tokens[span.start as usize..span.end as usize] {
2582 if token.kind == Kind::String {
2583 value.push_str(&string_token(token.text(self.query))?);
2584 }
2585 }
2586 Ok(value)
2587 }
2588
2589 fn first_string(&self, node: u32) -> &'a str {
2595 let span = self.tree.node(node);
2596 self.tokens[span.start as usize..span.end as usize]
2597 .iter()
2598 .find(|token| token.kind == Kind::String)
2599 .map_or("", |token| token.text(self.query))
2600 }
2601
2602 fn string_literal(&mut self, node: u32) -> Result<ExprRef> {
2611 let token = self.first_string(node);
2612 let prefix = match token.as_bytes() {
2613 [prefix, b'\'', ..] => *prefix,
2614 _ => 0,
2615 };
2616 if matches!(prefix, b'X' | b'x') {
2617 if let Some(body) = token.get(1..).and_then(quoted_body) {
2618 let text = blob_text(body.as_bytes())?;
2619 let text = self.intern(&text);
2620 return Ok(self.push(Expr::Literal { kind: LiteralKind::Blob, text }));
2621 }
2622 }
2623 let value = self.string_value(node)?;
2624 let text = self.intern(&value);
2625 let literal = self.push(Expr::Literal { kind: LiteralKind::String, text });
2626 if matches!(prefix, b'N' | b'n') {
2627 let ty = self.intern("VARCHAR");
2628 return Ok(self.push(Expr::Cast { operand: literal, ty, try_cast: false }));
2629 }
2630 Ok(literal)
2631 }
2632}
2633
2634const UNITS: &[(&str, &str, Option<&str>)] = &[
2642 ("YearKeyword", "to_years", Some("INTEGER")),
2643 ("MonthKeyword", "to_months", Some("INTEGER")),
2644 ("QuarterKeyword", "to_quarters", Some("INTEGER")),
2645 ("DecadeKeyword", "to_decades", Some("INTEGER")),
2646 ("CenturyKeyword", "to_centuries", Some("INTEGER")),
2647 ("MillenniumKeyword", "to_millennia", Some("INTEGER")),
2648 ("DayKeyword", "to_days", Some("INTEGER")),
2649 ("WeekKeyword", "to_weeks", Some("INTEGER")),
2650 ("HourKeyword", "to_hours", Some("BIGINT")),
2651 ("MinuteKeyword", "to_minutes", Some("BIGINT")),
2652 ("MicrosecondKeyword", "to_microseconds", Some("BIGINT")),
2653 ("SecondKeyword", "to_seconds", None),
2654 ("MillisecondKeyword", "to_milliseconds", None),
2655];
2656
2657fn date_part(written: &str) -> String {
2668 const PARTS: &[(&str, &str)] = &[
2669 ("YEAR", "YEAR"),
2670 ("YEARS", "YEAR"),
2671 ("MONTH", "MONTH"),
2672 ("MONTHS", "MONTH"),
2673 ("DAY", "DAY"),
2674 ("DAYS", "DAY"),
2675 ("HOUR", "HOUR"),
2676 ("HOURS", "HOUR"),
2677 ("MINUTE", "MINUTE"),
2678 ("MINUTES", "MINUTE"),
2679 ("SECOND", "SECOND"),
2680 ("SECONDS", "SECOND"),
2681 ("MILLISECOND", "MILLISECONDS"),
2682 ("MILLISECONDS", "MILLISECONDS"),
2683 ("MICROSECOND", "MICROSECONDS"),
2684 ("MICROSECONDS", "MICROSECONDS"),
2685 ("WEEK", "WEEK"),
2686 ("WEEKS", "WEEK"),
2687 ("QUARTER", "QUARTER"),
2688 ("QUARTERS", "QUARTER"),
2689 ("DECADE", "DECADE"),
2690 ("DECADES", "DECADE"),
2691 ("CENTURY", "CENTURY"),
2692 ("CENTURIES", "CENTURY"),
2693 ("MILLENNIUM", "MILLENNIUM"),
2694 ("MILLENNIA", "MILLENNIUM"),
2695 ];
2696 PARTS
2697 .iter()
2698 .find(|(spelling, _)| spelling.eq_ignore_ascii_case(written))
2699 .map_or_else(|| written.to_string(), |(_, name)| (*name).to_string())
2700}
2701
2702fn worded(rule: &str) -> String {
2704 let mut out = String::new();
2705 for character in rule.chars() {
2706 if character.is_ascii_uppercase() && !out.is_empty() {
2707 out.push(' ');
2708 }
2709 out.push(character.to_ascii_uppercase());
2710 }
2711 out
2712}
2713
2714fn string_token(text: &str) -> Result<String> {
2721 if let Some(body) = dollar_body(text) {
2722 return Ok(body.to_string());
2723 }
2724 if let Some(body) = quoted_body(text) {
2725 return Ok(body.replace("''", "'"));
2726 }
2727 let Some(body) = text.get(1..).and_then(quoted_body) else {
2728 return Ok(text.to_string());
2729 };
2730 match text.as_bytes()[0] {
2731 b'E' | b'e' => escaped(body),
2732 b'N' | b'n' => Ok(body.replace("''", "'")),
2734 b'B' | b'b' => Ok(format!("b{}", body.replace("''", "'"))),
2738 _ => Err(Error::not_implemented(format!("the string literal {text} is not supported yet"))),
2741 }
2742}
2743
2744fn blob_text(body: &[u8]) -> Result<String> {
2756 if body.len() % 2 != 0 {
2757 return Err(Error::parser("Hex string literal must have an even number of hex digits"));
2758 }
2759 let digit = |byte: u8| (byte as char).to_digit(16).map(|digit| digit as u8);
2760 let bytes: Option<Vec<u8>> =
2761 body.chunks(2).map(|pair| Some(digit(pair[0])? * 16 + digit(pair[1])?)).collect();
2762 match bytes {
2763 Some(bytes) => Ok(Value::Blob(bytes).to_string()),
2764 None => {
2765 Ok(body.chunks(2).map(|pair| format!("\\x{}", String::from_utf8_lossy(pair))).collect())
2766 }
2767 }
2768}
2769
2770fn quoted_body(text: &str) -> Option<&str> {
2775 text.strip_prefix('\'').filter(|rest| !rest.is_empty()).and_then(|rest| rest.strip_suffix('\''))
2776}
2777
2778fn escaped(body: &str) -> Result<String> {
2791 let bytes = body.as_bytes();
2792 let mut out = Vec::with_capacity(bytes.len());
2793 let mut at = 0;
2794 while at < bytes.len() {
2795 let byte = bytes[at];
2796 at += 1;
2797 if byte == b'\'' && bytes.get(at) == Some(&b'\'') {
2798 out.push(b'\'');
2799 at += 1;
2800 continue;
2801 }
2802 if byte != b'\\' || at == bytes.len() {
2803 out.push(byte);
2804 continue;
2805 }
2806 let escape = bytes[at];
2807 at += 1;
2808 match escape {
2809 b'n' => out.push(b'\n'),
2810 b't' => out.push(b'\t'),
2811 b'r' => out.push(b'\r'),
2812 b'b' => out.push(0x08),
2813 b'f' => out.push(0x0c),
2814 b'x' => match digits(bytes, &mut at, 16, 2) {
2815 Some(value) => out.push(value as u8),
2816 None => out.push(b'x'),
2817 },
2818 b'0'..=b'7' => {
2819 at -= 1;
2820 let value = digits(bytes, &mut at, 8, 3).unwrap_or(0);
2821 out.push(value as u8);
2822 }
2823 b'u' => match four_hex(bytes, at).and_then(char::from_u32).filter(|c| *c != '\0') {
2824 Some(c) => {
2825 at += 4;
2826 out.extend_from_slice(c.encode_utf8(&mut [0; 4]).as_bytes());
2827 }
2828 None => out.push(b'u'),
2829 },
2830 other => out.push(other),
2831 }
2832 }
2833 if out.contains(&0) {
2834 return Err(Error::parser("Null character not permitted in escape string literal"));
2835 }
2836 String::from_utf8(out).map_err(|error| {
2837 Error::parser(format!(
2838 "Invalid UTF-8 in escape string literal at byte offset {}: byte mismatch",
2839 error.utf8_error().valid_up_to()
2840 ))
2841 })
2842}
2843
2844fn digits(bytes: &[u8], at: &mut usize, radix: u32, most: usize) -> Option<u32> {
2849 let mut value = None;
2850 for _ in 0..most {
2851 let Some(digit) = bytes.get(*at).and_then(|byte| (*byte as char).to_digit(radix)) else {
2852 break;
2853 };
2854 value = Some(value.unwrap_or(0) * radix + digit);
2855 *at += 1;
2856 }
2857 value
2858}
2859
2860fn four_hex(bytes: &[u8], at: usize) -> Option<u32> {
2866 let digits = bytes.get(at..at + 4)?;
2867 if !digits.iter().all(u8::is_ascii_hexdigit) {
2868 return None;
2869 }
2870 u32::from_str_radix(std::str::from_utf8(digits).ok()?, 16).ok()
2871}
2872
2873fn dollar_body(text: &str) -> Option<&str> {
2882 let rest = text.strip_prefix('$')?;
2883 let close = rest.find('$')?;
2884 let (tag, body) = (&rest[..close], &rest[close + 1..]);
2885 body.strip_suffix(&format!("${tag}$"))
2886}
2887
2888fn unquote(text: &str) -> String {
2898 if let Some(body) = text.strip_prefix('"').and_then(|rest| rest.strip_suffix('"')) {
2899 return body.replace("\"\"", "\"");
2900 }
2901 match text.strip_prefix('\'').and_then(|rest| rest.strip_suffix('\'')) {
2902 Some(body) => body.replace("''", "'"),
2903 None => text.to_string(),
2904 }
2905}
2906
2907#[cfg(test)]
2908mod tests {
2909 use super::*;
2910 use crate::corpus::CORPUS;
2911 use crate::matcher::parse;
2912
2913 fn show(ast: &Ast, expr: ExprRef) -> String {
2921 if expr == NONE {
2922 return "-".to_string();
2923 }
2924 let list = |slice: Slice| {
2925 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
2926 };
2927 match ast.expr(expr) {
2928 Expr::Star { qualifier, replacements } => {
2929 let star = if qualifier.is_empty() {
2930 "*".to_string()
2931 } else {
2932 format!("{}.*", ast.name_text(qualifier))
2933 };
2934 if replacements.is_empty() {
2935 return star;
2936 }
2937 let entries: Vec<String> = ast
2938 .target_list(replacements)
2939 .iter()
2940 .map(|target| {
2941 format!("{} AS {}", show(ast, target.expr), ast.string(target.alias))
2942 })
2943 .collect();
2944 format!("{star} REPLACE ({})", entries.join(", "))
2945 }
2946 Expr::Column { name } => ast.name_text(name),
2947 Expr::Literal { kind, text } => match kind {
2948 LiteralKind::Number => ast.string(text).to_string(),
2949 LiteralKind::String => format!("'{}'", ast.string(text)),
2950 LiteralKind::Blob => format!("'{}'::BLOB", ast.string(text)),
2951 other => format!("{other:?}").to_uppercase(),
2952 },
2953 Expr::Unary { op, operand } => format!("({op:?} {})", show(ast, operand)),
2954 Expr::Binary { op, left, right } => {
2955 let op = match op {
2956 BinaryOp::Named(name) => ast.string(name).to_string(),
2957 other => format!("{other:?}"),
2958 };
2959 format!("({} {op} {})", show(ast, left), show(ast, right))
2960 }
2961 Expr::Function { name, args, distinct } => {
2962 let distinct = if distinct { "DISTINCT " } else { "" };
2963 format!("{}({distinct}{})", ast.name_text(name), list(args))
2964 }
2965 Expr::Cast { operand, ty, try_cast } => {
2966 let word = if try_cast { "TRY_CAST" } else { "CAST" };
2967 format!("{word}({} AS {})", show(ast, operand), ast.string(ty))
2968 }
2969 Expr::Case { operand, arms, otherwise } => {
2970 let arms = ast
2971 .arm_list(arms)
2972 .iter()
2973 .map(|arm| format!("WHEN {} THEN {}", show(ast, arm.when), show(ast, arm.then)))
2974 .collect::<Vec<_>>()
2975 .join(" ");
2976 format!("CASE {} {arms} ELSE {} END", show(ast, operand), show(ast, otherwise))
2977 }
2978 Expr::Between { operand, low, high, negated } => {
2979 let not = if negated { "NOT " } else { "" };
2980 format!(
2981 "({not}{} BETWEEN {} AND {})",
2982 show(ast, operand),
2983 show(ast, low),
2984 show(ast, high)
2985 )
2986 }
2987 Expr::In { operand, list: items, negated } => {
2988 let not = if negated { "NOT " } else { "" };
2989 format!("({not}{} IN [{}])", show(ast, operand), list(items))
2990 }
2991 Expr::List { items } => format!("[{}]", list(items)),
2992 Expr::Parameter { name } => format!("${}", ast.string(name)),
2993 Expr::Row { items } => format!("ROW({})", list(items)),
2994 Expr::Subquery { query } => format!("({})", show_query(ast, query)),
2995 Expr::Exists { query, negated } => {
2996 let exists = format!("EXISTS ({})", show_query(ast, query));
2997 if negated { format!("NOT {exists}") } else { exists }
2998 }
2999 Expr::InSubquery { operand, query, negated } => {
3000 let written = format!("{} IN ({})", show(ast, operand), show_query(ast, query));
3001 if negated { format!("NOT {written}") } else { written }
3002 }
3003 Expr::QuantifiedSubquery { operand, op, query, all } => {
3004 let quantifier = if all { "ALL" } else { "ANY" };
3005 format!("{} {op:?} {quantifier} ({})", show(ast, operand), show_query(ast, query))
3006 }
3007 }
3008 }
3009
3010 fn show_source(ast: &Ast, source: SourceRef) -> String {
3012 let alias = |alias: StrRef| match alias {
3013 NONE => String::new(),
3014 other => format!(" AS {}", ast.string(other)),
3015 };
3016 match ast.source(source) {
3017 Source::Table { name, alias: name_alias, .. } => {
3018 format!("{}{}", ast.name_text(name), alias(name_alias))
3019 }
3020 Source::Function { name, args, alias: call_alias, .. } => {
3021 let args = ast
3022 .target_list(args)
3023 .iter()
3024 .map(|item| match item.alias {
3025 NONE => show(ast, item.expr),
3026 named => format!("{} := {}", ast.string(named), show(ast, item.expr)),
3027 })
3028 .collect::<Vec<_>>()
3029 .join(", ");
3030 format!("{}({args}){}", ast.name_text(name), alias(call_alias))
3031 }
3032 Source::Subquery { query, alias: query_alias, .. } => {
3033 format!("({}){}", show_query(ast, query), alias(query_alias))
3034 }
3035 Source::Values { rows, alias: values_alias, .. } => {
3036 format!("{}{}", show_rows(ast, rows), alias(values_alias))
3037 }
3038 Source::Join { left, right, kind, natural, on, using } => {
3039 let natural = if natural { "NATURAL " } else { "" };
3040 let on = if on == NONE { String::new() } else { format!(" ON {}", show(ast, on)) };
3041 let using = if using.is_empty() {
3042 String::new()
3043 } else {
3044 format!(" USING ({})", ast.name_text(using))
3045 };
3046 format!(
3047 "({} {natural}{kind:?} JOIN {}{on}{using})",
3048 show_source(ast, left),
3049 show_source(ast, right)
3050 )
3051 }
3052 }
3053 }
3054
3055 fn show_rows(ast: &Ast, rows: Slice) -> String {
3057 let rows = ast
3058 .rows(rows)
3059 .iter()
3060 .map(|&row| {
3061 let items = ast
3062 .expr_list(row)
3063 .iter()
3064 .map(|&item| show(ast, item))
3065 .collect::<Vec<_>>()
3066 .join(", ");
3067 format!("({items})")
3068 })
3069 .collect::<Vec<_>>()
3070 .join(", ");
3071 format!("VALUES {rows}")
3072 }
3073
3074 fn show_query(ast: &Ast, index: QueryRef) -> String {
3076 let query = ast.query(index);
3077 let list = |slice: Slice| {
3078 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
3079 };
3080 let mut out = match query.body {
3081 QueryBody::SetOp { op, quantifier, by_name, left, right } => {
3082 let by_name = if by_name { " BY NAME" } else { "" };
3083 format!(
3084 "({} {op:?} {quantifier:?}{by_name} {})",
3085 show_query(ast, left),
3086 show_query(ast, right)
3087 )
3088 }
3089 QueryBody::Select(index) => {
3090 let select = ast.select(index);
3091 let distinct = match select.distinct {
3092 Distinct::No => String::new(),
3093 Distinct::Yes => " DISTINCT".to_string(),
3094 Distinct::On(on) => format!(" DISTINCT ON ({})", list(on)),
3095 };
3096 let targets = ast
3097 .target_list(select.targets)
3098 .iter()
3099 .map(|target| match target.alias {
3100 NONE => show(ast, target.expr),
3101 alias => format!("{} AS {}", show(ast, target.expr), ast.string(alias)),
3102 })
3103 .collect::<Vec<_>>()
3104 .join(", ");
3105 let mut out = format!("SELECT{distinct} {targets}");
3106 if !select.from.is_empty() {
3107 let from = ast
3108 .source_list(select.from)
3109 .iter()
3110 .map(|&source| show_source(ast, source))
3111 .collect::<Vec<_>>()
3112 .join(", ");
3113 out += &format!(" FROM {from}");
3114 }
3115 if select.filter != NONE {
3116 out += &format!(" WHERE {}", show(ast, select.filter));
3117 }
3118 if select.group_by_all {
3119 out += " GROUP BY ALL";
3120 } else if !select.group_by.is_empty() {
3121 out += &format!(" GROUP BY {}", list(select.group_by));
3122 }
3123 if select.having != NONE {
3124 out += &format!(" HAVING {}", show(ast, select.having));
3125 }
3126 out
3127 }
3128 QueryBody::Values(rows) => show_rows(ast, rows),
3129 QueryBody::Describe(inner) => format!("DESCRIBE {}", show_query(ast, inner)),
3130 QueryBody::Show { name, .. } => format!("SHOW {}", ast.name_text(name)),
3131 };
3132 if query.order_by_all {
3133 out += " ORDER BY ALL";
3134 } else if !query.order_by.is_empty() {
3135 let items = ast
3136 .order_list(query.order_by)
3137 .iter()
3138 .map(|item| format!("{} {:?} {:?}", show(ast, item.expr), item.order, item.nulls))
3139 .collect::<Vec<_>>()
3140 .join(", ");
3141 out += &format!(" ORDER BY {items}");
3142 }
3143 if query.limit != NONE {
3144 let percent = if query.limit_percent { "%" } else { "" };
3145 out += &format!(" LIMIT {}{percent}", show(ast, query.limit));
3146 }
3147 if query.offset != NONE {
3148 out += &format!(" OFFSET {}", show(ast, query.offset));
3149 }
3150 out
3151 }
3152
3153 fn round(query: &str) -> String {
3155 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
3156 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
3157 let Statement::Query(index) = ast.statements[0] else {
3158 panic!("{query} is not a query");
3159 };
3160 show_query(&ast, index)
3161 }
3162
3163 fn round_with_case(query: &str, case: IdentifierCase) -> String {
3164 let ast =
3165 parse_ast_with_case(query, case).unwrap_or_else(|error| panic!("{query}: {error}"));
3166 let Statement::Query(index) = ast.statements[0] else {
3167 panic!("{query} is not a query");
3168 };
3169 show_query(&ast, index)
3170 }
3171
3172 fn round_statement(query: &str) -> String {
3174 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
3175 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
3176 match ast.statements[0] {
3177 Statement::Query(index) => show_query(&ast, index),
3178 Statement::CreateTable(index) => {
3179 let create = ast.create_table(index);
3180 let mut out = "CREATE".to_string();
3181 if create.or_replace {
3182 out += " OR REPLACE";
3183 }
3184 if create.temporary {
3185 out += " TEMPORARY";
3186 }
3187 out += " TABLE";
3188 if create.if_not_exists {
3189 out += " IF NOT EXISTS";
3190 }
3191 out += &format!(" {}", ast.name_text(create.name));
3192 let columns = ast
3193 .column_defs(create.columns)
3194 .iter()
3195 .map(|def| {
3196 let ty = match def.ty {
3197 NONE => String::new(),
3198 other => format!(" {}", ast.string(other)),
3199 };
3200 let null = if def.not_null { " NOT NULL" } else { "" };
3201 format!("{}{ty}{null}", ast.string(def.name))
3202 })
3203 .collect::<Vec<_>>()
3204 .join(", ");
3205 if !columns.is_empty() || create.query == NONE {
3206 out += &format!(" ({columns})");
3207 }
3208 if create.query != NONE {
3209 out += &format!(" AS {}", show_query(&ast, create.query));
3210 }
3211 out
3212 }
3213 Statement::CreateView(index) => {
3214 let create = ast.create_view(index);
3215 let mut out = "CREATE".to_string();
3216 if create.or_replace {
3217 out += " OR REPLACE";
3218 }
3219 if create.temporary {
3220 out += " TEMPORARY";
3221 }
3222 out += " VIEW";
3223 if create.if_not_exists {
3224 out += " IF NOT EXISTS";
3225 }
3226 out += &format!(" {}", ast.name_text(create.name));
3227 if !create.columns.is_empty() {
3228 let columns = ast.name(create.columns).collect::<Vec<_>>().join(", ");
3229 out += &format!(" ({columns})");
3230 }
3231 out + &format!(" AS {}", show_query(&ast, create.query))
3232 }
3233 Statement::DropTable(index) => {
3234 let drop = ast.drop_table(index);
3235 let mut out = if drop.view { "DROP VIEW" } else { "DROP TABLE" }.to_string();
3236 if drop.if_exists {
3237 out += " IF EXISTS";
3238 }
3239 let names = ast
3240 .name_list(drop.names)
3241 .iter()
3242 .map(|&name| ast.name_text(name))
3243 .collect::<Vec<_>>()
3244 .join(", ");
3245 out + &format!(" {names}")
3246 }
3247 Statement::Insert(index) => {
3248 let insert = ast.insert(index);
3249 let mut out = format!("INSERT INTO {}", ast.name_text(insert.name));
3250 if !insert.columns.is_empty() {
3251 let columns = ast.name(insert.columns).collect::<Vec<_>>().join(", ");
3252 out += &format!(" ({columns})");
3253 }
3254 out + &format!(" {}", show_query(&ast, insert.source))
3255 }
3256 Statement::Set(index) => {
3257 let setting = ast.setting(index);
3258 let scope = match setting.scope.keyword() {
3259 "" => String::new(),
3260 word => format!(" {word}"),
3261 };
3262 format!("SET{scope} {} = {}", ast.string(setting.name), show(&ast, setting.value))
3263 }
3264 Statement::Reset(index) => {
3265 let setting = ast.setting(index);
3266 let scope = match setting.scope.keyword() {
3267 "" => String::new(),
3268 word => format!(" {word}"),
3269 };
3270 format!("RESET{scope} {}", ast.string(setting.name))
3271 }
3272 Statement::Checkpoint => "CHECKPOINT".to_string(),
3273 Statement::Explain { query, analyze } => {
3274 let analyze = if analyze { "ANALYZE " } else { "" };
3275 format!("EXPLAIN {analyze}{}", show_query(&ast, query))
3276 }
3277 }
3278 }
3279
3280 #[test]
3281 fn expressions_and_queries_keep_their_source_ranges() {
3282 let sql = "SELECT 1 + 22";
3283 let ast = parse_ast(sql).expect("the query parses");
3284 let Statement::Query(query) = ast.statements[0] else { panic!("a query") };
3285 assert_eq!(ast.query_span(query), Span::new(0, sql.len() as u32));
3286 let twenty_two = ast
3287 .exprs
3288 .iter()
3289 .enumerate()
3290 .find_map(|(at, expr)| match *expr {
3291 Expr::Literal { kind: LiteralKind::Number, text } if ast.string(text) == "22" => {
3292 Some(at as u32)
3293 }
3294 _ => None,
3295 })
3296 .expect("the literal is in the arena");
3297 assert_eq!(ast.expr_span(twenty_two), Span::new(11, 13));
3298 }
3299
3300 #[test]
3301 fn an_explain_keeps_the_query_it_was_asked_about() {
3302 assert_eq!(
3303 round_statement("EXPLAIN SELECT a FROM t WHERE a > 1"),
3304 "EXPLAIN SELECT a FROM t WHERE (a Gt 1)"
3305 );
3306 assert_eq!(round_statement("explain select 1"), "EXPLAIN SELECT 1");
3307 assert_eq!(round_statement("explain analyze select 1"), "EXPLAIN ANALYZE SELECT 1");
3308 }
3309
3310 #[test]
3311 fn the_parts_of_an_explain_that_are_not_the_query_are_refused_by_name() {
3312 for (query, named) in [
3315 ("EXPLAIN (FORMAT JSON) SELECT 1", "ExplainOptionList"),
3316 ("EXPLAIN INSERT INTO t VALUES (1)", "InsertStatement"),
3317 ("EXPLAIN CREATE TABLE u (a INTEGER)", "CreateStatement"),
3318 ] {
3319 let error = parse_ast(query).expect_err(query).to_string();
3320 assert!(error.contains(named), "{query}: {error}");
3321 }
3322 }
3323
3324 #[test]
3325 fn a_set_keeps_its_name_its_scope_and_its_value() {
3326 assert_eq!(round_statement("SET memory_limit = '1GB'"), "SET memory_limit = '1GB'");
3327 assert_eq!(round_statement("set threads=4"), "SET threads = 4");
3328 assert_eq!(round_statement("SET GLOBAL threads = 4"), "SET GLOBAL threads = 4");
3329 assert_eq!(round_statement("SET SESSION threads = 4"), "SET SESSION threads = 4");
3330 assert_eq!(round_statement("SET LOCAL threads = 4"), "SET LOCAL threads = 4");
3331 assert_eq!(round_statement("RESET memory_limit"), "RESET memory_limit");
3332 assert_eq!(round_statement("RESET GLOBAL memory_limit"), "RESET GLOBAL memory_limit");
3333 assert_eq!(
3334 round_statement("SET TIME ZONE 'Asia/Kathmandu'"),
3335 "SET TimeZone = 'Asia/Kathmandu'"
3336 );
3337 assert_eq!(round_statement("SET TIME ZONE UTC"), "SET TimeZone = 'UTC'");
3338 assert_eq!(round_statement("SET TIME ZONE DEFAULT"), "RESET TimeZone");
3339 assert_eq!(round_statement("SET TIME ZONE LOCAL"), "RESET TimeZone");
3340 }
3341
3342 #[test]
3343 fn the_two_other_things_the_word_set_starts_are_refused_rather_than_read_as_settings() {
3344 for statement in ["SET VARIABLE x = 1", "SET SCHEMA 'main'"] {
3348 let error = parse_ast(statement).expect_err(statement);
3349 assert_eq!(error.code().duckdb_name(), "Not implemented Error", "{statement}");
3350 }
3351 }
3352
3353 #[test]
3354 fn a_setting_written_with_a_list_of_values_is_refused_rather_than_taking_the_first() {
3355 let error = parse_ast("SET search_path = a, b").expect_err("a list of two");
3356 assert_eq!(error.code().duckdb_name(), "Not implemented Error");
3357 }
3358
3359 #[test]
3360 fn the_query_m0_has_to_run_transforms() {
3361 assert_eq!(round("SELECT * FROM t WHERE x > 5"), "SELECT * FROM t WHERE (x Gt 5)");
3362 }
3363
3364 #[test]
3365 fn a_replace_list_rides_on_the_star_it_changes() {
3366 assert_eq!(
3369 round("SELECT * REPLACE (a + 1 AS a) FROM t"),
3370 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3371 );
3372 assert_eq!(
3373 round("SELECT * REPLACE a + 1 AS a FROM t"),
3374 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3375 );
3376 assert_eq!(
3377 round("SELECT t.* REPLACE (make_date(a) AS a, b * 2 AS b) FROM t"),
3378 "SELECT t.* REPLACE (make_date(a) AS a, (b Multiply 2) AS b) FROM t"
3379 );
3380 }
3381
3382 #[test]
3383 fn one_column_cannot_be_replaced_twice() {
3384 let error = parse_ast("SELECT * REPLACE (a + 1 AS a, a + 2 AS A) FROM t").unwrap_err();
3387 assert_eq!(error.to_string(), "Parser Error: Duplicate entry \"A\" in REPLACE list");
3388 }
3389
3390 #[test]
3391 fn a_table_function_argument_can_have_a_name_written_in_front_of_it() {
3392 for spelling in
3395 ["binary_as_string := True", "binary_as_string => True", "binary_as_string = True"]
3396 {
3397 assert_eq!(
3398 round(&format!("SELECT * FROM read_parquet('f.parquet', {spelling})")),
3399 "SELECT * FROM read_parquet('f.parquet', binary_as_string := TRUE)",
3400 "{spelling}"
3401 );
3402 }
3403 }
3404
3405 #[test]
3406 fn an_equality_that_is_not_a_bare_name_stays_an_argument() {
3407 assert_eq!(round("SELECT * FROM f(t.a = 1)"), "SELECT * FROM f((t.a Eq 1))");
3410 assert_eq!(round("SELECT * FROM f(1 = 1)"), "SELECT * FROM f((1 Eq 1))");
3411 }
3412
3413 #[test]
3414 fn a_create_table_keeps_its_types_as_text() {
3415 assert_eq!(
3416 round_statement("CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"),
3417 "CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"
3418 );
3419 assert_eq!(
3423 round_statement("CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"),
3424 "CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"
3425 );
3426 }
3427
3428 #[test]
3429 fn the_modifiers_on_a_create_table_survive() {
3430 assert_eq!(
3431 round_statement("CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"),
3432 "CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"
3433 );
3434 assert_eq!(
3435 round_statement("CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"),
3436 "CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"
3437 );
3438 }
3439
3440 #[test]
3441 fn or_replace_and_if_not_exists_in_one_statement_is_refused_here_and_not_later() {
3442 for sql in [
3446 "CREATE OR REPLACE TABLE IF NOT EXISTS t (a INT)",
3447 "CREATE OR REPLACE VIEW IF NOT EXISTS v AS SELECT 1",
3448 ] {
3449 let error = parse_ast(sql).unwrap_err().to_string();
3450 assert_eq!(
3451 error,
3452 "Parser Error: Cannot specify both OR REPLACE and IF NOT EXISTS within single \
3453 create statement"
3454 );
3455 }
3456 }
3457
3458 #[test]
3459 fn a_create_table_as_carries_the_query_and_not_the_types() {
3460 assert_eq!(
3461 round_statement("CREATE TABLE t AS SELECT a FROM u"),
3462 "CREATE TABLE t AS SELECT a FROM u"
3463 );
3464 assert_eq!(
3467 round_statement("CREATE TABLE t (x, y) AS SELECT a, b FROM u"),
3468 "CREATE TABLE t (x, y) AS SELECT a, b FROM u"
3469 );
3470 }
3471
3472 #[test]
3473 fn a_create_view_carries_its_body_twice_over() {
3474 assert_eq!(
3475 round_statement("CREATE VIEW v AS SELECT a FROM u"),
3476 "CREATE VIEW v AS SELECT a FROM u"
3477 );
3478 assert_eq!(
3479 round_statement("CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"),
3480 "CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"
3481 );
3482 let ast = parse_ast("CREATE VIEW v (x) AS SELECT a FROM u WHERE a > 1").expect("parses");
3485 let Statement::CreateView(index) = ast.statements[0] else {
3486 panic!("not a create view");
3487 };
3488 assert_eq!(ast.string(ast.create_view(index).sql), "SELECT a FROM u WHERE a > 1");
3489 }
3490
3491 #[test]
3492 fn a_drop_view_is_not_a_drop_table() {
3493 assert_eq!(round_statement("DROP VIEW IF EXISTS a, b"), "DROP VIEW IF EXISTS a, b");
3494 assert_eq!(round_statement("DROP TABLE a"), "DROP TABLE a");
3495 }
3496
3497 #[test]
3498 fn a_drop_table_is_a_list_of_qualified_names() {
3499 assert_eq!(round_statement("DROP TABLE t"), "DROP TABLE t");
3500 assert_eq!(round_statement("DROP TABLE IF EXISTS a, b.c"), "DROP TABLE IF EXISTS a, b.c");
3501 }
3502
3503 #[test]
3504 fn dropping_something_that_is_neither_a_table_nor_a_view_is_refused() {
3505 let error = parse_ast("DROP MATERIALIZED VIEW v").unwrap_err().to_string();
3509 assert!(error.starts_with("Not implemented Error"), "{error}");
3510 }
3511
3512 #[test]
3513 fn both_spellings_of_insert_arrive_at_a_query() {
3514 assert_eq!(
3515 round_statement("INSERT INTO t VALUES (1, 'a'), (2, 'b')"),
3516 "INSERT INTO t VALUES (1, 'a'), (2, 'b')"
3517 );
3518 assert_eq!(
3519 round_statement("INSERT INTO t (a, b) SELECT x, y FROM u"),
3520 "INSERT INTO t (a, b) SELECT x, y FROM u"
3521 );
3522 }
3523
3524 #[test]
3525 fn an_insert_clause_that_changes_the_answer_is_refused() {
3526 for query in [
3527 "INSERT INTO t VALUES (1) RETURNING *",
3528 "INSERT OR REPLACE INTO t VALUES (1)",
3529 "INSERT INTO t BY NAME SELECT 1 AS a",
3530 "INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING",
3531 "INSERT INTO t DEFAULT VALUES",
3532 ] {
3533 let error = parse_ast(query).unwrap_err().to_string();
3534 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
3535 }
3536 }
3537
3538 #[test]
3539 fn a_column_constraint_that_is_not_not_null_is_refused() {
3540 for query in [
3544 "CREATE TABLE t (a INT PRIMARY KEY)",
3545 "CREATE TABLE t (a INT UNIQUE)",
3546 "CREATE TABLE t (a INT CHECK (a > 0))",
3547 "CREATE TABLE t (a INT DEFAULT 1)",
3548 "CREATE TABLE t (a INT REFERENCES u (b))",
3549 "CREATE TABLE t (a INT, PRIMARY KEY (a))",
3550 ] {
3551 let error = parse_ast(query).unwrap_err().to_string();
3552 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
3553 }
3554 }
3555
3556 #[test]
3557 fn values_is_a_query_on_its_own_and_in_a_from() {
3558 assert_eq!(round("VALUES (1), (2)"), "VALUES (1), (2)");
3559 assert_eq!(
3563 round("SELECT * FROM (VALUES (1, 2), (3, 4)) t(a, b)"),
3564 "SELECT * FROM (VALUES (1, 2), (3, 4)) AS t"
3565 );
3566 assert_eq!(
3567 round("SELECT * FROM VALUES (1, 2), (3, 4) AS t(a, b)"),
3568 "SELECT * FROM VALUES (1, 2), (3, 4) AS t"
3569 );
3570 assert_eq!(round("VALUES (1), (2, 3)"), "VALUES (1), (2, 3)");
3573 }
3574
3575 #[test]
3576 fn non_recursive_ctes_inline_and_semantic_variants_are_explicit() {
3577 assert_eq!(
3578 round("WITH t AS (SELECT 1 AS x) SELECT x FROM t"),
3579 "SELECT x FROM (SELECT 1 AS x) AS t"
3580 );
3581 assert_eq!(
3582 round("WITH t(x) AS NOT MATERIALIZED (SELECT 1) SELECT x FROM t"),
3583 "SELECT x FROM (SELECT 1) AS t"
3584 );
3585 for query in [
3586 "WITH RECURSIVE t(x) AS (SELECT 1) SELECT x FROM t",
3587 "WITH t AS MATERIALIZED (SELECT 1 AS x) SELECT x FROM t",
3588 ] {
3589 let error = parse_ast(query).expect_err("the unsupported CTE shape is refused");
3590 assert!(error.to_string().starts_with("Not implemented Error"), "{query}: {error}");
3591 }
3592 }
3593
3594 #[test]
3602 fn describe_rewrites_a_name_into_a_star_over_it() {
3603 assert_eq!(round("DESCRIBE SELECT 1 AS a"), "DESCRIBE SELECT 1 AS a");
3604 assert_eq!(round("DESCRIBE t"), "DESCRIBE SELECT * FROM t");
3605 assert_eq!(round("DESC t"), "DESCRIBE SELECT * FROM t");
3606 assert_eq!(round("DESCRIBE 'x.parquet'"), "DESCRIBE SELECT * FROM x.parquet");
3607 assert_eq!(
3609 round("SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"),
3610 "SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"
3611 );
3612 assert_eq!(round("DESCRIBE DESCRIBE SELECT 1 AS a"), "DESCRIBE DESCRIBE SELECT 1 AS a");
3613 }
3614
3615 #[test]
3622 fn summarize_is_refused_even_though_it_parses_as_a_describe() {
3623 for query in ["SUMMARIZE t", "SUMMARIZE SELECT 1"] {
3624 let error = parse_ast(query).expect_err("summarize is not implemented");
3625 let message = error.to_string();
3626 assert!(message.starts_with("Not implemented Error"), "{query} failed with {message}");
3627 }
3628 }
3629
3630 #[test]
3631 fn every_statement_in_the_corpus_gets_a_defined_answer() {
3632 let mut done = 0;
3637 for query in CORPUS {
3638 match parse_ast(query) {
3639 Ok(ast) => {
3640 assert_eq!(ast.statements.len(), 1, "{query}");
3641 done += 1;
3642 }
3643 Err(error) => {
3644 let message = error.to_string();
3645 assert!(
3646 message.starts_with("Not implemented Error"),
3647 "{query} failed with {message}, which is not a not-implemented error"
3648 );
3649 }
3650 }
3651 }
3652 assert!(done >= 31, "only {done} of the corpus transforms, which is fewer than it was");
3655 }
3656
3657 #[test]
3658 fn the_ast_is_far_smaller_than_the_parse_tree() {
3659 let query = CORPUS[4];
3660 let tree = parse(query).unwrap();
3661 let ast = parse_ast(query).unwrap();
3662 assert!(
3665 ast.node_count() * 20 < tree.arena_len(),
3666 "{} ast nodes against {} parse nodes",
3667 ast.node_count(),
3668 tree.arena_len()
3669 );
3670 }
3671
3672 #[test]
3673 fn precedence_comes_out_of_the_chain_and_into_the_tree() {
3674 assert_eq!(round("SELECT 1 + 2 * 3"), "SELECT (1 Add (2 Multiply 3))");
3675 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
3676 assert_eq!(round("SELECT 1 + 2 + 3"), "SELECT ((1 Add 2) Add 3)");
3677 assert_eq!(round("SELECT 1 - 2 - 3"), "SELECT ((1 Subtract 2) Subtract 3)");
3678 assert_eq!(
3679 round("SELECT a OR b AND c"),
3680 "SELECT (a Or (b And c))",
3681 "and binds tighter than or"
3682 );
3683 }
3684
3685 #[test]
3686 fn a_double_negation_is_two_nodes_and_not_none() {
3687 assert_eq!(round("SELECT NOT NOT a"), "SELECT (Not (Not a))");
3691 }
3692
3693 #[test]
3694 fn a_parenthesised_single_expression_is_not_a_row() {
3695 assert_eq!(round("SELECT (a)"), "SELECT a");
3696 assert_eq!(round("SELECT (a, b)"), "SELECT ROW(a, b)");
3697 }
3698
3699 #[test]
3700 fn a_bracketed_list_is_a_list_of_however_many_items_were_written() {
3701 assert_eq!(round("SELECT [a]"), "SELECT [a]");
3704 assert_eq!(round("SELECT [1, 2, 3]"), "SELECT [1, 2, 3]");
3705 assert_eq!(round("SELECT []"), "SELECT []");
3706 assert_eq!(round("SELECT ['a.parquet', 'b.parquet']"), "SELECT ['a.parquet', 'b.parquet']");
3707 }
3708
3709 #[test]
3710 fn a_parameter_carries_its_identifier_however_it_was_written() {
3711 assert_eq!(round("SELECT $1"), "SELECT $1");
3712 assert_eq!(round("SELECT ?1"), "SELECT $1");
3713 assert_eq!(round("SELECT $name"), "SELECT $name");
3714 assert_eq!(round("SELECT ? + $2"), "SELECT ($1 Add $2)");
3717 assert_eq!(round("SELECT ?, ?, ?"), "SELECT $1, $2, $3");
3718 }
3719
3720 #[test]
3721 fn the_parameters_of_a_statement_are_listed_once_each_in_written_order() {
3722 let ast = parse_ast("SELECT $b, $a, $b WHERE $a").expect("parses");
3723 assert_eq!(ast.parameters(), vec!["b", "a"]);
3724 assert!(parse_ast("SELECT 1").expect("parses").parameters().is_empty());
3725 }
3726
3727 #[test]
3728 fn the_three_ways_to_write_an_alias_all_arrive() {
3729 assert_eq!(round("SELECT a AS b"), "SELECT a AS b");
3730 assert_eq!(round("SELECT a b"), "SELECT a AS b");
3731 assert_eq!(round("SELECT b: a"), "SELECT a AS b");
3732 assert_eq!(round("SELECT a"), "SELECT a", "and no alias when none was written");
3733 }
3734
3735 #[test]
3736 fn a_from_with_no_select_selects_everything() {
3737 assert_eq!(round("FROM t"), "SELECT * FROM t");
3740 assert_eq!(round("FROM t SELECT a"), "SELECT a FROM t");
3741 }
3742
3743 #[test]
3744 fn joins_nest_to_the_left() {
3745 assert_eq!(
3746 round("SELECT * FROM a JOIN b ON a.i = b.i LEFT JOIN c USING (k)"),
3747 "SELECT * FROM ((a Inner JOIN b ON (a.i Eq b.i)) Left JOIN c USING (k))"
3748 );
3749 assert_eq!(
3750 round("SELECT * FROM a NATURAL JOIN b"),
3751 "SELECT * FROM (a NATURAL Inner JOIN b)"
3752 );
3753 assert_eq!(round("SELECT * FROM a CROSS JOIN b"), "SELECT * FROM (a Cross JOIN b)");
3754 assert_eq!(
3755 round("SELECT * FROM a POSITIONAL JOIN b"),
3756 "SELECT * FROM (a Positional JOIN b)"
3757 );
3758 assert_eq!(round("SELECT * FROM a, b"), "SELECT * FROM a, b", "a comma is not a join node");
3759 }
3760
3761 #[test]
3762 fn a_qualified_name_keeps_its_parts_however_it_was_spelled() {
3763 assert_eq!(round("SELECT a"), "SELECT a");
3767 assert_eq!(round("SELECT t.a"), "SELECT t.a");
3768 assert_eq!(round("SELECT s.t.a"), "SELECT s.t.a");
3769 assert_eq!(round("SELECT c.s.t.a"), "SELECT c.s.t.a");
3770 assert_eq!(round("SELECT * FROM s.t"), "SELECT * FROM s.t");
3771 }
3772
3773 #[test]
3774 fn a_star_can_be_qualified() {
3775 assert_eq!(round("SELECT *"), "SELECT *");
3776 assert_eq!(round("SELECT t.*"), "SELECT t.*");
3777 assert_eq!(round("SELECT s.t.*"), "SELECT s.t.*");
3778 }
3779
3780 #[test]
3781 fn a_quoted_identifier_keeps_its_case_and_loses_its_quotes() {
3782 let ast = parse_ast("SELECT \"Mixed Case\", \"a\"\"b\"").unwrap();
3786 assert_eq!(ast.strings[0], "Mixed Case");
3787 assert_eq!(ast.strings[1], "a\"b");
3788 }
3789
3790 #[test]
3791 fn a_string_literal_is_decoded_and_adjacent_ones_are_joined() {
3792 assert_eq!(round("SELECT 'it''s'"), "SELECT 'it's'");
3793 assert_eq!(round("SELECT 'a'\n'b'"), "SELECT 'ab'", "the standard's adjacency rule");
3794 }
3795
3796 #[test]
3798 fn a_dollar_quoted_string_loses_its_dollars_and_its_tag() {
3799 assert_eq!(round("SELECT $$dollar quoted$$"), "SELECT 'dollar quoted'");
3800 assert_eq!(round("SELECT $tag$body$tag$"), "SELECT 'body'");
3801 assert_eq!(round("SELECT $$$$"), "SELECT ''", "an empty tag and an empty body");
3802 assert_eq!(round("SELECT $tag$it''s $other$ fine$tag$"), "SELECT 'it''s $other$ fine'");
3805 assert_eq!(round("SELECT $$open"), "SELECT '$$open'");
3807 }
3808
3809 #[test]
3815 fn an_escape_string_resolves_its_backslashes() {
3816 assert_eq!(round("SELECT E'a\\nb'"), "SELECT 'a\nb'");
3817 assert_eq!(round("SELECT e'a\\tb'"), "SELECT 'a\tb'", "the prefix is a letter, not a name");
3818 assert_eq!(round("SELECT E'a\\rb'"), "SELECT 'a\rb'");
3819 assert_eq!(round("SELECT E'a\\bb'"), "SELECT 'a\u{8}b'");
3820 assert_eq!(round("SELECT E'a\\fb'"), "SELECT 'a\u{c}b'");
3821 assert_eq!(round("SELECT E'a\\\\b'"), "SELECT 'a\\b'");
3822 assert_eq!(round("SELECT E'a\\'b'"), "SELECT 'a'b'", "a quote, the same as ''");
3823 assert_eq!(round("SELECT E'a''b'"), "SELECT 'a'b'", "and '' still means a quote here");
3824 assert_eq!(round("SELECT E'a\\vb'"), "SELECT 'avb'");
3827 assert_eq!(round("SELECT E'a\\qb'"), "SELECT 'aqb'");
3828 }
3829
3830 #[test]
3832 fn a_numeric_escape_writes_the_byte_or_the_character_it_names() {
3833 assert_eq!(round("SELECT E'\\x41'"), "SELECT 'A'");
3834 assert_eq!(round("SELECT E'\\x4142'"), "SELECT 'A42'", "two digits at the most");
3835 assert_eq!(
3836 round("SELECT E'a\\x'"),
3837 "SELECT 'ax'",
3838 "and one at the least, or it is a letter"
3839 );
3840 assert_eq!(round("SELECT E'\\101'"), "SELECT 'A'");
3841 assert_eq!(round("SELECT E'\\1011'"), "SELECT 'A1'", "three digits at the most");
3842 assert_eq!(round("SELECT E'\\8'"), "SELECT '8'", "8 is not an octal digit");
3843 assert_eq!(round("SELECT E'\\xc3\\xa9'"), "SELECT 'é'");
3845 assert_eq!(round("SELECT E'\\u00e9'"), "SELECT 'é'");
3846 assert_eq!(round("SELECT E'a\\u41'"), "SELECT 'au41'", "four digits or it is a letter");
3847 assert_eq!(round("SELECT E'a\\uZZZZ'"), "SELECT 'auZZZZ'");
3848 assert_eq!(
3849 round("SELECT E'\\ud83d\\ude00'"),
3850 "SELECT 'ud83dude00'",
3851 "surrogates are not it"
3852 );
3853 }
3854
3855 #[test]
3857 fn an_escape_string_that_is_not_a_string_raises() {
3858 let error = parse_ast("SELECT E'a\\x00'").unwrap_err().to_string();
3859 assert_eq!(error, "Parser Error: Null character not permitted in escape string literal");
3860 let error = parse_ast("SELECT E'a\\377'").unwrap_err().to_string();
3861 assert_eq!(
3862 error,
3863 "Parser Error: Invalid UTF-8 in escape string literal at byte offset 1: byte mismatch",
3864 "the offset is where the bytes stop being a string, not where the escape was written"
3865 );
3866 }
3867
3868 #[test]
3870 fn the_other_string_prefixes_are_what_upstream_makes_of_them() {
3871 assert_eq!(round("SELECT N'abc'"), "SELECT CAST('abc' AS VARCHAR)");
3873 assert_eq!(round("SELECT n'abc'"), "SELECT CAST('abc' AS VARCHAR)");
3874 assert_eq!(round("SELECT B'101'"), "SELECT 'b101'");
3876 assert_eq!(round("SELECT b'abc'"), "SELECT 'babc'");
3877 assert_eq!(round("SELECT B''"), "SELECT 'b'", "an empty one is the letter on its own");
3878 }
3879
3880 #[test]
3886 fn a_hex_string_is_a_blob_and_not_a_string() {
3887 assert_eq!(round("SELECT x'4142'"), "SELECT 'AB'::BLOB");
3888 assert_eq!(round("SELECT X'4142'"), "SELECT 'AB'::BLOB");
3889 assert_eq!(round("SELECT x'ff41'"), "SELECT '\\xFFA'::BLOB", "a byte that does not print");
3890 assert_eq!(round("SELECT x''"), "SELECT ''::BLOB", "an empty one is an empty blob");
3891 assert_eq!(round("SELECT x'2741'"), "SELECT '\\x27A'::BLOB");
3894 assert_eq!(round("SELECT x'5c7834314141'"), "SELECT '\\x5Cx41AA'::BLOB");
3895 let error = parse_ast("SELECT x'4'").unwrap_err().to_string();
3898 assert_eq!(
3899 error,
3900 "Parser Error: Hex string literal must have an even number of hex digits"
3901 );
3902 assert_eq!(round("SELECT x'41zz'"), "SELECT '\\x41\\xzz'::BLOB");
3903 }
3904
3905 #[test]
3906 fn the_null_and_boolean_tests_are_postfix_unary_operators() {
3907 assert_eq!(round("SELECT x IS NULL"), "SELECT (IsNull x)");
3908 assert_eq!(round("SELECT x IS NOT NULL"), "SELECT (IsNotNull x)");
3909 assert_eq!(round("SELECT x ISNULL"), "SELECT (IsNull x)");
3910 assert_eq!(round("SELECT x NOTNULL"), "SELECT (IsNotNull x)");
3911 assert_eq!(round("SELECT x IS TRUE"), "SELECT (IsTrue x)");
3912 assert_eq!(round("SELECT x IS NOT FALSE"), "SELECT (IsNotFalse x)");
3913 assert_eq!(round("SELECT x IS DISTINCT FROM y"), "SELECT (x IsDistinctFrom y)");
3914 assert_eq!(round("SELECT x IS NOT DISTINCT FROM y"), "SELECT (x IsNotDistinctFrom y)");
3915 }
3916
3917 #[test]
3918 fn the_like_family_folds_its_negation_into_the_operator() {
3919 assert_eq!(round("SELECT x LIKE 'a'"), "SELECT (x Like 'a')");
3920 assert_eq!(round("SELECT x NOT LIKE 'a'"), "SELECT (x NotLike 'a')");
3921 assert_eq!(round("SELECT x ILIKE 'a'"), "SELECT (x ILike 'a')");
3922 assert_eq!(round("SELECT x ~~ 'a'"), "SELECT (x Like 'a')", "the operator spelling");
3923 assert_eq!(round("SELECT x !~~ 'a'"), "SELECT (x NotLike 'a')");
3924 assert_eq!(round("SELECT x SIMILAR TO 'a'"), "SELECT (x SimilarTo 'a')");
3925 assert_eq!(round("SELECT x NOT GLOB 'a'"), "SELECT (Not (x Glob 'a'))");
3927 }
3928
3929 #[test]
3930 fn between_and_in_carry_their_negation_as_a_flag() {
3931 assert_eq!(round("SELECT x BETWEEN 1 AND 2"), "SELECT (x BETWEEN 1 AND 2)");
3932 assert_eq!(round("SELECT x NOT BETWEEN 1 AND 2"), "SELECT (NOT x BETWEEN 1 AND 2)");
3933 assert_eq!(round("SELECT x IN (1, 2)"), "SELECT (x IN [1, 2])");
3934 assert_eq!(round("SELECT x NOT IN (1, 2)"), "SELECT (NOT x IN [1, 2])");
3935 }
3936
3937 #[test]
3938 fn both_spellings_of_a_cast_are_the_same_node() {
3939 assert_eq!(round("SELECT CAST(x AS BIGINT)"), "SELECT CAST(x AS BIGINT)");
3940 assert_eq!(round("SELECT x::BIGINT"), "SELECT CAST(x AS BIGINT)");
3941 assert_eq!(round("SELECT TRY_CAST(x AS BIGINT)"), "SELECT TRY_CAST(x AS BIGINT)");
3942 assert_eq!(
3943 round("SELECT x::DECIMAL(18, 3)"),
3944 "SELECT CAST(x AS DECIMAL(18, 3))",
3945 "the type is kept as text because parsing it is the type system's job"
3946 );
3947 }
3948
3949 #[test]
3950 fn a_typed_literal_is_a_third_spelling_of_the_same_cast() {
3951 assert_eq!(round("SELECT DATE '1995-09-01'"), "SELECT CAST('1995-09-01' AS DATE)");
3952 assert_eq!(
3953 round("SELECT date '1995-09-01'"),
3954 "SELECT CAST('1995-09-01' AS date)",
3955 "the type is kept as written, the same as it is in the other two spellings"
3956 );
3957 assert_eq!(
3958 round("SELECT TIMESTAMP '2020-01-01 03:04:05'"),
3959 "SELECT CAST('2020-01-01 03:04:05' AS TIMESTAMP)"
3960 );
3961 assert_eq!(
3962 round("SELECT DECIMAL(5, 2) '1.5'"),
3963 "SELECT CAST('1.5' AS DECIMAL(5, 2))",
3964 "any type the cast takes is a typed literal, parameters and all"
3965 );
3966 assert_eq!(
3967 round("SELECT VARCHAR 'hi' FROM t"),
3968 "SELECT CAST('hi' AS VARCHAR) FROM t",
3969 "including the ones where the cast has nothing to do"
3970 );
3971 }
3972
3973 #[test]
3974 fn a_case_keeps_its_arms_in_order() {
3975 assert_eq!(
3976 round("SELECT CASE WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"),
3977 "SELECT CASE - WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"
3978 );
3979 assert_eq!(
3980 round("SELECT CASE x WHEN 1 THEN 'a' END"),
3981 "SELECT CASE x WHEN 1 THEN 'a' ELSE - END",
3982 "a simple case keeps the operand and a missing else is not an implicit null yet"
3983 );
3984 }
3985
3986 #[test]
3987 fn a_field_access_and_a_method_call_are_ordinary_function_calls() {
3988 assert_eq!(round("SELECT (f(x)).y"), "SELECT struct_extract(f(x), 'y')");
3991 assert_eq!(round("SELECT a[1]"), "SELECT array_extract(a, 1)");
3992 }
3993
3994 #[test]
3996 fn a_range_gets_the_bounds_the_query_left_out() {
3997 assert_eq!(round("SELECT a[1:2]"), "SELECT array_slice(a, 1, 2)");
3998 assert_eq!(round("SELECT a[:2]"), "SELECT array_slice(a, 1, 2)");
3999 assert_eq!(round("SELECT a[2:]"), "SELECT array_slice(a, 2, -1)");
4000 assert_eq!(round("SELECT a[:]"), "SELECT array_slice(a, 1, -1)");
4001 assert_eq!(round("SELECT a[1:-]"), "SELECT array_slice(a, 1, -1)");
4003 assert_eq!(round("SELECT a[1:2:3]"), "SELECT array_slice(a, 1, 2, 3)");
4004 assert_eq!(round("SELECT a[1:2:]"), "SELECT array_slice(a, 1, 2, [])");
4007 }
4008
4009 #[test]
4011 fn an_empty_subscript_is_not_a_subscript() {
4012 let error = parse_ast("SELECT a[]").expect_err("an empty subscript");
4013 assert_eq!(error.message(), "Empty subscript '[]' is not allowed");
4014 }
4015
4016 #[test]
4019 fn a_keyword_is_not_stepped_through_on_the_way_to_its_one_argument() {
4020 for (sql, rule) in [
4021 ("SELECT row(1)", "RowExpression"),
4022 ("SELECT try(1)", "TryExpression"),
4023 ("SELECT unpack([1])", "UnpackExpression"),
4024 ("SELECT columns('a')", "ColumnsExpression"),
4025 ] {
4026 let error = parse_ast(sql).expect_err(sql);
4027 assert!(error.message().ends_with(rule), "{sql}: {error}");
4028 }
4029 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
4032 assert_eq!(round("SELECT -(7)"), "SELECT (Negate 7)");
4033 }
4034
4035 #[test]
4037 fn the_null_checks_are_calls_by_the_names_duckdb_prints() {
4038 assert_eq!(round("SELECT COALESCE(a, b, 1)"), "SELECT coalesce(a, b, 1)");
4041 assert_eq!(round("SELECT coalesce(a)"), "SELECT coalesce(a)");
4042 assert_eq!(round("SELECT NULLIF(a, 1)"), "SELECT nullif(a, 1)");
4043 assert_eq!(round("SELECT ifnull(a, 1)"), "SELECT coalesce(a, 1)");
4045 assert_eq!(round("SELECT main.ifnull(a, 1)"), "SELECT coalesce(a, 1)");
4046 let error = parse_ast("SELECT ifnull(a)").expect_err("one argument to ifnull");
4047 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
4048 let error = parse_ast("SELECT ifnull(a, b, c)").expect_err("three arguments to ifnull");
4049 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
4050 }
4051
4052 #[test]
4055 fn the_string_keywords_are_the_calls_duckdb_prints() {
4056 assert_eq!(round("SELECT substring(s, 2, 3)"), "SELECT substring(s, 2, 3)");
4057 assert_eq!(round("SELECT SUBSTRING(s FROM 2 FOR 3)"), "SELECT substring(s, 2, 3)");
4058 assert_eq!(round("SELECT substring(s FROM 2)"), "SELECT substring(s, 2)");
4059 assert_eq!(round("SELECT substring(s FOR 3)"), "SELECT substring(s, 1, 3)");
4061 assert_eq!(round("SELECT position('c' IN s)"), "SELECT position(s, 'c')");
4063 assert_eq!(round("SELECT trim(s)"), "SELECT trim(s)");
4064 assert_eq!(round("SELECT trim(BOTH 'x' FROM s)"), "SELECT trim(s, 'x')");
4065 assert_eq!(round("SELECT trim(BOTH FROM s)"), "SELECT trim(s)");
4066 assert_eq!(round("SELECT trim(s, 'xy')"), "SELECT trim(s, 'xy')");
4067 assert_eq!(round("SELECT trim(LEADING FROM s)"), "SELECT ltrim(s)");
4069 assert_eq!(round("SELECT trim(TRAILING FROM s)"), "SELECT rtrim(s)");
4070 assert_eq!(round("SELECT trim(LEADING 'x' FROM s)"), "SELECT ltrim(s, 'x')");
4071 assert_eq!(round("SELECT trim(TRAILING 'x' FROM s)"), "SELECT rtrim(s, 'x')");
4072 assert_eq!(
4073 round("SELECT overlay(s PLACING 'X' FROM 2 FOR 1)"),
4074 "SELECT overlay(s, 'X', 2, 1)"
4075 );
4076 assert_eq!(round("SELECT overlay(s PLACING 'X' FROM 2)"), "SELECT overlay(s, 'X', 2)");
4077 assert_eq!(round("SELECT overlay(s, 'X', 2, 1)"), "SELECT overlay(s, 'X', 2, 1)");
4078 }
4079
4080 #[test]
4081 fn an_aggregate_keeps_its_distinct() {
4082 assert_eq!(round("SELECT count(*)"), "SELECT count(*)");
4083 assert_eq!(round("SELECT count(DISTINCT x)"), "SELECT count(DISTINCT x)");
4084 assert_eq!(round("SELECT count(ALL x)"), "SELECT count(x)");
4085 assert_eq!(round("SELECT main.count(x)"), "SELECT main.count(x)");
4086 }
4087
4088 #[test]
4089 fn the_modifiers_hang_off_the_query_and_not_off_the_select() {
4090 assert_eq!(
4094 round("SELECT 1 UNION ALL SELECT 2 ORDER BY 1"),
4095 "(SELECT 1 Union All SELECT 2) ORDER BY 1 Unstated Unstated"
4096 );
4097 assert_eq!(
4098 round("SELECT a FROM t UNION SELECT b FROM u EXCEPT SELECT c FROM v"),
4099 "((SELECT a FROM t Union Unstated SELECT b FROM u) Except Unstated SELECT c FROM v)",
4100 "set operators are left associative"
4101 );
4102 assert_eq!(
4103 round("SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"),
4104 "(SELECT 1 Union Unstated (SELECT 2 Intersect Unstated SELECT 3))",
4105 "and intersect binds tighter than the other two"
4106 );
4107 }
4108
4109 #[test]
4110 fn the_sort_and_limit_clauses_keep_what_was_written() {
4111 assert_eq!(
4112 round("SELECT a FROM t ORDER BY a"),
4113 "SELECT a FROM t ORDER BY a Unstated Unstated"
4114 );
4115 assert_eq!(
4116 round("SELECT a FROM t ORDER BY a DESC NULLS LAST"),
4117 "SELECT a FROM t ORDER BY a Descending Last"
4118 );
4119 assert_eq!(round("SELECT a FROM t ORDER BY ALL"), "SELECT a FROM t ORDER BY ALL");
4120 assert_eq!(round("SELECT a FROM t GROUP BY ALL"), "SELECT a FROM t GROUP BY ALL");
4121 assert_eq!(round("SELECT a FROM t LIMIT 10 OFFSET 5"), "SELECT a FROM t LIMIT 10 OFFSET 5");
4122 assert_eq!(round("SELECT a FROM t OFFSET 5 LIMIT 10"), "SELECT a FROM t LIMIT 10 OFFSET 5");
4123 assert_eq!(round("SELECT a FROM t LIMIT 10%"), "SELECT a FROM t LIMIT 10%");
4124 assert_eq!(round("SELECT a FROM t LIMIT ALL"), "SELECT a FROM t", "which is no limit");
4125 }
4126
4127 #[test]
4128 fn a_subquery_appears_in_both_places_it_can() {
4129 assert_eq!(
4130 round("SELECT * FROM (SELECT x FROM t) AS s"),
4131 "SELECT * FROM (SELECT x FROM t) AS s"
4132 );
4133 assert_eq!(round("SELECT (SELECT 1)"), "SELECT (SELECT 1)");
4134 }
4135
4136 #[test]
4137 fn distinct_on_keeps_its_expressions() {
4138 assert_eq!(round("SELECT DISTINCT a"), "SELECT DISTINCT a");
4139 assert_eq!(round("SELECT ALL a"), "SELECT a", "which is the default written out");
4140 assert_eq!(round("SELECT DISTINCT ON (a, b) a"), "SELECT DISTINCT ON (a, b) a");
4141 }
4142
4143 #[test]
4144 fn an_operator_the_dialect_does_not_name_is_kept_by_name() {
4145 assert_eq!(round("SELECT a <=> b"), "SELECT (a <=> b)");
4151 assert!(parse_ast("SELECT a foo b").is_err(), "a bare word is not an operator");
4152 }
4153
4154 #[test]
4155 fn a_script_is_a_list_of_statements() {
4156 let ast = parse_ast("SELECT 1; SELECT 2;").unwrap();
4157 assert_eq!(ast.statements.len(), 2);
4158 let Statement::Query(second) = ast.statements[1] else {
4162 panic!("the second statement is a query");
4163 };
4164 assert_eq!(show_query(&ast, second), "SELECT 2");
4165 }
4166
4167 #[test]
4168 fn an_unsupported_construct_names_itself_and_what_was_written() {
4169 let error = parse_ast("ALTER TABLE t ADD COLUMN a INTEGER").unwrap_err().to_string();
4170 assert!(error.starts_with("Not implemented Error"), "{error}");
4171 assert!(error.contains("ALTER TABLE t ADD COLUMN a INTEGER"), "{error}");
4172 assert!(error.contains("AlterStatement"), "{error}");
4173 }
4174
4175 #[test]
4176 fn a_long_construct_is_cut_short_in_the_message() {
4177 let query = format!("ALTER TABLE t ADD COLUMN {} INTEGER", "a".repeat(80));
4178 let error = parse_ast(&query).unwrap_err().to_string();
4179 assert!(error.contains("..."), "{error}");
4180 assert!(error.len() < 200, "{error}");
4181 }
4182
4183 #[test]
4184 fn the_transformer_never_panics_on_anything_the_matcher_accepts() {
4185 for query in [
4189 "SELECT",
4190 "FROM t SELECT",
4191 "SELECT * FROM t WHERE",
4192 "SELECT ()",
4193 "SELECT a FROM t GROUP BY ()",
4194 ] {
4195 let answer = parse_ast(query);
4196 if let Err(error) = answer {
4197 let message = error.to_string();
4198 assert!(
4199 message.starts_with("Not implemented Error")
4200 || message.starts_with("Parser Error"),
4201 "{query} failed with {message}"
4202 );
4203 }
4204 }
4205 }
4206
4207 #[test]
4208 fn a_file_name_in_a_from_clause_is_a_table_name_with_the_quotes_off() {
4209 assert_eq!(round("SELECT * FROM 'hits.parquet'"), "SELECT * FROM hits.parquet");
4213 assert_eq!(round("SELECT * FROM \"hits.parquet\""), "SELECT * FROM hits.parquet");
4214 assert_eq!(round("SELECT * FROM 'hits.parquet' AS h"), "SELECT * FROM hits.parquet AS h");
4215 assert_eq!(
4216 round_with_case("SELECT Mixed FROM 'NoSuch/Mixed/File.csv'", IdentifierCase::Lower),
4217 "SELECT mixed FROM NoSuch/Mixed/File.csv"
4218 );
4219 assert_eq!(
4220 round_with_case("SELECT Mixed FROM \"QuotedTable\"", IdentifierCase::Upper),
4221 "SELECT MIXED FROM QuotedTable"
4222 );
4223 }
4224
4225 #[test]
4226 fn a_function_call_in_a_from_clause_is_a_source_and_not_an_expression() {
4227 assert_eq!(round("SELECT * FROM range(3)"), "SELECT * FROM range(3)");
4228 assert_eq!(round("SELECT * FROM range(1, 10, 2)"), "SELECT * FROM range(1, 10, 2)");
4229 assert_eq!(round("SELECT * FROM main.range(3)"), "SELECT * FROM main.range(3)");
4230 assert_eq!(round("SELECT * FROM range(3) AS t"), "SELECT * FROM range(3) AS t");
4231 assert_eq!(round("SELECT * FROM some_function()"), "SELECT * FROM some_function()");
4234 }
4235
4236 #[test]
4237 fn the_forms_of_a_table_function_this_does_not_cover_are_turned_away_by_name() {
4238 for query in [
4239 "SELECT * FROM range(3) WITH ORDINALITY",
4240 "SELECT * FROM LATERAL range(3)",
4241 "SELECT * FROM t: range(3)",
4242 ] {
4243 let error = parse_ast(query).unwrap_err().to_string();
4244 assert!(error.contains("grammar rule"), "{query} failed with {error}");
4245 }
4246 }
4247
4248 #[test]
4249 fn a_pragma_is_the_call_it_stands_for_by_the_time_it_leaves_here() {
4250 assert_eq!(round("PRAGMA version"), "SELECT * FROM pragma_version()");
4251 assert_eq!(round("PRAGMA database_size"), "SELECT * FROM pragma_database_size()");
4252 assert_eq!(round("PRAGMA VERSION"), "SELECT * FROM pragma_VERSION()");
4255 assert_eq!(round("PRAGMA table_info('t')"), "SELECT * FROM pragma_table_info('t')");
4256 }
4257
4258 #[test]
4259 fn a_bare_name_in_a_pragmas_parentheses_is_a_name_and_not_a_column() {
4260 assert_eq!(round("PRAGMA table_info(t)"), "SELECT * FROM pragma_table_info('t')");
4263 assert_eq!(round("PRAGMA table_info(main.t)"), "SELECT * FROM pragma_table_info('main.t')");
4264 assert_eq!(round("PRAGMA table_info(\"T\")"), "SELECT * FROM pragma_table_info('T')");
4265 assert_eq!(round("PRAGMA table_info(1)"), "SELECT * FROM pragma_table_info(1)");
4268 }
4269
4270 #[test]
4271 fn a_pragma_with_an_equals_sign_is_a_set_and_nothing_else() {
4272 assert_eq!(round_statement("PRAGMA memory_limit = '1GB'"), "SET memory_limit = '1GB'");
4273 assert_eq!(round_statement("PRAGMA threads = 4"), "SET threads = 4");
4274 }
4275
4276 #[test]
4277 fn a_pragma_with_empty_parentheses_does_not_parse_on_either_engine() {
4278 let error = parse_ast("PRAGMA version()").unwrap_err().to_string();
4281 assert!(error.contains("syntax error at or near \")\""), "{error}");
4282 }
4283
4284 #[test]
4285 fn interning_means_a_name_written_twice_is_stored_once() {
4286 let ast = parse_ast("SELECT a, a, a FROM t WHERE a = a").unwrap();
4287 assert_eq!(ast.strings.iter().filter(|text| *text == "a").count(), 1);
4288 }
4289}