1use std::collections::HashMap;
21
22use rudb_common::{Error, Result, 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 let tokens = tokenize(query)?;
42 let tree = parse_tokens(query, &tokens, PROGRAM, true)?;
43 transform(query, &tokens, &tree)
44}
45
46pub fn transform(query: &str, tokens: &[Token], tree: &Tree) -> Result<Ast> {
48 let mut transform = Transform {
49 query,
50 tokens,
51 tree,
52 ast: Ast::default(),
53 interned: HashMap::new(),
54 anonymous: 0,
55 };
56 transform.program(tree.root())?;
57 Ok(transform.ast)
58}
59
60struct Transform<'a> {
61 query: &'a str,
62 tokens: &'a [Token],
63 tree: &'a Tree,
64 ast: Ast,
65 interned: HashMap<String, StrRef>,
66 anonymous: u32,
68}
69
70impl<'a> Transform<'a> {
71 fn text(&self, node: u32) -> &'a str {
75 self.tree.text(node, self.query, self.tokens)
76 }
77
78 fn name(&self, node: u32) -> &'static str {
80 self.tree.name(node)
81 }
82
83 fn kids(&self, node: u32) -> impl Iterator<Item = u32> + use<'a> {
89 let tree = self.tree;
90 tree.children(node)
91 }
92
93 fn count(&self, node: u32) -> usize {
95 self.kids(node).count()
96 }
97
98 fn nth(&self, node: u32, n: usize) -> u32 {
100 self.kids(node).nth(n).unwrap_or(NONE)
101 }
102
103 fn first(&self, node: u32) -> u32 {
105 self.nth(node, 0)
106 }
107
108 fn find(&self, node: u32, name: &str) -> u32 {
115 self.kids(node).find(|&kid| self.name(kid) == name).unwrap_or(NONE)
116 }
117
118 fn leaves(&self, node: u32, out: &mut Vec<u32>) {
125 let mut any = false;
126 for kid in self.kids(node) {
127 any = true;
128 self.leaves(kid, &mut *out);
129 }
130 if !any {
131 out.push(node);
132 }
133 }
134
135 fn intern(&mut self, text: &str) -> StrRef {
139 if let Some(&index) = self.interned.get(text) {
140 return index;
141 }
142 let index = u32::try_from(self.ast.strings.len())
143 .map_err(|_| Error::internal("more than four billion strings in one query"))
144 .unwrap_or(NONE);
145 self.ast.strings.push(text.to_string());
146 self.interned.insert(text.to_string(), index);
147 index
148 }
149
150 fn push(&mut self, expr: Expr) -> ExprRef {
152 let index = self.ast.exprs.len() as u32;
153 self.ast.exprs.push(expr);
154 index
155 }
156
157 fn push_source(&mut self, source: Source) -> SourceRef {
159 let index = self.ast.sources.len() as u32;
160 self.ast.sources.push(source);
161 index
162 }
163
164 fn push_query(&mut self, query: Query) -> QueryRef {
166 let index = self.ast.queries.len() as u32;
167 self.ast.queries.push(query);
168 index
169 }
170
171 fn push_select(&mut self, select: Select) -> SelectRef {
173 let index = self.ast.selects.len() as u32;
174 self.ast.selects.push(select);
175 index
176 }
177
178 fn expr_slice(&mut self, items: Vec<ExprRef>) -> Slice {
180 let start = self.ast.expr_lists.len() as u32;
181 self.ast.expr_lists.extend(items);
182 Slice { start, len: self.ast.expr_lists.len() as u32 - start }
183 }
184
185 fn part_slice(&mut self, items: Vec<StrRef>) -> Slice {
187 let start = self.ast.parts.len() as u32;
188 self.ast.parts.extend(items);
189 Slice { start, len: self.ast.parts.len() as u32 - start }
190 }
191
192 fn column_def_slice(&mut self, items: Vec<ColumnDef>) -> Slice {
194 let start = self.ast.column_defs.len() as u32;
195 self.ast.column_defs.extend(items);
196 Slice { start, len: self.ast.column_defs.len() as u32 - start }
197 }
198
199 fn target_slice(&mut self, items: Vec<Target>) -> Slice {
201 let start = self.ast.targets.len() as u32;
202 self.ast.targets.extend(items);
203 Slice { start, len: self.ast.targets.len() as u32 - start }
204 }
205
206 fn name_list_slice(&mut self, items: Vec<Slice>) -> Slice {
208 let start = self.ast.name_lists.len() as u32;
209 self.ast.name_lists.extend(items);
210 Slice { start, len: self.ast.name_lists.len() as u32 - start }
211 }
212
213 fn unsupported<T>(&self, node: u32) -> Result<T> {
218 let text = self.text(node);
219 let text = if text.chars().count() > 60 {
220 let cut = text.char_indices().nth(60).map_or(text.len(), |(at, _)| at);
221 format!("{}...", &text[..cut])
222 } else {
223 text.to_string()
224 };
225 Err(Error::not_implemented(format!(
226 "{text} is not supported yet, the grammar rule is {}",
227 self.name(node)
228 )))
229 }
230
231 fn identifier(&mut self, node: u32) -> StrRef {
235 let mut leaves = Vec::new();
236 self.leaves(node, &mut leaves);
237 let text = leaves.last().map_or("", |&leaf| self.text(leaf));
238 let text = unquote(text.strip_suffix('.').unwrap_or(text));
239 self.intern(&text)
240 }
241
242 fn name_parts(&mut self, node: u32) -> Slice {
244 let mut leaves = Vec::new();
245 self.leaves(node, &mut leaves);
246 let mut parts = Vec::with_capacity(leaves.len());
247 for leaf in leaves {
248 let text = self.text(leaf);
249 if text.is_empty() || text == "*" {
252 continue;
253 }
254 let text = unquote(text.strip_suffix('.').unwrap_or(text));
255 let interned = self.intern(&text);
256 parts.push(interned);
257 }
258 self.part_slice(parts)
259 }
260
261 fn program(&mut self, node: u32) -> Result<()> {
265 for top in self.kids(node) {
266 let Some(statement) = self.kids(top).find(|&kid| self.name(kid) == "Statement") else {
271 continue;
272 };
273 let statement = self.statement(statement)?;
274 self.ast.statements.push(statement);
275 }
276 Ok(())
277 }
278
279 fn statement(&mut self, node: u32) -> Result<Statement> {
281 let inner = self.first(node);
282 match self.name(inner) {
283 "SelectStatement" => {
284 let query = self.query(self.first(inner))?;
285 Ok(Statement::Query(query))
286 }
287 "CreateStatement" => self.create_statement(inner),
288 "DropStatement" => self.drop_statement(inner),
289 "InsertStatement" => self.insert_statement(inner),
290 "SetStatement" => self.set_statement(inner),
291 "ResetStatement" => self.reset_statement(inner),
292 "ExplainStatement" => self.explain_statement(inner),
293 _ => self.unsupported(inner),
294 }
295 }
296
297 fn explain_statement(&mut self, node: u32) -> Result<Statement> {
308 let analyze = self.find(node, "AnalyzeKeyword") != NONE;
309 let options = self.find(node, "ExplainOptionList");
310 if options != NONE {
311 return self.unsupported(options);
312 }
313 let inner = self.first(self.find(node, "ExplainableStatements"));
314 if self.name(inner) != "ExplainSelectStatement" {
315 return self.unsupported(inner);
316 }
317 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
318 Ok(Statement::Explain { query, analyze })
319 }
320
321 fn set_statement(&mut self, node: u32) -> Result<Statement> {
328 let inner = self.first(self.find(node, "SetAssignmentOrTimeZone"));
329 if self.name(inner) != "StandardAssignment" {
330 return self.unsupported(inner);
331 }
332 let (name, scope) = self.setting_name(self.find(inner, "SetVariableOrSetting"))?;
333 let assignment = self.find(inner, "SetAssignment");
334 let list = self.find(assignment, "VariableList");
335 let mut values = Vec::new();
336 for kid in self.kids(list) {
337 values.push(self.expr(kid)?);
338 }
339 let [value] = values[..] else {
343 return self.unsupported(list);
344 };
345 let index = self.ast.settings.len() as u32;
346 self.ast.settings.push(Setting { name, scope, value });
347 Ok(Statement::Set(index))
348 }
349
350 fn reset_statement(&mut self, node: u32) -> Result<Statement> {
352 let (name, scope) = self.setting_name(self.find(node, "SetVariableOrSetting"))?;
353 let index = self.ast.settings.len() as u32;
354 self.ast.settings.push(Setting { name, scope, value: NONE });
355 Ok(Statement::Reset(index))
356 }
357
358 fn setting_name(&mut self, node: u32) -> Result<(StrRef, Scope)> {
364 let inner = self.first(node);
365 if self.name(inner) != "SetSetting" {
366 return self.unsupported(inner);
367 }
368 let written = self.find(inner, "SettingScope");
369 let scope = if written == NONE {
370 Scope::Unwritten
371 } else {
372 match self.name(self.first(written)) {
373 "GlobalScope" => Scope::Global,
374 "SessionScope" => Scope::Session,
375 "LocalScope" => Scope::Local,
376 _ => return self.unsupported(written),
377 }
378 };
379 Ok((self.identifier(self.find(inner, "SettingName")), scope))
380 }
381
382 fn create_statement(&mut self, node: u32) -> Result<Statement> {
388 let or_replace = self.find(node, "OrReplace") != NONE;
389 let temporary = self.find(node, "Temporary") != NONE;
390 let variation = self.find(node, "CreateStatementVariation");
391 let inner = self.first(variation);
392 if or_replace && self.find(inner, "IfNotExists") != NONE {
396 return Err(Error::parser(
397 "Cannot specify both OR REPLACE and IF NOT EXISTS within single create statement",
398 ));
399 }
400 match self.name(inner) {
401 "CreateTableStmt" => self.create_table_statement(inner, or_replace, temporary),
402 "CreateViewStmt" => self.create_view_statement(inner, or_replace, temporary),
403 _ => self.unsupported(inner),
404 }
405 }
406
407 fn create_table_statement(
409 &mut self,
410 inner: u32,
411 or_replace: bool,
412 temporary: bool,
413 ) -> Result<Statement> {
414 let name = self.name_parts(self.find(inner, "QualifiedName"));
415 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
416 let definition = self.find(inner, "CreateTableDefinition");
417 let body = self.first(definition);
418 let (columns, query) = match self.name(body) {
419 "CreateColumnList" => (self.column_list(body)?, NONE),
420 "CreateTableAs" => self.create_table_as(body)?,
421 _ => return self.unsupported(body),
422 };
423 let index = self.ast.create_tables.len() as u32;
424 self.ast.create_tables.push(CreateTable {
425 name,
426 columns,
427 query,
428 if_not_exists,
429 or_replace,
430 temporary,
431 });
432 Ok(Statement::CreateTable(index))
433 }
434
435 fn create_view_statement(
442 &mut self,
443 inner: u32,
444 or_replace: bool,
445 temporary: bool,
446 ) -> Result<Statement> {
447 for kid in self.kids(inner) {
448 if matches!(self.name(kid), "CreateSecure" | "CreateRecursive" | "WithList") {
452 return self.unsupported(kid);
453 }
454 }
455 let name = self.name_parts(self.find(inner, "QualifiedName"));
456 let if_not_exists = self.find(inner, "IfNotExists") != NONE;
457 let list = self.find(inner, "InsertColumnList");
458 let columns = if list == NONE {
459 Slice::default()
460 } else {
461 let mut parts = Vec::new();
462 for kid in self.kids(self.find(list, "ColumnList")) {
463 parts.push(self.identifier(kid));
464 }
465 self.part_slice(parts)
466 };
467 let body = self.find(inner, "SelectStatementInternal");
468 let sql = self.text(body).to_string();
469 let sql = self.intern(&sql);
470 let query = self.query(body)?;
471 let index = self.ast.create_views.len() as u32;
472 self.ast.create_views.push(CreateView {
473 name,
474 columns,
475 query,
476 sql,
477 if_not_exists,
478 or_replace,
479 temporary,
480 });
481 Ok(Statement::CreateView(index))
482 }
483
484 fn column_list(&mut self, node: u32) -> Result<Slice> {
486 for kid in self.kids(node) {
487 if matches!(self.name(kid), "PartitionOptions" | "SortedOptions" | "WithList") {
488 return self.unsupported(kid);
489 }
490 }
491 let list = self.find(node, "CreateTableColumnList");
492 if list == NONE {
493 return Ok(Slice::default());
496 }
497 let mut defs = Vec::new();
498 for element in self.kids(list) {
499 let inner = self.first(element);
500 if self.name(inner) != "CreateTableColumnDefinition" {
501 return self.unsupported(inner);
505 }
506 defs.push(self.column_definition(self.first(inner))?);
507 }
508 Ok(self.column_def_slice(defs))
509 }
510
511 fn column_definition(&mut self, node: u32) -> Result<ColumnDef> {
514 let name = self.identifier(self.find(node, "DottedIdentifier"));
515 let type_node = self.find(node, "Type");
516 let ty = if type_node == NONE {
517 NONE
518 } else {
519 let text = self.text(type_node).to_string();
520 self.intern(&text)
521 };
522 if self.find(node, "GeneratedColumn") != NONE {
523 return self.unsupported(self.find(node, "GeneratedColumn"));
524 }
525 let mut not_null = false;
526 for kid in self.kids(node) {
527 if self.name(kid) != "ColumnConstraint" {
528 continue;
529 }
530 let constraint = self.first(kid);
531 match self.name(constraint) {
532 "NotNullConstraint" => {
533 not_null = self.name(self.first(constraint)) == "NotNullColumnConstraint";
534 }
535 _ => return self.unsupported(constraint),
536 }
537 }
538 Ok(ColumnDef { name, ty, not_null })
539 }
540
541 fn create_table_as(&mut self, node: u32) -> Result<(Slice, QueryRef)> {
547 for kid in self.kids(node) {
548 if matches!(
549 self.name(kid),
550 "PartitionOptions" | "SortedOptions" | "WithList" | "WithData"
551 ) {
552 return self.unsupported(kid);
553 }
554 }
555 let names = self.find(node, "IdentifierList");
556 let columns = if names == NONE {
557 Slice::default()
558 } else {
559 let mut defs = Vec::new();
560 for kid in self.kids(names) {
561 let name = self.identifier(kid);
562 defs.push(ColumnDef { name, ty: NONE, not_null: false });
563 }
564 self.column_def_slice(defs)
565 };
566 let statement = self.find(node, "Statement");
567 let inner = self.first(statement);
568 if self.name(inner) != "SelectStatement" {
569 return self.unsupported(inner);
570 }
571 let query = self.query(self.first(inner))?;
572 Ok((columns, query))
573 }
574
575 fn drop_statement(&mut self, node: u32) -> Result<Statement> {
581 if self.find(node, "DropBehavior") != NONE {
582 return self.unsupported(self.find(node, "DropBehavior"));
583 }
584 let entries = self.find(node, "DropEntries");
585 let inner = self.first(entries);
586 if self.name(inner) != "DropTable" {
587 return self.unsupported(inner);
588 }
589 let kind = self.find(inner, "TableOrView");
590 let view = match self.name(self.first(kind)) {
591 "CommentTable" => false,
592 "CommentView" => true,
593 _ => return self.unsupported(kind),
594 };
595 let if_exists = self.find(inner, "IfExists") != NONE;
596 let mut names = Vec::new();
597 for kid in self.kids(inner) {
598 if self.name(kid) == "BaseTableName" {
599 names.push(self.name_parts(kid));
600 }
601 }
602 let names = self.name_list_slice(names);
603 let index = self.ast.drop_tables.len() as u32;
604 self.ast.drop_tables.push(DropTable { names, if_exists, view });
605 Ok(Statement::DropTable(index))
606 }
607
608 fn insert_statement(&mut self, node: u32) -> Result<Statement> {
615 for kid in self.kids(node) {
616 if matches!(
617 self.name(kid),
618 "InsertTarget" | "InsertColumnList" | "InsertValues" | "WithClause"
619 ) {
620 continue;
621 }
622 return self.unsupported(kid);
623 }
624 if self.find(node, "WithClause") != NONE {
625 return self.unsupported(self.find(node, "WithClause"));
626 }
627 let name = self.name_parts(self.find(self.find(node, "InsertTarget"), "BaseTableName"));
628 let list = self.find(node, "InsertColumnList");
629 let columns = if list == NONE {
630 Slice::default()
631 } else {
632 let mut parts = Vec::new();
633 for kid in self.kids(self.find(list, "ColumnList")) {
634 parts.push(self.identifier(kid));
635 }
636 self.part_slice(parts)
637 };
638 let values = self.find(node, "InsertValues");
639 let inner = self.first(values);
640 if self.name(inner) != "SelectInsertValues" {
641 return self.unsupported(inner);
642 }
643 let source = self.query(self.find(inner, "SelectStatementInternal"))?;
644 let index = self.ast.inserts.len() as u32;
645 self.ast.inserts.push(Insert { name, columns, source });
646 Ok(Statement::Insert(index))
647 }
648
649 fn query(&mut self, node: u32) -> Result<QueryRef> {
651 if self.find(node, "WithClause") != NONE {
652 return self.unsupported(self.find(node, "WithClause"));
653 }
654 let chain = self.find(node, "SelectSetOpChain");
655 if chain == NONE {
656 return self.unsupported(node);
657 }
658 let query = self.set_op_chain(chain)?;
659 let modifiers = self.find(node, "ResultModifiers");
660 if modifiers != NONE {
661 self.result_modifiers(query, modifiers)?;
662 }
663 Ok(query)
664 }
665
666 fn set_op_chain(&mut self, node: u32) -> Result<QueryRef> {
668 let mut kids = self.kids(node);
669 let head = kids.next().unwrap_or(NONE);
670 let mut left = self.intersect_chain(head)?;
671 for tail in kids {
672 let clause = self.first(tail);
674 let (op, quantifier, by_name) = self.setop_clause(clause)?;
675 let right = self.intersect_chain(self.nth(tail, 1))?;
676 left = self.push_query(Query::bare(QueryBody::SetOp {
677 op,
678 quantifier,
679 by_name,
680 left,
681 right,
682 }));
683 }
684 Ok(left)
685 }
686
687 fn intersect_chain(&mut self, node: u32) -> Result<QueryRef> {
689 let mut kids = self.kids(node);
690 let head = kids.next().unwrap_or(NONE);
691 let mut left = self.select_atom(head)?;
692 for tail in kids {
693 let clause = self.first(tail);
695 let quantifier = self.quantifier(self.find(clause, "DistinctOrAll"));
696 let right = self.select_atom(self.nth(tail, 1))?;
697 left = self.push_query(Query::bare(QueryBody::SetOp {
698 op: SetOp::Intersect,
699 quantifier,
700 by_name: false,
701 left,
702 right,
703 }));
704 }
705 Ok(left)
706 }
707
708 fn setop_clause(&mut self, node: u32) -> Result<(SetOp, Quantifier, bool)> {
710 let kind = self.find(node, "SetopType");
711 let op = match self.name(self.first(kind)) {
712 "SetopUnion" => SetOp::Union,
713 "SetopExcept" => SetOp::Except,
714 _ => return self.unsupported(kind),
715 };
716 let quantifier = self.quantifier(self.find(node, "DistinctOrAll"));
717 Ok((op, quantifier, self.find(node, "ByName") != NONE))
718 }
719
720 fn quantifier(&self, node: u32) -> Quantifier {
722 if node == NONE {
723 return Quantifier::Unstated;
724 }
725 match self.name(self.first(node)) {
726 "DistinctKeyword" => Quantifier::Distinct,
727 "AllKeyword" => Quantifier::All,
728 _ => Quantifier::Unstated,
729 }
730 }
731
732 fn select_atom(&mut self, node: u32) -> Result<QueryRef> {
734 let inner = self.first(node);
735 match self.name(inner) {
736 "SelectParens" => self.query(self.first(inner)),
739 "SelectStatementType" => {
740 let kind = self.first(inner);
741 match self.name(kind) {
742 "OptionalParensSimpleSelect" => {
743 let select = self.simple_select(self.unwrap_parens(kind))?;
744 Ok(self.push_query(Query::bare(QueryBody::Select(select))))
745 }
746 "ValuesClause" => {
747 let rows = self.values_clause(kind)?;
748 Ok(self.push_query(Query::bare(QueryBody::Values(rows))))
749 }
750 "DescribeStatement" => self.describe_statement(kind),
751 _ => self.unsupported(kind),
752 }
753 }
754 _ => self.unsupported(inner),
755 }
756 }
757
758 fn describe_statement(&mut self, node: u32) -> Result<QueryRef> {
771 let inner = self.first(node);
772 match self.name(inner) {
773 "DescribeSelect" => {
774 self.describe_and_not_summarize(inner)?;
775 let query = self.query(self.find(inner, "SelectStatementInternal"))?;
776 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
777 }
778 "DescribeByName" => {
779 self.describe_and_not_summarize(inner)?;
780 let target = self.find(inner, "DescribeTarget");
781 if target == NONE {
782 return self.unsupported(inner);
783 }
784 let source = self.describe_target(target)?;
785 let query = self.star_over(source);
786 Ok(self.push_query(Query::bare(QueryBody::Describe(query))))
787 }
788 _ => self.unsupported(inner),
789 }
790 }
791
792 fn describe_and_not_summarize(&mut self, node: u32) -> Result<()> {
794 let word = self.find(node, "DescribeOrSummarize");
795 if word == NONE || self.name(self.first(word)) != "DescribeRule" {
796 return self.unsupported(if word == NONE { node } else { word });
797 }
798 Ok(())
799 }
800
801 fn describe_target(&mut self, node: u32) -> Result<SourceRef> {
807 let inner = self.first(node);
808 let name = match self.name(inner) {
809 "DescribeBaseTableName" => self.name_parts(self.find(inner, "BaseTableName")),
810 "DescribeStringLiteral" => {
811 let text = self.string_value(self.find(inner, "StringLiteral"))?;
812 let part = self.intern(&text);
813 self.part_slice(vec![part])
814 }
815 _ => return self.unsupported(inner),
816 };
817 Ok(self.push_source(Source::Table { name, alias: NONE, columns: Slice::default() }))
818 }
819
820 fn star_over(&mut self, source: SourceRef) -> QueryRef {
822 let star =
823 self.push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
824 let targets = self.target_slice(vec![Target { expr: star, alias: NONE }]);
825 let start = self.ast.source_lists.len() as u32;
826 self.ast.source_lists.push(source);
827 let from = Slice { start, len: 1 };
828 let select = self.push_select(Select { targets, from, ..Select::empty() });
829 self.push_query(Query::bare(QueryBody::Select(select)))
830 }
831
832 fn values_clause(&mut self, node: u32) -> Result<Slice> {
838 let mut rows = Vec::new();
839 for kid in self.kids(node) {
840 if self.name(kid) != "ValuesExpressions" {
841 continue;
842 }
843 let mut items = Vec::new();
844 for expr in self.kids(kid) {
845 items.push(self.expr(expr)?);
846 }
847 let slice = self.expr_slice(items);
848 rows.push(slice);
849 }
850 let start = self.ast.rows.len() as u32;
851 self.ast.rows.extend(rows);
852 Ok(Slice { start, len: self.ast.rows.len() as u32 - start })
853 }
854
855 fn unwrap_parens(&self, node: u32) -> u32 {
857 let mut node = self.first(node);
858 while self.name(node) == "SimpleSelectParens" {
859 node = self.first(node);
860 }
861 node
862 }
863
864 fn result_modifiers(&mut self, query: QueryRef, node: u32) -> Result<()> {
866 let order = self.find(node, "OrderByClause");
867 if order != NONE {
868 let (items, all) = self.order_by(order)?;
869 let start = self.ast.order_items.len() as u32;
870 self.ast.order_items.extend(items);
871 self.ast.queries[query as usize].order_by =
872 Slice { start, len: self.ast.order_items.len() as u32 - start };
873 self.ast.queries[query as usize].order_by_all = all;
874 }
875 let limit = self.find(node, "LimitOffset");
876 if limit != NONE {
877 self.limit_offset(query, self.first(limit))?;
878 }
879 Ok(())
880 }
881
882 fn limit_offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
884 match self.name(node) {
885 "LimitOffsetClause" | "OffsetLimitClause" => {
886 let limit = self.find(node, "LimitClause");
887 if limit != NONE {
888 self.limit(query, limit)?;
889 }
890 let offset = self.find(node, "OffsetClause");
891 if offset != NONE {
892 self.offset(query, offset)?;
893 }
894 Ok(())
895 }
896 _ => self.unsupported(node),
897 }
898 }
899
900 fn limit(&mut self, query: QueryRef, node: u32) -> Result<()> {
902 let value = self.first(node);
903 let inner = self.first(value);
904 match self.name(inner) {
905 "LimitAll" => Ok(()),
907 "LimitExpression" => {
911 let expr = self.expr(self.first(inner))?;
912 self.ast.queries[query as usize].limit = expr;
913 self.ast.queries[query as usize].limit_percent = self.text(inner).ends_with('%');
914 Ok(())
915 }
916 "LimitLiteralPercent" => {
917 let expr = self.expr(self.first(inner))?;
918 self.ast.queries[query as usize].limit = expr;
919 self.ast.queries[query as usize].limit_percent = true;
920 Ok(())
921 }
922 _ => self.unsupported(inner),
923 }
924 }
925
926 fn offset(&mut self, query: QueryRef, node: u32) -> Result<()> {
928 let value = self.first(node);
929 let expr = self.expr(self.first(value))?;
930 self.ast.queries[query as usize].offset = expr;
931 Ok(())
932 }
933
934 fn simple_select(&mut self, node: u32) -> Result<SelectRef> {
937 for name in ["WindowClause", "QualifyClause", "SampleClause"] {
938 let clause = self.find(node, name);
939 if clause != NONE {
940 return self.unsupported(clause);
941 }
942 }
943 let mut select = Select::empty();
944 self.select_from(&mut select, self.first(node))?;
945 let filter = self.find(node, "WhereClause");
946 if filter != NONE {
947 select.filter = self.expr(self.first(filter))?;
948 }
949 let group = self.find(node, "GroupByClause");
950 if group != NONE {
951 self.group_by(&mut select, self.first(group))?;
952 }
953 let having = self.find(node, "HavingClause");
954 if having != NONE {
955 select.having = self.expr(self.first(having))?;
956 }
957 Ok(self.push_select(select))
958 }
959
960 fn select_from(&mut self, select: &mut Select, node: u32) -> Result<()> {
963 let clause = self.first(node);
964 let targets = self.find(clause, "SelectClause");
965 let from = self.find(clause, "FromClause");
966 if from != NONE {
967 select.from = self.sources(from)?;
968 }
969 if targets == NONE {
970 let star = self
974 .push(Expr::Star { qualifier: Slice::default(), replacements: Slice::default() });
975 let start = self.ast.targets.len() as u32;
976 self.ast.targets.push(Target { expr: star, alias: NONE });
977 select.targets = Slice { start, len: 1 };
978 return Ok(());
979 }
980 self.select_clause(select, targets)
981 }
982
983 fn select_clause(&mut self, select: &mut Select, node: u32) -> Result<()> {
985 let distinct = self.find(node, "DistinctClause");
986 if distinct != NONE {
987 let inner = self.first(distinct);
988 select.distinct = match self.name(inner) {
989 "DistinctAll" => Distinct::No,
991 "DistinctOn" => {
992 let on = self.find(inner, "DistinctOnTargets");
993 if on == NONE {
994 Distinct::Yes
995 } else {
996 let mut items = Vec::new();
997 for kid in self.kids(on) {
998 items.push(self.expr(kid)?);
999 }
1000 Distinct::On(self.expr_slice(items))
1001 }
1002 }
1003 _ => return self.unsupported(inner),
1004 };
1005 }
1006 let list = self.find(node, "TargetList");
1007 if list == NONE {
1008 return Ok(());
1009 }
1010 let mut targets = Vec::new();
1011 for kid in self.kids(list) {
1012 targets.push(self.target(kid)?);
1013 }
1014 select.targets = self.target_slice(targets);
1015 Ok(())
1016 }
1017
1018 fn target(&mut self, node: u32) -> Result<Target> {
1020 let inner = self.first(node);
1021 match self.name(inner) {
1022 "ColIdExpression" => {
1024 let alias = self.identifier(self.first(inner));
1025 let expr = self.expr(self.nth(inner, 1))?;
1026 Ok(Target { expr, alias })
1027 }
1028 "ExpressionAsCollabel" => {
1029 let expr = self.expr(self.first(inner))?;
1030 let alias = self.identifier(self.nth(inner, 1));
1031 Ok(Target { expr, alias })
1032 }
1033 "ExpressionOptIdentifier" => {
1034 let expr = self.expr(self.first(inner))?;
1035 let alias =
1036 if self.count(inner) > 1 { self.identifier(self.nth(inner, 1)) } else { NONE };
1037 Ok(Target { expr, alias })
1038 }
1039 _ => self.unsupported(inner),
1040 }
1041 }
1042
1043 fn group_by(&mut self, select: &mut Select, node: u32) -> Result<()> {
1045 let inner = self.first(node);
1046 match self.name(inner) {
1047 "GroupByAll" => {
1048 select.group_by_all = true;
1049 Ok(())
1050 }
1051 "GroupByList" => {
1052 let mut items = Vec::new();
1053 for kid in self.kids(inner) {
1054 let expression = self.first(kid);
1057 if self.name(expression) != "GroupByBaseExpression" {
1058 return self.unsupported(expression);
1059 }
1060 items.push(self.expr(self.first(expression))?);
1061 }
1062 select.group_by = self.expr_slice(items);
1063 Ok(())
1064 }
1065 _ => self.unsupported(inner),
1066 }
1067 }
1068
1069 fn order_by(&mut self, node: u32) -> Result<(Vec<OrderItem>, bool)> {
1072 let inner = self.first(self.first(node));
1073 match self.name(inner) {
1074 "OrderByAll" => {
1075 let (order, nulls) = self.sort_options(inner);
1076 Ok((vec![OrderItem { expr: NONE, order, nulls }], true))
1077 }
1078 "OrderByExpressionList" => {
1079 let mut items = Vec::new();
1080 for kid in self.kids(inner) {
1081 let expr = self.expr(self.first(kid))?;
1083 let (order, nulls) = self.sort_options(kid);
1084 items.push(OrderItem { expr, order, nulls });
1085 }
1086 Ok((items, false))
1087 }
1088 _ => self.unsupported(inner),
1089 }
1090 }
1091
1092 fn sort_options(&self, node: u32) -> (Order, Nulls) {
1094 let direction = self.find(node, "DescOrAsc");
1095 let order = if direction == NONE {
1096 Order::Unstated
1097 } else if self.name(self.first(direction)) == "DescendingOrder" {
1098 Order::Descending
1099 } else {
1100 Order::Ascending
1101 };
1102 let placement = self.find(node, "NullsFirstOrLast");
1103 let nulls = if placement == NONE {
1104 Nulls::Unstated
1105 } else if self.name(self.first(placement)) == "NullsFirst" {
1106 Nulls::First
1107 } else {
1108 Nulls::Last
1109 };
1110 (order, nulls)
1111 }
1112
1113 fn sources(&mut self, node: u32) -> Result<Slice> {
1117 let mut items = Vec::new();
1118 for kid in self.kids(node) {
1119 items.push(self.table_ref(kid)?);
1120 }
1121 let start = self.ast.source_lists.len() as u32;
1122 self.ast.source_lists.extend(items);
1123 Ok(Slice { start, len: self.ast.source_lists.len() as u32 - start })
1124 }
1125
1126 fn table_ref(&mut self, node: u32) -> Result<SourceRef> {
1128 let mut kids = self.kids(node);
1129 let head = kids.next().unwrap_or(NONE);
1130 let mut left = self.inner_table_ref(head)?;
1131 for tail in kids {
1132 let clause = self.first(tail);
1133 if self.name(clause) != "JoinClause" {
1134 return self.unsupported(clause);
1135 }
1136 left = self.join(left, self.first(clause))?;
1137 }
1138 Ok(left)
1139 }
1140
1141 fn inner_table_ref(&mut self, node: u32) -> Result<SourceRef> {
1143 let inner = if self.name(node) == "InnerTableRef" { self.first(node) } else { node };
1144 match self.name(inner) {
1145 "BaseTableRef" => {
1146 if self.find(inner, "TableAliasColon") != NONE {
1147 return self.unsupported(inner);
1148 }
1149 for name in ["AtClause", "SampleClause"] {
1150 let clause = self.find(inner, name);
1151 if clause != NONE {
1152 return self.unsupported(clause);
1153 }
1154 }
1155 let name = self.name_parts(self.find(inner, "BaseTableName"));
1156 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1157 Ok(self.push_source(Source::Table { name, alias, columns }))
1158 }
1159 "TableSubquery" => {
1160 if self.find(inner, "TableAliasColon") != NONE
1161 || self.find(inner, "Lateral") != NONE
1162 {
1163 return self.unsupported(inner);
1164 }
1165 let reference = self.find(inner, "SubqueryReference");
1167 let query = self.query(self.first(reference))?;
1168 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1169 Ok(self.push_source(Source::Subquery { query, alias, columns }))
1170 }
1171 "TableFunction" => {
1176 let form = self.first(inner);
1177 for name in ["TableAliasColon", "Lateral", "WithOrdinality", "SampleClause"] {
1178 let clause = self.find(form, name);
1179 if clause != NONE {
1180 return self.unsupported(clause);
1181 }
1182 }
1183 let name = self.name_parts(self.find(form, "QualifiedTableFunction"));
1184 let mut args = Vec::new();
1185 let list = self.find(form, "TableFunctionArguments");
1188 for kid in self.kids(list) {
1189 args.push(self.table_argument(kid)?);
1190 }
1191 let args = self.target_slice(args);
1192 let (alias, columns) = self.table_alias(self.find(form, "TableAlias"));
1193 Ok(self.push_source(Source::Function { name, args, alias, columns }))
1194 }
1195 "ValuesRef" => {
1196 if self.find(inner, "TableAliasColon") != NONE {
1197 return self.unsupported(inner);
1198 }
1199 let rows = self.values_clause(self.find(inner, "ValuesClause"))?;
1200 let (alias, columns) = self.table_alias(self.find(inner, "TableAlias"));
1201 Ok(self.push_source(Source::Values { rows, alias, columns }))
1202 }
1203 "ParensTableRef" => {
1204 if self.find(inner, "TableAliasColon") != NONE
1205 || self.find(inner, "SampleClause") != NONE
1206 || self.find(inner, "TableAlias") != NONE
1207 {
1208 return self.unsupported(inner);
1209 }
1210 self.table_ref(self.find(inner, "TableRef"))
1211 }
1212 _ => self.unsupported(inner),
1213 }
1214 }
1215
1216 fn table_alias(&mut self, node: u32) -> (StrRef, Slice) {
1218 if node == NONE {
1219 return (NONE, Slice::default());
1220 }
1221 let inner = self.first(node);
1222 let alias = self.identifier(self.first(inner));
1223 let list = self.find(inner, "ColumnAliases");
1224 if list == NONE {
1225 return (alias, Slice::default());
1226 }
1227 let mut columns = Vec::new();
1228 for kid in self.kids(list) {
1229 let name = self.identifier(kid);
1230 columns.push(name);
1231 }
1232 (alias, self.part_slice(columns))
1233 }
1234
1235 fn join(&mut self, left: SourceRef, node: u32) -> Result<SourceRef> {
1237 match self.name(node) {
1238 "RegularJoinClause" => {
1240 if self.find(node, "Asof") != NONE {
1241 return self.unsupported(node);
1242 }
1243 let kind = self.join_type(self.find(node, "JoinType"));
1244 let right = self.table_ref(self.find(node, "TableRef"))?;
1245 let (on, using) = self.join_qualifier(self.find(node, "JoinQualifier"))?;
1246 Ok(self.push_source(Source::Join { left, right, kind, natural: false, on, using }))
1247 }
1248 "JoinWithoutOnClause" => {
1251 let prefix = self.first(self.find(node, "JoinPrefix"));
1252 let (kind, natural) = match self.name(prefix) {
1253 "CrossJoinPrefix" => (JoinKind::Cross, false),
1254 "PositionalJoinPrefix" => (JoinKind::Positional, false),
1255 "NaturalJoinPrefix" => (self.join_type(self.find(prefix, "JoinType")), true),
1256 _ => return self.unsupported(prefix),
1257 };
1258 let right = self.inner_table_ref(self.find(node, "InnerTableRef"))?;
1259 Ok(self.push_source(Source::Join {
1260 left,
1261 right,
1262 kind,
1263 natural,
1264 on: NONE,
1265 using: Slice::default(),
1266 }))
1267 }
1268 _ => self.unsupported(node),
1269 }
1270 }
1271
1272 fn join_type(&self, node: u32) -> JoinKind {
1275 if node == NONE {
1276 return JoinKind::Inner;
1277 }
1278 match self.name(self.first(node)) {
1279 "FullJoin" => JoinKind::Full,
1280 "LeftJoin" => JoinKind::Left,
1281 "RightJoin" => JoinKind::Right,
1282 "SemiJoin" => JoinKind::Semi,
1283 "AntiJoin" => JoinKind::Anti,
1284 _ => JoinKind::Inner,
1285 }
1286 }
1287
1288 fn join_qualifier(&mut self, node: u32) -> Result<(ExprRef, Slice)> {
1290 let inner = self.first(node);
1291 match self.name(inner) {
1292 "OnClause" => Ok((self.expr(self.first(inner))?, Slice::default())),
1293 "UsingClause" => {
1294 let mut columns = Vec::new();
1295 for kid in self.kids(inner) {
1296 let name = self.identifier(kid);
1297 columns.push(name);
1298 }
1299 Ok((NONE, self.part_slice(columns)))
1300 }
1301 _ => self.unsupported(inner),
1302 }
1303 }
1304
1305 fn expr(&mut self, node: u32) -> Result<ExprRef> {
1323 let mut node = node;
1324 loop {
1325 let count = self.count(node);
1326 let name = self.name(node);
1327 match name {
1328 "LogicalOrExpression" if count > 1 => return self.logical(node, BinaryOp::Or),
1329 "LogicalAndExpression" if count > 1 => return self.logical(node, BinaryOp::And),
1330 "LogicalNotExpression" if count > 1 => return self.logical_not(node),
1331 "IsExpression" if count > 1 => return self.is_expression(node),
1332 "BetweenInLikeExpression" if count > 1 => return self.between_in_like(node),
1333 "PrefixExpression" if count > 1 => return self.prefix(node),
1334 "BaseExpression" if count > 1 => return self.indirection(node),
1335 "LambdaArrowExpression"
1336 | "IsDistinctFromExpression"
1337 | "ComparisonExpression"
1338 | "OtherOperatorExpression"
1339 | "BitwiseExpression"
1340 | "AdditiveExpression"
1341 | "MultiplicativeExpression"
1342 | "ExponentiationExpression"
1343 | "CollateExpression"
1344 | "AtTimeZoneExpression"
1345 if count > 1 =>
1346 {
1347 return self.tail_chain(node);
1348 }
1349 "ColumnReference" => {
1350 let name = self.name_parts(node);
1351 return Ok(self.push(Expr::Column { name }));
1352 }
1353 "StarExpression" => return self.star(node),
1354 "NumberLiteral" => {
1355 let text = self.text(node).to_string();
1356 let text = self.intern(&text);
1357 return Ok(self.push(Expr::Literal { kind: LiteralKind::Number, text }));
1358 }
1359 "StringLiteral" => return self.string_literal(node),
1360 "NullLiteral" | "TrueLiteral" | "FalseLiteral" => {
1361 let kind = match name {
1362 "NullLiteral" => LiteralKind::Null,
1363 "TrueLiteral" => LiteralKind::True,
1364 _ => LiteralKind::False,
1365 };
1366 return Ok(self.push(Expr::Literal { kind, text: NONE }));
1367 }
1368 "FunctionExpression" => return self.function(node),
1369 "CoalesceExpression" => return self.coalesce(node),
1370 "NullIfExpression" => return self.null_if(node),
1371 "SubstringExpression" => return self.substring(node),
1372 "PositionExpression" => return self.position(node),
1373 "TrimExpression" => return self.trim(node),
1374 "OverlayExpression" => return self.overlay(node),
1375 "ExtractExpression" => return self.extract(node),
1376 "CastExpression" => return self.cast(node),
1377 "TypeLiteral" => return self.typed_literal(node),
1378 "IntervalLiteral" => return self.interval_literal(node),
1379 "CaseExpression" => return self.case(node),
1380 "ParenthesisExpression" => return self.row(node),
1381 "ParensExpression" if count == 1 => node = self.first(node),
1387 "BoundedListExpression" => return self.list(node),
1388 "QuestionMarkNumberedParameter"
1389 | "AnonymousParameter"
1390 | "NumberedParameter"
1391 | "ColLabelParameter" => return self.parameter(node),
1392 "SubqueryExpression" => return self.subquery(node),
1393 _ if count == 1 && self.text(self.first(node)) == self.text(node) => {
1394 node = self.first(node);
1395 }
1396 _ => return self.unsupported(node),
1397 }
1398 }
1399 }
1400
1401 fn tail_chain(&mut self, node: u32) -> Result<ExprRef> {
1403 let mut kids = self.kids(node);
1404 let head = kids.next().unwrap_or(NONE);
1405 let mut left = self.expr(head)?;
1406 for tail in kids {
1407 let operator = self.first(tail);
1408 let op = self.binary_op(operator)?;
1409 let operand = self.kids(tail).last().unwrap_or(NONE);
1413 if self.count(tail) > 2 {
1414 return self.unsupported(tail);
1415 }
1416 let right = self.expr(operand)?;
1417 left = self.push(Expr::Binary { op, left, right });
1418 }
1419 Ok(left)
1420 }
1421
1422 fn binary_op(&mut self, node: u32) -> Result<BinaryOp> {
1424 let mut leaf = node;
1430 while self.count(leaf) == 1 {
1431 leaf = self.first(leaf);
1432 }
1433 let text = self.text(node);
1434 let upper = text.to_ascii_uppercase();
1435 let op = match upper.as_str() {
1436 "OR" => BinaryOp::Or,
1437 "AND" => BinaryOp::And,
1438 "=" | "==" => BinaryOp::Eq,
1439 "!=" | "<>" => BinaryOp::NotEq,
1440 "<" => BinaryOp::Lt,
1441 ">" => BinaryOp::Gt,
1442 "<=" => BinaryOp::LtEq,
1443 ">=" => BinaryOp::GtEq,
1444 "+" => BinaryOp::Add,
1445 "-" => BinaryOp::Subtract,
1446 "*" => BinaryOp::Multiply,
1447 "/" => BinaryOp::Divide,
1448 "//" => BinaryOp::IntegerDivide,
1449 "%" => BinaryOp::Modulo,
1450 "^" | "**" => BinaryOp::Power,
1451 "&" => BinaryOp::BitAnd,
1452 "|" => BinaryOp::BitOr,
1453 "<<" => BinaryOp::ShiftLeft,
1454 ">>" => BinaryOp::ShiftRight,
1455 "||" => BinaryOp::Concat,
1456 "COLLATE" => BinaryOp::Collate,
1457 "->" => BinaryOp::Arrow,
1458 "->>" => BinaryOp::LongArrow,
1459 "@>" => BinaryOp::Contains,
1460 "<@" => BinaryOp::ContainedBy,
1461 "&&" => BinaryOp::Overlaps,
1462 "^@" => BinaryOp::StartsWith,
1463 "<<=" => BinaryOp::InetContainedByOrEq,
1464 ">>=" => BinaryOp::InetContainsOrEq,
1465 _ if self.name(leaf) == "AtTimeZoneOperator" => BinaryOp::AtTimeZone,
1466 _ if self.name(leaf) == "IsDistinctFromOp" => {
1469 if upper.split_whitespace().any(|word| word == "NOT") {
1470 BinaryOp::IsNotDistinctFrom
1471 } else {
1472 BinaryOp::IsDistinctFrom
1473 }
1474 }
1475 _ if self.name(leaf) == "OperatorLiteral" => {
1482 let interned = self.intern(text);
1483 BinaryOp::Named(interned)
1484 }
1485 _ => return self.unsupported(node),
1486 };
1487 Ok(op)
1488 }
1489
1490 fn logical(&mut self, node: u32, op: BinaryOp) -> Result<ExprRef> {
1495 let mut kids = self.kids(node);
1496 let head = kids.next().unwrap_or(NONE);
1497 let mut left = self.expr(head)?;
1498 for tail in kids {
1499 let right = self.expr(self.first(tail))?;
1500 left = self.push(Expr::Binary { op, left, right });
1501 }
1502 Ok(left)
1503 }
1504
1505 fn logical_not(&mut self, node: u32) -> Result<ExprRef> {
1510 let negations = self.count(self.first(node));
1511 let mut expr = self.expr(self.nth(node, 1))?;
1512 for _ in 0..negations {
1513 expr = self.push(Expr::Unary { op: UnaryOp::Not, operand: expr });
1514 }
1515 Ok(expr)
1516 }
1517
1518 fn is_expression(&mut self, node: u32) -> Result<ExprRef> {
1520 let mut kids = self.kids(node);
1521 let head = kids.next().unwrap_or(NONE);
1522 let mut expr = self.expr(head)?;
1523 for test in kids {
1524 let inner = self.first(test);
1525 let negated = self.text(inner).to_ascii_uppercase().contains("NOT");
1526 let op = match self.name(inner) {
1527 "NotNull" => UnaryOp::IsNotNull,
1528 "IsNull" => UnaryOp::IsNull,
1529 "IsLiteral" => match self.name(self.first(self.first(inner))) {
1532 "NullLiteral" if negated => UnaryOp::IsNotNull,
1533 "NullLiteral" => UnaryOp::IsNull,
1534 "TrueLiteral" if negated => UnaryOp::IsNotTrue,
1535 "TrueLiteral" => UnaryOp::IsTrue,
1536 "FalseLiteral" if negated => UnaryOp::IsNotFalse,
1537 "FalseLiteral" => UnaryOp::IsFalse,
1538 "UnknownLiteral" if negated => UnaryOp::IsNotUnknown,
1539 "UnknownLiteral" => UnaryOp::IsUnknown,
1540 _ => return self.unsupported(inner),
1541 },
1542 _ => return self.unsupported(inner),
1543 };
1544 expr = self.push(Expr::Unary { op, operand: expr });
1545 }
1546 Ok(expr)
1547 }
1548
1549 fn between_in_like(&mut self, node: u32) -> Result<ExprRef> {
1551 let operand = self.expr(self.first(node))?;
1552 let op = self.nth(node, 1);
1555 let negated = self.text(op).to_ascii_uppercase().starts_with("NOT");
1556 let inner = self.first(self.first(op));
1557 match self.name(inner) {
1558 "BetweenClause" => {
1560 let low = self.expr(self.first(inner))?;
1561 let high = self.expr(self.nth(inner, 1))?;
1562 Ok(self.push(Expr::Between { operand, low, high, negated }))
1563 }
1564 "InClause" => {
1566 let expression = self.first(self.first(inner));
1567 match self.name(expression) {
1568 "InExpressionList" => {
1569 let mut items = Vec::new();
1570 for kid in self.kids(expression) {
1571 items.push(self.expr(kid)?);
1572 }
1573 let list = self.expr_slice(items);
1574 Ok(self.push(Expr::In { operand, list, negated }))
1575 }
1576 _ => self.unsupported(expression),
1577 }
1578 }
1579 "LikeClause" => {
1581 if self.find(inner, "EscapeClause") != NONE {
1582 return self.unsupported(inner);
1583 }
1584 let variation = self.name(self.first(self.first(inner)));
1585 let op = match (variation, negated) {
1586 ("LikeToken", false) | ("NotLikeOp", true) => BinaryOp::Like,
1587 ("LikeToken", true) | ("NotLikeOp", false) => BinaryOp::NotLike,
1588 ("ILikeToken", false) | ("NotILikeOp", true) => BinaryOp::ILike,
1589 ("ILikeToken", true) | ("NotILikeOp", false) => BinaryOp::NotILike,
1590 ("GlobToken", _) => BinaryOp::Glob,
1593 ("RegexMatchToken", _) => BinaryOp::Regex,
1594 ("SimilarToToken", false) | ("NotSimilarToOp", true) => BinaryOp::SimilarTo,
1595 ("SimilarToToken", true) | ("NotSimilarToOp", false) => BinaryOp::NotSimilarTo,
1596 ("RegexInsensitiveMatchToken", false)
1597 | ("NotRegexInsensitiveMatchOp", true) => BinaryOp::RegexInsensitive,
1598 ("RegexInsensitiveMatchToken", true)
1599 | ("NotRegexInsensitiveMatchOp", false) => BinaryOp::NotRegexInsensitive,
1600 _ => return self.unsupported(inner),
1601 };
1602 let right = self.expr(self.nth(inner, 1))?;
1603 let expr = self.push(Expr::Binary { op, left: operand, right });
1604 if negated && matches!(op, BinaryOp::Glob | BinaryOp::Regex) {
1607 return Ok(self.push(Expr::Unary { op: UnaryOp::Not, operand: expr }));
1608 }
1609 Ok(expr)
1610 }
1611 _ => self.unsupported(inner),
1612 }
1613 }
1614
1615 fn prefix(&mut self, node: u32) -> Result<ExprRef> {
1617 let kids: Vec<u32> = self.kids(node).collect();
1618 let mut expr = self.expr(kids[kids.len() - 1])?;
1619 for &operator in kids[..kids.len() - 1].iter().rev() {
1620 let op = match self.name(self.first(operator)) {
1621 "MinusPrefixOperator" => UnaryOp::Negate,
1622 "PlusPrefixOperator" => UnaryOp::Plus,
1623 "TildePrefixOperator" => UnaryOp::BitNot,
1624 _ => return self.unsupported(operator),
1625 };
1626 expr = self.push(Expr::Unary { op, operand: expr });
1627 }
1628 Ok(expr)
1629 }
1630
1631 fn indirection(&mut self, node: u32) -> Result<ExprRef> {
1633 let mut expr = self.expr(self.first(node))?;
1634 for step in self.kids(self.nth(node, 1)) {
1635 let inner = self.first(step);
1636 expr = match self.name(inner) {
1637 "CastOperator" => {
1639 let text = self.text(self.first(inner)).to_string();
1640 let ty = self.intern(&text);
1641 self.push(Expr::Cast { operand: expr, ty, try_cast: false })
1642 }
1643 "DotOperator" => {
1644 let dot = self.first(inner);
1645 match self.name(dot) {
1646 "DotColumnOperator" => {
1651 let field = self.identifier(self.first(dot));
1652 let text = self.ast.string(field).to_string();
1653 let literal = self.intern(&text);
1654 let key = self
1655 .push(Expr::Literal { kind: LiteralKind::String, text: literal });
1656 let name = self.function_name("struct_extract");
1657 let args = self.expr_slice(vec![expr, key]);
1658 self.push(Expr::Function { name, args, distinct: false })
1659 }
1660 "DotMethodOperator" => {
1662 let method = self.first(dot);
1663 let text = self.text(self.first(method)).to_string();
1664 let text = unquote(&text);
1665 let name = self.function_name(&text);
1666 let mut args = vec![expr];
1667 let list = self.find(method, "MethodExpressionArguments");
1668 if list != NONE {
1669 let inner = self.first(list);
1670 let arguments = self.find(inner, "MethodFunctionArguments");
1671 if arguments != NONE {
1672 for kid in self.kids(arguments) {
1673 args.push(self.argument(kid)?);
1674 }
1675 }
1676 }
1677 let args = self.expr_slice(args);
1678 self.push(Expr::Function { name, args, distinct: false })
1679 }
1680 _ => return self.unsupported(dot),
1681 }
1682 }
1683 "SliceExpression" => self.subscript(inner, expr)?,
1688 "PostfixOperator" => {
1690 self.push(Expr::Unary { op: UnaryOp::Factorial, operand: expr })
1691 }
1692 _ => return self.unsupported(inner),
1693 };
1694 }
1695 Ok(expr)
1696 }
1697
1698 fn subscript(&mut self, node: u32, target: ExprRef) -> Result<ExprRef> {
1717 let bound = self.first(node);
1718 let (mut begin, mut end, mut step) = (NONE, NONE, NONE);
1719 for kid in self.kids(bound) {
1720 match self.name(kid) {
1721 "EndSliceBound" => end = kid,
1722 "StepSliceBound" => step = kid,
1723 _ => begin = kid,
1724 }
1725 }
1726 if end == NONE && step == NONE {
1727 if begin == NONE {
1728 return Err(Error::parser("Empty subscript '[]' is not allowed"));
1729 }
1730 let index = self.expr(begin)?;
1731 let name = self.function_name("array_extract");
1732 let args = self.expr_slice(vec![target, index]);
1733 return Ok(self.push(Expr::Function { name, args, distinct: false }));
1734 }
1735 let first = if begin == NONE { self.literal_number("1") } else { self.expr(begin)? };
1736 let value = if end == NONE { NONE } else { self.find(end, "EndSliceValue") };
1739 let written = if value == NONE { NONE } else { self.first(value) };
1740 let last = if written == NONE || self.name(written) == "EndSliceMinus" {
1741 self.literal_number("-1")
1742 } else {
1743 self.expr(written)?
1744 };
1745 let mut args = vec![target, first, last];
1746 if step != NONE {
1747 let by = self.first(step);
1748 args.push(if by == NONE {
1749 self.push(Expr::List { items: Slice::default() })
1750 } else {
1751 self.expr(by)?
1752 });
1753 }
1754 let name = self.function_name("array_slice");
1755 let args = self.expr_slice(args);
1756 Ok(self.push(Expr::Function { name, args, distinct: false }))
1757 }
1758
1759 fn literal_number(&mut self, digits: &str) -> ExprRef {
1761 let text = self.intern(digits);
1762 self.push(Expr::Literal { kind: LiteralKind::Number, text })
1763 }
1764
1765 fn function_name(&mut self, name: &str) -> Slice {
1767 let interned = self.intern(name);
1768 self.part_slice(vec![interned])
1769 }
1770
1771 fn star(&mut self, node: u32) -> Result<ExprRef> {
1773 for name in ["ExcludeList", "RenameList"] {
1774 let list = self.find(node, name);
1775 if list != NONE {
1776 return self.unsupported(list);
1777 }
1778 }
1779 let replace = self.find(node, "ReplaceList");
1780 let replacements =
1781 if replace == NONE { Slice::default() } else { self.replacements(replace)? };
1782 let qualifier = self.find(node, "StarQualifierList");
1783 let qualifier =
1784 if qualifier == NONE { Slice::default() } else { self.name_parts(qualifier) };
1785 Ok(self.push(Expr::Star { qualifier, replacements }))
1786 }
1787
1788 fn replacements(&mut self, node: u32) -> Result<Slice> {
1795 let entries = self.first(self.first(node));
1798 let listed: Vec<u32> =
1799 self.kids(entries).filter(|&kid| self.name(kid) == "ReplaceEntry").collect();
1800 let mut replacements = Vec::with_capacity(listed.len());
1801 for entry in listed {
1802 let expr = self.expr(self.first(entry))?;
1803 let alias = self.identifier(self.nth(entry, 1));
1804 let written = self.ast.string(alias).to_string();
1805 if replacements
1806 .iter()
1807 .any(|held: &Target| self.ast.string(held.alias).eq_ignore_ascii_case(&written))
1808 {
1809 return Err(Error::parser(format!(
1810 "Duplicate entry \"{written}\" in REPLACE list"
1811 )));
1812 }
1813 replacements.push(Target { expr, alias });
1814 }
1815 Ok(self.target_slice(replacements))
1816 }
1817
1818 fn function(&mut self, node: u32) -> Result<ExprRef> {
1821 for name in ["WithinGroupClause", "FilterClause", "ExportClause", "OverClause"] {
1822 let clause = self.find(node, name);
1823 if clause != NONE {
1824 return self.unsupported(clause);
1825 }
1826 }
1827 let name = self.name_parts(self.first(node));
1828 let list = self.first(self.nth(node, 1));
1832 for name in ["OrderByClause", "IgnoreOrRespectNulls"] {
1833 let clause = self.find(list, name);
1834 if clause != NONE {
1835 return self.unsupported(clause);
1836 }
1837 }
1838 let distinct = self.quantifier(self.find(list, "DistinctOrAll")) == Quantifier::Distinct;
1839 let mut args = Vec::new();
1840 let arguments = self.find(list, "FunctionArgumentList");
1841 if arguments != NONE {
1842 for kid in self.kids(arguments) {
1843 args.push(self.argument(kid)?);
1844 }
1845 }
1846 if self.ast.name(name).last().is_some_and(|part| part.eq_ignore_ascii_case("ifnull")) {
1852 if args.len() != 2 {
1853 return Err(Error::parser("Wrong number of arguments to IFNULL."));
1854 }
1855 let args = self.expr_slice(args);
1856 let name = self.function_name("coalesce");
1857 return Ok(self.push(Expr::Function { name, args, distinct }));
1858 }
1859 let args = self.expr_slice(args);
1860 Ok(self.push(Expr::Function { name, args, distinct }))
1861 }
1862
1863 fn coalesce(&mut self, node: u32) -> Result<ExprRef> {
1874 let mut args = Vec::new();
1875 for kid in self.kids(node) {
1876 args.push(self.expr(kid)?);
1877 }
1878 let args = self.expr_slice(args);
1879 let name = self.function_name("coalesce");
1880 Ok(self.push(Expr::Function { name, args, distinct: false }))
1881 }
1882
1883 fn null_if(&mut self, node: u32) -> Result<ExprRef> {
1893 let arguments = self.find(node, "NullIfArguments");
1894 if arguments == NONE {
1895 return self.unsupported(node);
1896 }
1897 let mut args = Vec::new();
1898 for kid in self.kids(arguments) {
1899 args.push(self.expr(kid)?);
1900 }
1901 let args = self.expr_slice(args);
1902 let name = self.function_name("nullif");
1903 Ok(self.push(Expr::Function { name, args, distinct: false }))
1904 }
1905
1906 fn substring(&mut self, node: u32) -> Result<ExprRef> {
1915 let shape = self.first(self.first(node));
1916 let mut args = Vec::new();
1917 match self.name(shape) {
1918 "SubstringExpressionList" => {
1919 for kid in self.kids(shape) {
1920 args.push(self.expr(kid)?);
1921 }
1922 }
1923 "SubstringParameters" => {
1924 args.push(self.expr(self.first(shape))?);
1925 let bounds = self.first(self.nth(shape, 1));
1929 let from = self.find(bounds, "FromExpression");
1930 let start =
1931 if from == NONE { self.number("1") } else { self.expr(self.first(from))? };
1932 args.push(start);
1933 let count = self.find(bounds, "ForExpression");
1934 if count != NONE {
1935 args.push(self.expr(self.first(count))?);
1936 }
1937 }
1938 _ => return self.unsupported(shape),
1939 }
1940 let args = self.expr_slice(args);
1941 let name = self.function_name("substring");
1942 Ok(self.push(Expr::Function { name, args, distinct: false }))
1943 }
1944
1945 fn position(&mut self, node: u32) -> Result<ExprRef> {
1952 let arguments = self.first(node);
1953 if self.count(arguments) != 2 {
1954 return self.unsupported(arguments);
1955 }
1956 let needle = self.expr(self.first(arguments))?;
1957 let haystack = self.expr(self.nth(arguments, 1))?;
1958 let args = self.expr_slice(vec![haystack, needle]);
1959 let name = self.function_name("position");
1960 Ok(self.push(Expr::Function { name, args, distinct: false }))
1961 }
1962
1963 fn trim(&mut self, node: u32) -> Result<ExprRef> {
1972 let arguments = self.first(node);
1973 let direction = self.find(arguments, "TrimDirection");
1974 let name = match direction {
1975 NONE => "trim",
1976 held => match self.name(self.first(held)) {
1977 "TrimLeading" => "ltrim",
1978 "TrimTrailing" => "rtrim",
1979 _ => "trim",
1980 },
1981 };
1982 let mut args = Vec::new();
1983 for kid in self.kids(arguments) {
1984 if matches!(self.name(kid), "TrimDirection" | "TrimSource") {
1985 continue;
1986 }
1987 args.push(self.expr(kid)?);
1988 }
1989 let source = self.find(arguments, "TrimSource");
1992 if source != NONE && self.count(source) == 1 {
1993 args.push(self.expr(self.first(source))?);
1994 }
1995 let args = self.expr_slice(args);
1996 let name = self.function_name(name);
1997 Ok(self.push(Expr::Function { name, args, distinct: false }))
1998 }
1999
2000 fn overlay(&mut self, node: u32) -> Result<ExprRef> {
2008 let shape = self.first(self.first(node));
2009 if !matches!(self.name(shape), "OverlayParameters" | "OverlayExpressionList") {
2010 return self.unsupported(shape);
2011 }
2012 let mut args = Vec::new();
2013 for kid in self.kids(shape) {
2014 let kid = match self.name(kid) {
2015 "FromExpression" | "ForExpression" => self.first(kid),
2016 _ => kid,
2017 };
2018 args.push(self.expr(kid)?);
2019 }
2020 let args = self.expr_slice(args);
2021 let name = self.function_name("overlay");
2022 Ok(self.push(Expr::Function { name, args, distinct: false }))
2023 }
2024
2025 fn number(&mut self, text: &str) -> ExprRef {
2027 let text = self.intern(text);
2028 self.push(Expr::Literal { kind: LiteralKind::Number, text })
2029 }
2030
2031 fn extract(&mut self, node: u32) -> Result<ExprRef> {
2040 let arguments = self.find(node, "ExtractArguments");
2041 if arguments == NONE {
2042 return self.unsupported(node);
2043 }
2044 let argument = self.first(self.first(arguments));
2045 let part = match self.name(argument) {
2046 "ExtractStringArgument" => self.string_value(argument)?,
2047 "ExtractDatePartArgument" => date_part(self.text(argument)),
2052 "ExtractIdentifierArgument" => self.text(argument).to_string(),
2055 _ => return self.unsupported(argument),
2056 };
2057 let text = self.intern(&part);
2058 let part = self.push(Expr::Literal { kind: LiteralKind::String, text });
2059 let operand = self.expr(self.nth(arguments, 1))?;
2060 let name = self.function_name("date_part");
2061 let args = self.expr_slice(vec![part, operand]);
2062 Ok(self.push(Expr::Function { name, args, distinct: false }))
2063 }
2064
2065 fn argument(&mut self, node: u32) -> Result<ExprRef> {
2067 let inner = self.first(node);
2068 match self.name(inner) {
2069 "PositionalFunctionArgument" => self.expr(self.first(inner)),
2070 _ => self.unsupported(inner),
2071 }
2072 }
2073
2074 fn table_argument(&mut self, node: u32) -> Result<Target> {
2089 let inner = self.first(node);
2090 if self.name(inner) == "NamedFunctionArgument" {
2091 let named = self.first(inner);
2092 if self.count(named) != 3 {
2093 return self.unsupported(named);
2096 }
2097 let alias = self.identifier(self.first(named));
2098 let expr = self.expr(self.nth(named, 2))?;
2099 return Ok(Target { expr, alias });
2100 }
2101 let expr = self.expr(self.first(inner))?;
2102 if let Expr::Binary { op: BinaryOp::Eq, left, right } = self.ast.expr(expr) {
2103 if let Expr::Column { name } = self.ast.expr(left) {
2104 if name.len == 1 {
2105 let alias = self.ast.parts[name.start as usize];
2106 return Ok(Target { expr: right, alias });
2107 }
2108 }
2109 }
2110 Ok(Target { expr, alias: NONE })
2111 }
2112
2113 fn cast(&mut self, node: u32) -> Result<ExprRef> {
2115 let try_cast = self.name(self.first(self.first(node))) == "TryCastKeyword";
2116 let arguments = self.nth(node, 1);
2118 let operand = self.expr(self.first(arguments))?;
2119 let text = self.text(self.nth(arguments, 1)).to_string();
2120 let ty = self.intern(&text);
2121 Ok(self.push(Expr::Cast { operand, ty, try_cast }))
2122 }
2123
2124 fn typed_literal(&mut self, node: u32) -> Result<ExprRef> {
2134 let text = self.text(self.first(node)).to_string();
2135 let ty = self.intern(&text);
2136 let operand = self.expr(self.nth(node, 1))?;
2137 Ok(self.push(Expr::Cast { operand, ty, try_cast: false }))
2138 }
2139
2140 fn interval_literal(&mut self, node: u32) -> Result<ExprRef> {
2158 let parameter = self.find(node, "IntervalParameter");
2159 if parameter == NONE {
2160 return self.unsupported(node);
2161 }
2162 let operand = self.expr(self.first(parameter))?;
2163 let unit = self.find(node, "Interval");
2164 if unit == NONE {
2165 let ty = self.intern("INTERVAL");
2166 return Ok(self.push(Expr::Cast { operand, ty, try_cast: false }));
2167 }
2168 let spelling = self.name(self.first(unit));
2169 if spelling == "IntervalToInterval" {
2173 let pair = self.name(self.first(self.first(unit)));
2174 return Err(Error::parser(format!("{} is not supported", worded(pair))));
2175 }
2176 let Some(&(_, function, width)) = UNITS.iter().find(|(rule, _, _)| *rule == spelling)
2177 else {
2178 return self.unsupported(unit);
2179 };
2180 let double = self.intern("DOUBLE");
2181 let mut count = self.push(Expr::Cast { operand, ty: double, try_cast: false });
2182 if let Some(width) = width {
2183 let name = self.function_name("trunc");
2184 let args = self.expr_slice(vec![count]);
2185 let whole = self.push(Expr::Function { name, args, distinct: false });
2186 let ty = self.intern(width);
2187 count = self.push(Expr::Cast { operand: whole, ty, try_cast: false });
2188 }
2189 let name = self.function_name(function);
2190 let args = self.expr_slice(vec![count]);
2191 Ok(self.push(Expr::Function { name, args, distinct: false }))
2192 }
2193
2194 fn case(&mut self, node: u32) -> Result<ExprRef> {
2196 let mut operand = NONE;
2197 let mut arms = Vec::new();
2198 let mut otherwise = NONE;
2199 for kid in self.kids(node) {
2200 match self.name(kid) {
2201 "CaseWhenThen" => {
2203 let when = self.expr(self.first(kid))?;
2204 let then = self.expr(self.nth(kid, 1))?;
2205 arms.push(CaseArm { when, then });
2206 }
2207 "CaseElse" => otherwise = self.expr(self.first(kid))?,
2209 _ => operand = self.expr(kid)?,
2211 }
2212 }
2213 let start = self.ast.case_arms.len() as u32;
2214 self.ast.case_arms.extend(arms);
2215 let arms = Slice { start, len: self.ast.case_arms.len() as u32 - start };
2216 Ok(self.push(Expr::Case { operand, arms, otherwise }))
2217 }
2218
2219 fn row(&mut self, node: u32) -> Result<ExprRef> {
2224 let mut items = Vec::new();
2225 for kid in self.kids(node) {
2226 items.push(self.expr(kid)?);
2227 }
2228 if items.len() == 1 {
2229 return Ok(items[0]);
2230 }
2231 let items = self.expr_slice(items);
2232 Ok(self.push(Expr::Row { items }))
2233 }
2234
2235 fn parameter(&mut self, node: u32) -> Result<ExprRef> {
2242 let written = self.text(node).trim();
2243 let written = written.trim_start_matches(['?', '$']).trim();
2244 let name = if written.is_empty() {
2245 self.anonymous += 1;
2246 self.anonymous.to_string()
2247 } else {
2248 written.to_string()
2249 };
2250 let name = self.intern(&name);
2251 Ok(self.push(Expr::Parameter { name }))
2252 }
2253
2254 fn list(&mut self, node: u32) -> Result<ExprRef> {
2259 let mut items = Vec::new();
2260 for kid in self.kids(node) {
2261 items.push(self.expr(kid)?);
2262 }
2263 let items = self.expr_slice(items);
2264 Ok(self.push(Expr::List { items }))
2265 }
2266
2267 fn subquery(&mut self, node: u32) -> Result<ExprRef> {
2269 if self.find(node, "SubqueryNot") != NONE || self.find(node, "SubqueryExists") != NONE {
2270 return self.unsupported(node);
2271 }
2272 let reference = self.find(node, "SubqueryReference");
2273 let query = self.query(self.first(reference))?;
2274 Ok(self.push(Expr::Subquery { query }))
2275 }
2276
2277 fn string_value(&self, node: u32) -> Result<String> {
2283 let span = self.tree.node(node);
2284 let mut value = String::new();
2285 for token in &self.tokens[span.start as usize..span.end as usize] {
2286 if token.kind == Kind::String {
2287 value.push_str(&string_token(token.text(self.query))?);
2288 }
2289 }
2290 Ok(value)
2291 }
2292
2293 fn first_string(&self, node: u32) -> &'a str {
2299 let span = self.tree.node(node);
2300 self.tokens[span.start as usize..span.end as usize]
2301 .iter()
2302 .find(|token| token.kind == Kind::String)
2303 .map_or("", |token| token.text(self.query))
2304 }
2305
2306 fn string_literal(&mut self, node: u32) -> Result<ExprRef> {
2315 let token = self.first_string(node);
2316 let prefix = match token.as_bytes() {
2317 [prefix, b'\'', ..] => *prefix,
2318 _ => 0,
2319 };
2320 if matches!(prefix, b'X' | b'x') {
2321 if let Some(body) = token.get(1..).and_then(quoted_body) {
2322 let text = blob_text(body.as_bytes())?;
2323 let text = self.intern(&text);
2324 return Ok(self.push(Expr::Literal { kind: LiteralKind::Blob, text }));
2325 }
2326 }
2327 let value = self.string_value(node)?;
2328 let text = self.intern(&value);
2329 let literal = self.push(Expr::Literal { kind: LiteralKind::String, text });
2330 if matches!(prefix, b'N' | b'n') {
2331 let ty = self.intern("VARCHAR");
2332 return Ok(self.push(Expr::Cast { operand: literal, ty, try_cast: false }));
2333 }
2334 Ok(literal)
2335 }
2336}
2337
2338const UNITS: &[(&str, &str, Option<&str>)] = &[
2346 ("YearKeyword", "to_years", Some("INTEGER")),
2347 ("MonthKeyword", "to_months", Some("INTEGER")),
2348 ("QuarterKeyword", "to_quarters", Some("INTEGER")),
2349 ("DecadeKeyword", "to_decades", Some("INTEGER")),
2350 ("CenturyKeyword", "to_centuries", Some("INTEGER")),
2351 ("MillenniumKeyword", "to_millennia", Some("INTEGER")),
2352 ("DayKeyword", "to_days", Some("INTEGER")),
2353 ("WeekKeyword", "to_weeks", Some("INTEGER")),
2354 ("HourKeyword", "to_hours", Some("BIGINT")),
2355 ("MinuteKeyword", "to_minutes", Some("BIGINT")),
2356 ("MicrosecondKeyword", "to_microseconds", Some("BIGINT")),
2357 ("SecondKeyword", "to_seconds", None),
2358 ("MillisecondKeyword", "to_milliseconds", None),
2359];
2360
2361fn date_part(written: &str) -> String {
2372 const PARTS: &[(&str, &str)] = &[
2373 ("YEAR", "YEAR"),
2374 ("YEARS", "YEAR"),
2375 ("MONTH", "MONTH"),
2376 ("MONTHS", "MONTH"),
2377 ("DAY", "DAY"),
2378 ("DAYS", "DAY"),
2379 ("HOUR", "HOUR"),
2380 ("HOURS", "HOUR"),
2381 ("MINUTE", "MINUTE"),
2382 ("MINUTES", "MINUTE"),
2383 ("SECOND", "SECOND"),
2384 ("SECONDS", "SECOND"),
2385 ("MILLISECOND", "MILLISECONDS"),
2386 ("MILLISECONDS", "MILLISECONDS"),
2387 ("MICROSECOND", "MICROSECONDS"),
2388 ("MICROSECONDS", "MICROSECONDS"),
2389 ("WEEK", "WEEK"),
2390 ("WEEKS", "WEEK"),
2391 ("QUARTER", "QUARTER"),
2392 ("QUARTERS", "QUARTER"),
2393 ("DECADE", "DECADE"),
2394 ("DECADES", "DECADE"),
2395 ("CENTURY", "CENTURY"),
2396 ("CENTURIES", "CENTURY"),
2397 ("MILLENNIUM", "MILLENNIUM"),
2398 ("MILLENNIA", "MILLENNIUM"),
2399 ];
2400 PARTS
2401 .iter()
2402 .find(|(spelling, _)| spelling.eq_ignore_ascii_case(written))
2403 .map_or_else(|| written.to_string(), |(_, name)| (*name).to_string())
2404}
2405
2406fn worded(rule: &str) -> String {
2408 let mut out = String::new();
2409 for character in rule.chars() {
2410 if character.is_ascii_uppercase() && !out.is_empty() {
2411 out.push(' ');
2412 }
2413 out.push(character.to_ascii_uppercase());
2414 }
2415 out
2416}
2417
2418fn string_token(text: &str) -> Result<String> {
2425 if let Some(body) = dollar_body(text) {
2426 return Ok(body.to_string());
2427 }
2428 if let Some(body) = quoted_body(text) {
2429 return Ok(body.replace("''", "'"));
2430 }
2431 let Some(body) = text.get(1..).and_then(quoted_body) else {
2432 return Ok(text.to_string());
2433 };
2434 match text.as_bytes()[0] {
2435 b'E' | b'e' => escaped(body),
2436 b'N' | b'n' => Ok(body.replace("''", "'")),
2438 b'B' | b'b' => Ok(format!("b{}", body.replace("''", "'"))),
2442 _ => Err(Error::not_implemented(format!("the string literal {text} is not supported yet"))),
2445 }
2446}
2447
2448fn blob_text(body: &[u8]) -> Result<String> {
2460 if body.len() % 2 != 0 {
2461 return Err(Error::parser("Hex string literal must have an even number of hex digits"));
2462 }
2463 let digit = |byte: u8| (byte as char).to_digit(16).map(|digit| digit as u8);
2464 let bytes: Option<Vec<u8>> =
2465 body.chunks(2).map(|pair| Some(digit(pair[0])? * 16 + digit(pair[1])?)).collect();
2466 match bytes {
2467 Some(bytes) => Ok(Value::Blob(bytes).to_string()),
2468 None => {
2469 Ok(body.chunks(2).map(|pair| format!("\\x{}", String::from_utf8_lossy(pair))).collect())
2470 }
2471 }
2472}
2473
2474fn quoted_body(text: &str) -> Option<&str> {
2479 text.strip_prefix('\'').filter(|rest| !rest.is_empty()).and_then(|rest| rest.strip_suffix('\''))
2480}
2481
2482fn escaped(body: &str) -> Result<String> {
2495 let bytes = body.as_bytes();
2496 let mut out = Vec::with_capacity(bytes.len());
2497 let mut at = 0;
2498 while at < bytes.len() {
2499 let byte = bytes[at];
2500 at += 1;
2501 if byte == b'\'' && bytes.get(at) == Some(&b'\'') {
2502 out.push(b'\'');
2503 at += 1;
2504 continue;
2505 }
2506 if byte != b'\\' || at == bytes.len() {
2507 out.push(byte);
2508 continue;
2509 }
2510 let escape = bytes[at];
2511 at += 1;
2512 match escape {
2513 b'n' => out.push(b'\n'),
2514 b't' => out.push(b'\t'),
2515 b'r' => out.push(b'\r'),
2516 b'b' => out.push(0x08),
2517 b'f' => out.push(0x0c),
2518 b'x' => match digits(bytes, &mut at, 16, 2) {
2519 Some(value) => out.push(value as u8),
2520 None => out.push(b'x'),
2521 },
2522 b'0'..=b'7' => {
2523 at -= 1;
2524 let value = digits(bytes, &mut at, 8, 3).unwrap_or(0);
2525 out.push(value as u8);
2526 }
2527 b'u' => match four_hex(bytes, at).and_then(char::from_u32).filter(|c| *c != '\0') {
2528 Some(c) => {
2529 at += 4;
2530 out.extend_from_slice(c.encode_utf8(&mut [0; 4]).as_bytes());
2531 }
2532 None => out.push(b'u'),
2533 },
2534 other => out.push(other),
2535 }
2536 }
2537 if out.contains(&0) {
2538 return Err(Error::parser("Null character not permitted in escape string literal"));
2539 }
2540 String::from_utf8(out).map_err(|error| {
2541 Error::parser(format!(
2542 "Invalid UTF-8 in escape string literal at byte offset {}: byte mismatch",
2543 error.utf8_error().valid_up_to()
2544 ))
2545 })
2546}
2547
2548fn digits(bytes: &[u8], at: &mut usize, radix: u32, most: usize) -> Option<u32> {
2553 let mut value = None;
2554 for _ in 0..most {
2555 let Some(digit) = bytes.get(*at).and_then(|byte| (*byte as char).to_digit(radix)) else {
2556 break;
2557 };
2558 value = Some(value.unwrap_or(0) * radix + digit);
2559 *at += 1;
2560 }
2561 value
2562}
2563
2564fn four_hex(bytes: &[u8], at: usize) -> Option<u32> {
2570 let digits = bytes.get(at..at + 4)?;
2571 if !digits.iter().all(u8::is_ascii_hexdigit) {
2572 return None;
2573 }
2574 u32::from_str_radix(std::str::from_utf8(digits).ok()?, 16).ok()
2575}
2576
2577fn dollar_body(text: &str) -> Option<&str> {
2586 let rest = text.strip_prefix('$')?;
2587 let close = rest.find('$')?;
2588 let (tag, body) = (&rest[..close], &rest[close + 1..]);
2589 body.strip_suffix(&format!("${tag}$"))
2590}
2591
2592fn unquote(text: &str) -> String {
2602 if let Some(body) = text.strip_prefix('"').and_then(|rest| rest.strip_suffix('"')) {
2603 return body.replace("\"\"", "\"");
2604 }
2605 match text.strip_prefix('\'').and_then(|rest| rest.strip_suffix('\'')) {
2606 Some(body) => body.replace("''", "'"),
2607 None => text.to_string(),
2608 }
2609}
2610
2611#[cfg(test)]
2612mod tests {
2613 use super::*;
2614 use crate::corpus::CORPUS;
2615 use crate::matcher::parse;
2616
2617 fn show(ast: &Ast, expr: ExprRef) -> String {
2625 if expr == NONE {
2626 return "-".to_string();
2627 }
2628 let list = |slice: Slice| {
2629 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
2630 };
2631 match ast.expr(expr) {
2632 Expr::Star { qualifier, replacements } => {
2633 let star = if qualifier.is_empty() {
2634 "*".to_string()
2635 } else {
2636 format!("{}.*", ast.name_text(qualifier))
2637 };
2638 if replacements.is_empty() {
2639 return star;
2640 }
2641 let entries: Vec<String> = ast
2642 .target_list(replacements)
2643 .iter()
2644 .map(|target| {
2645 format!("{} AS {}", show(ast, target.expr), ast.string(target.alias))
2646 })
2647 .collect();
2648 format!("{star} REPLACE ({})", entries.join(", "))
2649 }
2650 Expr::Column { name } => ast.name_text(name),
2651 Expr::Literal { kind, text } => match kind {
2652 LiteralKind::Number => ast.string(text).to_string(),
2653 LiteralKind::String => format!("'{}'", ast.string(text)),
2654 LiteralKind::Blob => format!("'{}'::BLOB", ast.string(text)),
2655 other => format!("{other:?}").to_uppercase(),
2656 },
2657 Expr::Unary { op, operand } => format!("({op:?} {})", show(ast, operand)),
2658 Expr::Binary { op, left, right } => {
2659 let op = match op {
2660 BinaryOp::Named(name) => ast.string(name).to_string(),
2661 other => format!("{other:?}"),
2662 };
2663 format!("({} {op} {})", show(ast, left), show(ast, right))
2664 }
2665 Expr::Function { name, args, distinct } => {
2666 let distinct = if distinct { "DISTINCT " } else { "" };
2667 format!("{}({distinct}{})", ast.name_text(name), list(args))
2668 }
2669 Expr::Cast { operand, ty, try_cast } => {
2670 let word = if try_cast { "TRY_CAST" } else { "CAST" };
2671 format!("{word}({} AS {})", show(ast, operand), ast.string(ty))
2672 }
2673 Expr::Case { operand, arms, otherwise } => {
2674 let arms = ast
2675 .arm_list(arms)
2676 .iter()
2677 .map(|arm| format!("WHEN {} THEN {}", show(ast, arm.when), show(ast, arm.then)))
2678 .collect::<Vec<_>>()
2679 .join(" ");
2680 format!("CASE {} {arms} ELSE {} END", show(ast, operand), show(ast, otherwise))
2681 }
2682 Expr::Between { operand, low, high, negated } => {
2683 let not = if negated { "NOT " } else { "" };
2684 format!(
2685 "({not}{} BETWEEN {} AND {})",
2686 show(ast, operand),
2687 show(ast, low),
2688 show(ast, high)
2689 )
2690 }
2691 Expr::In { operand, list: items, negated } => {
2692 let not = if negated { "NOT " } else { "" };
2693 format!("({not}{} IN [{}])", show(ast, operand), list(items))
2694 }
2695 Expr::List { items } => format!("[{}]", list(items)),
2696 Expr::Parameter { name } => format!("${}", ast.string(name)),
2697 Expr::Row { items } => format!("ROW({})", list(items)),
2698 Expr::Subquery { query } => format!("({})", show_query(ast, query)),
2699 }
2700 }
2701
2702 fn show_source(ast: &Ast, source: SourceRef) -> String {
2704 let alias = |alias: StrRef| match alias {
2705 NONE => String::new(),
2706 other => format!(" AS {}", ast.string(other)),
2707 };
2708 match ast.source(source) {
2709 Source::Table { name, alias: name_alias, .. } => {
2710 format!("{}{}", ast.name_text(name), alias(name_alias))
2711 }
2712 Source::Function { name, args, alias: call_alias, .. } => {
2713 let args = ast
2714 .target_list(args)
2715 .iter()
2716 .map(|item| match item.alias {
2717 NONE => show(ast, item.expr),
2718 named => format!("{} := {}", ast.string(named), show(ast, item.expr)),
2719 })
2720 .collect::<Vec<_>>()
2721 .join(", ");
2722 format!("{}({args}){}", ast.name_text(name), alias(call_alias))
2723 }
2724 Source::Subquery { query, alias: query_alias, .. } => {
2725 format!("({}){}", show_query(ast, query), alias(query_alias))
2726 }
2727 Source::Values { rows, alias: values_alias, .. } => {
2728 format!("{}{}", show_rows(ast, rows), alias(values_alias))
2729 }
2730 Source::Join { left, right, kind, natural, on, using } => {
2731 let natural = if natural { "NATURAL " } else { "" };
2732 let on = if on == NONE { String::new() } else { format!(" ON {}", show(ast, on)) };
2733 let using = if using.is_empty() {
2734 String::new()
2735 } else {
2736 format!(" USING ({})", ast.name_text(using))
2737 };
2738 format!(
2739 "({} {natural}{kind:?} JOIN {}{on}{using})",
2740 show_source(ast, left),
2741 show_source(ast, right)
2742 )
2743 }
2744 }
2745 }
2746
2747 fn show_rows(ast: &Ast, rows: Slice) -> String {
2749 let rows = ast
2750 .rows(rows)
2751 .iter()
2752 .map(|&row| {
2753 let items = ast
2754 .expr_list(row)
2755 .iter()
2756 .map(|&item| show(ast, item))
2757 .collect::<Vec<_>>()
2758 .join(", ");
2759 format!("({items})")
2760 })
2761 .collect::<Vec<_>>()
2762 .join(", ");
2763 format!("VALUES {rows}")
2764 }
2765
2766 fn show_query(ast: &Ast, index: QueryRef) -> String {
2768 let query = ast.query(index);
2769 let list = |slice: Slice| {
2770 ast.expr_list(slice).iter().map(|&item| show(ast, item)).collect::<Vec<_>>().join(", ")
2771 };
2772 let mut out = match query.body {
2773 QueryBody::SetOp { op, quantifier, by_name, left, right } => {
2774 let by_name = if by_name { " BY NAME" } else { "" };
2775 format!(
2776 "({} {op:?} {quantifier:?}{by_name} {})",
2777 show_query(ast, left),
2778 show_query(ast, right)
2779 )
2780 }
2781 QueryBody::Select(index) => {
2782 let select = ast.select(index);
2783 let distinct = match select.distinct {
2784 Distinct::No => String::new(),
2785 Distinct::Yes => " DISTINCT".to_string(),
2786 Distinct::On(on) => format!(" DISTINCT ON ({})", list(on)),
2787 };
2788 let targets = ast
2789 .target_list(select.targets)
2790 .iter()
2791 .map(|target| match target.alias {
2792 NONE => show(ast, target.expr),
2793 alias => format!("{} AS {}", show(ast, target.expr), ast.string(alias)),
2794 })
2795 .collect::<Vec<_>>()
2796 .join(", ");
2797 let mut out = format!("SELECT{distinct} {targets}");
2798 if !select.from.is_empty() {
2799 let from = ast
2800 .source_list(select.from)
2801 .iter()
2802 .map(|&source| show_source(ast, source))
2803 .collect::<Vec<_>>()
2804 .join(", ");
2805 out += &format!(" FROM {from}");
2806 }
2807 if select.filter != NONE {
2808 out += &format!(" WHERE {}", show(ast, select.filter));
2809 }
2810 if select.group_by_all {
2811 out += " GROUP BY ALL";
2812 } else if !select.group_by.is_empty() {
2813 out += &format!(" GROUP BY {}", list(select.group_by));
2814 }
2815 if select.having != NONE {
2816 out += &format!(" HAVING {}", show(ast, select.having));
2817 }
2818 out
2819 }
2820 QueryBody::Values(rows) => show_rows(ast, rows),
2821 QueryBody::Describe(inner) => format!("DESCRIBE {}", show_query(ast, inner)),
2822 };
2823 if query.order_by_all {
2824 out += " ORDER BY ALL";
2825 } else if !query.order_by.is_empty() {
2826 let items = ast
2827 .order_list(query.order_by)
2828 .iter()
2829 .map(|item| format!("{} {:?} {:?}", show(ast, item.expr), item.order, item.nulls))
2830 .collect::<Vec<_>>()
2831 .join(", ");
2832 out += &format!(" ORDER BY {items}");
2833 }
2834 if query.limit != NONE {
2835 let percent = if query.limit_percent { "%" } else { "" };
2836 out += &format!(" LIMIT {}{percent}", show(ast, query.limit));
2837 }
2838 if query.offset != NONE {
2839 out += &format!(" OFFSET {}", show(ast, query.offset));
2840 }
2841 out
2842 }
2843
2844 fn round(query: &str) -> String {
2846 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
2847 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
2848 let Statement::Query(index) = ast.statements[0] else {
2849 panic!("{query} is not a query");
2850 };
2851 show_query(&ast, index)
2852 }
2853
2854 fn round_statement(query: &str) -> String {
2856 let ast = parse_ast(query).unwrap_or_else(|error| panic!("{query}: {error}"));
2857 assert_eq!(ast.statements.len(), 1, "{query} is one statement");
2858 match ast.statements[0] {
2859 Statement::Query(index) => show_query(&ast, index),
2860 Statement::CreateTable(index) => {
2861 let create = ast.create_table(index);
2862 let mut out = "CREATE".to_string();
2863 if create.or_replace {
2864 out += " OR REPLACE";
2865 }
2866 if create.temporary {
2867 out += " TEMPORARY";
2868 }
2869 out += " TABLE";
2870 if create.if_not_exists {
2871 out += " IF NOT EXISTS";
2872 }
2873 out += &format!(" {}", ast.name_text(create.name));
2874 let columns = ast
2875 .column_defs(create.columns)
2876 .iter()
2877 .map(|def| {
2878 let ty = match def.ty {
2879 NONE => String::new(),
2880 other => format!(" {}", ast.string(other)),
2881 };
2882 let null = if def.not_null { " NOT NULL" } else { "" };
2883 format!("{}{ty}{null}", ast.string(def.name))
2884 })
2885 .collect::<Vec<_>>()
2886 .join(", ");
2887 if !columns.is_empty() || create.query == NONE {
2888 out += &format!(" ({columns})");
2889 }
2890 if create.query != NONE {
2891 out += &format!(" AS {}", show_query(&ast, create.query));
2892 }
2893 out
2894 }
2895 Statement::CreateView(index) => {
2896 let create = ast.create_view(index);
2897 let mut out = "CREATE".to_string();
2898 if create.or_replace {
2899 out += " OR REPLACE";
2900 }
2901 if create.temporary {
2902 out += " TEMPORARY";
2903 }
2904 out += " VIEW";
2905 if create.if_not_exists {
2906 out += " IF NOT EXISTS";
2907 }
2908 out += &format!(" {}", ast.name_text(create.name));
2909 if !create.columns.is_empty() {
2910 let columns = ast.name(create.columns).collect::<Vec<_>>().join(", ");
2911 out += &format!(" ({columns})");
2912 }
2913 out + &format!(" AS {}", show_query(&ast, create.query))
2914 }
2915 Statement::DropTable(index) => {
2916 let drop = ast.drop_table(index);
2917 let mut out = if drop.view { "DROP VIEW" } else { "DROP TABLE" }.to_string();
2918 if drop.if_exists {
2919 out += " IF EXISTS";
2920 }
2921 let names = ast
2922 .name_list(drop.names)
2923 .iter()
2924 .map(|&name| ast.name_text(name))
2925 .collect::<Vec<_>>()
2926 .join(", ");
2927 out + &format!(" {names}")
2928 }
2929 Statement::Insert(index) => {
2930 let insert = ast.insert(index);
2931 let mut out = format!("INSERT INTO {}", ast.name_text(insert.name));
2932 if !insert.columns.is_empty() {
2933 let columns = ast.name(insert.columns).collect::<Vec<_>>().join(", ");
2934 out += &format!(" ({columns})");
2935 }
2936 out + &format!(" {}", show_query(&ast, insert.source))
2937 }
2938 Statement::Set(index) => {
2939 let setting = ast.setting(index);
2940 let scope = match setting.scope.keyword() {
2941 "" => String::new(),
2942 word => format!(" {word}"),
2943 };
2944 format!("SET{scope} {} = {}", ast.string(setting.name), show(&ast, setting.value))
2945 }
2946 Statement::Reset(index) => {
2947 let setting = ast.setting(index);
2948 let scope = match setting.scope.keyword() {
2949 "" => String::new(),
2950 word => format!(" {word}"),
2951 };
2952 format!("RESET{scope} {}", ast.string(setting.name))
2953 }
2954 Statement::Explain { query, analyze } => {
2955 let analyze = if analyze { "ANALYZE " } else { "" };
2956 format!("EXPLAIN {analyze}{}", show_query(&ast, query))
2957 }
2958 }
2959 }
2960
2961 #[test]
2962 fn an_explain_keeps_the_query_it_was_asked_about() {
2963 assert_eq!(
2964 round_statement("EXPLAIN SELECT a FROM t WHERE a > 1"),
2965 "EXPLAIN SELECT a FROM t WHERE (a Gt 1)"
2966 );
2967 assert_eq!(round_statement("explain select 1"), "EXPLAIN SELECT 1");
2968 assert_eq!(round_statement("explain analyze select 1"), "EXPLAIN ANALYZE SELECT 1");
2969 }
2970
2971 #[test]
2972 fn the_parts_of_an_explain_that_are_not_the_query_are_refused_by_name() {
2973 for (query, named) in [
2976 ("EXPLAIN (FORMAT JSON) SELECT 1", "ExplainOptionList"),
2977 ("EXPLAIN INSERT INTO t VALUES (1)", "InsertStatement"),
2978 ("EXPLAIN CREATE TABLE u (a INTEGER)", "CreateStatement"),
2979 ] {
2980 let error = parse_ast(query).expect_err(query).to_string();
2981 assert!(error.contains(named), "{query}: {error}");
2982 }
2983 }
2984
2985 #[test]
2986 fn a_set_keeps_its_name_its_scope_and_its_value() {
2987 assert_eq!(round_statement("SET memory_limit = '1GB'"), "SET memory_limit = '1GB'");
2988 assert_eq!(round_statement("set threads=4"), "SET threads = 4");
2989 assert_eq!(round_statement("SET GLOBAL threads = 4"), "SET GLOBAL threads = 4");
2990 assert_eq!(round_statement("SET SESSION threads = 4"), "SET SESSION threads = 4");
2991 assert_eq!(round_statement("SET LOCAL threads = 4"), "SET LOCAL threads = 4");
2992 assert_eq!(round_statement("RESET memory_limit"), "RESET memory_limit");
2993 assert_eq!(round_statement("RESET GLOBAL memory_limit"), "RESET GLOBAL memory_limit");
2994 }
2995
2996 #[test]
2997 fn the_two_other_things_the_word_set_starts_are_refused_rather_than_read_as_settings() {
2998 for statement in ["SET VARIABLE x = 1", "SET SCHEMA 'main'", "SET TIME ZONE 'UTC'"] {
3002 let error = parse_ast(statement).expect_err(statement);
3003 assert_eq!(error.code().duckdb_name(), "Not implemented Error", "{statement}");
3004 }
3005 }
3006
3007 #[test]
3008 fn a_setting_written_with_a_list_of_values_is_refused_rather_than_taking_the_first() {
3009 let error = parse_ast("SET search_path = a, b").expect_err("a list of two");
3010 assert_eq!(error.code().duckdb_name(), "Not implemented Error");
3011 }
3012
3013 #[test]
3014 fn the_query_m0_has_to_run_transforms() {
3015 assert_eq!(round("SELECT * FROM t WHERE x > 5"), "SELECT * FROM t WHERE (x Gt 5)");
3016 }
3017
3018 #[test]
3019 fn a_replace_list_rides_on_the_star_it_changes() {
3020 assert_eq!(
3023 round("SELECT * REPLACE (a + 1 AS a) FROM t"),
3024 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3025 );
3026 assert_eq!(
3027 round("SELECT * REPLACE a + 1 AS a FROM t"),
3028 "SELECT * REPLACE ((a Add 1) AS a) FROM t"
3029 );
3030 assert_eq!(
3031 round("SELECT t.* REPLACE (make_date(a) AS a, b * 2 AS b) FROM t"),
3032 "SELECT t.* REPLACE (make_date(a) AS a, (b Multiply 2) AS b) FROM t"
3033 );
3034 }
3035
3036 #[test]
3037 fn one_column_cannot_be_replaced_twice() {
3038 let error = parse_ast("SELECT * REPLACE (a + 1 AS a, a + 2 AS A) FROM t").unwrap_err();
3041 assert_eq!(error.to_string(), "Parser Error: Duplicate entry \"A\" in REPLACE list");
3042 }
3043
3044 #[test]
3045 fn a_table_function_argument_can_have_a_name_written_in_front_of_it() {
3046 for spelling in
3049 ["binary_as_string := True", "binary_as_string => True", "binary_as_string = True"]
3050 {
3051 assert_eq!(
3052 round(&format!("SELECT * FROM read_parquet('f.parquet', {spelling})")),
3053 "SELECT * FROM read_parquet('f.parquet', binary_as_string := TRUE)",
3054 "{spelling}"
3055 );
3056 }
3057 }
3058
3059 #[test]
3060 fn an_equality_that_is_not_a_bare_name_stays_an_argument() {
3061 assert_eq!(round("SELECT * FROM f(t.a = 1)"), "SELECT * FROM f((t.a Eq 1))");
3064 assert_eq!(round("SELECT * FROM f(1 = 1)"), "SELECT * FROM f((1 Eq 1))");
3065 }
3066
3067 #[test]
3068 fn a_create_table_keeps_its_types_as_text() {
3069 assert_eq!(
3070 round_statement("CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"),
3071 "CREATE TABLE t (a INTEGER, b VARCHAR NOT NULL)"
3072 );
3073 assert_eq!(
3077 round_statement("CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"),
3078 "CREATE TABLE t (a DECIMAL(18, 3), b STRUCT(x INT))"
3079 );
3080 }
3081
3082 #[test]
3083 fn the_modifiers_on_a_create_table_survive() {
3084 assert_eq!(
3085 round_statement("CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"),
3086 "CREATE OR REPLACE TEMPORARY TABLE s.t (a INT)"
3087 );
3088 assert_eq!(
3089 round_statement("CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"),
3090 "CREATE TEMPORARY TABLE IF NOT EXISTS s.t (a INT)"
3091 );
3092 }
3093
3094 #[test]
3095 fn or_replace_and_if_not_exists_in_one_statement_is_refused_here_and_not_later() {
3096 for sql in [
3100 "CREATE OR REPLACE TABLE IF NOT EXISTS t (a INT)",
3101 "CREATE OR REPLACE VIEW IF NOT EXISTS v AS SELECT 1",
3102 ] {
3103 let error = parse_ast(sql).unwrap_err().to_string();
3104 assert_eq!(
3105 error,
3106 "Parser Error: Cannot specify both OR REPLACE and IF NOT EXISTS within single \
3107 create statement"
3108 );
3109 }
3110 }
3111
3112 #[test]
3113 fn a_create_table_as_carries_the_query_and_not_the_types() {
3114 assert_eq!(
3115 round_statement("CREATE TABLE t AS SELECT a FROM u"),
3116 "CREATE TABLE t AS SELECT a FROM u"
3117 );
3118 assert_eq!(
3121 round_statement("CREATE TABLE t (x, y) AS SELECT a, b FROM u"),
3122 "CREATE TABLE t (x, y) AS SELECT a, b FROM u"
3123 );
3124 }
3125
3126 #[test]
3127 fn a_create_view_carries_its_body_twice_over() {
3128 assert_eq!(
3129 round_statement("CREATE VIEW v AS SELECT a FROM u"),
3130 "CREATE VIEW v AS SELECT a FROM u"
3131 );
3132 assert_eq!(
3133 round_statement("CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"),
3134 "CREATE OR REPLACE VIEW main.v (x, y) AS SELECT a, b FROM u"
3135 );
3136 let ast = parse_ast("CREATE VIEW v (x) AS SELECT a FROM u WHERE a > 1").expect("parses");
3139 let Statement::CreateView(index) = ast.statements[0] else {
3140 panic!("not a create view");
3141 };
3142 assert_eq!(ast.string(ast.create_view(index).sql), "SELECT a FROM u WHERE a > 1");
3143 }
3144
3145 #[test]
3146 fn a_drop_view_is_not_a_drop_table() {
3147 assert_eq!(round_statement("DROP VIEW IF EXISTS a, b"), "DROP VIEW IF EXISTS a, b");
3148 assert_eq!(round_statement("DROP TABLE a"), "DROP TABLE a");
3149 }
3150
3151 #[test]
3152 fn a_drop_table_is_a_list_of_qualified_names() {
3153 assert_eq!(round_statement("DROP TABLE t"), "DROP TABLE t");
3154 assert_eq!(round_statement("DROP TABLE IF EXISTS a, b.c"), "DROP TABLE IF EXISTS a, b.c");
3155 }
3156
3157 #[test]
3158 fn dropping_something_that_is_neither_a_table_nor_a_view_is_refused() {
3159 let error = parse_ast("DROP MATERIALIZED VIEW v").unwrap_err().to_string();
3163 assert!(error.starts_with("Not implemented Error"), "{error}");
3164 }
3165
3166 #[test]
3167 fn both_spellings_of_insert_arrive_at_a_query() {
3168 assert_eq!(
3169 round_statement("INSERT INTO t VALUES (1, 'a'), (2, 'b')"),
3170 "INSERT INTO t VALUES (1, 'a'), (2, 'b')"
3171 );
3172 assert_eq!(
3173 round_statement("INSERT INTO t (a, b) SELECT x, y FROM u"),
3174 "INSERT INTO t (a, b) SELECT x, y FROM u"
3175 );
3176 }
3177
3178 #[test]
3179 fn an_insert_clause_that_changes_the_answer_is_refused() {
3180 for query in [
3181 "INSERT INTO t VALUES (1) RETURNING *",
3182 "INSERT OR REPLACE INTO t VALUES (1)",
3183 "INSERT INTO t BY NAME SELECT 1 AS a",
3184 "INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING",
3185 "INSERT INTO t DEFAULT VALUES",
3186 ] {
3187 let error = parse_ast(query).unwrap_err().to_string();
3188 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
3189 }
3190 }
3191
3192 #[test]
3193 fn a_column_constraint_that_is_not_not_null_is_refused() {
3194 for query in [
3198 "CREATE TABLE t (a INT PRIMARY KEY)",
3199 "CREATE TABLE t (a INT UNIQUE)",
3200 "CREATE TABLE t (a INT CHECK (a > 0))",
3201 "CREATE TABLE t (a INT DEFAULT 1)",
3202 "CREATE TABLE t (a INT REFERENCES u (b))",
3203 "CREATE TABLE t (a INT, PRIMARY KEY (a))",
3204 ] {
3205 let error = parse_ast(query).unwrap_err().to_string();
3206 assert!(error.starts_with("Not implemented Error"), "{query} gave {error}");
3207 }
3208 }
3209
3210 #[test]
3211 fn values_is_a_query_on_its_own_and_in_a_from() {
3212 assert_eq!(round("VALUES (1), (2)"), "VALUES (1), (2)");
3213 assert_eq!(
3217 round("SELECT * FROM (VALUES (1, 2), (3, 4)) t(a, b)"),
3218 "SELECT * FROM (VALUES (1, 2), (3, 4)) AS t"
3219 );
3220 assert_eq!(
3221 round("SELECT * FROM VALUES (1, 2), (3, 4) AS t(a, b)"),
3222 "SELECT * FROM VALUES (1, 2), (3, 4) AS t"
3223 );
3224 assert_eq!(round("VALUES (1), (2, 3)"), "VALUES (1), (2, 3)");
3227 }
3228
3229 #[test]
3237 fn describe_rewrites_a_name_into_a_star_over_it() {
3238 assert_eq!(round("DESCRIBE SELECT 1 AS a"), "DESCRIBE SELECT 1 AS a");
3239 assert_eq!(round("DESCRIBE t"), "DESCRIBE SELECT * FROM t");
3240 assert_eq!(round("DESC t"), "DESCRIBE SELECT * FROM t");
3241 assert_eq!(round("DESCRIBE 'x.parquet'"), "DESCRIBE SELECT * FROM x.parquet");
3242 assert_eq!(
3244 round("SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"),
3245 "SELECT column_name FROM (DESCRIBE SELECT 1 AS a)"
3246 );
3247 assert_eq!(round("DESCRIBE DESCRIBE SELECT 1 AS a"), "DESCRIBE DESCRIBE SELECT 1 AS a");
3248 }
3249
3250 #[test]
3257 fn summarize_is_refused_even_though_it_parses_as_a_describe() {
3258 for query in ["SUMMARIZE t", "SUMMARIZE SELECT 1"] {
3259 let error = parse_ast(query).expect_err("summarize is not implemented");
3260 let message = error.to_string();
3261 assert!(message.starts_with("Not implemented Error"), "{query} failed with {message}");
3262 }
3263 }
3264
3265 #[test]
3266 fn every_statement_in_the_corpus_gets_a_defined_answer() {
3267 let mut done = 0;
3272 for query in CORPUS {
3273 match parse_ast(query) {
3274 Ok(ast) => {
3275 assert_eq!(ast.statements.len(), 1, "{query}");
3276 done += 1;
3277 }
3278 Err(error) => {
3279 let message = error.to_string();
3280 assert!(
3281 message.starts_with("Not implemented Error"),
3282 "{query} failed with {message}, which is not a not-implemented error"
3283 );
3284 }
3285 }
3286 }
3287 assert!(done >= 31, "only {done} of the corpus transforms, which is fewer than it was");
3290 }
3291
3292 #[test]
3293 fn the_ast_is_far_smaller_than_the_parse_tree() {
3294 let query = CORPUS[4];
3295 let tree = parse(query).unwrap();
3296 let ast = parse_ast(query).unwrap();
3297 assert!(
3300 ast.node_count() * 20 < tree.arena_len(),
3301 "{} ast nodes against {} parse nodes",
3302 ast.node_count(),
3303 tree.arena_len()
3304 );
3305 }
3306
3307 #[test]
3308 fn precedence_comes_out_of_the_chain_and_into_the_tree() {
3309 assert_eq!(round("SELECT 1 + 2 * 3"), "SELECT (1 Add (2 Multiply 3))");
3310 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
3311 assert_eq!(round("SELECT 1 + 2 + 3"), "SELECT ((1 Add 2) Add 3)");
3312 assert_eq!(round("SELECT 1 - 2 - 3"), "SELECT ((1 Subtract 2) Subtract 3)");
3313 assert_eq!(
3314 round("SELECT a OR b AND c"),
3315 "SELECT (a Or (b And c))",
3316 "and binds tighter than or"
3317 );
3318 }
3319
3320 #[test]
3321 fn a_double_negation_is_two_nodes_and_not_none() {
3322 assert_eq!(round("SELECT NOT NOT a"), "SELECT (Not (Not a))");
3326 }
3327
3328 #[test]
3329 fn a_parenthesised_single_expression_is_not_a_row() {
3330 assert_eq!(round("SELECT (a)"), "SELECT a");
3331 assert_eq!(round("SELECT (a, b)"), "SELECT ROW(a, b)");
3332 }
3333
3334 #[test]
3335 fn a_bracketed_list_is_a_list_of_however_many_items_were_written() {
3336 assert_eq!(round("SELECT [a]"), "SELECT [a]");
3339 assert_eq!(round("SELECT [1, 2, 3]"), "SELECT [1, 2, 3]");
3340 assert_eq!(round("SELECT []"), "SELECT []");
3341 assert_eq!(round("SELECT ['a.parquet', 'b.parquet']"), "SELECT ['a.parquet', 'b.parquet']");
3342 }
3343
3344 #[test]
3345 fn a_parameter_carries_its_identifier_however_it_was_written() {
3346 assert_eq!(round("SELECT $1"), "SELECT $1");
3347 assert_eq!(round("SELECT ?1"), "SELECT $1");
3348 assert_eq!(round("SELECT $name"), "SELECT $name");
3349 assert_eq!(round("SELECT ? + $2"), "SELECT ($1 Add $2)");
3352 assert_eq!(round("SELECT ?, ?, ?"), "SELECT $1, $2, $3");
3353 }
3354
3355 #[test]
3356 fn the_parameters_of_a_statement_are_listed_once_each_in_written_order() {
3357 let ast = parse_ast("SELECT $b, $a, $b WHERE $a").expect("parses");
3358 assert_eq!(ast.parameters(), vec!["b", "a"]);
3359 assert!(parse_ast("SELECT 1").expect("parses").parameters().is_empty());
3360 }
3361
3362 #[test]
3363 fn the_three_ways_to_write_an_alias_all_arrive() {
3364 assert_eq!(round("SELECT a AS b"), "SELECT a AS b");
3365 assert_eq!(round("SELECT a b"), "SELECT a AS b");
3366 assert_eq!(round("SELECT b: a"), "SELECT a AS b");
3367 assert_eq!(round("SELECT a"), "SELECT a", "and no alias when none was written");
3368 }
3369
3370 #[test]
3371 fn a_from_with_no_select_selects_everything() {
3372 assert_eq!(round("FROM t"), "SELECT * FROM t");
3375 assert_eq!(round("FROM t SELECT a"), "SELECT a FROM t");
3376 }
3377
3378 #[test]
3379 fn joins_nest_to_the_left() {
3380 assert_eq!(
3381 round("SELECT * FROM a JOIN b ON a.i = b.i LEFT JOIN c USING (k)"),
3382 "SELECT * FROM ((a Inner JOIN b ON (a.i Eq b.i)) Left JOIN c USING (k))"
3383 );
3384 assert_eq!(
3385 round("SELECT * FROM a NATURAL JOIN b"),
3386 "SELECT * FROM (a NATURAL Inner JOIN b)"
3387 );
3388 assert_eq!(round("SELECT * FROM a CROSS JOIN b"), "SELECT * FROM (a Cross JOIN b)");
3389 assert_eq!(
3390 round("SELECT * FROM a POSITIONAL JOIN b"),
3391 "SELECT * FROM (a Positional JOIN b)"
3392 );
3393 assert_eq!(round("SELECT * FROM a, b"), "SELECT * FROM a, b", "a comma is not a join node");
3394 }
3395
3396 #[test]
3397 fn a_qualified_name_keeps_its_parts_however_it_was_spelled() {
3398 assert_eq!(round("SELECT a"), "SELECT a");
3402 assert_eq!(round("SELECT t.a"), "SELECT t.a");
3403 assert_eq!(round("SELECT s.t.a"), "SELECT s.t.a");
3404 assert_eq!(round("SELECT c.s.t.a"), "SELECT c.s.t.a");
3405 assert_eq!(round("SELECT * FROM s.t"), "SELECT * FROM s.t");
3406 }
3407
3408 #[test]
3409 fn a_star_can_be_qualified() {
3410 assert_eq!(round("SELECT *"), "SELECT *");
3411 assert_eq!(round("SELECT t.*"), "SELECT t.*");
3412 assert_eq!(round("SELECT s.t.*"), "SELECT s.t.*");
3413 }
3414
3415 #[test]
3416 fn a_quoted_identifier_keeps_its_case_and_loses_its_quotes() {
3417 let ast = parse_ast("SELECT \"Mixed Case\", \"a\"\"b\"").unwrap();
3421 assert_eq!(ast.strings[0], "Mixed Case");
3422 assert_eq!(ast.strings[1], "a\"b");
3423 }
3424
3425 #[test]
3426 fn a_string_literal_is_decoded_and_adjacent_ones_are_joined() {
3427 assert_eq!(round("SELECT 'it''s'"), "SELECT 'it's'");
3428 assert_eq!(round("SELECT 'a'\n'b'"), "SELECT 'ab'", "the standard's adjacency rule");
3429 }
3430
3431 #[test]
3433 fn a_dollar_quoted_string_loses_its_dollars_and_its_tag() {
3434 assert_eq!(round("SELECT $$dollar quoted$$"), "SELECT 'dollar quoted'");
3435 assert_eq!(round("SELECT $tag$body$tag$"), "SELECT 'body'");
3436 assert_eq!(round("SELECT $$$$"), "SELECT ''", "an empty tag and an empty body");
3437 assert_eq!(round("SELECT $tag$it''s $other$ fine$tag$"), "SELECT 'it''s $other$ fine'");
3440 assert_eq!(round("SELECT $$open"), "SELECT '$$open'");
3442 }
3443
3444 #[test]
3450 fn an_escape_string_resolves_its_backslashes() {
3451 assert_eq!(round("SELECT E'a\\nb'"), "SELECT 'a\nb'");
3452 assert_eq!(round("SELECT e'a\\tb'"), "SELECT 'a\tb'", "the prefix is a letter, not a name");
3453 assert_eq!(round("SELECT E'a\\rb'"), "SELECT 'a\rb'");
3454 assert_eq!(round("SELECT E'a\\bb'"), "SELECT 'a\u{8}b'");
3455 assert_eq!(round("SELECT E'a\\fb'"), "SELECT 'a\u{c}b'");
3456 assert_eq!(round("SELECT E'a\\\\b'"), "SELECT 'a\\b'");
3457 assert_eq!(round("SELECT E'a\\'b'"), "SELECT 'a'b'", "a quote, the same as ''");
3458 assert_eq!(round("SELECT E'a''b'"), "SELECT 'a'b'", "and '' still means a quote here");
3459 assert_eq!(round("SELECT E'a\\vb'"), "SELECT 'avb'");
3462 assert_eq!(round("SELECT E'a\\qb'"), "SELECT 'aqb'");
3463 }
3464
3465 #[test]
3467 fn a_numeric_escape_writes_the_byte_or_the_character_it_names() {
3468 assert_eq!(round("SELECT E'\\x41'"), "SELECT 'A'");
3469 assert_eq!(round("SELECT E'\\x4142'"), "SELECT 'A42'", "two digits at the most");
3470 assert_eq!(
3471 round("SELECT E'a\\x'"),
3472 "SELECT 'ax'",
3473 "and one at the least, or it is a letter"
3474 );
3475 assert_eq!(round("SELECT E'\\101'"), "SELECT 'A'");
3476 assert_eq!(round("SELECT E'\\1011'"), "SELECT 'A1'", "three digits at the most");
3477 assert_eq!(round("SELECT E'\\8'"), "SELECT '8'", "8 is not an octal digit");
3478 assert_eq!(round("SELECT E'\\xc3\\xa9'"), "SELECT 'é'");
3480 assert_eq!(round("SELECT E'\\u00e9'"), "SELECT 'é'");
3481 assert_eq!(round("SELECT E'a\\u41'"), "SELECT 'au41'", "four digits or it is a letter");
3482 assert_eq!(round("SELECT E'a\\uZZZZ'"), "SELECT 'auZZZZ'");
3483 assert_eq!(
3484 round("SELECT E'\\ud83d\\ude00'"),
3485 "SELECT 'ud83dude00'",
3486 "surrogates are not it"
3487 );
3488 }
3489
3490 #[test]
3492 fn an_escape_string_that_is_not_a_string_raises() {
3493 let error = parse_ast("SELECT E'a\\x00'").unwrap_err().to_string();
3494 assert_eq!(error, "Parser Error: Null character not permitted in escape string literal");
3495 let error = parse_ast("SELECT E'a\\377'").unwrap_err().to_string();
3496 assert_eq!(
3497 error,
3498 "Parser Error: Invalid UTF-8 in escape string literal at byte offset 1: byte mismatch",
3499 "the offset is where the bytes stop being a string, not where the escape was written"
3500 );
3501 }
3502
3503 #[test]
3505 fn the_other_string_prefixes_are_what_upstream_makes_of_them() {
3506 assert_eq!(round("SELECT N'abc'"), "SELECT CAST('abc' AS VARCHAR)");
3508 assert_eq!(round("SELECT n'abc'"), "SELECT CAST('abc' AS VARCHAR)");
3509 assert_eq!(round("SELECT B'101'"), "SELECT 'b101'");
3511 assert_eq!(round("SELECT b'abc'"), "SELECT 'babc'");
3512 assert_eq!(round("SELECT B''"), "SELECT 'b'", "an empty one is the letter on its own");
3513 }
3514
3515 #[test]
3521 fn a_hex_string_is_a_blob_and_not_a_string() {
3522 assert_eq!(round("SELECT x'4142'"), "SELECT 'AB'::BLOB");
3523 assert_eq!(round("SELECT X'4142'"), "SELECT 'AB'::BLOB");
3524 assert_eq!(round("SELECT x'ff41'"), "SELECT '\\xFFA'::BLOB", "a byte that does not print");
3525 assert_eq!(round("SELECT x''"), "SELECT ''::BLOB", "an empty one is an empty blob");
3526 assert_eq!(round("SELECT x'2741'"), "SELECT '\\x27A'::BLOB");
3529 assert_eq!(round("SELECT x'5c7834314141'"), "SELECT '\\x5Cx41AA'::BLOB");
3530 let error = parse_ast("SELECT x'4'").unwrap_err().to_string();
3533 assert_eq!(
3534 error,
3535 "Parser Error: Hex string literal must have an even number of hex digits"
3536 );
3537 assert_eq!(round("SELECT x'41zz'"), "SELECT '\\x41\\xzz'::BLOB");
3538 }
3539
3540 #[test]
3541 fn the_null_and_boolean_tests_are_postfix_unary_operators() {
3542 assert_eq!(round("SELECT x IS NULL"), "SELECT (IsNull x)");
3543 assert_eq!(round("SELECT x IS NOT NULL"), "SELECT (IsNotNull x)");
3544 assert_eq!(round("SELECT x ISNULL"), "SELECT (IsNull x)");
3545 assert_eq!(round("SELECT x NOTNULL"), "SELECT (IsNotNull x)");
3546 assert_eq!(round("SELECT x IS TRUE"), "SELECT (IsTrue x)");
3547 assert_eq!(round("SELECT x IS NOT FALSE"), "SELECT (IsNotFalse x)");
3548 assert_eq!(round("SELECT x IS DISTINCT FROM y"), "SELECT (x IsDistinctFrom y)");
3549 assert_eq!(round("SELECT x IS NOT DISTINCT FROM y"), "SELECT (x IsNotDistinctFrom y)");
3550 }
3551
3552 #[test]
3553 fn the_like_family_folds_its_negation_into_the_operator() {
3554 assert_eq!(round("SELECT x LIKE 'a'"), "SELECT (x Like 'a')");
3555 assert_eq!(round("SELECT x NOT LIKE 'a'"), "SELECT (x NotLike 'a')");
3556 assert_eq!(round("SELECT x ILIKE 'a'"), "SELECT (x ILike 'a')");
3557 assert_eq!(round("SELECT x ~~ 'a'"), "SELECT (x Like 'a')", "the operator spelling");
3558 assert_eq!(round("SELECT x !~~ 'a'"), "SELECT (x NotLike 'a')");
3559 assert_eq!(round("SELECT x SIMILAR TO 'a'"), "SELECT (x SimilarTo 'a')");
3560 assert_eq!(round("SELECT x NOT GLOB 'a'"), "SELECT (Not (x Glob 'a'))");
3562 }
3563
3564 #[test]
3565 fn between_and_in_carry_their_negation_as_a_flag() {
3566 assert_eq!(round("SELECT x BETWEEN 1 AND 2"), "SELECT (x BETWEEN 1 AND 2)");
3567 assert_eq!(round("SELECT x NOT BETWEEN 1 AND 2"), "SELECT (NOT x BETWEEN 1 AND 2)");
3568 assert_eq!(round("SELECT x IN (1, 2)"), "SELECT (x IN [1, 2])");
3569 assert_eq!(round("SELECT x NOT IN (1, 2)"), "SELECT (NOT x IN [1, 2])");
3570 }
3571
3572 #[test]
3573 fn both_spellings_of_a_cast_are_the_same_node() {
3574 assert_eq!(round("SELECT CAST(x AS BIGINT)"), "SELECT CAST(x AS BIGINT)");
3575 assert_eq!(round("SELECT x::BIGINT"), "SELECT CAST(x AS BIGINT)");
3576 assert_eq!(round("SELECT TRY_CAST(x AS BIGINT)"), "SELECT TRY_CAST(x AS BIGINT)");
3577 assert_eq!(
3578 round("SELECT x::DECIMAL(18, 3)"),
3579 "SELECT CAST(x AS DECIMAL(18, 3))",
3580 "the type is kept as text because parsing it is the type system's job"
3581 );
3582 }
3583
3584 #[test]
3585 fn a_typed_literal_is_a_third_spelling_of_the_same_cast() {
3586 assert_eq!(round("SELECT DATE '1995-09-01'"), "SELECT CAST('1995-09-01' AS DATE)");
3587 assert_eq!(
3588 round("SELECT date '1995-09-01'"),
3589 "SELECT CAST('1995-09-01' AS date)",
3590 "the type is kept as written, the same as it is in the other two spellings"
3591 );
3592 assert_eq!(
3593 round("SELECT TIMESTAMP '2020-01-01 03:04:05'"),
3594 "SELECT CAST('2020-01-01 03:04:05' AS TIMESTAMP)"
3595 );
3596 assert_eq!(
3597 round("SELECT DECIMAL(5, 2) '1.5'"),
3598 "SELECT CAST('1.5' AS DECIMAL(5, 2))",
3599 "any type the cast takes is a typed literal, parameters and all"
3600 );
3601 assert_eq!(
3602 round("SELECT VARCHAR 'hi' FROM t"),
3603 "SELECT CAST('hi' AS VARCHAR) FROM t",
3604 "including the ones where the cast has nothing to do"
3605 );
3606 }
3607
3608 #[test]
3609 fn a_case_keeps_its_arms_in_order() {
3610 assert_eq!(
3611 round("SELECT CASE WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"),
3612 "SELECT CASE - WHEN a THEN 1 WHEN b THEN 2 ELSE 3 END"
3613 );
3614 assert_eq!(
3615 round("SELECT CASE x WHEN 1 THEN 'a' END"),
3616 "SELECT CASE x WHEN 1 THEN 'a' ELSE - END",
3617 "a simple case keeps the operand and a missing else is not an implicit null yet"
3618 );
3619 }
3620
3621 #[test]
3622 fn a_field_access_and_a_method_call_are_ordinary_function_calls() {
3623 assert_eq!(round("SELECT (f(x)).y"), "SELECT struct_extract(f(x), 'y')");
3626 assert_eq!(round("SELECT a[1]"), "SELECT array_extract(a, 1)");
3627 }
3628
3629 #[test]
3631 fn a_range_gets_the_bounds_the_query_left_out() {
3632 assert_eq!(round("SELECT a[1:2]"), "SELECT array_slice(a, 1, 2)");
3633 assert_eq!(round("SELECT a[:2]"), "SELECT array_slice(a, 1, 2)");
3634 assert_eq!(round("SELECT a[2:]"), "SELECT array_slice(a, 2, -1)");
3635 assert_eq!(round("SELECT a[:]"), "SELECT array_slice(a, 1, -1)");
3636 assert_eq!(round("SELECT a[1:-]"), "SELECT array_slice(a, 1, -1)");
3638 assert_eq!(round("SELECT a[1:2:3]"), "SELECT array_slice(a, 1, 2, 3)");
3639 assert_eq!(round("SELECT a[1:2:]"), "SELECT array_slice(a, 1, 2, [])");
3642 }
3643
3644 #[test]
3646 fn an_empty_subscript_is_not_a_subscript() {
3647 let error = parse_ast("SELECT a[]").expect_err("an empty subscript");
3648 assert_eq!(error.message(), "Empty subscript '[]' is not allowed");
3649 }
3650
3651 #[test]
3654 fn a_keyword_is_not_stepped_through_on_the_way_to_its_one_argument() {
3655 for (sql, rule) in [
3656 ("SELECT row(1)", "RowExpression"),
3657 ("SELECT try(1)", "TryExpression"),
3658 ("SELECT unpack([1])", "UnpackExpression"),
3659 ("SELECT columns('a')", "ColumnsExpression"),
3660 ] {
3661 let error = parse_ast(sql).expect_err(sql);
3662 assert!(error.message().ends_with(rule), "{sql}: {error}");
3663 }
3664 assert_eq!(round("SELECT (1 + 2) * 3"), "SELECT ((1 Add 2) Multiply 3)");
3667 assert_eq!(round("SELECT -(7)"), "SELECT (Negate 7)");
3668 }
3669
3670 #[test]
3672 fn the_null_checks_are_calls_by_the_names_duckdb_prints() {
3673 assert_eq!(round("SELECT COALESCE(a, b, 1)"), "SELECT coalesce(a, b, 1)");
3676 assert_eq!(round("SELECT coalesce(a)"), "SELECT coalesce(a)");
3677 assert_eq!(round("SELECT NULLIF(a, 1)"), "SELECT nullif(a, 1)");
3678 assert_eq!(round("SELECT ifnull(a, 1)"), "SELECT coalesce(a, 1)");
3680 assert_eq!(round("SELECT main.ifnull(a, 1)"), "SELECT coalesce(a, 1)");
3681 let error = parse_ast("SELECT ifnull(a)").expect_err("one argument to ifnull");
3682 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
3683 let error = parse_ast("SELECT ifnull(a, b, c)").expect_err("three arguments to ifnull");
3684 assert_eq!(error.message(), "Wrong number of arguments to IFNULL.");
3685 }
3686
3687 #[test]
3690 fn the_string_keywords_are_the_calls_duckdb_prints() {
3691 assert_eq!(round("SELECT substring(s, 2, 3)"), "SELECT substring(s, 2, 3)");
3692 assert_eq!(round("SELECT SUBSTRING(s FROM 2 FOR 3)"), "SELECT substring(s, 2, 3)");
3693 assert_eq!(round("SELECT substring(s FROM 2)"), "SELECT substring(s, 2)");
3694 assert_eq!(round("SELECT substring(s FOR 3)"), "SELECT substring(s, 1, 3)");
3696 assert_eq!(round("SELECT position('c' IN s)"), "SELECT position(s, 'c')");
3698 assert_eq!(round("SELECT trim(s)"), "SELECT trim(s)");
3699 assert_eq!(round("SELECT trim(BOTH 'x' FROM s)"), "SELECT trim(s, 'x')");
3700 assert_eq!(round("SELECT trim(BOTH FROM s)"), "SELECT trim(s)");
3701 assert_eq!(round("SELECT trim(s, 'xy')"), "SELECT trim(s, 'xy')");
3702 assert_eq!(round("SELECT trim(LEADING FROM s)"), "SELECT ltrim(s)");
3704 assert_eq!(round("SELECT trim(TRAILING FROM s)"), "SELECT rtrim(s)");
3705 assert_eq!(round("SELECT trim(LEADING 'x' FROM s)"), "SELECT ltrim(s, 'x')");
3706 assert_eq!(round("SELECT trim(TRAILING 'x' FROM s)"), "SELECT rtrim(s, 'x')");
3707 assert_eq!(
3708 round("SELECT overlay(s PLACING 'X' FROM 2 FOR 1)"),
3709 "SELECT overlay(s, 'X', 2, 1)"
3710 );
3711 assert_eq!(round("SELECT overlay(s PLACING 'X' FROM 2)"), "SELECT overlay(s, 'X', 2)");
3712 assert_eq!(round("SELECT overlay(s, 'X', 2, 1)"), "SELECT overlay(s, 'X', 2, 1)");
3713 }
3714
3715 #[test]
3716 fn an_aggregate_keeps_its_distinct() {
3717 assert_eq!(round("SELECT count(*)"), "SELECT count(*)");
3718 assert_eq!(round("SELECT count(DISTINCT x)"), "SELECT count(DISTINCT x)");
3719 assert_eq!(round("SELECT count(ALL x)"), "SELECT count(x)");
3720 assert_eq!(round("SELECT main.count(x)"), "SELECT main.count(x)");
3721 }
3722
3723 #[test]
3724 fn the_modifiers_hang_off_the_query_and_not_off_the_select() {
3725 assert_eq!(
3729 round("SELECT 1 UNION ALL SELECT 2 ORDER BY 1"),
3730 "(SELECT 1 Union All SELECT 2) ORDER BY 1 Unstated Unstated"
3731 );
3732 assert_eq!(
3733 round("SELECT a FROM t UNION SELECT b FROM u EXCEPT SELECT c FROM v"),
3734 "((SELECT a FROM t Union Unstated SELECT b FROM u) Except Unstated SELECT c FROM v)",
3735 "set operators are left associative"
3736 );
3737 assert_eq!(
3738 round("SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"),
3739 "(SELECT 1 Union Unstated (SELECT 2 Intersect Unstated SELECT 3))",
3740 "and intersect binds tighter than the other two"
3741 );
3742 }
3743
3744 #[test]
3745 fn the_sort_and_limit_clauses_keep_what_was_written() {
3746 assert_eq!(
3747 round("SELECT a FROM t ORDER BY a"),
3748 "SELECT a FROM t ORDER BY a Unstated Unstated"
3749 );
3750 assert_eq!(
3751 round("SELECT a FROM t ORDER BY a DESC NULLS LAST"),
3752 "SELECT a FROM t ORDER BY a Descending Last"
3753 );
3754 assert_eq!(round("SELECT a FROM t ORDER BY ALL"), "SELECT a FROM t ORDER BY ALL");
3755 assert_eq!(round("SELECT a FROM t GROUP BY ALL"), "SELECT a FROM t GROUP BY ALL");
3756 assert_eq!(round("SELECT a FROM t LIMIT 10 OFFSET 5"), "SELECT a FROM t LIMIT 10 OFFSET 5");
3757 assert_eq!(round("SELECT a FROM t OFFSET 5 LIMIT 10"), "SELECT a FROM t LIMIT 10 OFFSET 5");
3758 assert_eq!(round("SELECT a FROM t LIMIT 10%"), "SELECT a FROM t LIMIT 10%");
3759 assert_eq!(round("SELECT a FROM t LIMIT ALL"), "SELECT a FROM t", "which is no limit");
3760 }
3761
3762 #[test]
3763 fn a_subquery_appears_in_both_places_it_can() {
3764 assert_eq!(
3765 round("SELECT * FROM (SELECT x FROM t) AS s"),
3766 "SELECT * FROM (SELECT x FROM t) AS s"
3767 );
3768 assert_eq!(round("SELECT (SELECT 1)"), "SELECT (SELECT 1)");
3769 }
3770
3771 #[test]
3772 fn distinct_on_keeps_its_expressions() {
3773 assert_eq!(round("SELECT DISTINCT a"), "SELECT DISTINCT a");
3774 assert_eq!(round("SELECT ALL a"), "SELECT a", "which is the default written out");
3775 assert_eq!(round("SELECT DISTINCT ON (a, b) a"), "SELECT DISTINCT ON (a, b) a");
3776 }
3777
3778 #[test]
3779 fn an_operator_the_dialect_does_not_name_is_kept_by_name() {
3780 assert_eq!(round("SELECT a <=> b"), "SELECT (a <=> b)");
3786 assert!(parse_ast("SELECT a foo b").is_err(), "a bare word is not an operator");
3787 }
3788
3789 #[test]
3790 fn a_script_is_a_list_of_statements() {
3791 let ast = parse_ast("SELECT 1; SELECT 2;").unwrap();
3792 assert_eq!(ast.statements.len(), 2);
3793 let Statement::Query(second) = ast.statements[1] else {
3797 panic!("the second statement is a query");
3798 };
3799 assert_eq!(show_query(&ast, second), "SELECT 2");
3800 }
3801
3802 #[test]
3803 fn an_unsupported_construct_names_itself_and_what_was_written() {
3804 let error = parse_ast("ALTER TABLE t ADD COLUMN a INTEGER").unwrap_err().to_string();
3805 assert!(error.starts_with("Not implemented Error"), "{error}");
3806 assert!(error.contains("ALTER TABLE t ADD COLUMN a INTEGER"), "{error}");
3807 assert!(error.contains("AlterStatement"), "{error}");
3808 }
3809
3810 #[test]
3811 fn a_long_construct_is_cut_short_in_the_message() {
3812 let query = format!("ALTER TABLE t ADD COLUMN {} INTEGER", "a".repeat(80));
3813 let error = parse_ast(&query).unwrap_err().to_string();
3814 assert!(error.contains("..."), "{error}");
3815 assert!(error.len() < 200, "{error}");
3816 }
3817
3818 #[test]
3819 fn the_transformer_never_panics_on_anything_the_matcher_accepts() {
3820 for query in [
3824 "SELECT",
3825 "FROM t SELECT",
3826 "SELECT * FROM t WHERE",
3827 "SELECT ()",
3828 "SELECT a FROM t GROUP BY ()",
3829 ] {
3830 let answer = parse_ast(query);
3831 if let Err(error) = answer {
3832 let message = error.to_string();
3833 assert!(
3834 message.starts_with("Not implemented Error")
3835 || message.starts_with("Parser Error"),
3836 "{query} failed with {message}"
3837 );
3838 }
3839 }
3840 }
3841
3842 #[test]
3843 fn a_file_name_in_a_from_clause_is_a_table_name_with_the_quotes_off() {
3844 assert_eq!(round("SELECT * FROM 'hits.parquet'"), "SELECT * FROM hits.parquet");
3848 assert_eq!(round("SELECT * FROM \"hits.parquet\""), "SELECT * FROM hits.parquet");
3849 assert_eq!(round("SELECT * FROM 'hits.parquet' AS h"), "SELECT * FROM hits.parquet AS h");
3850 }
3851
3852 #[test]
3853 fn a_function_call_in_a_from_clause_is_a_source_and_not_an_expression() {
3854 assert_eq!(round("SELECT * FROM range(3)"), "SELECT * FROM range(3)");
3855 assert_eq!(round("SELECT * FROM range(1, 10, 2)"), "SELECT * FROM range(1, 10, 2)");
3856 assert_eq!(round("SELECT * FROM main.range(3)"), "SELECT * FROM main.range(3)");
3857 assert_eq!(round("SELECT * FROM range(3) AS t"), "SELECT * FROM range(3) AS t");
3858 assert_eq!(round("SELECT * FROM some_function()"), "SELECT * FROM some_function()");
3861 }
3862
3863 #[test]
3864 fn the_forms_of_a_table_function_this_does_not_cover_are_turned_away_by_name() {
3865 for query in [
3866 "SELECT * FROM range(3) WITH ORDINALITY",
3867 "SELECT * FROM LATERAL range(3)",
3868 "SELECT * FROM t: range(3)",
3869 ] {
3870 let error = parse_ast(query).unwrap_err().to_string();
3871 assert!(error.contains("grammar rule"), "{query} failed with {error}");
3872 }
3873 }
3874
3875 #[test]
3876 fn interning_means_a_name_written_twice_is_stored_once() {
3877 let ast = parse_ast("SELECT a, a, a FROM t WHERE a = a").unwrap();
3878 assert_eq!(ast.strings.iter().filter(|text| *text == "a").count(), 1);
3879 }
3880}