1use crate::ast::*;
2use crate::errors::{Result, SqlglotError};
3use crate::tokens::{Token, TokenType, Tokenizer};
4
5fn quote_style_from_char(c: char) -> QuoteStyle {
7 match c {
8 '"' => QuoteStyle::DoubleQuote,
9 '`' => QuoteStyle::Backtick,
10 '[' => QuoteStyle::Bracket,
11 _ => QuoteStyle::None,
12 }
13}
14
15pub struct Parser {
20 tokens: Vec<Token>,
21 pos: usize,
22 #[allow(dead_code)]
24 preserve_comments: bool,
25 pending_comments: Vec<String>,
27}
28
29impl Parser {
30 pub fn new(sql: &str) -> Result<Self> {
32 let mut tokenizer = Tokenizer::new(sql);
33 let tokens = tokenizer.tokenize()?;
34 Ok(Self {
35 tokens,
36 pos: 0,
37 preserve_comments: false,
38 pending_comments: Vec::new(),
39 })
40 }
41
42 pub fn new_with_comments(sql: &str) -> Result<Self> {
44 let mut tokenizer = Tokenizer::with_comments(sql);
45 let tokens = tokenizer.tokenize()?;
46 Ok(Self {
47 tokens,
48 pos: 0,
49 preserve_comments: true,
50 pending_comments: Vec::new(),
51 })
52 }
53
54 fn collect_comments(&mut self) {
59 while self.pos < self.tokens.len() {
60 match self.tokens[self.pos].token_type {
61 TokenType::LineComment | TokenType::BlockComment => {
62 let token = &self.tokens[self.pos];
63 self.pending_comments.push(token.value.clone());
64 self.pos += 1;
65 }
66 _ => break,
67 }
68 }
69 }
70
71 fn take_comments(&mut self) -> Vec<String> {
73 std::mem::take(&mut self.pending_comments)
74 }
75
76 fn peek(&self) -> &Token {
79 &self.tokens[self.pos.min(self.tokens.len() - 1)]
80 }
81
82 fn peek_type(&self) -> &TokenType {
83 &self.peek().token_type
84 }
85
86 fn advance(&mut self) -> &Token {
87 let token = &self.tokens[self.pos.min(self.tokens.len() - 1)];
88 if self.pos < self.tokens.len() {
89 self.pos += 1;
90 }
91 token
92 }
93
94 fn expect(&mut self, expected: TokenType) -> Result<Token> {
95 let token = self.peek().clone();
96 if token.token_type == expected {
97 self.advance();
98 Ok(token)
99 } else {
100 Err(SqlglotError::ParserError {
101 message: format!(
102 "Expected {expected:?}, got {:?} ('{}') at line {} col {}",
103 token.token_type, token.value, token.line, token.col
104 ),
105 })
106 }
107 }
108
109 fn match_token(&mut self, expected: TokenType) -> bool {
110 if self.peek().token_type == expected {
111 self.advance();
112 true
113 } else {
114 false
115 }
116 }
117
118 fn check_keyword(&self, keyword: &str) -> bool {
120 self.peek().value.to_uppercase() == keyword
121 }
122
123 fn check_keyword_offset(&self, keyword: &str, offset: usize) -> bool {
125 let idx = self.pos + offset;
126 if idx < self.tokens.len() {
127 self.tokens[idx].value.to_uppercase() == keyword
128 } else {
129 false
130 }
131 }
132
133 fn match_keyword(&mut self, keyword: &str) -> bool {
135 if self.check_keyword(keyword) {
136 self.advance();
137 true
138 } else {
139 false
140 }
141 }
142
143 fn expect_keyword(&mut self, keyword: &str) -> Result<()> {
145 if self.check_keyword(keyword) {
146 self.advance();
147 Ok(())
148 } else {
149 let token = self.peek().clone();
150 Err(SqlglotError::ParserError {
151 message: format!(
152 "Expected keyword '{keyword}', got '{value}' at line {line} col {col}",
153 value = token.value,
154 line = token.line,
155 col = token.col
156 ),
157 })
158 }
159 }
160
161 fn is_name_token(&self) -> bool {
163 matches!(
164 self.peek_type(),
165 TokenType::Identifier
166 | TokenType::Year
167 | TokenType::Month
168 | TokenType::Day
169 | TokenType::Hour
170 | TokenType::Minute
171 | TokenType::Second
172 | TokenType::Key
173 | TokenType::Filter
174 | TokenType::First
175 | TokenType::Next
176 | TokenType::Only
177 | TokenType::Respect
178 | TokenType::Epoch
179 | TokenType::Schema
180 | TokenType::Database
181 | TokenType::View
182 | TokenType::Collate
183 | TokenType::Comment
184 | TokenType::Left
185 | TokenType::Right
186 | TokenType::Replace
187 | TokenType::Cube
188 | TokenType::Rollup
189 | TokenType::Grouping
190 | TokenType::Pivot
191 | TokenType::Unpivot
192 | TokenType::Sets
193 )
194 }
195
196 fn expect_name(&mut self) -> Result<String> {
198 let (name, _) = self.expect_name_with_quote()?;
199 Ok(name)
200 }
201
202 fn expect_name_with_quote(&mut self) -> Result<(String, QuoteStyle)> {
204 if self.is_name_token() {
205 let token = self.advance().clone();
206 let qs = quote_style_from_char(token.quote_char);
207 return Ok((token.value.clone(), qs));
208 }
209 let token = self.peek().clone();
211 if matches!(
212 token.token_type,
213 TokenType::Identifier
214 | TokenType::Int
215 | TokenType::Integer
216 | TokenType::BigInt
217 | TokenType::SmallInt
218 | TokenType::TinyInt
219 | TokenType::Float
220 | TokenType::Double
221 | TokenType::Decimal
222 | TokenType::Numeric
223 | TokenType::Real
224 | TokenType::Varchar
225 | TokenType::Char
226 | TokenType::Text
227 | TokenType::Boolean
228 | TokenType::Date
229 | TokenType::Timestamp
230 | TokenType::TimestampTz
231 | TokenType::Time
232 | TokenType::Interval
233 | TokenType::Blob
234 | TokenType::Bytea
235 | TokenType::Json
236 | TokenType::Jsonb
237 | TokenType::Uuid
238 | TokenType::Array
239 | TokenType::Map
240 | TokenType::Struct
241 ) {
242 let t = self.advance().clone();
243 let qs = quote_style_from_char(t.quote_char);
244 Ok((t.value.clone(), qs))
245 } else {
246 Err(SqlglotError::ParserError {
247 message: format!(
248 "Expected identifier, got {:?} ('{}') at line {} col {}",
249 token.token_type, token.value, token.line, token.col
250 ),
251 })
252 }
253 }
254
255 pub fn parse_statement(&mut self) -> Result<Statement> {
259 self.collect_comments();
260 let stmt = self.parse_statement_inner()?;
261 while self.match_token(TokenType::Semicolon) {}
263 Ok(stmt)
264 }
265
266 fn parse_statement_inner(&mut self) -> Result<Statement> {
267 self.collect_comments();
268 let comments = self.take_comments();
269 let mut stmt = match self.peek_type() {
270 TokenType::With => self.parse_with_statement(),
271 TokenType::Select => {
272 let select = self.parse_select_body(vec![])?;
273 self.maybe_parse_set_operation(Statement::Select(select))
274 }
275 TokenType::LParen => {
276 let saved_pos = self.pos;
278 self.advance(); if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
280 let inner = self.parse_statement_inner()?;
281 self.expect(TokenType::RParen)?;
282 self.maybe_parse_set_operation(inner)
283 } else {
284 self.pos = saved_pos;
285 Err(SqlglotError::ParserError {
286 message: "Expected statement".into(),
287 })
288 }
289 }
290 TokenType::Insert => self.parse_insert().map(Statement::Insert),
291 TokenType::Update => self.parse_update().map(Statement::Update),
292 TokenType::Delete => self.parse_delete().map(Statement::Delete),
293 TokenType::Merge => self.parse_merge().map(Statement::Merge),
294 TokenType::Create => self.parse_create(),
295 TokenType::Drop => self.parse_drop(),
296 TokenType::Alter => self.parse_alter_table().map(Statement::AlterTable),
297 TokenType::Truncate => self.parse_truncate().map(Statement::Truncate),
298 TokenType::Begin | TokenType::Commit | TokenType::Rollback | TokenType::Savepoint => {
299 self.parse_transaction().map(Statement::Transaction)
300 }
301 TokenType::Explain => self.parse_explain().map(Statement::Explain),
302 TokenType::Use => self.parse_use().map(Statement::Use),
303 _ => Err(SqlglotError::UnexpectedToken {
304 token: self.peek().clone(),
305 }),
306 }?;
307 if !comments.is_empty() {
308 attach_comments_to_statement(&mut stmt, comments);
309 }
310 Ok(stmt)
311 }
312
313 pub fn parse_statements(&mut self) -> Result<Vec<Statement>> {
315 let mut stmts = Vec::new();
316 while !matches!(self.peek_type(), TokenType::Eof) {
317 while self.match_token(TokenType::Semicolon) {}
318 if matches!(self.peek_type(), TokenType::Eof) {
319 break;
320 }
321 stmts.push(self.parse_statement()?);
322 }
323 Ok(stmts)
324 }
325
326 fn parse_with_statement(&mut self) -> Result<Statement> {
329 self.expect(TokenType::With)?;
330 let recursive = self.match_token(TokenType::Recursive);
331 let mut ctes = vec![self.parse_cte(recursive)?];
332 while self.match_token(TokenType::Comma) {
333 ctes.push(self.parse_cte(recursive)?);
334 }
335
336 match self.peek_type() {
338 TokenType::Select => {
339 let select = self.parse_select_body(ctes)?;
340 self.maybe_parse_set_operation(Statement::Select(select))
341 }
342 TokenType::Insert => {
343 let ins = self.parse_insert()?;
345 let _ = ctes; Ok(Statement::Insert(ins))
348 }
349 _ => Err(SqlglotError::ParserError {
350 message: "Expected SELECT or INSERT after WITH clause".into(),
351 }),
352 }
353 }
354
355 fn parse_cte(&mut self, recursive: bool) -> Result<Cte> {
356 let (name, name_quote_style) = self.expect_name_with_quote()?;
357
358 let columns = if self.match_token(TokenType::LParen) {
359 let mut cols = vec![self.expect_name()?];
360 while self.match_token(TokenType::Comma) {
361 cols.push(self.expect_name()?);
362 }
363 self.expect(TokenType::RParen)?;
364 cols
365 } else {
366 vec![]
367 };
368
369 self.expect(TokenType::As)?;
370
371 let materialized = if self.match_keyword("MATERIALIZED") {
372 Some(true)
373 } else if self.check_keyword("NOT") {
374 let saved = self.pos;
375 self.advance();
376 if self.match_keyword("MATERIALIZED") {
377 Some(false)
378 } else {
379 self.pos = saved;
380 None
381 }
382 } else {
383 None
384 };
385
386 self.expect(TokenType::LParen)?;
387 let query = self.parse_statement_inner()?;
388 self.expect(TokenType::RParen)?;
389
390 Ok(Cte {
391 name,
392 name_quote_style,
393 columns,
394 query: Box::new(query),
395 materialized,
396 recursive,
397 })
398 }
399
400 fn parse_select_body(&mut self, ctes: Vec<Cte>) -> Result<SelectStatement> {
403 self.expect(TokenType::Select)?;
404
405 let distinct = self.match_token(TokenType::Distinct);
406
407 let top = if self.match_token(TokenType::Top) {
412 Some(Box::new(self.parse_primary()?))
413 } else {
414 None
415 };
416
417 let columns = self.parse_select_items()?;
418
419 let from = if self.match_token(TokenType::From) {
420 Some(FromClause {
421 source: self.parse_table_source()?,
422 })
423 } else {
424 None
425 };
426
427 let joins = self.parse_joins()?;
428
429 let where_clause = if self.match_token(TokenType::Where) {
430 Some(self.parse_expr()?)
431 } else {
432 None
433 };
434
435 let group_by = if self.match_token(TokenType::Group) {
436 self.expect(TokenType::By)?;
437 self.parse_group_by_list()?
438 } else {
439 vec![]
440 };
441
442 let having = if self.match_token(TokenType::Having) {
443 Some(self.parse_expr()?)
444 } else {
445 None
446 };
447
448 let qualify = if self.match_token(TokenType::Qualify) {
449 Some(self.parse_expr()?)
450 } else {
451 None
452 };
453
454 let window_definitions = if self.match_token(TokenType::Window) {
456 self.parse_window_definitions()?
457 } else {
458 vec![]
459 };
460
461 let order_by = if self.match_token(TokenType::Order) {
462 self.expect(TokenType::By)?;
463 self.parse_order_by_items()?
464 } else {
465 vec![]
466 };
467
468 let limit = if self.match_token(TokenType::Limit) {
469 Some(self.parse_expr()?)
470 } else {
471 None
472 };
473
474 let offset = if self.match_token(TokenType::Offset) {
475 let expr = self.parse_expr()?;
476 let _ = self.match_token(TokenType::Rows) || self.match_keyword("ROW");
479 Some(expr)
480 } else {
481 None
482 };
483
484 let fetch_first = if self.match_token(TokenType::Fetch) {
486 let _ = self.match_token(TokenType::First) || self.match_token(TokenType::Next);
488 let count = self.parse_expr()?;
489 let _ = self.match_keyword("ROWS") || self.match_keyword("ROW");
491 let _ = self.match_token(TokenType::Only);
493 Some(count)
494 } else {
495 None
496 };
497
498 Ok(SelectStatement {
499 comments: vec![],
500 ctes,
501 distinct,
502 top,
503 columns,
504 from,
505 joins,
506 where_clause,
507 group_by,
508 having,
509 order_by,
510 limit,
511 offset,
512 fetch_first,
513 qualify,
514 window_definitions,
515 })
516 }
517
518 fn parse_window_definitions(&mut self) -> Result<Vec<WindowDefinition>> {
519 let mut defs = Vec::new();
520 loop {
521 let name = self.expect_name()?;
522 self.expect(TokenType::As)?;
523 self.expect(TokenType::LParen)?;
524 let spec = self.parse_window_spec()?;
525 self.expect(TokenType::RParen)?;
526 defs.push(WindowDefinition { name, spec });
527 if !self.match_token(TokenType::Comma) {
528 break;
529 }
530 }
531 Ok(defs)
532 }
533
534 fn maybe_parse_set_operation(&mut self, left: Statement) -> Result<Statement> {
536 let op = match self.peek_type() {
537 TokenType::Union => SetOperationType::Union,
538 TokenType::Intersect => SetOperationType::Intersect,
539 TokenType::Except => SetOperationType::Except,
540 _ => return Ok(left),
541 };
542 self.advance();
543
544 let all = self.match_token(TokenType::All);
545 let _ = self.match_token(TokenType::Distinct); let right = self.parse_statement_inner()?;
548
549 let combined = Statement::SetOperation(SetOperationStatement {
551 comments: vec![],
552 op,
553 all,
554 left: Box::new(left),
555 right: Box::new(right),
556 order_by: vec![],
557 limit: None,
558 offset: None,
559 });
560
561 if matches!(
563 self.peek_type(),
564 TokenType::Union | TokenType::Intersect | TokenType::Except
565 ) {
566 self.maybe_parse_set_operation(combined)
567 } else {
568 if let Statement::SetOperation(mut sop) = combined {
570 if self.match_token(TokenType::Order) {
571 self.expect(TokenType::By)?;
572 sop.order_by = self.parse_order_by_items()?;
573 }
574 if self.match_token(TokenType::Limit) {
575 sop.limit = Some(self.parse_expr()?);
576 }
577 if self.match_token(TokenType::Offset) {
578 sop.offset = Some(self.parse_expr()?);
579 }
580 Ok(Statement::SetOperation(sop))
581 } else {
582 Ok(combined)
583 }
584 }
585 }
586
587 fn parse_select_items(&mut self) -> Result<Vec<SelectItem>> {
588 let mut items = vec![self.parse_select_item()?];
589 while self.match_token(TokenType::Comma) {
590 items.push(self.parse_select_item()?);
591 }
592 Ok(items)
593 }
594
595 fn parse_select_item(&mut self) -> Result<SelectItem> {
596 if self.peek().token_type == TokenType::Star {
597 self.advance();
598 return Ok(SelectItem::Wildcard);
599 }
600
601 let expr = self.parse_expr()?;
602
603 if let Expr::QualifiedWildcard { ref table } = expr {
605 return Ok(SelectItem::QualifiedWildcard {
606 table: table.clone(),
607 });
608 }
609
610 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
611 Some((name, qs)) => (Some(name), qs),
612 None => (None, QuoteStyle::None),
613 };
614
615 Ok(SelectItem::Expr {
616 expr,
617 alias,
618 alias_quote_style,
619 })
620 }
621
622 fn parse_optional_alias(&mut self) -> Result<Option<(String, QuoteStyle)>> {
623 if self.match_token(TokenType::As) {
624 return Ok(Some(self.expect_name_with_quote()?));
625 }
626 if self.is_name_token() {
628 let peeked_upper = self.peek().value.to_uppercase();
629 if !matches!(
630 peeked_upper.as_str(),
631 "FROM"
632 | "WHERE"
633 | "GROUP"
634 | "ORDER"
635 | "LIMIT"
636 | "HAVING"
637 | "UNION"
638 | "INTERSECT"
639 | "EXCEPT"
640 | "JOIN"
641 | "INNER"
642 | "LEFT"
643 | "RIGHT"
644 | "FULL"
645 | "CROSS"
646 | "ON"
647 | "WINDOW"
648 | "QUALIFY"
649 | "INTO"
650 | "SET"
651 | "RETURNING"
652 | "PIVOT"
653 | "UNPIVOT"
654 ) {
655 let token = self.advance().clone();
656 let qs = quote_style_from_char(token.quote_char);
657 return Ok(Some((token.value.clone(), qs)));
658 }
659 }
660 Ok(None)
661 }
662
663 fn parse_table_source(&mut self) -> Result<TableSource> {
664 let source = self.parse_base_table_source()?;
665 self.parse_pivot_or_unpivot(source)
667 }
668
669 fn parse_base_table_source(&mut self) -> Result<TableSource> {
670 if self.match_token(TokenType::Lateral) {
672 let source = self.parse_table_source()?;
673 return Ok(TableSource::Lateral {
674 source: Box::new(source),
675 });
676 }
677
678 if self.match_token(TokenType::Unnest) {
680 self.expect(TokenType::LParen)?;
681 let expr = self.parse_expr()?;
682 self.expect(TokenType::RParen)?;
683 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
684 Some((name, qs)) => (Some(name), qs),
685 None => (None, QuoteStyle::None),
686 };
687 let with_offset = self.match_keyword("WITH") && self.match_keyword("OFFSET");
688 return Ok(TableSource::Unnest {
689 expr: Box::new(expr),
690 alias,
691 alias_quote_style,
692 with_offset,
693 });
694 }
695
696 if self.peek_type() == &TokenType::LParen {
698 let saved = self.pos;
699 self.advance();
700 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
701 let query = self.parse_statement_inner()?;
702 self.expect(TokenType::RParen)?;
703 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
704 Some((name, qs)) => (Some(name), qs),
705 None => (None, QuoteStyle::None),
706 };
707 return Ok(TableSource::Subquery {
708 query: Box::new(query),
709 alias,
710 alias_quote_style,
711 });
712 }
713 self.pos = saved;
714 }
715
716 let table_ref = self.parse_table_ref()?;
718
719 if self.peek_type() == &TokenType::LParen && table_ref.schema.is_none() {
721 self.advance();
722 let args = if self.peek_type() != &TokenType::RParen {
723 self.parse_expr_list()?
724 } else {
725 vec![]
726 };
727 self.expect(TokenType::RParen)?;
728 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
729 Some((name, qs)) => (Some(name), qs),
730 None => (None, QuoteStyle::None),
731 };
732 return Ok(TableSource::TableFunction {
733 name: table_ref.name,
734 args,
735 alias,
736 alias_quote_style,
737 });
738 }
739
740 Ok(TableSource::Table(table_ref))
741 }
742
743 fn parse_pivot_or_unpivot(&mut self, source: TableSource) -> Result<TableSource> {
745 if self.match_token(TokenType::Pivot) {
746 self.expect(TokenType::LParen)?;
747 let aggregate = self.parse_expr()?;
748 self.expect_keyword("FOR")?;
749 let for_column = self.expect_name()?;
750 self.expect(TokenType::In)?;
751 self.expect(TokenType::LParen)?;
752 let in_values = self.parse_pivot_values()?;
753 self.expect(TokenType::RParen)?;
754 self.expect(TokenType::RParen)?;
755 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
756 Some((name, qs)) => (Some(name), qs),
757 None => (None, QuoteStyle::None),
758 };
759 return Ok(TableSource::Pivot {
760 source: Box::new(source),
761 aggregate: Box::new(aggregate),
762 for_column,
763 in_values,
764 alias,
765 alias_quote_style,
766 });
767 }
768 if self.match_token(TokenType::Unpivot) {
769 self.expect(TokenType::LParen)?;
770 let value_column = self.expect_name()?;
771 self.expect_keyword("FOR")?;
772 let for_column = self.expect_name()?;
773 self.expect(TokenType::In)?;
774 self.expect(TokenType::LParen)?;
775 let in_columns = self.parse_pivot_values()?;
776 self.expect(TokenType::RParen)?;
777 self.expect(TokenType::RParen)?;
778 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
779 Some((name, qs)) => (Some(name), qs),
780 None => (None, QuoteStyle::None),
781 };
782 return Ok(TableSource::Unpivot {
783 source: Box::new(source),
784 value_column,
785 for_column,
786 in_columns,
787 alias,
788 alias_quote_style,
789 });
790 }
791 Ok(source)
792 }
793
794 fn parse_pivot_values(&mut self) -> Result<Vec<PivotValue>> {
796 let mut values = Vec::new();
797 loop {
798 let value = self.parse_expr()?;
799 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
800 Some((name, qs)) => (Some(name), qs),
801 None => (None, QuoteStyle::None),
802 };
803 values.push(PivotValue {
804 value,
805 alias,
806 alias_quote_style,
807 });
808 if !self.match_token(TokenType::Comma) {
809 break;
810 }
811 }
812 Ok(values)
813 }
814
815 fn parse_table_ref(&mut self) -> Result<TableRef> {
816 let (first, first_qs) = self.expect_name_with_quote()?;
817
818 let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
820 let (second, second_qs) = self.expect_name_with_quote()?;
821 if self.match_token(TokenType::Dot) {
822 let (third, third_qs) = self.expect_name_with_quote()?;
823 (Some(first), Some(second), third, third_qs)
824 } else {
825 (None, Some(first), second, second_qs)
826 }
827 } else {
828 (None, None, first, first_qs)
829 };
830
831 let (alias, alias_quote_style) = match self.parse_optional_alias()? {
832 Some((name, qs)) => (Some(name), qs),
833 None => (None, QuoteStyle::None),
834 };
835
836 Ok(TableRef {
837 catalog,
838 schema,
839 name,
840 alias,
841 name_quote_style: name_qs,
842 alias_quote_style,
843 })
844 }
845
846 fn parse_table_ref_no_alias(&mut self) -> Result<TableRef> {
848 let (first, first_qs) = self.expect_name_with_quote()?;
849
850 let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
851 let (second, second_qs) = self.expect_name_with_quote()?;
852 if self.match_token(TokenType::Dot) {
853 let (third, third_qs) = self.expect_name_with_quote()?;
854 (Some(first), Some(second), third, third_qs)
855 } else {
856 (None, Some(first), second, second_qs)
857 }
858 } else {
859 (None, None, first, first_qs)
860 };
861
862 Ok(TableRef {
863 catalog,
864 schema,
865 name,
866 alias: None,
867 name_quote_style: name_qs,
868 alias_quote_style: QuoteStyle::None,
869 })
870 }
871
872 fn parse_joins(&mut self) -> Result<Vec<JoinClause>> {
873 let mut joins = Vec::new();
874 loop {
875 let join_type = match self.peek_type() {
876 TokenType::Comma => {
884 self.advance();
885 JoinType::Cross
886 }
887 TokenType::Join => {
888 self.advance();
889 JoinType::Inner
890 }
891 TokenType::Inner => {
892 self.advance();
893 self.expect(TokenType::Join)?;
894 JoinType::Inner
895 }
896 TokenType::Left => {
897 self.advance();
898 let _ = self.match_token(TokenType::Outer);
899 self.expect(TokenType::Join)?;
900 JoinType::Left
901 }
902 TokenType::Right => {
903 self.advance();
904 let _ = self.match_token(TokenType::Outer);
905 self.expect(TokenType::Join)?;
906 JoinType::Right
907 }
908 TokenType::Full => {
909 self.advance();
910 let _ = self.match_token(TokenType::Outer);
911 self.expect(TokenType::Join)?;
912 JoinType::Full
913 }
914 TokenType::Cross => {
915 self.advance();
916 self.expect(TokenType::Join)?;
917 JoinType::Cross
918 }
919 _ => break,
920 };
921
922 let table = self.parse_table_source()?;
923 let mut on = None;
924 let mut using = vec![];
925
926 if self.match_token(TokenType::On) {
927 on = Some(self.parse_expr()?);
928 } else if self.match_token(TokenType::Using) {
929 self.expect(TokenType::LParen)?;
930 using = vec![self.expect_name()?];
931 while self.match_token(TokenType::Comma) {
932 using.push(self.expect_name()?);
933 }
934 self.expect(TokenType::RParen)?;
935 }
936
937 joins.push(JoinClause {
938 join_type,
939 table,
940 on,
941 using,
942 });
943 }
944 Ok(joins)
945 }
946
947 fn parse_order_by_items(&mut self) -> Result<Vec<OrderByItem>> {
948 let mut items = Vec::new();
949 loop {
950 let expr = self.parse_expr()?;
951 let ascending = if self.match_token(TokenType::Desc) {
952 false
953 } else {
954 let _ = self.match_token(TokenType::Asc);
955 true
956 };
957
958 let nulls_first = if self.match_token(TokenType::Nulls) {
959 if self.match_token(TokenType::First) {
960 Some(true)
961 } else {
962 self.expect(TokenType::Identifier)?; Some(false)
964 }
965 } else {
966 None
967 };
968
969 items.push(OrderByItem {
970 expr,
971 ascending,
972 nulls_first,
973 });
974 if !self.match_token(TokenType::Comma) {
975 break;
976 }
977 }
978 Ok(items)
979 }
980
981 fn parse_expr_list(&mut self) -> Result<Vec<Expr>> {
982 let mut exprs = vec![self.parse_expr()?];
983 while self.match_token(TokenType::Comma) {
984 exprs.push(self.parse_expr()?);
985 }
986 Ok(exprs)
987 }
988
989 fn parse_group_by_list(&mut self) -> Result<Vec<Expr>> {
992 let mut items = vec![self.parse_group_by_item()?];
993 while self.match_token(TokenType::Comma) {
994 items.push(self.parse_group_by_item()?);
995 }
996 Ok(items)
997 }
998
999 fn parse_group_by_item(&mut self) -> Result<Expr> {
1001 match self.peek_type() {
1002 TokenType::Cube => {
1003 self.advance();
1004 self.expect(TokenType::LParen)?;
1005 let exprs = if self.peek_type() == &TokenType::RParen {
1006 vec![]
1007 } else {
1008 self.parse_group_by_element_list()?
1009 };
1010 self.expect(TokenType::RParen)?;
1011 Ok(Expr::Cube { exprs })
1012 }
1013 TokenType::Rollup => {
1014 self.advance();
1015 self.expect(TokenType::LParen)?;
1016 let exprs = if self.peek_type() == &TokenType::RParen {
1017 vec![]
1018 } else {
1019 self.parse_group_by_element_list()?
1020 };
1021 self.expect(TokenType::RParen)?;
1022 Ok(Expr::Rollup { exprs })
1023 }
1024 TokenType::Grouping => {
1025 let saved = self.pos;
1027 self.advance();
1028 if self.peek_type() == &TokenType::Sets {
1029 self.advance();
1031 self.expect(TokenType::LParen)?;
1032 let sets = self.parse_grouping_sets_elements()?;
1033 self.expect(TokenType::RParen)?;
1034 Ok(Expr::GroupingSets { sets })
1035 } else {
1036 self.pos = saved;
1038 self.parse_expr()
1039 }
1040 }
1041 _ => self.parse_expr(),
1042 }
1043 }
1044
1045 fn parse_group_by_element_list(&mut self) -> Result<Vec<Expr>> {
1048 let mut items = vec![self.parse_group_by_element()?];
1049 while self.match_token(TokenType::Comma) {
1050 items.push(self.parse_group_by_element()?);
1051 }
1052 Ok(items)
1053 }
1054
1055 fn parse_group_by_element(&mut self) -> Result<Expr> {
1057 if self.peek_type() == &TokenType::LParen {
1058 self.advance();
1059 let exprs = self.parse_expr_list()?;
1060 self.expect(TokenType::RParen)?;
1061 if exprs.len() == 1 {
1062 Ok(Expr::Nested(Box::new(exprs.into_iter().next().unwrap())))
1063 } else {
1064 Ok(Expr::Tuple(exprs))
1065 }
1066 } else {
1067 self.parse_expr()
1068 }
1069 }
1070
1071 fn parse_grouping_sets_elements(&mut self) -> Result<Vec<Expr>> {
1074 let mut items = vec![self.parse_grouping_sets_element()?];
1075 while self.match_token(TokenType::Comma) {
1076 items.push(self.parse_grouping_sets_element()?);
1077 }
1078 Ok(items)
1079 }
1080
1081 fn parse_grouping_sets_element(&mut self) -> Result<Expr> {
1083 match self.peek_type() {
1084 TokenType::Cube => {
1085 self.advance();
1086 self.expect(TokenType::LParen)?;
1087 let exprs = if self.peek_type() == &TokenType::RParen {
1088 vec![]
1089 } else {
1090 self.parse_group_by_element_list()?
1091 };
1092 self.expect(TokenType::RParen)?;
1093 Ok(Expr::Cube { exprs })
1094 }
1095 TokenType::Rollup => {
1096 self.advance();
1097 self.expect(TokenType::LParen)?;
1098 let exprs = if self.peek_type() == &TokenType::RParen {
1099 vec![]
1100 } else {
1101 self.parse_group_by_element_list()?
1102 };
1103 self.expect(TokenType::RParen)?;
1104 Ok(Expr::Rollup { exprs })
1105 }
1106 TokenType::LParen => {
1107 self.advance();
1108 if self.peek_type() == &TokenType::RParen {
1109 self.advance();
1111 Ok(Expr::Tuple(vec![]))
1112 } else {
1113 let exprs = self.parse_expr_list()?;
1114 self.expect(TokenType::RParen)?;
1115 if exprs.len() == 1 {
1116 Ok(Expr::Nested(Box::new(exprs.into_iter().next().unwrap())))
1117 } else {
1118 Ok(Expr::Tuple(exprs))
1119 }
1120 }
1121 }
1122 _ => self.parse_expr(),
1123 }
1124 }
1125
1126 fn parse_insert(&mut self) -> Result<InsertStatement> {
1129 self.expect(TokenType::Insert)?;
1130 let _ = self.match_token(TokenType::Into);
1131 let table = self.parse_table_ref()?;
1132
1133 let columns = if self.match_token(TokenType::LParen) {
1134 let mut cols = vec![self.expect_name()?];
1135 while self.match_token(TokenType::Comma) {
1136 cols.push(self.expect_name()?);
1137 }
1138 self.expect(TokenType::RParen)?;
1139 cols
1140 } else {
1141 vec![]
1142 };
1143
1144 let source = if self.match_token(TokenType::Values) {
1145 let mut rows = Vec::new();
1146 loop {
1147 self.expect(TokenType::LParen)?;
1148 let row = self.parse_expr_list()?;
1149 self.expect(TokenType::RParen)?;
1150 rows.push(row);
1151 if !self.match_token(TokenType::Comma) {
1152 break;
1153 }
1154 }
1155 InsertSource::Values(rows)
1156 } else if matches!(
1157 self.peek_type(),
1158 TokenType::Select | TokenType::With | TokenType::LParen
1159 ) {
1160 InsertSource::Query(Box::new(self.parse_statement_inner()?))
1161 } else if self.match_token(TokenType::Default) {
1162 self.expect(TokenType::Values)?;
1163 InsertSource::Default
1164 } else {
1165 return Err(SqlglotError::ParserError {
1166 message: "Expected VALUES, SELECT, or DEFAULT VALUES after INSERT".into(),
1167 });
1168 };
1169
1170 let on_conflict = if self.match_token(TokenType::On) {
1172 if self.match_token(TokenType::Conflict) {
1173 let columns = if self.match_token(TokenType::LParen) {
1174 let mut cols = vec![self.expect_name()?];
1175 while self.match_token(TokenType::Comma) {
1176 cols.push(self.expect_name()?);
1177 }
1178 self.expect(TokenType::RParen)?;
1179 cols
1180 } else {
1181 vec![]
1182 };
1183 self.expect(TokenType::Do)?;
1184 let action = if self.match_token(TokenType::Nothing) {
1185 ConflictAction::DoNothing
1186 } else {
1187 self.expect(TokenType::Update)?;
1188 self.expect(TokenType::Set)?;
1189 let mut assignments = Vec::new();
1190 loop {
1191 let col = self.expect_name()?;
1192 self.expect(TokenType::Eq)?;
1193 let val = self.parse_expr()?;
1194 assignments.push((col, val));
1195 if !self.match_token(TokenType::Comma) {
1196 break;
1197 }
1198 }
1199 ConflictAction::DoUpdate(assignments)
1200 };
1201 Some(OnConflict { columns, action })
1202 } else {
1203 None
1204 }
1205 } else {
1206 None
1207 };
1208
1209 let returning = if self.match_token(TokenType::Returning) {
1210 self.parse_select_items()?
1211 } else {
1212 vec![]
1213 };
1214
1215 Ok(InsertStatement {
1216 comments: vec![],
1217 table,
1218 columns,
1219 source,
1220 on_conflict,
1221 returning,
1222 })
1223 }
1224
1225 fn parse_update(&mut self) -> Result<UpdateStatement> {
1228 self.expect(TokenType::Update)?;
1229 let table = self.parse_table_ref()?;
1230 self.expect(TokenType::Set)?;
1231
1232 let mut assignments = Vec::new();
1233 loop {
1234 let col = self.expect_name()?;
1235 self.expect(TokenType::Eq)?;
1236 let val = self.parse_expr()?;
1237 assignments.push((col, val));
1238 if !self.match_token(TokenType::Comma) {
1239 break;
1240 }
1241 }
1242
1243 let from = if self.match_token(TokenType::From) {
1244 Some(FromClause {
1245 source: self.parse_table_source()?,
1246 })
1247 } else {
1248 None
1249 };
1250
1251 let where_clause = if self.match_token(TokenType::Where) {
1252 Some(self.parse_expr()?)
1253 } else {
1254 None
1255 };
1256
1257 let returning = if self.match_token(TokenType::Returning) {
1258 self.parse_select_items()?
1259 } else {
1260 vec![]
1261 };
1262
1263 Ok(UpdateStatement {
1264 comments: vec![],
1265 table,
1266 assignments,
1267 from,
1268 where_clause,
1269 returning,
1270 })
1271 }
1272
1273 fn parse_delete(&mut self) -> Result<DeleteStatement> {
1276 self.expect(TokenType::Delete)?;
1277 self.expect(TokenType::From)?;
1278 let table = self.parse_table_ref()?;
1279
1280 let using = if self.match_token(TokenType::Using) {
1281 Some(FromClause {
1282 source: self.parse_table_source()?,
1283 })
1284 } else {
1285 None
1286 };
1287
1288 let where_clause = if self.match_token(TokenType::Where) {
1289 Some(self.parse_expr()?)
1290 } else {
1291 None
1292 };
1293
1294 let returning = if self.match_token(TokenType::Returning) {
1295 self.parse_select_items()?
1296 } else {
1297 vec![]
1298 };
1299
1300 Ok(DeleteStatement {
1301 comments: vec![],
1302 table,
1303 using,
1304 where_clause,
1305 returning,
1306 })
1307 }
1308
1309 fn parse_merge(&mut self) -> Result<MergeStatement> {
1312 self.expect(TokenType::Merge)?;
1313 let _ = self.match_token(TokenType::Into);
1314 let target = self.parse_table_ref()?;
1315
1316 self.expect(TokenType::Using)?;
1317 let source = self.parse_table_source()?;
1318
1319 self.expect(TokenType::On)?;
1320 let on = self.parse_expr()?;
1321
1322 let mut clauses = Vec::new();
1323 while self.match_token(TokenType::When) {
1324 clauses.push(self.parse_merge_clause()?);
1325 }
1326
1327 if clauses.is_empty() {
1328 return Err(SqlglotError::ParserError {
1329 message: "MERGE requires at least one WHEN clause".into(),
1330 });
1331 }
1332
1333 let output = if self.match_keyword("OUTPUT") {
1335 self.parse_select_items()?
1336 } else {
1337 vec![]
1338 };
1339
1340 Ok(MergeStatement {
1341 comments: vec![],
1342 target,
1343 source,
1344 on,
1345 clauses,
1346 output,
1347 })
1348 }
1349
1350 fn parse_merge_clause(&mut self) -> Result<MergeClause> {
1351 let kind = if self.match_token(TokenType::Not) {
1352 self.expect(TokenType::Matched)?;
1353 if self.match_keyword("BY") {
1354 if self.match_keyword("SOURCE") {
1355 MergeClauseKind::NotMatchedBySource
1356 } else {
1357 let _ = self.match_keyword("TARGET");
1359 MergeClauseKind::NotMatched
1360 }
1361 } else {
1362 MergeClauseKind::NotMatched
1363 }
1364 } else {
1365 self.expect(TokenType::Matched)?;
1366 MergeClauseKind::Matched
1367 };
1368
1369 let condition = if self.match_token(TokenType::And) {
1370 Some(self.parse_expr()?)
1371 } else {
1372 None
1373 };
1374
1375 self.expect(TokenType::Then)?;
1376
1377 let action = self.parse_merge_action(&kind)?;
1378
1379 Ok(MergeClause {
1380 kind,
1381 condition,
1382 action,
1383 })
1384 }
1385
1386 fn parse_merge_action(&mut self, kind: &MergeClauseKind) -> Result<MergeAction> {
1387 if self.match_token(TokenType::Update) {
1388 self.expect(TokenType::Set)?;
1389 let mut assignments = Vec::new();
1390 loop {
1391 let mut col = self.expect_name()?;
1392 while self.match_token(TokenType::Dot) {
1394 col.push('.');
1395 col.push_str(&self.expect_name()?);
1396 }
1397 self.expect(TokenType::Eq)?;
1398 let val = self.parse_expr()?;
1399 assignments.push((col, val));
1400 if !self.match_token(TokenType::Comma) {
1401 break;
1402 }
1403 }
1404 Ok(MergeAction::Update(assignments))
1405 } else if self.match_token(TokenType::Insert) {
1406 if self.match_keyword("ROW") {
1408 return Ok(MergeAction::InsertRow);
1409 }
1410
1411 let columns = if self.match_token(TokenType::LParen) {
1412 let mut cols = vec![self.expect_name()?];
1413 while self.match_token(TokenType::Comma) {
1414 cols.push(self.expect_name()?);
1415 }
1416 self.expect(TokenType::RParen)?;
1417 cols
1418 } else {
1419 vec![]
1420 };
1421
1422 self.expect(TokenType::Values)?;
1423 self.expect(TokenType::LParen)?;
1424 let values = self.parse_expr_list()?;
1425 self.expect(TokenType::RParen)?;
1426
1427 Ok(MergeAction::Insert { columns, values })
1428 } else if self.match_token(TokenType::Delete) {
1429 Ok(MergeAction::Delete)
1430 } else {
1431 Err(SqlglotError::ParserError {
1432 message: format!(
1433 "Expected UPDATE, INSERT, or DELETE after WHEN {} THEN",
1434 match kind {
1435 MergeClauseKind::Matched => "MATCHED",
1436 MergeClauseKind::NotMatched => "NOT MATCHED",
1437 MergeClauseKind::NotMatchedBySource => "NOT MATCHED BY SOURCE",
1438 }
1439 ),
1440 })
1441 }
1442 }
1443
1444 fn parse_create(&mut self) -> Result<Statement> {
1447 self.expect(TokenType::Create)?;
1448
1449 let or_replace = if self.check_keyword("OR") {
1450 self.advance();
1451 self.expect(TokenType::Replace)?;
1452 true
1453 } else {
1454 false
1455 };
1456
1457 let temporary = self.match_token(TokenType::Temporary) || self.match_token(TokenType::Temp);
1458
1459 let materialized = self.match_token(TokenType::Materialized);
1460
1461 if self.match_token(TokenType::View) {
1462 return self
1463 .parse_create_view(or_replace, materialized)
1464 .map(Statement::CreateView);
1465 }
1466
1467 self.expect(TokenType::Table)?;
1468
1469 let if_not_exists = if self.match_token(TokenType::If) {
1470 self.expect(TokenType::Not)?;
1471 self.expect(TokenType::Exists)?;
1472 true
1473 } else {
1474 false
1475 };
1476
1477 let table = self.parse_table_ref_no_alias()?;
1478
1479 if self.match_token(TokenType::As) {
1481 let query = self.parse_statement_inner()?;
1482 return Ok(Statement::CreateTable(CreateTableStatement {
1483 comments: vec![],
1484 if_not_exists,
1485 temporary,
1486 table,
1487 columns: vec![],
1488 constraints: vec![],
1489 as_select: Some(Box::new(query)),
1490 }));
1491 }
1492
1493 self.expect(TokenType::LParen)?;
1494
1495 let mut columns = Vec::new();
1496 let mut constraints = Vec::new();
1497
1498 loop {
1499 if matches!(
1501 self.peek_type(),
1502 TokenType::Primary
1503 | TokenType::Unique
1504 | TokenType::Foreign
1505 | TokenType::Check
1506 | TokenType::Constraint
1507 ) {
1508 constraints.push(self.parse_table_constraint()?);
1509 } else if self.peek_type() != &TokenType::RParen {
1510 columns.push(self.parse_column_def()?);
1511 }
1512
1513 if !self.match_token(TokenType::Comma) {
1514 break;
1515 }
1516 }
1517 self.expect(TokenType::RParen)?;
1518
1519 Ok(Statement::CreateTable(CreateTableStatement {
1520 comments: vec![],
1521 if_not_exists,
1522 temporary,
1523 table,
1524 columns,
1525 constraints,
1526 as_select: None,
1527 }))
1528 }
1529
1530 fn parse_create_view(
1531 &mut self,
1532 or_replace: bool,
1533 materialized: bool,
1534 ) -> Result<CreateViewStatement> {
1535 let if_not_exists = if self.match_token(TokenType::If) {
1536 self.expect(TokenType::Not)?;
1537 self.expect(TokenType::Exists)?;
1538 true
1539 } else {
1540 false
1541 };
1542
1543 let name = self.parse_table_ref_no_alias()?;
1545
1546 let columns = if self.match_token(TokenType::LParen) {
1547 let mut cols = vec![self.expect_name()?];
1548 while self.match_token(TokenType::Comma) {
1549 cols.push(self.expect_name()?);
1550 }
1551 self.expect(TokenType::RParen)?;
1552 cols
1553 } else {
1554 vec![]
1555 };
1556
1557 self.expect(TokenType::As)?;
1558 let query = self.parse_statement_inner()?;
1559
1560 Ok(CreateViewStatement {
1561 comments: vec![],
1562 name,
1563 columns,
1564 query: Box::new(query),
1565 or_replace,
1566 materialized,
1567 if_not_exists,
1568 })
1569 }
1570
1571 fn parse_table_constraint(&mut self) -> Result<TableConstraint> {
1572 let name = if self.match_token(TokenType::Constraint) {
1573 Some(self.expect_name()?)
1574 } else {
1575 None
1576 };
1577
1578 if self.match_token(TokenType::Primary) {
1579 self.expect(TokenType::Key)?;
1580 self.expect(TokenType::LParen)?;
1581 let columns = self.parse_name_list()?;
1582 self.expect(TokenType::RParen)?;
1583 Ok(TableConstraint::PrimaryKey { name, columns })
1584 } else if self.match_token(TokenType::Unique) {
1585 self.expect(TokenType::LParen)?;
1586 let columns = self.parse_name_list()?;
1587 self.expect(TokenType::RParen)?;
1588 Ok(TableConstraint::Unique { name, columns })
1589 } else if self.match_token(TokenType::Foreign) {
1590 self.expect(TokenType::Key)?;
1591 self.expect(TokenType::LParen)?;
1592 let columns = self.parse_name_list()?;
1593 self.expect(TokenType::RParen)?;
1594 self.expect(TokenType::References)?;
1595 let ref_table = self.parse_table_ref()?;
1596 self.expect(TokenType::LParen)?;
1597 let ref_columns = self.parse_name_list()?;
1598 self.expect(TokenType::RParen)?;
1599
1600 let on_delete =
1601 if self.match_token(TokenType::On) && self.match_token(TokenType::Delete) {
1602 Some(self.parse_referential_action()?)
1603 } else {
1604 None
1605 };
1606 let on_update =
1607 if self.match_token(TokenType::On) && self.match_token(TokenType::Update) {
1608 Some(self.parse_referential_action()?)
1609 } else {
1610 None
1611 };
1612
1613 Ok(TableConstraint::ForeignKey {
1614 name,
1615 columns,
1616 ref_table,
1617 ref_columns,
1618 on_delete,
1619 on_update,
1620 })
1621 } else if self.match_token(TokenType::Check) {
1622 self.expect(TokenType::LParen)?;
1623 let expr = self.parse_expr()?;
1624 self.expect(TokenType::RParen)?;
1625 Ok(TableConstraint::Check { name, expr })
1626 } else {
1627 Err(SqlglotError::ParserError {
1628 message: "Expected constraint type".into(),
1629 })
1630 }
1631 }
1632
1633 fn parse_referential_action(&mut self) -> Result<ReferentialAction> {
1634 if self.match_token(TokenType::Cascade) {
1635 Ok(ReferentialAction::Cascade)
1636 } else if self.match_token(TokenType::Restrict) {
1637 Ok(ReferentialAction::Restrict)
1638 } else if self.match_token(TokenType::Set) {
1639 if self.match_token(TokenType::Null) {
1640 Ok(ReferentialAction::SetNull)
1641 } else if self.match_token(TokenType::Default) {
1642 Ok(ReferentialAction::SetDefault)
1643 } else {
1644 Err(SqlglotError::ParserError {
1645 message: "Expected NULL or DEFAULT after SET".into(),
1646 })
1647 }
1648 } else if self.check_keyword("NO") {
1649 self.advance();
1650 self.expect(TokenType::Identifier)?; Ok(ReferentialAction::NoAction)
1652 } else {
1653 Err(SqlglotError::ParserError {
1654 message: "Expected referential action (CASCADE, RESTRICT, SET NULL, SET DEFAULT, NO ACTION)".into(),
1655 })
1656 }
1657 }
1658
1659 fn parse_name_list(&mut self) -> Result<Vec<String>> {
1660 let mut names = vec![self.expect_name()?];
1661 while self.match_token(TokenType::Comma) {
1662 names.push(self.expect_name()?);
1663 }
1664 Ok(names)
1665 }
1666
1667 fn parse_column_def(&mut self) -> Result<ColumnDef> {
1668 let name = self.expect_name()?;
1669 let data_type = self.parse_data_type()?;
1670
1671 let mut nullable = None;
1672 let mut default = None;
1673 let mut primary_key = false;
1674 let mut unique = false;
1675 let mut auto_increment = false;
1676 let mut collation = None;
1677 let mut comment = None;
1678
1679 loop {
1680 if self.match_token(TokenType::Not) {
1681 self.expect(TokenType::Null)?;
1682 nullable = Some(false);
1683 } else if self.peek_type() == &TokenType::Null {
1684 self.advance();
1685 nullable = Some(true);
1686 } else if self.match_token(TokenType::Default) {
1687 default = Some(self.parse_expr()?);
1688 } else if self.match_token(TokenType::Primary) {
1689 self.expect(TokenType::Key)?;
1690 primary_key = true;
1691 } else if self.match_token(TokenType::Unique) {
1692 unique = true;
1693 } else if self.match_token(TokenType::AutoIncrement) {
1694 auto_increment = true;
1695 } else if self.match_token(TokenType::Collate) {
1696 collation = Some(self.expect_name()?);
1697 } else if self.match_token(TokenType::Comment) {
1698 let tok = self.expect(TokenType::String)?;
1699 comment = Some(tok.value);
1700 } else if self.match_token(TokenType::References) {
1701 let _ = self.parse_table_ref()?;
1703 if self.match_token(TokenType::LParen) {
1704 while !self.match_token(TokenType::RParen) {
1705 self.advance();
1706 }
1707 }
1708 } else {
1709 break;
1710 }
1711 }
1712
1713 Ok(ColumnDef {
1714 name,
1715 data_type,
1716 nullable,
1717 default,
1718 primary_key,
1719 unique,
1720 auto_increment,
1721 collation,
1722 comment,
1723 })
1724 }
1725
1726 fn parse_data_type(&mut self) -> Result<DataType> {
1727 let token = self.peek().clone();
1728 let type_result = match &token.token_type {
1729 TokenType::Int | TokenType::Integer => {
1730 self.advance();
1731 Ok(DataType::Int)
1732 }
1733 TokenType::BigInt => {
1734 self.advance();
1735 Ok(DataType::BigInt)
1736 }
1737 TokenType::SmallInt => {
1738 self.advance();
1739 Ok(DataType::SmallInt)
1740 }
1741 TokenType::TinyInt => {
1742 self.advance();
1743 Ok(DataType::TinyInt)
1744 }
1745 TokenType::Float => {
1746 self.advance();
1747 Ok(DataType::Float)
1748 }
1749 TokenType::Double => {
1750 self.advance();
1751 let _ = self.match_keyword("PRECISION");
1752 Ok(DataType::Double)
1753 }
1754 TokenType::Real => {
1755 self.advance();
1756 Ok(DataType::Real)
1757 }
1758 TokenType::Decimal | TokenType::Numeric => {
1759 let is_numeric = token.token_type == TokenType::Numeric;
1760 self.advance();
1761 let (precision, scale) = self.parse_type_params()?;
1762 if is_numeric {
1763 Ok(DataType::Numeric { precision, scale })
1764 } else {
1765 Ok(DataType::Decimal { precision, scale })
1766 }
1767 }
1768 TokenType::Varchar => {
1769 self.advance();
1770 let len = self.parse_single_type_param()?;
1771 Ok(DataType::Varchar(len))
1772 }
1773 TokenType::Char => {
1774 self.advance();
1775 let len = self.parse_single_type_param()?;
1776 Ok(DataType::Char(len))
1777 }
1778 TokenType::Text => {
1779 self.advance();
1780 Ok(DataType::Text)
1781 }
1782 TokenType::Boolean => {
1783 self.advance();
1784 Ok(DataType::Boolean)
1785 }
1786 TokenType::Date => {
1787 self.advance();
1788 Ok(DataType::Date)
1789 }
1790 TokenType::Timestamp => {
1791 self.advance();
1792 let precision = self.parse_single_type_param()?;
1793 let with_tz = if self.match_keyword("WITH") {
1794 let _ = self.match_keyword("TIME");
1795 let _ = self.match_keyword("ZONE");
1796 true
1797 } else if self.match_keyword("WITHOUT") {
1798 let _ = self.match_keyword("TIME");
1799 let _ = self.match_keyword("ZONE");
1800 false
1801 } else {
1802 false
1803 };
1804 Ok(DataType::Timestamp { precision, with_tz })
1805 }
1806 TokenType::TimestampTz => {
1807 self.advance();
1808 let precision = self.parse_single_type_param()?;
1809 Ok(DataType::Timestamp {
1810 precision,
1811 with_tz: true,
1812 })
1813 }
1814 TokenType::Time => {
1815 self.advance();
1816 let precision = self.parse_single_type_param()?;
1817 Ok(DataType::Time { precision })
1818 }
1819 TokenType::Interval => {
1820 self.advance();
1821 Ok(DataType::Interval)
1822 }
1823 TokenType::Blob => {
1824 self.advance();
1825 Ok(DataType::Blob)
1826 }
1827 TokenType::Bytea => {
1828 self.advance();
1829 Ok(DataType::Bytea)
1830 }
1831 TokenType::Json => {
1832 self.advance();
1833 Ok(DataType::Json)
1834 }
1835 TokenType::Jsonb => {
1836 self.advance();
1837 Ok(DataType::Jsonb)
1838 }
1839 TokenType::Uuid => {
1840 self.advance();
1841 Ok(DataType::Uuid)
1842 }
1843 TokenType::Array => {
1844 self.advance();
1845 if self.match_token(TokenType::Lt) {
1846 let inner = self.parse_data_type()?;
1847 self.expect(TokenType::Gt)?;
1848 Ok(DataType::Array(Some(Box::new(inner))))
1849 } else {
1850 Ok(DataType::Array(None))
1851 }
1852 }
1853 TokenType::Identifier => {
1854 let name = token.value.to_uppercase();
1855 self.advance();
1856 match name.as_str() {
1857 "STRING" => Ok(DataType::String),
1858 "BINARY" => {
1859 let len = self.parse_single_type_param()?;
1860 Ok(DataType::Binary(len))
1861 }
1862 "VARBINARY" => {
1863 let len = self.parse_single_type_param()?;
1864 Ok(DataType::Varbinary(len))
1865 }
1866 "DATETIME" => Ok(DataType::DateTime),
1867 "BYTES" => Ok(DataType::Bytes),
1868 "VARIANT" => Ok(DataType::Variant),
1869 "OBJECT" => Ok(DataType::Object),
1870 "XML" => Ok(DataType::Xml),
1871 "INET" => Ok(DataType::Inet),
1872 "CIDR" => Ok(DataType::Cidr),
1873 "MACADDR" => Ok(DataType::Macaddr),
1874 "BIT" => {
1875 let len = self.parse_single_type_param()?;
1876 Ok(DataType::Bit(len))
1877 }
1878 "MONEY" => Ok(DataType::Money),
1879 "SERIAL" => Ok(DataType::Serial),
1880 "BIGSERIAL" => Ok(DataType::BigSerial),
1881 "SMALLSERIAL" => Ok(DataType::SmallSerial),
1882 "REGCLASS" => Ok(DataType::Regclass),
1883 "REGTYPE" => Ok(DataType::Regtype),
1884 "HSTORE" => Ok(DataType::Hstore),
1885 "GEOGRAPHY" => Ok(DataType::Geography),
1886 "GEOMETRY" => Ok(DataType::Geometry),
1887 "SUPER" => Ok(DataType::Super),
1888 _ => Ok(DataType::Unknown(name)),
1889 }
1890 }
1891 _ => Err(SqlglotError::ParserError {
1892 message: format!("Expected data type, got {:?}", token.token_type),
1893 }),
1894 };
1895
1896 let mut dt = type_result?;
1898 while self.match_token(TokenType::LBracket) {
1899 let _ = self.match_token(TokenType::Number);
1901 self.expect(TokenType::RBracket)?;
1902 dt = DataType::Array(Some(Box::new(dt)));
1903 }
1904 Ok(dt)
1905 }
1906
1907 fn parse_type_params(&mut self) -> Result<(Option<u32>, Option<u32>)> {
1908 if self.match_token(TokenType::LParen) {
1909 let p: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1910 let s = if self.match_token(TokenType::Comma) {
1911 self.expect(TokenType::Number)?.value.parse().ok()
1912 } else {
1913 None
1914 };
1915 self.expect(TokenType::RParen)?;
1916 Ok((p, s))
1917 } else {
1918 Ok((None, None))
1919 }
1920 }
1921
1922 fn parse_single_type_param(&mut self) -> Result<Option<u32>> {
1923 if self.match_token(TokenType::LParen) {
1924 if self.check_keyword("MAX") {
1926 self.advance(); self.expect(TokenType::RParen)?;
1928 return Ok(None);
1929 }
1930 let n: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1931 self.expect(TokenType::RParen)?;
1932 Ok(n)
1933 } else {
1934 Ok(None)
1935 }
1936 }
1937
1938 fn parse_drop(&mut self) -> Result<Statement> {
1941 self.expect(TokenType::Drop)?;
1942
1943 if self.match_token(TokenType::Materialized) {
1944 self.expect(TokenType::View)?;
1945 let if_exists = if self.match_token(TokenType::If) {
1946 self.expect(TokenType::Exists)?;
1947 true
1948 } else {
1949 false
1950 };
1951 let name = self.parse_table_ref()?;
1952 return Ok(Statement::DropView(DropViewStatement {
1953 comments: vec![],
1954 name,
1955 if_exists,
1956 materialized: true,
1957 }));
1958 }
1959
1960 if self.match_token(TokenType::View) {
1961 let if_exists = if self.match_token(TokenType::If) {
1962 self.expect(TokenType::Exists)?;
1963 true
1964 } else {
1965 false
1966 };
1967 let name = self.parse_table_ref()?;
1968 return Ok(Statement::DropView(DropViewStatement {
1969 comments: vec![],
1970 name,
1971 if_exists,
1972 materialized: false,
1973 }));
1974 }
1975
1976 self.expect(TokenType::Table)?;
1977
1978 let if_exists = if self.match_token(TokenType::If) {
1979 self.expect(TokenType::Exists)?;
1980 true
1981 } else {
1982 false
1983 };
1984
1985 let table = self.parse_table_ref()?;
1986 let cascade = self.match_token(TokenType::Cascade);
1987
1988 Ok(Statement::DropTable(DropTableStatement {
1989 comments: vec![],
1990 if_exists,
1991 table,
1992 cascade,
1993 }))
1994 }
1995
1996 fn parse_alter_table(&mut self) -> Result<AlterTableStatement> {
1999 self.expect(TokenType::Alter)?;
2000 self.expect(TokenType::Table)?;
2001 let table = self.parse_table_ref_no_alias()?;
2002
2003 let mut actions = Vec::new();
2004 loop {
2005 let action = self.parse_alter_action()?;
2006 actions.push(action);
2007 if !self.match_token(TokenType::Comma) {
2008 break;
2009 }
2010 }
2011
2012 Ok(AlterTableStatement {
2013 comments: vec![],
2014 table,
2015 actions,
2016 })
2017 }
2018
2019 fn parse_alter_action(&mut self) -> Result<AlterTableAction> {
2020 if self.match_keyword("ADD") {
2021 if matches!(
2022 self.peek_type(),
2023 TokenType::Constraint
2024 | TokenType::Primary
2025 | TokenType::Unique
2026 | TokenType::Foreign
2027 | TokenType::Check
2028 ) {
2029 let constraint = self.parse_table_constraint()?;
2030 Ok(AlterTableAction::AddConstraint(constraint))
2031 } else {
2032 let _ = self.match_keyword("COLUMN");
2033 let col = self.parse_column_def()?;
2034 Ok(AlterTableAction::AddColumn(col))
2035 }
2036 } else if self.match_token(TokenType::Drop) {
2037 let _ = self.match_keyword("COLUMN");
2038 let if_exists = if self.match_token(TokenType::If) {
2039 self.expect(TokenType::Exists)?;
2040 true
2041 } else {
2042 false
2043 };
2044 let name = self.expect_name()?;
2045 Ok(AlterTableAction::DropColumn { name, if_exists })
2046 } else if self.match_keyword("RENAME") {
2047 if self.match_keyword("COLUMN") {
2048 let old_name = self.expect_name()?;
2049 self.expect(TokenType::Identifier)?; let new_name = self.expect_name()?;
2051 Ok(AlterTableAction::RenameColumn { old_name, new_name })
2052 } else if self.match_keyword("TO") {
2053 let new_name = self.expect_name()?;
2054 Ok(AlterTableAction::RenameTable { new_name })
2055 } else {
2056 Err(SqlglotError::ParserError {
2057 message: "Expected COLUMN or TO after RENAME".into(),
2058 })
2059 }
2060 } else {
2061 Err(SqlglotError::ParserError {
2062 message: "Expected ADD, DROP, or RENAME in ALTER TABLE".into(),
2063 })
2064 }
2065 }
2066
2067 fn parse_truncate(&mut self) -> Result<TruncateStatement> {
2070 self.expect(TokenType::Truncate)?;
2071 let _ = self.match_token(TokenType::Table);
2072 let table = self.parse_table_ref()?;
2073 Ok(TruncateStatement {
2074 comments: vec![],
2075 table,
2076 })
2077 }
2078
2079 fn parse_transaction(&mut self) -> Result<TransactionStatement> {
2082 match self.peek_type() {
2083 TokenType::Begin => {
2084 self.advance();
2085 let _ = self.match_token(TokenType::Transaction);
2086 Ok(TransactionStatement::Begin)
2087 }
2088 TokenType::Commit => {
2089 self.advance();
2090 let _ = self.match_token(TokenType::Transaction);
2091 Ok(TransactionStatement::Commit)
2092 }
2093 TokenType::Rollback => {
2094 self.advance();
2095 let _ = self.match_token(TokenType::Transaction);
2096 if self.match_keyword("TO") {
2097 let _ = self.match_token(TokenType::Savepoint);
2098 let name = self.expect_name()?;
2099 Ok(TransactionStatement::RollbackTo(name))
2100 } else {
2101 Ok(TransactionStatement::Rollback)
2102 }
2103 }
2104 TokenType::Savepoint => {
2105 self.advance();
2106 let name = self.expect_name()?;
2107 Ok(TransactionStatement::Savepoint(name))
2108 }
2109 _ => Err(SqlglotError::ParserError {
2110 message: "Expected transaction statement".into(),
2111 }),
2112 }
2113 }
2114
2115 fn parse_explain(&mut self) -> Result<ExplainStatement> {
2118 self.expect(TokenType::Explain)?;
2119 let analyze = self.match_token(TokenType::Analyze);
2120 let statement = self.parse_statement_inner()?;
2121 Ok(ExplainStatement {
2122 comments: vec![],
2123 analyze,
2124 statement: Box::new(statement),
2125 })
2126 }
2127
2128 fn parse_use(&mut self) -> Result<UseStatement> {
2131 self.expect(TokenType::Use)?;
2132 let name = self.expect_name()?;
2133 Ok(UseStatement {
2134 comments: vec![],
2135 name,
2136 })
2137 }
2138
2139 fn parse_expr(&mut self) -> Result<Expr> {
2144 self.parse_or_expr()
2145 }
2146
2147 fn parse_or_expr(&mut self) -> Result<Expr> {
2148 let mut left = self.parse_and_expr()?;
2149 while self.match_token(TokenType::Or) {
2150 let right = self.parse_and_expr()?;
2151 left = Expr::BinaryOp {
2152 left: Box::new(left),
2153 op: BinaryOperator::Or,
2154 right: Box::new(right),
2155 };
2156 }
2157 Ok(left)
2158 }
2159
2160 fn parse_and_expr(&mut self) -> Result<Expr> {
2161 let mut left = self.parse_not_expr()?;
2162 while self.match_token(TokenType::And) {
2163 let right = self.parse_not_expr()?;
2164 left = Expr::BinaryOp {
2165 left: Box::new(left),
2166 op: BinaryOperator::And,
2167 right: Box::new(right),
2168 };
2169 }
2170 Ok(left)
2171 }
2172
2173 fn parse_not_expr(&mut self) -> Result<Expr> {
2174 if self.match_token(TokenType::Not) {
2175 let expr = self.parse_not_expr()?;
2176 Ok(Expr::UnaryOp {
2177 op: UnaryOperator::Not,
2178 expr: Box::new(expr),
2179 })
2180 } else {
2181 self.parse_comparison()
2182 }
2183 }
2184
2185 fn parse_comparison(&mut self) -> Result<Expr> {
2186 let mut left = self.parse_addition()?;
2187
2188 loop {
2189 let op = match self.peek_type() {
2190 TokenType::Eq => Some(BinaryOperator::Eq),
2191 TokenType::Neq => Some(BinaryOperator::Neq),
2192 TokenType::Lt => Some(BinaryOperator::Lt),
2193 TokenType::Gt => Some(BinaryOperator::Gt),
2194 TokenType::LtEq => Some(BinaryOperator::LtEq),
2195 TokenType::GtEq => Some(BinaryOperator::GtEq),
2196 _ => None,
2197 };
2198
2199 if let Some(op) = op {
2200 self.advance();
2201 if matches!(self.peek_type(), TokenType::Any | TokenType::Some) {
2202 self.advance();
2203 self.expect(TokenType::LParen)?;
2204 let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2205 Expr::Subquery(Box::new(self.parse_statement_inner()?))
2206 } else {
2207 self.parse_expr()?
2208 };
2209 self.expect(TokenType::RParen)?;
2210 left = Expr::AnyOp {
2211 expr: Box::new(left),
2212 op,
2213 right: Box::new(right),
2214 };
2215 } else if self.peek_type() == &TokenType::All {
2216 self.advance();
2217 self.expect(TokenType::LParen)?;
2218 let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2219 Expr::Subquery(Box::new(self.parse_statement_inner()?))
2220 } else {
2221 self.parse_expr()?
2222 };
2223 self.expect(TokenType::RParen)?;
2224 left = Expr::AllOp {
2225 expr: Box::new(left),
2226 op,
2227 right: Box::new(right),
2228 };
2229 } else {
2230 let right = self.parse_addition()?;
2231 left = Expr::BinaryOp {
2232 left: Box::new(left),
2233 op,
2234 right: Box::new(right),
2235 };
2236 }
2237 } else if self.peek_type() == &TokenType::Is {
2238 self.advance();
2239 let negated = self.match_token(TokenType::Not);
2240 if self.match_token(TokenType::True) {
2241 left = Expr::IsBool {
2242 expr: Box::new(left),
2243 value: true,
2244 negated,
2245 };
2246 } else if self.match_token(TokenType::False) {
2247 left = Expr::IsBool {
2248 expr: Box::new(left),
2249 value: false,
2250 negated,
2251 };
2252 } else {
2253 self.expect(TokenType::Null)?;
2254 left = Expr::IsNull {
2255 expr: Box::new(left),
2256 negated,
2257 };
2258 }
2259 } else if matches!(
2260 self.peek_type(),
2261 TokenType::Not
2262 | TokenType::In
2263 | TokenType::Like
2264 | TokenType::ILike
2265 | TokenType::Between
2266 ) {
2267 if self.peek_type() == &TokenType::Not {
2269 let saved_pos = self.pos;
2270 self.advance(); if !matches!(
2272 self.peek_type(),
2273 TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
2274 ) {
2275 self.pos = saved_pos;
2277 break;
2278 }
2279 }
2281 let negated =
2282 self.pos > 0 && self.tokens[self.pos - 1].token_type == TokenType::Not;
2283
2284 if self.match_token(TokenType::In) {
2285 self.expect(TokenType::LParen)?;
2286 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2288 let subquery = self.parse_statement_inner()?;
2289 self.expect(TokenType::RParen)?;
2290 left = Expr::InSubquery {
2291 expr: Box::new(left),
2292 subquery: Box::new(subquery),
2293 negated,
2294 };
2295 } else {
2296 let list = self.parse_expr_list()?;
2297 self.expect(TokenType::RParen)?;
2298 left = Expr::InList {
2299 expr: Box::new(left),
2300 list,
2301 negated,
2302 };
2303 }
2304 } else if self.match_token(TokenType::Like) {
2305 let pattern = self.parse_addition()?;
2306 let escape = if self.match_token(TokenType::Escape) {
2307 Some(Box::new(self.parse_primary()?))
2308 } else {
2309 None
2310 };
2311 left = Expr::Like {
2312 expr: Box::new(left),
2313 pattern: Box::new(pattern),
2314 negated,
2315 escape,
2316 };
2317 } else if self.match_token(TokenType::ILike) {
2318 let pattern = self.parse_addition()?;
2319 let escape = if self.match_token(TokenType::Escape) {
2320 Some(Box::new(self.parse_primary()?))
2321 } else {
2322 None
2323 };
2324 left = Expr::ILike {
2325 expr: Box::new(left),
2326 pattern: Box::new(pattern),
2327 negated,
2328 escape,
2329 };
2330 } else if self.match_token(TokenType::Between) {
2331 let low = self.parse_addition()?;
2332 self.expect(TokenType::And)?;
2333 let high = self.parse_addition()?;
2334 left = Expr::Between {
2335 expr: Box::new(left),
2336 low: Box::new(low),
2337 high: Box::new(high),
2338 negated,
2339 };
2340 } else {
2341 break;
2342 }
2343 } else if self.check_keyword("SIMILAR") {
2344 self.advance(); self.expect_keyword("TO")?;
2347 let pattern = self.parse_addition()?;
2348 let escape = if self.match_token(TokenType::Escape) {
2349 Some(Box::new(self.parse_primary()?))
2350 } else {
2351 None
2352 };
2353 left = Expr::SimilarTo {
2354 expr: Box::new(left),
2355 pattern: Box::new(pattern),
2356 negated: false,
2357 escape,
2358 };
2359 } else if self.peek_type() == &TokenType::Not && self.check_keyword_offset("SIMILAR", 1)
2360 {
2361 self.advance(); self.advance(); self.expect_keyword("TO")?;
2365 let pattern = self.parse_addition()?;
2366 let escape = if self.match_token(TokenType::Escape) {
2367 Some(Box::new(self.parse_primary()?))
2368 } else {
2369 None
2370 };
2371 left = Expr::SimilarTo {
2372 expr: Box::new(left),
2373 pattern: Box::new(pattern),
2374 negated: true,
2375 escape,
2376 };
2377 } else {
2378 break;
2379 }
2380 }
2381
2382 Ok(left)
2383 }
2384
2385 fn parse_addition(&mut self) -> Result<Expr> {
2386 let mut left = self.parse_multiplication()?;
2387 loop {
2388 let op = match self.peek_type() {
2389 TokenType::Plus => Some(BinaryOperator::Plus),
2390 TokenType::Minus => Some(BinaryOperator::Minus),
2391 TokenType::Concat => Some(BinaryOperator::Concat),
2392 TokenType::BitwiseOr => Some(BinaryOperator::BitwiseOr),
2393 TokenType::BitwiseXor => Some(BinaryOperator::BitwiseXor),
2394 TokenType::ShiftLeft => Some(BinaryOperator::ShiftLeft),
2395 TokenType::ShiftRight => Some(BinaryOperator::ShiftRight),
2396 _ => None,
2397 };
2398 if let Some(op) = op {
2399 self.advance();
2400 let right = self.parse_multiplication()?;
2401 left = Expr::BinaryOp {
2402 left: Box::new(left),
2403 op,
2404 right: Box::new(right),
2405 };
2406 } else {
2407 break;
2408 }
2409 }
2410 Ok(left)
2411 }
2412
2413 fn parse_multiplication(&mut self) -> Result<Expr> {
2414 let mut left = self.parse_unary()?;
2415 loop {
2416 let op = match self.peek_type() {
2417 TokenType::Star => Some(BinaryOperator::Multiply),
2418 TokenType::Slash => Some(BinaryOperator::Divide),
2419 TokenType::Percent2 => Some(BinaryOperator::Modulo),
2420 TokenType::BitwiseAnd => Some(BinaryOperator::BitwiseAnd),
2421 _ => None,
2422 };
2423 if let Some(op) = op {
2424 self.advance();
2425 let right = self.parse_unary()?;
2426 left = Expr::BinaryOp {
2427 left: Box::new(left),
2428 op,
2429 right: Box::new(right),
2430 };
2431 } else {
2432 break;
2433 }
2434 }
2435 Ok(left)
2436 }
2437
2438 fn parse_unary(&mut self) -> Result<Expr> {
2439 match self.peek_type() {
2440 TokenType::Minus => {
2441 self.advance();
2442 let expr = self.parse_postfix()?;
2443 Ok(Expr::UnaryOp {
2444 op: UnaryOperator::Minus,
2445 expr: Box::new(expr),
2446 })
2447 }
2448 TokenType::Plus => {
2449 self.advance();
2450 let expr = self.parse_postfix()?;
2451 Ok(Expr::UnaryOp {
2452 op: UnaryOperator::Plus,
2453 expr: Box::new(expr),
2454 })
2455 }
2456 TokenType::BitwiseNot => {
2457 self.advance();
2458 let expr = self.parse_postfix()?;
2459 Ok(Expr::UnaryOp {
2460 op: UnaryOperator::BitwiseNot,
2461 expr: Box::new(expr),
2462 })
2463 }
2464 _ => self.parse_postfix(),
2465 }
2466 }
2467
2468 fn parse_postfix(&mut self) -> Result<Expr> {
2470 let mut expr = self.parse_primary()?;
2471
2472 loop {
2473 if self.match_token(TokenType::DoubleColon) {
2474 let data_type = self.parse_data_type()?;
2476 expr = Expr::Cast {
2477 expr: Box::new(expr),
2478 data_type,
2479 };
2480 } else if self.match_token(TokenType::LBracket) {
2481 let index = self.parse_expr()?;
2483 self.expect(TokenType::RBracket)?;
2484 expr = Expr::ArrayIndex {
2485 expr: Box::new(expr),
2486 index: Box::new(index),
2487 };
2488 } else if self.match_token(TokenType::Arrow) {
2489 let path = self.parse_primary()?;
2490 expr = Expr::JsonAccess {
2491 expr: Box::new(expr),
2492 path: Box::new(path),
2493 as_text: false,
2494 };
2495 } else if self.match_token(TokenType::DoubleArrow) {
2496 let path = self.parse_primary()?;
2497 expr = Expr::JsonAccess {
2498 expr: Box::new(expr),
2499 path: Box::new(path),
2500 as_text: true,
2501 };
2502 } else {
2503 break;
2504 }
2505 }
2506
2507 if self.match_token(TokenType::Over) {
2509 let spec = if self.match_token(TokenType::LParen) {
2510 let ws = self.parse_window_spec()?;
2511 self.expect(TokenType::RParen)?;
2512 ws
2513 } else {
2514 let wref = self.expect_name()?;
2516 WindowSpec {
2517 window_ref: Some(wref),
2518 partition_by: vec![],
2519 order_by: vec![],
2520 frame: None,
2521 }
2522 };
2523 match expr {
2524 Expr::Function {
2525 name,
2526 args,
2527 distinct,
2528 filter,
2529 ..
2530 } => {
2531 expr = Expr::Function {
2532 name,
2533 args,
2534 distinct,
2535 filter,
2536 over: Some(spec),
2537 };
2538 }
2539 Expr::TypedFunction { func, filter, .. } => {
2540 expr = Expr::TypedFunction {
2541 func,
2542 filter,
2543 over: Some(spec),
2544 };
2545 }
2546 _ => {}
2547 }
2548 }
2549
2550 if self.match_token(TokenType::Filter) {
2552 self.expect(TokenType::LParen)?;
2553 self.expect(TokenType::Where)?;
2554 let filter_expr = self.parse_expr()?;
2555 self.expect(TokenType::RParen)?;
2556 match expr {
2557 Expr::Function {
2558 name,
2559 args,
2560 distinct,
2561 over,
2562 ..
2563 } => {
2564 expr = Expr::Function {
2565 name,
2566 args,
2567 distinct,
2568 filter: Some(Box::new(filter_expr)),
2569 over,
2570 };
2571 }
2572 Expr::TypedFunction { func, over, .. } => {
2573 expr = Expr::TypedFunction {
2574 func,
2575 filter: Some(Box::new(filter_expr)),
2576 over,
2577 };
2578 }
2579 _ => {}
2580 }
2581 }
2582
2583 Ok(expr)
2584 }
2585
2586 fn parse_window_spec(&mut self) -> Result<WindowSpec> {
2587 let window_ref = if self.is_name_token()
2588 && !matches!(
2589 self.peek_type(),
2590 TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range
2591 ) {
2592 let saved = self.pos;
2593 let name = self.expect_name()?;
2594 if matches!(
2596 self.peek_type(),
2597 TokenType::RParen
2598 | TokenType::Partition
2599 | TokenType::Order
2600 | TokenType::Rows
2601 | TokenType::Range
2602 ) {
2603 Some(name)
2604 } else {
2605 self.pos = saved;
2606 None
2607 }
2608 } else {
2609 None
2610 };
2611
2612 let partition_by = if self.match_token(TokenType::Partition) {
2613 self.expect(TokenType::By)?;
2614 self.parse_expr_list()?
2615 } else {
2616 vec![]
2617 };
2618
2619 let order_by = if self.match_token(TokenType::Order) {
2620 self.expect(TokenType::By)?;
2621 self.parse_order_by_items()?
2622 } else {
2623 vec![]
2624 };
2625
2626 let frame = if matches!(self.peek_type(), TokenType::Rows | TokenType::Range) {
2627 Some(self.parse_window_frame()?)
2628 } else {
2629 None
2630 };
2631
2632 Ok(WindowSpec {
2633 window_ref,
2634 partition_by,
2635 order_by,
2636 frame,
2637 })
2638 }
2639
2640 fn parse_window_frame(&mut self) -> Result<WindowFrame> {
2641 let kind = if self.match_token(TokenType::Rows) {
2642 WindowFrameKind::Rows
2643 } else if self.match_token(TokenType::Range) {
2644 WindowFrameKind::Range
2645 } else {
2646 WindowFrameKind::Rows
2647 };
2648
2649 if self.match_keyword("BETWEEN") {
2650 let start = self.parse_window_frame_bound()?;
2651 self.expect(TokenType::And)?;
2652 let end = self.parse_window_frame_bound()?;
2653 Ok(WindowFrame {
2654 kind,
2655 start,
2656 end: Some(end),
2657 })
2658 } else {
2659 let start = self.parse_window_frame_bound()?;
2660 Ok(WindowFrame {
2661 kind,
2662 start,
2663 end: None,
2664 })
2665 }
2666 }
2667
2668 fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound> {
2669 if self.check_keyword("CURRENT") {
2670 self.advance();
2671 let _ = self.match_keyword("ROW");
2672 Ok(WindowFrameBound::CurrentRow)
2673 } else if self.match_token(TokenType::Unbounded) {
2674 if self.match_token(TokenType::Preceding) {
2675 Ok(WindowFrameBound::Preceding(None))
2676 } else {
2677 self.expect(TokenType::Following)?;
2678 Ok(WindowFrameBound::Following(None))
2679 }
2680 } else {
2681 let n = self.parse_expr()?;
2682 if self.match_token(TokenType::Preceding) {
2683 Ok(WindowFrameBound::Preceding(Some(Box::new(n))))
2684 } else {
2685 self.expect(TokenType::Following)?;
2686 Ok(WindowFrameBound::Following(Some(Box::new(n))))
2687 }
2688 }
2689 }
2690
2691 fn parse_primary(&mut self) -> Result<Expr> {
2692 let token = self.peek().clone();
2693
2694 match &token.token_type {
2695 TokenType::Number => {
2696 self.advance();
2697 Ok(Expr::Number(token.value))
2698 }
2699 TokenType::String => {
2700 self.advance();
2701 Ok(Expr::StringLiteral(token.value))
2702 }
2703 TokenType::NationalString => {
2704 self.advance();
2705 Ok(Expr::NationalStringLiteral(token.value))
2706 }
2707 TokenType::True => {
2708 self.advance();
2709 Ok(Expr::Boolean(true))
2710 }
2711 TokenType::False => {
2712 self.advance();
2713 Ok(Expr::Boolean(false))
2714 }
2715 TokenType::Null => {
2716 self.advance();
2717 Ok(Expr::Null)
2718 }
2719 TokenType::Default => {
2720 self.advance();
2721 Ok(Expr::Default)
2722 }
2723 TokenType::Star => {
2724 self.advance();
2725 Ok(Expr::Wildcard)
2726 }
2727 TokenType::Parameter => {
2728 self.advance();
2729 Ok(Expr::Parameter(token.value))
2730 }
2731
2732 TokenType::Cast => {
2734 self.advance();
2735 self.expect(TokenType::LParen)?;
2736 let expr = self.parse_expr()?;
2737 self.expect(TokenType::As)?;
2738 let data_type = self.parse_data_type()?;
2739 self.expect(TokenType::RParen)?;
2740 Ok(Expr::Cast {
2741 expr: Box::new(expr),
2742 data_type,
2743 })
2744 }
2745
2746 TokenType::Extract => {
2748 self.advance();
2749 self.expect(TokenType::LParen)?;
2750 let field = self.parse_datetime_field()?;
2751 self.expect(TokenType::From)?;
2752 let expr = self.parse_expr()?;
2753 self.expect(TokenType::RParen)?;
2754 Ok(Expr::Extract {
2755 field,
2756 expr: Box::new(expr),
2757 })
2758 }
2759
2760 TokenType::Case => self.parse_case_expr(),
2762
2763 TokenType::Exists => {
2765 self.advance();
2766 self.expect(TokenType::LParen)?;
2767 let subquery = self.parse_statement_inner()?;
2768 self.expect(TokenType::RParen)?;
2769 Ok(Expr::Exists {
2770 subquery: Box::new(subquery),
2771 negated: false,
2772 })
2773 }
2774
2775 TokenType::Not
2777 if {
2778 let next_pos = self.pos + 1;
2779 next_pos < self.tokens.len()
2780 && self.tokens[next_pos].token_type == TokenType::Exists
2781 } =>
2782 {
2783 self.advance(); self.advance(); self.expect(TokenType::LParen)?;
2786 let subquery = self.parse_statement_inner()?;
2787 self.expect(TokenType::RParen)?;
2788 Ok(Expr::Exists {
2789 subquery: Box::new(subquery),
2790 negated: true,
2791 })
2792 }
2793
2794 TokenType::Interval => {
2796 self.advance();
2797 let value = self.parse_primary()?;
2798 let unit = self.try_parse_datetime_field();
2799 Ok(Expr::Interval {
2800 value: Box::new(value),
2801 unit,
2802 })
2803 }
2804
2805 TokenType::LParen => {
2807 self.advance();
2808 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2810 let subquery = self.parse_statement_inner()?;
2811 self.expect(TokenType::RParen)?;
2812 Ok(Expr::Subquery(Box::new(subquery)))
2813 } else {
2814 let expr = self.parse_expr()?;
2815 if self.match_token(TokenType::Comma) {
2817 let mut items = vec![expr];
2818 items.push(self.parse_expr()?);
2819 while self.match_token(TokenType::Comma) {
2820 items.push(self.parse_expr()?);
2821 }
2822 self.expect(TokenType::RParen)?;
2823 Ok(Expr::Tuple(items))
2824 } else {
2825 self.expect(TokenType::RParen)?;
2826 Ok(Expr::Nested(Box::new(expr)))
2827 }
2828 }
2829 }
2830
2831 TokenType::Array => {
2833 self.advance();
2834 if self.match_token(TokenType::LBracket) {
2835 let items = if self.peek_type() != &TokenType::RBracket {
2836 self.parse_expr_list()?
2837 } else {
2838 vec![]
2839 };
2840 self.expect(TokenType::RBracket)?;
2841 Ok(Expr::ArrayLiteral(items))
2842 } else if self.match_token(TokenType::LParen) {
2843 let subquery = self.parse_statement_inner()?;
2845 self.expect(TokenType::RParen)?;
2846 Ok(Expr::Subquery(Box::new(subquery)))
2847 } else {
2848 Ok(Expr::Column {
2849 table: None,
2850 name: "ARRAY".to_string(),
2851 quote_style: QuoteStyle::None,
2852 table_quote_style: QuoteStyle::None,
2853 })
2854 }
2855 }
2856
2857 TokenType::LBracket => {
2859 self.advance();
2860 let items = if self.peek_type() != &TokenType::RBracket {
2861 self.parse_expr_list()?
2862 } else {
2863 vec![]
2864 };
2865 self.expect(TokenType::RBracket)?;
2866 Ok(Expr::ArrayLiteral(items))
2867 }
2868
2869 _ if self.is_name_token() || self.is_data_type_token() => {
2871 let name_token = self.advance().clone();
2872 let name = name_token.value.clone();
2873 let name_qs = quote_style_from_char(name_token.quote_char);
2874
2875 if matches!(
2877 name_token.token_type,
2878 TokenType::Date
2879 | TokenType::Timestamp
2880 | TokenType::TimestampTz
2881 | TokenType::Time
2882 ) && self.peek_type() == &TokenType::String
2883 {
2884 let value_token = self.advance().clone();
2885 let data_type = match name_token.token_type {
2886 TokenType::Date => DataType::Date,
2887 TokenType::Timestamp => DataType::Timestamp {
2888 precision: None,
2889 with_tz: false,
2890 },
2891 TokenType::TimestampTz => DataType::Timestamp {
2892 precision: None,
2893 with_tz: true,
2894 },
2895 TokenType::Time => DataType::Time { precision: None },
2896 _ => unreachable!(),
2897 };
2898 return Ok(Expr::Cast {
2899 expr: Box::new(Expr::StringLiteral(value_token.value)),
2900 data_type,
2901 });
2902 }
2903
2904 if name_qs == QuoteStyle::None && self.peek_type() != &TokenType::LParen {
2911 let upper = name.to_ascii_uppercase();
2912 let typed = match upper.as_str() {
2913 "CURRENT_DATE" => Some(TypedFunction::CurrentDate),
2914 "CURRENT_TIME" => Some(TypedFunction::CurrentTime),
2915 "CURRENT_TIMESTAMP" | "LOCALTIMESTAMP" => {
2916 Some(TypedFunction::CurrentTimestamp)
2917 }
2918 _ => None,
2919 };
2920 if let Some(tf) = typed {
2921 return Ok(Expr::TypedFunction {
2922 func: tf,
2923 filter: None,
2924 over: None,
2925 });
2926 }
2927 }
2928
2929 if self.peek_type() == &TokenType::LParen {
2931 self.advance();
2932
2933 let distinct = self.match_token(TokenType::Distinct);
2935
2936 if name.eq_ignore_ascii_case("GROUP_CONCAT") {
2940 let expr = self.parse_group_concat_call(distinct)?;
2941 self.expect(TokenType::RParen)?;
2942 return Ok(expr);
2943 }
2944
2945 let args = if self.peek_type() == &TokenType::RParen {
2946 vec![]
2947 } else if self.peek_type() == &TokenType::Star {
2948 self.advance();
2949 vec![Expr::Wildcard]
2950 } else {
2951 self.parse_expr_list()?
2952 };
2953 self.expect(TokenType::RParen)?;
2954
2955 if let Some(typed) = Self::try_typed_function(&name, args.clone(), distinct) {
2957 Ok(typed)
2958 } else {
2959 Ok(Expr::Function {
2960 name,
2961 args,
2962 distinct,
2963 filter: None,
2964 over: None,
2965 })
2966 }
2967 }
2968 else if self.match_token(TokenType::Dot) {
2970 if self.peek_type() == &TokenType::Star {
2971 self.advance();
2972 Ok(Expr::QualifiedWildcard { table: name })
2973 } else {
2974 let (col, col_qs) = self.expect_name_with_quote()?;
2975 Ok(Expr::Column {
2976 table: Some(name),
2977 name: col,
2978 quote_style: col_qs,
2979 table_quote_style: name_qs,
2980 })
2981 }
2982 } else {
2983 Ok(Expr::Column {
2984 table: None,
2985 name,
2986 quote_style: name_qs,
2987 table_quote_style: QuoteStyle::None,
2988 })
2989 }
2990 }
2991
2992 _ => Err(SqlglotError::UnexpectedToken { token }),
2993 }
2994 }
2995
2996 fn is_data_type_token(&self) -> bool {
2997 matches!(
2998 self.peek_type(),
2999 TokenType::Int
3000 | TokenType::Integer
3001 | TokenType::BigInt
3002 | TokenType::SmallInt
3003 | TokenType::TinyInt
3004 | TokenType::Float
3005 | TokenType::Double
3006 | TokenType::Decimal
3007 | TokenType::Numeric
3008 | TokenType::Real
3009 | TokenType::Varchar
3010 | TokenType::Char
3011 | TokenType::Text
3012 | TokenType::Boolean
3013 | TokenType::Date
3014 | TokenType::Timestamp
3015 | TokenType::TimestampTz
3016 | TokenType::Time
3017 | TokenType::Interval
3018 | TokenType::Blob
3019 | TokenType::Bytea
3020 | TokenType::Json
3021 | TokenType::Jsonb
3022 | TokenType::Uuid
3023 | TokenType::Array
3024 | TokenType::Map
3025 | TokenType::Struct
3026 )
3027 }
3028
3029 fn parse_datetime_field(&mut self) -> Result<DateTimeField> {
3030 let token = self.peek().clone();
3031 let field = match &token.token_type {
3032 TokenType::Year => DateTimeField::Year,
3033 TokenType::Month => DateTimeField::Month,
3034 TokenType::Day => DateTimeField::Day,
3035 TokenType::Hour => DateTimeField::Hour,
3036 TokenType::Minute => DateTimeField::Minute,
3037 TokenType::Second => DateTimeField::Second,
3038 TokenType::Epoch => DateTimeField::Epoch,
3039 _ => {
3040 let name = token.value.to_uppercase();
3041 match name.as_str() {
3042 "YEAR" => DateTimeField::Year,
3043 "QUARTER" => DateTimeField::Quarter,
3044 "MONTH" => DateTimeField::Month,
3045 "WEEK" => DateTimeField::Week,
3046 "DAY" => DateTimeField::Day,
3047 "DOW" | "DAYOFWEEK" => DateTimeField::DayOfWeek,
3048 "DOY" | "DAYOFYEAR" => DateTimeField::DayOfYear,
3049 "HOUR" => DateTimeField::Hour,
3050 "MINUTE" => DateTimeField::Minute,
3051 "SECOND" => DateTimeField::Second,
3052 "MILLISECOND" => DateTimeField::Millisecond,
3053 "MICROSECOND" => DateTimeField::Microsecond,
3054 "NANOSECOND" => DateTimeField::Nanosecond,
3055 "EPOCH" => DateTimeField::Epoch,
3056 "TIMEZONE" => DateTimeField::Timezone,
3057 "TIMEZONE_HOUR" => DateTimeField::TimezoneHour,
3058 "TIMEZONE_MINUTE" => DateTimeField::TimezoneMinute,
3059 _ => {
3060 return Err(SqlglotError::ParserError {
3061 message: format!("Unknown datetime field: {name}"),
3062 });
3063 }
3064 }
3065 }
3066 };
3067 self.advance();
3068 Ok(field)
3069 }
3070
3071 fn try_parse_datetime_field(&mut self) -> Option<DateTimeField> {
3072 let saved = self.pos;
3073 match self.parse_datetime_field() {
3074 Ok(field) => Some(field),
3075 Err(_) => {
3076 self.pos = saved;
3077 None
3078 }
3079 }
3080 }
3081
3082 fn parse_group_concat_call(&mut self, distinct: bool) -> Result<Expr> {
3086 let mut exprs: Vec<Expr> = Vec::new();
3087 let mut order_by: Vec<OrderByItem> = Vec::new();
3088 let mut separator: Option<Box<Expr>> = None;
3089
3090 if self.peek_type() != &TokenType::RParen {
3091 exprs.push(self.parse_expr()?);
3092 while self.peek_type() == &TokenType::Comma {
3093 self.advance();
3098 exprs.push(self.parse_expr()?);
3099 }
3100
3101 if self.match_token(TokenType::Order) {
3102 self.expect(TokenType::By)?;
3103 order_by = self.parse_order_by_items()?;
3104 }
3105
3106 if self.match_keyword("SEPARATOR") {
3107 separator = Some(Box::new(self.parse_expr()?));
3108 }
3109 }
3110
3111 Ok(Expr::TypedFunction {
3112 func: TypedFunction::GroupConcat {
3113 exprs,
3114 separator,
3115 order_by,
3116 distinct,
3117 },
3118 filter: None,
3119 over: None,
3120 })
3121 }
3122
3123 fn try_typed_function(name: &str, args: Vec<Expr>, distinct: bool) -> Option<Expr> {
3127 let upper = name.to_uppercase();
3128 let tf = match upper.as_str() {
3129 "DATE_ADD" | "DATEADD" | "TIMESTAMPADD" => {
3131 let mut it = args.into_iter();
3132 let first = it.next()?;
3133 let second = it.next()?;
3134 let third = it.next();
3135 if upper == "DATEADD" {
3137 if let Some(third_arg) = third {
3138 let unit = Self::expr_to_datetime_field(&first);
3140 TypedFunction::DateAdd {
3141 expr: Box::new(third_arg),
3142 interval: Box::new(second),
3143 unit,
3144 }
3145 } else {
3146 TypedFunction::DateAdd {
3147 expr: Box::new(first),
3148 interval: Box::new(second),
3149 unit: None,
3150 }
3151 }
3152 } else {
3153 let unit = third.as_ref().and_then(Self::expr_to_datetime_field);
3155 TypedFunction::DateAdd {
3156 expr: Box::new(first),
3157 interval: Box::new(second),
3158 unit,
3159 }
3160 }
3161 }
3162 "DATE_DIFF" | "DATEDIFF" | "TIMESTAMPDIFF" => {
3163 let mut it = args.into_iter();
3164 let first = it.next()?;
3165 let second = it.next()?;
3166 let third = it.next();
3167 if let Some(third_arg) = third {
3168 if upper == "DATEDIFF" {
3169 let unit = Self::expr_to_datetime_field(&first);
3171 TypedFunction::DateDiff {
3172 start: Box::new(second),
3173 end: Box::new(third_arg),
3174 unit,
3175 }
3176 } else {
3177 let unit = Self::expr_to_datetime_field(&third_arg);
3178 TypedFunction::DateDiff {
3179 start: Box::new(first),
3180 end: Box::new(second),
3181 unit,
3182 }
3183 }
3184 } else {
3185 TypedFunction::DateDiff {
3186 start: Box::new(first),
3187 end: Box::new(second),
3188 unit: None,
3189 }
3190 }
3191 }
3192 "DATE_TRUNC" | "DATETRUNC" => {
3193 let mut it = args.into_iter();
3194 let first = it.next()?;
3195 let second = it.next()?;
3196 let (unit, expr) = if let Some(u) = Self::expr_to_datetime_field(&first) {
3198 (u, second)
3199 } else if let Some(u) = Self::expr_to_datetime_field(&second) {
3200 (u, first)
3201 } else {
3202 return None;
3204 };
3205 TypedFunction::DateTrunc {
3206 unit,
3207 expr: Box::new(expr),
3208 }
3209 }
3210 "DATE_SUB" | "DATESUB" => {
3211 let mut it = args.into_iter();
3212 let first = it.next()?;
3213 let second = it.next()?;
3214 let third = it.next();
3215 let unit = third.as_ref().and_then(Self::expr_to_datetime_field);
3216 TypedFunction::DateSub {
3217 expr: Box::new(first),
3218 interval: Box::new(second),
3219 unit,
3220 }
3221 }
3222 "CURRENT_DATE" => TypedFunction::CurrentDate,
3223 "CURRENT_TIME" | "CURTIME" => TypedFunction::CurrentTime,
3224 "CURRENT_TIMESTAMP" | "NOW" | "GETDATE" | "SYSDATE" => TypedFunction::CurrentTimestamp,
3225 "STR_TO_TIME" | "STR_TO_DATE" | "TO_TIMESTAMP" | "PARSE_TIMESTAMP"
3226 | "PARSE_DATETIME" => {
3227 let mut it = args.into_iter();
3228 let expr = it.next()?;
3229 let format = it.next()?;
3230 TypedFunction::StrToTime {
3231 expr: Box::new(expr),
3232 format: Box::new(format),
3233 }
3234 }
3235 "TIME_TO_STR" | "DATE_FORMAT" | "FORMAT_TIMESTAMP" | "FORMAT_DATETIME" | "TO_CHAR" => {
3236 let mut it = args.into_iter();
3237 let expr = it.next()?;
3238 let format = it.next()?;
3239 TypedFunction::TimeToStr {
3240 expr: Box::new(expr),
3241 format: Box::new(format),
3242 }
3243 }
3244 "TS_OR_DS_TO_DATE" => {
3245 let mut it = args.into_iter();
3246 TypedFunction::TsOrDsToDate {
3247 expr: Box::new(it.next()?),
3248 }
3249 }
3250 "YEAR" => {
3251 let mut it = args.into_iter();
3252 TypedFunction::Year {
3253 expr: Box::new(it.next()?),
3254 }
3255 }
3256 "MONTH" => {
3257 let mut it = args.into_iter();
3258 TypedFunction::Month {
3259 expr: Box::new(it.next()?),
3260 }
3261 }
3262 "DAY" | "DAYOFMONTH" => {
3263 let mut it = args.into_iter();
3264 TypedFunction::Day {
3265 expr: Box::new(it.next()?),
3266 }
3267 }
3268
3269 "TRIM" => {
3271 let mut it = args.into_iter();
3272 let expr = it.next()?;
3273 TypedFunction::Trim {
3274 expr: Box::new(expr),
3275 trim_type: TrimType::Both,
3276 trim_chars: None,
3277 }
3278 }
3279 "LTRIM" => {
3280 let mut it = args.into_iter();
3281 let expr = it.next()?;
3282 TypedFunction::Trim {
3283 expr: Box::new(expr),
3284 trim_type: TrimType::Leading,
3285 trim_chars: None,
3286 }
3287 }
3288 "RTRIM" => {
3289 let mut it = args.into_iter();
3290 let expr = it.next()?;
3291 TypedFunction::Trim {
3292 expr: Box::new(expr),
3293 trim_type: TrimType::Trailing,
3294 trim_chars: None,
3295 }
3296 }
3297 "SUBSTRING" | "SUBSTR" => {
3298 let mut it = args.into_iter();
3299 let expr = it.next()?;
3300 let start = it.next()?;
3301 let length = it.next();
3302 TypedFunction::Substring {
3303 expr: Box::new(expr),
3304 start: Box::new(start),
3305 length: length.map(Box::new),
3306 }
3307 }
3308 "UPPER" | "UCASE" => {
3309 let mut it = args.into_iter();
3310 TypedFunction::Upper {
3311 expr: Box::new(it.next()?),
3312 }
3313 }
3314 "LOWER" | "LCASE" => {
3315 let mut it = args.into_iter();
3316 TypedFunction::Lower {
3317 expr: Box::new(it.next()?),
3318 }
3319 }
3320 "REGEXP_LIKE" | "RLIKE" => {
3321 let mut it = args.into_iter();
3322 let expr = it.next()?;
3323 let pattern = it.next()?;
3324 let flags = it.next();
3325 TypedFunction::RegexpLike {
3326 expr: Box::new(expr),
3327 pattern: Box::new(pattern),
3328 flags: flags.map(Box::new),
3329 }
3330 }
3331 "REGEXP_EXTRACT" | "REGEXP_SUBSTR" => {
3332 let mut it = args.into_iter();
3333 let expr = it.next()?;
3334 let pattern = it.next()?;
3335 let group_index = it.next();
3336 TypedFunction::RegexpExtract {
3337 expr: Box::new(expr),
3338 pattern: Box::new(pattern),
3339 group_index: group_index.map(Box::new),
3340 }
3341 }
3342 "REGEXP_REPLACE" => {
3343 let mut it = args.into_iter();
3344 let expr = it.next()?;
3345 let pattern = it.next()?;
3346 let replacement = it.next()?;
3347 let flags = it.next();
3348 TypedFunction::RegexpReplace {
3349 expr: Box::new(expr),
3350 pattern: Box::new(pattern),
3351 replacement: Box::new(replacement),
3352 flags: flags.map(Box::new),
3353 }
3354 }
3355 "CONCAT_WS" => {
3356 let mut it = args.into_iter();
3357 let separator = it.next()?;
3358 let exprs: Vec<Expr> = it.collect();
3359 TypedFunction::ConcatWs {
3360 separator: Box::new(separator),
3361 exprs,
3362 }
3363 }
3364 "SPLIT" | "STRING_SPLIT" => {
3365 let mut it = args.into_iter();
3366 let expr = it.next()?;
3367 let delimiter = it.next()?;
3368 TypedFunction::Split {
3369 expr: Box::new(expr),
3370 delimiter: Box::new(delimiter),
3371 }
3372 }
3373 "INITCAP" => {
3374 let mut it = args.into_iter();
3375 TypedFunction::Initcap {
3376 expr: Box::new(it.next()?),
3377 }
3378 }
3379 "LENGTH" | "LEN" | "CHAR_LENGTH" | "CHARACTER_LENGTH" => {
3380 let mut it = args.into_iter();
3381 TypedFunction::Length {
3382 expr: Box::new(it.next()?),
3383 }
3384 }
3385 "REPLACE" => {
3386 let mut it = args.into_iter();
3387 let expr = it.next()?;
3388 let from = it.next()?;
3389 let to = it.next()?;
3390 TypedFunction::Replace {
3391 expr: Box::new(expr),
3392 from: Box::new(from),
3393 to: Box::new(to),
3394 }
3395 }
3396 "REVERSE" => {
3397 let mut it = args.into_iter();
3398 TypedFunction::Reverse {
3399 expr: Box::new(it.next()?),
3400 }
3401 }
3402 "LEFT" => {
3403 let mut it = args.into_iter();
3404 let expr = it.next()?;
3405 let n = it.next()?;
3406 TypedFunction::Left {
3407 expr: Box::new(expr),
3408 n: Box::new(n),
3409 }
3410 }
3411 "RIGHT" => {
3412 let mut it = args.into_iter();
3413 let expr = it.next()?;
3414 let n = it.next()?;
3415 TypedFunction::Right {
3416 expr: Box::new(expr),
3417 n: Box::new(n),
3418 }
3419 }
3420 "LPAD" => {
3421 let mut it = args.into_iter();
3422 let expr = it.next()?;
3423 let length = it.next()?;
3424 let pad = it.next();
3425 TypedFunction::Lpad {
3426 expr: Box::new(expr),
3427 length: Box::new(length),
3428 pad: pad.map(Box::new),
3429 }
3430 }
3431 "RPAD" => {
3432 let mut it = args.into_iter();
3433 let expr = it.next()?;
3434 let length = it.next()?;
3435 let pad = it.next();
3436 TypedFunction::Rpad {
3437 expr: Box::new(expr),
3438 length: Box::new(length),
3439 pad: pad.map(Box::new),
3440 }
3441 }
3442
3443 "COUNT" => {
3445 let mut it = args.into_iter();
3446 let expr = it.next().unwrap_or(Expr::Wildcard);
3447 TypedFunction::Count {
3448 expr: Box::new(expr),
3449 distinct,
3450 }
3451 }
3452 "SUM" => {
3453 let mut it = args.into_iter();
3454 TypedFunction::Sum {
3455 expr: Box::new(it.next()?),
3456 distinct,
3457 }
3458 }
3459 "AVG" => {
3460 let mut it = args.into_iter();
3461 TypedFunction::Avg {
3462 expr: Box::new(it.next()?),
3463 distinct,
3464 }
3465 }
3466 "MIN" => {
3467 let mut it = args.into_iter();
3468 TypedFunction::Min {
3469 expr: Box::new(it.next()?),
3470 }
3471 }
3472 "MAX" => {
3473 let mut it = args.into_iter();
3474 TypedFunction::Max {
3475 expr: Box::new(it.next()?),
3476 }
3477 }
3478 "ARRAY_AGG" | "LIST" | "COLLECT_LIST" => {
3479 let mut it = args.into_iter();
3480 TypedFunction::ArrayAgg {
3481 expr: Box::new(it.next()?),
3482 distinct,
3483 }
3484 }
3485 "APPROX_DISTINCT" | "APPROX_COUNT_DISTINCT" => {
3486 let mut it = args.into_iter();
3487 TypedFunction::ApproxDistinct {
3488 expr: Box::new(it.next()?),
3489 }
3490 }
3491 "VARIANCE" | "VAR_SAMP" | "VAR" => {
3492 let mut it = args.into_iter();
3493 TypedFunction::Variance {
3494 expr: Box::new(it.next()?),
3495 }
3496 }
3497 "STDDEV" | "STDDEV_SAMP" => {
3498 let mut it = args.into_iter();
3499 TypedFunction::Stddev {
3500 expr: Box::new(it.next()?),
3501 }
3502 }
3503
3504 "ARRAY_CONCAT" | "ARRAY_CAT" => TypedFunction::ArrayConcat { arrays: args },
3506 "ARRAY_CONTAINS" => {
3507 let mut it = args.into_iter();
3508 let array = it.next()?;
3509 let element = it.next()?;
3510 TypedFunction::ArrayContains {
3511 array: Box::new(array),
3512 element: Box::new(element),
3513 }
3514 }
3515 "ARRAY_SIZE" | "ARRAY_LENGTH" | "CARDINALITY" => {
3516 let mut it = args.into_iter();
3517 TypedFunction::ArraySize {
3518 expr: Box::new(it.next()?),
3519 }
3520 }
3521 "EXPLODE" => {
3522 let mut it = args.into_iter();
3523 TypedFunction::Explode {
3524 expr: Box::new(it.next()?),
3525 }
3526 }
3527 "GENERATE_SERIES" | "SEQUENCE" => {
3528 let mut it = args.into_iter();
3529 let start = it.next()?;
3530 let stop = it.next()?;
3531 let step = it.next();
3532 TypedFunction::GenerateSeries {
3533 start: Box::new(start),
3534 stop: Box::new(stop),
3535 step: step.map(Box::new),
3536 }
3537 }
3538 "FLATTEN" => {
3539 let mut it = args.into_iter();
3540 TypedFunction::Flatten {
3541 expr: Box::new(it.next()?),
3542 }
3543 }
3544
3545 "JSON_EXTRACT" | "JSON_VALUE" => {
3547 let mut it = args.into_iter();
3548 let expr = it.next()?;
3549 let path = it.next()?;
3550 TypedFunction::JSONExtract {
3551 expr: Box::new(expr),
3552 path: Box::new(path),
3553 }
3554 }
3555 "JSON_EXTRACT_SCALAR" => {
3556 let mut it = args.into_iter();
3557 let expr = it.next()?;
3558 let path = it.next()?;
3559 TypedFunction::JSONExtractScalar {
3560 expr: Box::new(expr),
3561 path: Box::new(path),
3562 }
3563 }
3564 "PARSE_JSON" | "JSON_PARSE" => {
3565 let mut it = args.into_iter();
3566 TypedFunction::ParseJSON {
3567 expr: Box::new(it.next()?),
3568 }
3569 }
3570 "JSON_FORMAT" | "TO_JSON" | "TO_JSON_STRING" => {
3571 let mut it = args.into_iter();
3572 TypedFunction::JSONFormat {
3573 expr: Box::new(it.next()?),
3574 }
3575 }
3576
3577 "ROW_NUMBER" => TypedFunction::RowNumber,
3579 "RANK" => TypedFunction::Rank,
3580 "DENSE_RANK" => TypedFunction::DenseRank,
3581 "NTILE" => {
3582 let mut it = args.into_iter();
3583 TypedFunction::NTile {
3584 n: Box::new(it.next()?),
3585 }
3586 }
3587 "LEAD" => {
3588 let mut it = args.into_iter();
3589 let expr = it.next()?;
3590 let offset = it.next();
3591 let default = it.next();
3592 TypedFunction::Lead {
3593 expr: Box::new(expr),
3594 offset: offset.map(Box::new),
3595 default: default.map(Box::new),
3596 }
3597 }
3598 "LAG" => {
3599 let mut it = args.into_iter();
3600 let expr = it.next()?;
3601 let offset = it.next();
3602 let default = it.next();
3603 TypedFunction::Lag {
3604 expr: Box::new(expr),
3605 offset: offset.map(Box::new),
3606 default: default.map(Box::new),
3607 }
3608 }
3609 "FIRST_VALUE" => {
3610 let mut it = args.into_iter();
3611 TypedFunction::FirstValue {
3612 expr: Box::new(it.next()?),
3613 }
3614 }
3615 "LAST_VALUE" => {
3616 let mut it = args.into_iter();
3617 TypedFunction::LastValue {
3618 expr: Box::new(it.next()?),
3619 }
3620 }
3621
3622 "ABS" => {
3624 let mut it = args.into_iter();
3625 TypedFunction::Abs {
3626 expr: Box::new(it.next()?),
3627 }
3628 }
3629 "CEIL" | "CEILING" => {
3630 let mut it = args.into_iter();
3631 TypedFunction::Ceil {
3632 expr: Box::new(it.next()?),
3633 }
3634 }
3635 "FLOOR" => {
3636 let mut it = args.into_iter();
3637 TypedFunction::Floor {
3638 expr: Box::new(it.next()?),
3639 }
3640 }
3641 "ROUND" => {
3642 let mut it = args.into_iter();
3643 let expr = it.next()?;
3644 let decimals = it.next();
3645 TypedFunction::Round {
3646 expr: Box::new(expr),
3647 decimals: decimals.map(Box::new),
3648 }
3649 }
3650 "LOG" => {
3651 let mut it = args.into_iter();
3652 let expr = it.next()?;
3653 let base = it.next();
3654 TypedFunction::Log {
3655 expr: Box::new(expr),
3656 base: base.map(Box::new),
3657 }
3658 }
3659 "LN" => {
3660 let mut it = args.into_iter();
3661 TypedFunction::Ln {
3662 expr: Box::new(it.next()?),
3663 }
3664 }
3665 "POW" | "POWER" => {
3666 let mut it = args.into_iter();
3667 let base = it.next()?;
3668 let exponent = it.next()?;
3669 TypedFunction::Pow {
3670 base: Box::new(base),
3671 exponent: Box::new(exponent),
3672 }
3673 }
3674 "SQRT" => {
3675 let mut it = args.into_iter();
3676 TypedFunction::Sqrt {
3677 expr: Box::new(it.next()?),
3678 }
3679 }
3680 "GREATEST" => TypedFunction::Greatest { exprs: args },
3681 "LEAST" => TypedFunction::Least { exprs: args },
3682 "MOD" => {
3683 let mut it = args.into_iter();
3684 let left = it.next()?;
3685 let right = it.next()?;
3686 TypedFunction::Mod {
3687 left: Box::new(left),
3688 right: Box::new(right),
3689 }
3690 }
3691
3692 "HEX" | "TO_HEX" => {
3694 let mut it = args.into_iter();
3695 TypedFunction::Hex {
3696 expr: Box::new(it.next()?),
3697 }
3698 }
3699 "UNHEX" | "FROM_HEX" => {
3700 let mut it = args.into_iter();
3701 TypedFunction::Unhex {
3702 expr: Box::new(it.next()?),
3703 }
3704 }
3705 "MD5" => {
3706 let mut it = args.into_iter();
3707 TypedFunction::Md5 {
3708 expr: Box::new(it.next()?),
3709 }
3710 }
3711 "SHA" | "SHA1" => {
3712 let mut it = args.into_iter();
3713 TypedFunction::Sha {
3714 expr: Box::new(it.next()?),
3715 }
3716 }
3717 "SHA2" | "SHA256" | "SHA512" => {
3718 let mut it = args.into_iter();
3719 let expr = it.next()?;
3720 let bit_length = it.next().unwrap_or(Expr::Number("256".to_string()));
3721 TypedFunction::Sha2 {
3722 expr: Box::new(expr),
3723 bit_length: Box::new(bit_length),
3724 }
3725 }
3726
3727 _ => return None,
3729 };
3730
3731 Some(Expr::TypedFunction {
3732 func: tf,
3733 filter: None,
3734 over: None,
3735 })
3736 }
3737
3738 fn expr_to_datetime_field(expr: &Expr) -> Option<DateTimeField> {
3740 match expr {
3741 Expr::Column {
3742 name, table: None, ..
3743 } => match name.to_uppercase().as_str() {
3744 "YEAR" => Some(DateTimeField::Year),
3745 "QUARTER" => Some(DateTimeField::Quarter),
3746 "MONTH" => Some(DateTimeField::Month),
3747 "WEEK" => Some(DateTimeField::Week),
3748 "DAY" => Some(DateTimeField::Day),
3749 "HOUR" => Some(DateTimeField::Hour),
3750 "MINUTE" => Some(DateTimeField::Minute),
3751 "SECOND" => Some(DateTimeField::Second),
3752 "MILLISECOND" => Some(DateTimeField::Millisecond),
3753 "MICROSECOND" => Some(DateTimeField::Microsecond),
3754 _ => None,
3755 },
3756 Expr::StringLiteral(s) | Expr::NationalStringLiteral(s) => {
3757 match s.to_uppercase().as_str() {
3758 "YEAR" => Some(DateTimeField::Year),
3759 "QUARTER" => Some(DateTimeField::Quarter),
3760 "MONTH" => Some(DateTimeField::Month),
3761 "WEEK" => Some(DateTimeField::Week),
3762 "DAY" => Some(DateTimeField::Day),
3763 "HOUR" => Some(DateTimeField::Hour),
3764 "MINUTE" => Some(DateTimeField::Minute),
3765 "SECOND" => Some(DateTimeField::Second),
3766 "MILLISECOND" => Some(DateTimeField::Millisecond),
3767 "MICROSECOND" => Some(DateTimeField::Microsecond),
3768 _ => None,
3769 }
3770 }
3771 _ => None,
3772 }
3773 }
3774
3775 fn parse_case_expr(&mut self) -> Result<Expr> {
3776 self.expect(TokenType::Case)?;
3777
3778 let operand = if self.peek_type() != &TokenType::When {
3779 Some(Box::new(self.parse_expr()?))
3780 } else {
3781 None
3782 };
3783
3784 let mut when_clauses = Vec::new();
3785 while self.match_token(TokenType::When) {
3786 let condition = self.parse_expr()?;
3787 self.expect(TokenType::Then)?;
3788 let result = self.parse_expr()?;
3789 when_clauses.push((condition, result));
3790 }
3791
3792 let else_clause = if self.match_token(TokenType::Else) {
3793 Some(Box::new(self.parse_expr()?))
3794 } else {
3795 None
3796 };
3797
3798 self.expect(TokenType::End)?;
3799
3800 Ok(Expr::Case {
3801 operand,
3802 when_clauses,
3803 else_clause,
3804 })
3805 }
3806}
3807
3808#[cfg(test)]
3809mod tests {
3810 use super::*;
3811
3812 #[test]
3813 fn test_parse_simple_select() {
3814 let stmt = Parser::new("SELECT a, b FROM t")
3815 .unwrap()
3816 .parse_statement()
3817 .unwrap();
3818 match stmt {
3819 Statement::Select(sel) => {
3820 assert_eq!(sel.columns.len(), 2);
3821 assert!(sel.from.is_some());
3822 }
3823 _ => panic!("Expected SELECT"),
3824 }
3825 }
3826
3827 #[test]
3828 fn test_parse_select_with_where() {
3829 let stmt = Parser::new("SELECT x FROM t WHERE x > 10")
3830 .unwrap()
3831 .parse_statement()
3832 .unwrap();
3833 match stmt {
3834 Statement::Select(sel) => assert!(sel.where_clause.is_some()),
3835 _ => panic!("Expected SELECT"),
3836 }
3837 }
3838
3839 #[test]
3840 fn test_parse_select_wildcard() {
3841 let stmt = Parser::new("SELECT * FROM users")
3842 .unwrap()
3843 .parse_statement()
3844 .unwrap();
3845 match stmt {
3846 Statement::Select(sel) => {
3847 assert_eq!(sel.columns.len(), 1);
3848 assert!(matches!(sel.columns[0], SelectItem::Wildcard));
3849 }
3850 _ => panic!("Expected SELECT"),
3851 }
3852 }
3853
3854 #[test]
3855 fn test_parse_insert() {
3856 let stmt = Parser::new("INSERT INTO t (a, b) VALUES (1, 'hello')")
3857 .unwrap()
3858 .parse_statement()
3859 .unwrap();
3860 match stmt {
3861 Statement::Insert(ins) => {
3862 assert_eq!(ins.table.name, "t");
3863 assert_eq!(ins.columns, vec!["a", "b"]);
3864 match &ins.source {
3865 InsertSource::Values(rows) => {
3866 assert_eq!(rows.len(), 1);
3867 assert_eq!(rows[0].len(), 2);
3868 }
3869 _ => panic!("Expected VALUES"),
3870 }
3871 }
3872 _ => panic!("Expected INSERT"),
3873 }
3874 }
3875
3876 #[test]
3877 fn test_parse_delete() {
3878 let stmt = Parser::new("DELETE FROM users WHERE id = 1")
3879 .unwrap()
3880 .parse_statement()
3881 .unwrap();
3882 match stmt {
3883 Statement::Delete(del) => {
3884 assert_eq!(del.table.name, "users");
3885 assert!(del.where_clause.is_some());
3886 }
3887 _ => panic!("Expected DELETE"),
3888 }
3889 }
3890
3891 #[test]
3892 fn test_parse_join() {
3893 let stmt = Parser::new("SELECT a.id, b.name FROM a INNER JOIN b ON a.id = b.a_id")
3894 .unwrap()
3895 .parse_statement()
3896 .unwrap();
3897 match stmt {
3898 Statement::Select(sel) => {
3899 assert_eq!(sel.joins.len(), 1);
3900 assert_eq!(sel.joins[0].join_type, JoinType::Inner);
3901 }
3902 _ => panic!("Expected SELECT"),
3903 }
3904 }
3905
3906 #[test]
3907 fn test_parse_cte() {
3908 let stmt = Parser::new("WITH cte AS (SELECT 1 AS x) SELECT x FROM cte")
3909 .unwrap()
3910 .parse_statement()
3911 .unwrap();
3912 match stmt {
3913 Statement::Select(sel) => {
3914 assert_eq!(sel.ctes.len(), 1);
3915 assert_eq!(sel.ctes[0].name, "cte");
3916 }
3917 _ => panic!("Expected SELECT"),
3918 }
3919 }
3920
3921 #[test]
3922 fn test_parse_union() {
3923 let stmt = Parser::new("SELECT 1 UNION ALL SELECT 2")
3924 .unwrap()
3925 .parse_statement()
3926 .unwrap();
3927 match stmt {
3928 Statement::SetOperation(sop) => {
3929 assert_eq!(sop.op, SetOperationType::Union);
3930 assert!(sop.all);
3931 }
3932 _ => panic!("Expected SetOperation"),
3933 }
3934 }
3935
3936 #[test]
3937 fn test_parse_cast() {
3938 let stmt = Parser::new("SELECT CAST(x AS INT) FROM t")
3939 .unwrap()
3940 .parse_statement()
3941 .unwrap();
3942 match stmt {
3943 Statement::Select(sel) => {
3944 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
3945 assert!(matches!(expr, Expr::Cast { .. }));
3946 }
3947 }
3948 _ => panic!("Expected SELECT"),
3949 }
3950 }
3951
3952 #[test]
3953 fn test_parse_subquery() {
3954 let stmt = Parser::new("SELECT * FROM (SELECT 1 AS x) AS sub")
3955 .unwrap()
3956 .parse_statement()
3957 .unwrap();
3958 match stmt {
3959 Statement::Select(sel) => {
3960 if let Some(from) = &sel.from {
3961 assert!(matches!(from.source, TableSource::Subquery { .. }));
3962 }
3963 }
3964 _ => panic!("Expected SELECT"),
3965 }
3966 }
3967
3968 #[test]
3969 fn test_parse_exists() {
3970 let stmt = Parser::new("SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2)")
3971 .unwrap()
3972 .parse_statement()
3973 .unwrap();
3974 match stmt {
3975 Statement::Select(sel) => {
3976 assert!(sel.where_clause.is_some());
3977 }
3978 _ => panic!("Expected SELECT"),
3979 }
3980 }
3981
3982 #[test]
3983 fn test_parse_window_function() {
3984 let stmt = Parser::new(
3985 "SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp",
3986 )
3987 .unwrap()
3988 .parse_statement()
3989 .unwrap();
3990 match stmt {
3991 Statement::Select(sel) => {
3992 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
3993 match expr {
3994 Expr::TypedFunction { over, .. } => {
3995 assert!(over.is_some());
3996 }
3997 Expr::Function { over, .. } => {
3998 assert!(over.is_some());
3999 }
4000 _ => panic!("Expected function"),
4001 }
4002 }
4003 }
4004 _ => panic!("Expected SELECT"),
4005 }
4006 }
4007
4008 #[test]
4009 fn test_parse_multiple_statements() {
4010 let stmts = Parser::new("SELECT 1; SELECT 2;")
4011 .unwrap()
4012 .parse_statements()
4013 .unwrap();
4014 assert_eq!(stmts.len(), 2);
4015 }
4016
4017 #[test]
4018 fn test_parse_insert_select() {
4019 let stmt = Parser::new("INSERT INTO t SELECT * FROM s")
4020 .unwrap()
4021 .parse_statement()
4022 .unwrap();
4023 match stmt {
4024 Statement::Insert(ins) => {
4025 assert!(matches!(ins.source, InsertSource::Query(_)));
4026 }
4027 _ => panic!("Expected INSERT"),
4028 }
4029 }
4030
4031 #[test]
4032 fn test_parse_create_table_constraints() {
4033 let stmt =
4034 Parser::new("CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE)")
4035 .unwrap()
4036 .parse_statement()
4037 .unwrap();
4038 match stmt {
4039 Statement::CreateTable(ct) => {
4040 assert_eq!(ct.columns.len(), 2);
4041 assert!(ct.columns[0].primary_key);
4042 assert!(ct.columns[1].unique);
4043 }
4044 _ => panic!("Expected CREATE TABLE"),
4045 }
4046 }
4047
4048 #[test]
4049 fn test_parse_extract() {
4050 let stmt = Parser::new("SELECT EXTRACT(YEAR FROM created_at) FROM t")
4051 .unwrap()
4052 .parse_statement()
4053 .unwrap();
4054 match stmt {
4055 Statement::Select(sel) => {
4056 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
4057 assert!(matches!(expr, Expr::Extract { .. }));
4058 }
4059 }
4060 _ => panic!("Expected SELECT"),
4061 }
4062 }
4063
4064 #[test]
4065 fn test_parse_postgres_cast() {
4066 let stmt = Parser::new("SELECT x::int FROM t")
4067 .unwrap()
4068 .parse_statement()
4069 .unwrap();
4070 match stmt {
4071 Statement::Select(sel) => {
4072 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
4073 assert!(matches!(expr, Expr::Cast { .. }));
4074 }
4075 }
4076 _ => panic!("Expected SELECT"),
4077 }
4078 }
4079}
4080
4081fn attach_comments_to_statement(stmt: &mut Statement, comments: Vec<String>) {
4083 match stmt {
4084 Statement::Select(s) => s.comments = comments,
4085 Statement::Insert(s) => s.comments = comments,
4086 Statement::Update(s) => s.comments = comments,
4087 Statement::Delete(s) => s.comments = comments,
4088 Statement::CreateTable(s) => s.comments = comments,
4089 Statement::DropTable(s) => s.comments = comments,
4090 Statement::SetOperation(s) => s.comments = comments,
4091 Statement::AlterTable(s) => s.comments = comments,
4092 Statement::CreateView(s) => s.comments = comments,
4093 Statement::DropView(s) => s.comments = comments,
4094 Statement::Truncate(s) => s.comments = comments,
4095 Statement::Explain(s) => s.comments = comments,
4096 Statement::Use(s) => s.comments = comments,
4097 Statement::Merge(s) => s.comments = comments,
4098 Statement::Transaction(_) | Statement::Expression(_) => {}
4100 }
4101}