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}
23
24impl Parser {
25 pub fn new(sql: &str) -> Result<Self> {
27 let mut tokenizer = Tokenizer::new(sql);
28 let tokens = tokenizer.tokenize()?;
29 Ok(Self { tokens, pos: 0 })
30 }
31
32 fn peek(&self) -> &Token {
35 &self.tokens[self.pos.min(self.tokens.len() - 1)]
36 }
37
38 fn peek_type(&self) -> &TokenType {
39 &self.peek().token_type
40 }
41
42 fn advance(&mut self) -> &Token {
43 let token = &self.tokens[self.pos.min(self.tokens.len() - 1)];
44 if self.pos < self.tokens.len() {
45 self.pos += 1;
46 }
47 token
48 }
49
50 fn expect(&mut self, expected: TokenType) -> Result<Token> {
51 let token = self.peek().clone();
52 if token.token_type == expected {
53 self.advance();
54 Ok(token)
55 } else {
56 Err(SqlglotError::ParserError {
57 message: format!(
58 "Expected {expected:?}, got {:?} ('{}') at line {} col {}",
59 token.token_type, token.value, token.line, token.col
60 ),
61 })
62 }
63 }
64
65 fn match_token(&mut self, expected: TokenType) -> bool {
66 if self.peek().token_type == expected {
67 self.advance();
68 true
69 } else {
70 false
71 }
72 }
73
74 fn check_keyword(&self, keyword: &str) -> bool {
76 self.peek().value.to_uppercase() == keyword
77 }
78
79 fn match_keyword(&mut self, keyword: &str) -> bool {
81 if self.check_keyword(keyword) {
82 self.advance();
83 true
84 } else {
85 false
86 }
87 }
88
89 fn is_name_token(&self) -> bool {
91 matches!(
92 self.peek_type(),
93 TokenType::Identifier
94 | TokenType::Year
95 | TokenType::Month
96 | TokenType::Day
97 | TokenType::Hour
98 | TokenType::Minute
99 | TokenType::Second
100 | TokenType::Key
101 | TokenType::Filter
102 | TokenType::First
103 | TokenType::Next
104 | TokenType::Only
105 | TokenType::Respect
106 | TokenType::Epoch
107 | TokenType::Schema
108 | TokenType::Database
109 | TokenType::View
110 | TokenType::Collate
111 | TokenType::Comment
112 )
113 }
114
115 fn expect_name(&mut self) -> Result<String> {
117 let (name, _) = self.expect_name_with_quote()?;
118 Ok(name)
119 }
120
121 fn expect_name_with_quote(&mut self) -> Result<(String, QuoteStyle)> {
123 if self.is_name_token() {
124 let token = self.advance().clone();
125 let qs = quote_style_from_char(token.quote_char);
126 return Ok((token.value.clone(), qs));
127 }
128 let token = self.peek().clone();
130 if matches!(
131 token.token_type,
132 TokenType::Identifier
133 | TokenType::Int
134 | TokenType::Integer
135 | TokenType::BigInt
136 | TokenType::SmallInt
137 | TokenType::TinyInt
138 | TokenType::Float
139 | TokenType::Double
140 | TokenType::Decimal
141 | TokenType::Numeric
142 | TokenType::Real
143 | TokenType::Varchar
144 | TokenType::Char
145 | TokenType::Text
146 | TokenType::Boolean
147 | TokenType::Date
148 | TokenType::Timestamp
149 | TokenType::TimestampTz
150 | TokenType::Time
151 | TokenType::Interval
152 | TokenType::Blob
153 | TokenType::Bytea
154 | TokenType::Json
155 | TokenType::Jsonb
156 | TokenType::Uuid
157 | TokenType::Array
158 | TokenType::Map
159 | TokenType::Struct
160 ) {
161 let t = self.advance().clone();
162 let qs = quote_style_from_char(t.quote_char);
163 Ok((t.value.clone(), qs))
164 } else {
165 Err(SqlglotError::ParserError {
166 message: format!(
167 "Expected identifier, got {:?} ('{}') at line {} col {}",
168 token.token_type, token.value, token.line, token.col
169 ),
170 })
171 }
172 }
173
174 pub fn parse_statement(&mut self) -> Result<Statement> {
178 let stmt = self.parse_statement_inner()?;
179 while self.match_token(TokenType::Semicolon) {}
181 Ok(stmt)
182 }
183
184 fn parse_statement_inner(&mut self) -> Result<Statement> {
185 match self.peek_type() {
186 TokenType::With => self.parse_with_statement(),
187 TokenType::Select => {
188 let select = self.parse_select_body(vec![])?;
189 self.maybe_parse_set_operation(Statement::Select(select))
190 }
191 TokenType::LParen => {
192 let saved_pos = self.pos;
194 self.advance(); if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
196 let inner = self.parse_statement_inner()?;
197 self.expect(TokenType::RParen)?;
198 self.maybe_parse_set_operation(inner)
199 } else {
200 self.pos = saved_pos;
201 Err(SqlglotError::ParserError {
202 message: "Expected statement".into(),
203 })
204 }
205 }
206 TokenType::Insert => self.parse_insert().map(Statement::Insert),
207 TokenType::Update => self.parse_update().map(Statement::Update),
208 TokenType::Delete => self.parse_delete().map(Statement::Delete),
209 TokenType::Create => self.parse_create(),
210 TokenType::Drop => self.parse_drop(),
211 TokenType::Alter => self.parse_alter_table().map(Statement::AlterTable),
212 TokenType::Truncate => self.parse_truncate().map(Statement::Truncate),
213 TokenType::Begin | TokenType::Commit | TokenType::Rollback | TokenType::Savepoint => {
214 self.parse_transaction().map(Statement::Transaction)
215 }
216 TokenType::Explain => self.parse_explain().map(Statement::Explain),
217 TokenType::Use => self.parse_use().map(Statement::Use),
218 _ => Err(SqlglotError::UnexpectedToken {
219 token: self.peek().clone(),
220 }),
221 }
222 }
223
224 pub fn parse_statements(&mut self) -> Result<Vec<Statement>> {
226 let mut stmts = Vec::new();
227 while !matches!(self.peek_type(), TokenType::Eof) {
228 while self.match_token(TokenType::Semicolon) {}
229 if matches!(self.peek_type(), TokenType::Eof) {
230 break;
231 }
232 stmts.push(self.parse_statement()?);
233 }
234 Ok(stmts)
235 }
236
237 fn parse_with_statement(&mut self) -> Result<Statement> {
240 self.expect(TokenType::With)?;
241 let recursive = self.match_token(TokenType::Recursive);
242 let mut ctes = vec![self.parse_cte(recursive)?];
243 while self.match_token(TokenType::Comma) {
244 ctes.push(self.parse_cte(recursive)?);
245 }
246
247 match self.peek_type() {
249 TokenType::Select => {
250 let select = self.parse_select_body(ctes)?;
251 self.maybe_parse_set_operation(Statement::Select(select))
252 }
253 TokenType::Insert => {
254 let ins = self.parse_insert()?;
256 let _ = ctes; Ok(Statement::Insert(ins))
259 }
260 _ => Err(SqlglotError::ParserError {
261 message: "Expected SELECT or INSERT after WITH clause".into(),
262 }),
263 }
264 }
265
266 fn parse_cte(&mut self, recursive: bool) -> Result<Cte> {
267 let name = self.expect_name()?;
268
269 let columns = if self.match_token(TokenType::LParen) {
270 let mut cols = vec![self.expect_name()?];
271 while self.match_token(TokenType::Comma) {
272 cols.push(self.expect_name()?);
273 }
274 self.expect(TokenType::RParen)?;
275 cols
276 } else {
277 vec![]
278 };
279
280 self.expect(TokenType::As)?;
281
282 let materialized = if self.match_keyword("MATERIALIZED") {
283 Some(true)
284 } else if self.check_keyword("NOT") {
285 let saved = self.pos;
286 self.advance();
287 if self.match_keyword("MATERIALIZED") {
288 Some(false)
289 } else {
290 self.pos = saved;
291 None
292 }
293 } else {
294 None
295 };
296
297 self.expect(TokenType::LParen)?;
298 let query = self.parse_statement_inner()?;
299 self.expect(TokenType::RParen)?;
300
301 Ok(Cte {
302 name,
303 columns,
304 query: Box::new(query),
305 materialized,
306 recursive,
307 })
308 }
309
310 fn parse_select_body(&mut self, ctes: Vec<Cte>) -> Result<SelectStatement> {
313 self.expect(TokenType::Select)?;
314
315 let distinct = self.match_token(TokenType::Distinct);
316
317 let top = if self.match_token(TokenType::Top) {
319 Some(Box::new(self.parse_expr()?))
320 } else {
321 None
322 };
323
324 let columns = self.parse_select_items()?;
325
326 let from = if self.match_token(TokenType::From) {
327 Some(FromClause {
328 source: self.parse_table_source()?,
329 })
330 } else {
331 None
332 };
333
334 let joins = self.parse_joins()?;
335
336 let where_clause = if self.match_token(TokenType::Where) {
337 Some(self.parse_expr()?)
338 } else {
339 None
340 };
341
342 let group_by = if self.match_token(TokenType::Group) {
343 self.expect(TokenType::By)?;
344 self.parse_expr_list()?
345 } else {
346 vec![]
347 };
348
349 let having = if self.match_token(TokenType::Having) {
350 Some(self.parse_expr()?)
351 } else {
352 None
353 };
354
355 let qualify = if self.match_token(TokenType::Qualify) {
356 Some(self.parse_expr()?)
357 } else {
358 None
359 };
360
361 let window_definitions = if self.match_token(TokenType::Window) {
363 self.parse_window_definitions()?
364 } else {
365 vec![]
366 };
367
368 let order_by = if self.match_token(TokenType::Order) {
369 self.expect(TokenType::By)?;
370 self.parse_order_by_items()?
371 } else {
372 vec![]
373 };
374
375 let limit = if self.match_token(TokenType::Limit) {
376 Some(self.parse_expr()?)
377 } else {
378 None
379 };
380
381 let offset = if self.match_token(TokenType::Offset) {
382 Some(self.parse_expr()?)
383 } else {
384 None
385 };
386
387 let fetch_first = if self.match_token(TokenType::Fetch) {
389 let _ = self.match_token(TokenType::First) || self.match_token(TokenType::Next);
391 let count = self.parse_expr()?;
392 let _ = self.match_keyword("ROWS") || self.match_keyword("ROW");
394 let _ = self.match_token(TokenType::Only);
396 Some(count)
397 } else {
398 None
399 };
400
401 Ok(SelectStatement {
402 ctes,
403 distinct,
404 top,
405 columns,
406 from,
407 joins,
408 where_clause,
409 group_by,
410 having,
411 order_by,
412 limit,
413 offset,
414 fetch_first,
415 qualify,
416 window_definitions,
417 })
418 }
419
420 fn parse_window_definitions(&mut self) -> Result<Vec<WindowDefinition>> {
421 let mut defs = Vec::new();
422 loop {
423 let name = self.expect_name()?;
424 self.expect(TokenType::As)?;
425 self.expect(TokenType::LParen)?;
426 let spec = self.parse_window_spec()?;
427 self.expect(TokenType::RParen)?;
428 defs.push(WindowDefinition { name, spec });
429 if !self.match_token(TokenType::Comma) {
430 break;
431 }
432 }
433 Ok(defs)
434 }
435
436 fn maybe_parse_set_operation(&mut self, left: Statement) -> Result<Statement> {
438 let op = match self.peek_type() {
439 TokenType::Union => SetOperationType::Union,
440 TokenType::Intersect => SetOperationType::Intersect,
441 TokenType::Except => SetOperationType::Except,
442 _ => return Ok(left),
443 };
444 self.advance();
445
446 let all = self.match_token(TokenType::All);
447 let _ = self.match_token(TokenType::Distinct); let right = self.parse_statement_inner()?;
450
451 let combined = Statement::SetOperation(SetOperationStatement {
453 op,
454 all,
455 left: Box::new(left),
456 right: Box::new(right),
457 order_by: vec![],
458 limit: None,
459 offset: None,
460 });
461
462 if matches!(self.peek_type(), TokenType::Union | TokenType::Intersect | TokenType::Except) {
464 self.maybe_parse_set_operation(combined)
465 } else {
466 if let Statement::SetOperation(mut sop) = combined {
468 if self.match_token(TokenType::Order) {
469 self.expect(TokenType::By)?;
470 sop.order_by = self.parse_order_by_items()?;
471 }
472 if self.match_token(TokenType::Limit) {
473 sop.limit = Some(self.parse_expr()?);
474 }
475 if self.match_token(TokenType::Offset) {
476 sop.offset = Some(self.parse_expr()?);
477 }
478 Ok(Statement::SetOperation(sop))
479 } else {
480 Ok(combined)
481 }
482 }
483 }
484
485 fn parse_select_items(&mut self) -> Result<Vec<SelectItem>> {
486 let mut items = vec![self.parse_select_item()?];
487 while self.match_token(TokenType::Comma) {
488 items.push(self.parse_select_item()?);
489 }
490 Ok(items)
491 }
492
493 fn parse_select_item(&mut self) -> Result<SelectItem> {
494 if self.peek().token_type == TokenType::Star {
495 self.advance();
496 return Ok(SelectItem::Wildcard);
497 }
498
499 let expr = self.parse_expr()?;
500
501 if let Expr::QualifiedWildcard { ref table } = expr {
503 return Ok(SelectItem::QualifiedWildcard {
504 table: table.clone(),
505 });
506 }
507
508 let alias = self.parse_optional_alias()?;
509
510 Ok(SelectItem::Expr { expr, alias })
511 }
512
513 fn parse_optional_alias(&mut self) -> Result<Option<String>> {
514 if self.match_token(TokenType::As) {
515 return Ok(Some(self.expect_name()?));
516 }
517 if self.is_name_token() {
519 let peeked_upper = self.peek().value.to_uppercase();
520 if !matches!(
521 peeked_upper.as_str(),
522 "FROM"
523 | "WHERE"
524 | "GROUP"
525 | "ORDER"
526 | "LIMIT"
527 | "HAVING"
528 | "UNION"
529 | "INTERSECT"
530 | "EXCEPT"
531 | "JOIN"
532 | "INNER"
533 | "LEFT"
534 | "RIGHT"
535 | "FULL"
536 | "CROSS"
537 | "ON"
538 | "WINDOW"
539 | "QUALIFY"
540 | "INTO"
541 | "SET"
542 | "RETURNING"
543 ) {
544 return Ok(Some(self.advance().value.clone()));
545 }
546 }
547 Ok(None)
548 }
549
550 fn parse_table_source(&mut self) -> Result<TableSource> {
551 if self.match_token(TokenType::Lateral) {
553 let source = self.parse_table_source()?;
554 return Ok(TableSource::Lateral {
555 source: Box::new(source),
556 });
557 }
558
559 if self.match_token(TokenType::Unnest) {
561 self.expect(TokenType::LParen)?;
562 let expr = self.parse_expr()?;
563 self.expect(TokenType::RParen)?;
564 let alias = self.parse_optional_alias()?;
565 let with_offset = self.match_keyword("WITH") && self.match_keyword("OFFSET");
566 return Ok(TableSource::Unnest {
567 expr: Box::new(expr),
568 alias,
569 with_offset,
570 });
571 }
572
573 if self.peek_type() == &TokenType::LParen {
575 let saved = self.pos;
576 self.advance();
577 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
578 let query = self.parse_statement_inner()?;
579 self.expect(TokenType::RParen)?;
580 let alias = self.parse_optional_alias()?;
581 return Ok(TableSource::Subquery {
582 query: Box::new(query),
583 alias,
584 });
585 }
586 self.pos = saved;
587 }
588
589 let table_ref = self.parse_table_ref()?;
591
592 if self.peek_type() == &TokenType::LParen && table_ref.schema.is_none() {
594 self.advance();
595 let args = if self.peek_type() != &TokenType::RParen {
596 self.parse_expr_list()?
597 } else {
598 vec![]
599 };
600 self.expect(TokenType::RParen)?;
601 let alias = self.parse_optional_alias()?;
602 return Ok(TableSource::TableFunction {
603 name: table_ref.name,
604 args,
605 alias,
606 });
607 }
608
609 Ok(TableSource::Table(table_ref))
610 }
611
612 fn parse_table_ref(&mut self) -> Result<TableRef> {
613 let (first, first_qs) = self.expect_name_with_quote()?;
614
615 let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
617 let (second, second_qs) = self.expect_name_with_quote()?;
618 if self.match_token(TokenType::Dot) {
619 let (third, third_qs) = self.expect_name_with_quote()?;
620 (Some(first), Some(second), third, third_qs)
621 } else {
622 (None, Some(first), second, second_qs)
623 }
624 } else {
625 (None, None, first, first_qs)
626 };
627
628 let alias = self.parse_optional_alias()?;
629
630 Ok(TableRef {
631 catalog,
632 schema,
633 name,
634 alias,
635 name_quote_style: name_qs,
636 })
637 }
638
639 fn parse_table_ref_no_alias(&mut self) -> Result<TableRef> {
641 let (first, first_qs) = self.expect_name_with_quote()?;
642
643 let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
644 let (second, second_qs) = self.expect_name_with_quote()?;
645 if self.match_token(TokenType::Dot) {
646 let (third, third_qs) = self.expect_name_with_quote()?;
647 (Some(first), Some(second), third, third_qs)
648 } else {
649 (None, Some(first), second, second_qs)
650 }
651 } else {
652 (None, None, first, first_qs)
653 };
654
655 Ok(TableRef {
656 catalog,
657 schema,
658 name,
659 alias: None,
660 name_quote_style: name_qs,
661 })
662 }
663
664 fn parse_joins(&mut self) -> Result<Vec<JoinClause>> {
665 let mut joins = Vec::new();
666 loop {
667 let join_type = match self.peek_type() {
668 TokenType::Join => {
669 self.advance();
670 JoinType::Inner
671 }
672 TokenType::Inner => {
673 self.advance();
674 self.expect(TokenType::Join)?;
675 JoinType::Inner
676 }
677 TokenType::Left => {
678 self.advance();
679 let _ = self.match_token(TokenType::Outer);
680 self.expect(TokenType::Join)?;
681 JoinType::Left
682 }
683 TokenType::Right => {
684 self.advance();
685 let _ = self.match_token(TokenType::Outer);
686 self.expect(TokenType::Join)?;
687 JoinType::Right
688 }
689 TokenType::Full => {
690 self.advance();
691 let _ = self.match_token(TokenType::Outer);
692 self.expect(TokenType::Join)?;
693 JoinType::Full
694 }
695 TokenType::Cross => {
696 self.advance();
697 self.expect(TokenType::Join)?;
698 JoinType::Cross
699 }
700 _ => break,
701 };
702
703 let table = self.parse_table_source()?;
704 let mut on = None;
705 let mut using = vec![];
706
707 if self.match_token(TokenType::On) {
708 on = Some(self.parse_expr()?);
709 } else if self.match_token(TokenType::Using) {
710 self.expect(TokenType::LParen)?;
711 using = vec![self.expect_name()?];
712 while self.match_token(TokenType::Comma) {
713 using.push(self.expect_name()?);
714 }
715 self.expect(TokenType::RParen)?;
716 }
717
718 joins.push(JoinClause {
719 join_type,
720 table,
721 on,
722 using,
723 });
724 }
725 Ok(joins)
726 }
727
728 fn parse_order_by_items(&mut self) -> Result<Vec<OrderByItem>> {
729 let mut items = Vec::new();
730 loop {
731 let expr = self.parse_expr()?;
732 let ascending = if self.match_token(TokenType::Desc) {
733 false
734 } else {
735 let _ = self.match_token(TokenType::Asc);
736 true
737 };
738
739 let nulls_first = if self.match_token(TokenType::Nulls) {
740 if self.match_token(TokenType::First) {
741 Some(true)
742 } else {
743 self.expect(TokenType::Identifier)?; Some(false)
745 }
746 } else {
747 None
748 };
749
750 items.push(OrderByItem {
751 expr,
752 ascending,
753 nulls_first,
754 });
755 if !self.match_token(TokenType::Comma) {
756 break;
757 }
758 }
759 Ok(items)
760 }
761
762 fn parse_expr_list(&mut self) -> Result<Vec<Expr>> {
763 let mut exprs = vec![self.parse_expr()?];
764 while self.match_token(TokenType::Comma) {
765 exprs.push(self.parse_expr()?);
766 }
767 Ok(exprs)
768 }
769
770 fn parse_insert(&mut self) -> Result<InsertStatement> {
773 self.expect(TokenType::Insert)?;
774 let _ = self.match_token(TokenType::Into);
775 let table = self.parse_table_ref()?;
776
777 let columns = if self.match_token(TokenType::LParen) {
778 let mut cols = vec![self.expect_name()?];
779 while self.match_token(TokenType::Comma) {
780 cols.push(self.expect_name()?);
781 }
782 self.expect(TokenType::RParen)?;
783 cols
784 } else {
785 vec![]
786 };
787
788 let source = if self.match_token(TokenType::Values) {
789 let mut rows = Vec::new();
790 loop {
791 self.expect(TokenType::LParen)?;
792 let row = self.parse_expr_list()?;
793 self.expect(TokenType::RParen)?;
794 rows.push(row);
795 if !self.match_token(TokenType::Comma) {
796 break;
797 }
798 }
799 InsertSource::Values(rows)
800 } else if matches!(self.peek_type(), TokenType::Select | TokenType::With | TokenType::LParen) {
801 InsertSource::Query(Box::new(self.parse_statement_inner()?))
802 } else if self.match_token(TokenType::Default) {
803 self.expect(TokenType::Values)?;
804 InsertSource::Default
805 } else {
806 return Err(SqlglotError::ParserError {
807 message: "Expected VALUES, SELECT, or DEFAULT VALUES after INSERT".into(),
808 });
809 };
810
811 let on_conflict = if self.match_token(TokenType::On) {
813 if self.match_token(TokenType::Conflict) {
814 let columns = if self.match_token(TokenType::LParen) {
815 let mut cols = vec![self.expect_name()?];
816 while self.match_token(TokenType::Comma) {
817 cols.push(self.expect_name()?);
818 }
819 self.expect(TokenType::RParen)?;
820 cols
821 } else {
822 vec![]
823 };
824 self.expect(TokenType::Do)?;
825 let action = if self.match_token(TokenType::Nothing) {
826 ConflictAction::DoNothing
827 } else {
828 self.expect(TokenType::Update)?;
829 self.expect(TokenType::Set)?;
830 let mut assignments = Vec::new();
831 loop {
832 let col = self.expect_name()?;
833 self.expect(TokenType::Eq)?;
834 let val = self.parse_expr()?;
835 assignments.push((col, val));
836 if !self.match_token(TokenType::Comma) {
837 break;
838 }
839 }
840 ConflictAction::DoUpdate(assignments)
841 };
842 Some(OnConflict { columns, action })
843 } else {
844 None
845 }
846 } else {
847 None
848 };
849
850 let returning = if self.match_token(TokenType::Returning) {
851 self.parse_select_items()?
852 } else {
853 vec![]
854 };
855
856 Ok(InsertStatement {
857 table,
858 columns,
859 source,
860 on_conflict,
861 returning,
862 })
863 }
864
865 fn parse_update(&mut self) -> Result<UpdateStatement> {
868 self.expect(TokenType::Update)?;
869 let table = self.parse_table_ref()?;
870 self.expect(TokenType::Set)?;
871
872 let mut assignments = Vec::new();
873 loop {
874 let col = self.expect_name()?;
875 self.expect(TokenType::Eq)?;
876 let val = self.parse_expr()?;
877 assignments.push((col, val));
878 if !self.match_token(TokenType::Comma) {
879 break;
880 }
881 }
882
883 let from = if self.match_token(TokenType::From) {
884 Some(FromClause {
885 source: self.parse_table_source()?,
886 })
887 } else {
888 None
889 };
890
891 let where_clause = if self.match_token(TokenType::Where) {
892 Some(self.parse_expr()?)
893 } else {
894 None
895 };
896
897 let returning = if self.match_token(TokenType::Returning) {
898 self.parse_select_items()?
899 } else {
900 vec![]
901 };
902
903 Ok(UpdateStatement {
904 table,
905 assignments,
906 from,
907 where_clause,
908 returning,
909 })
910 }
911
912 fn parse_delete(&mut self) -> Result<DeleteStatement> {
915 self.expect(TokenType::Delete)?;
916 self.expect(TokenType::From)?;
917 let table = self.parse_table_ref()?;
918
919 let using = if self.match_token(TokenType::Using) {
920 Some(FromClause {
921 source: self.parse_table_source()?,
922 })
923 } else {
924 None
925 };
926
927 let where_clause = if self.match_token(TokenType::Where) {
928 Some(self.parse_expr()?)
929 } else {
930 None
931 };
932
933 let returning = if self.match_token(TokenType::Returning) {
934 self.parse_select_items()?
935 } else {
936 vec![]
937 };
938
939 Ok(DeleteStatement {
940 table,
941 using,
942 where_clause,
943 returning,
944 })
945 }
946
947 fn parse_create(&mut self) -> Result<Statement> {
950 self.expect(TokenType::Create)?;
951
952 let or_replace = if self.check_keyword("OR") {
953 self.advance();
954 self.expect(TokenType::Replace)?;
955 true
956 } else {
957 false
958 };
959
960 let temporary = self.match_token(TokenType::Temporary) || self.match_token(TokenType::Temp);
961
962 let materialized = self.match_token(TokenType::Materialized);
963
964 if self.match_token(TokenType::View) {
965 return self.parse_create_view(or_replace, materialized).map(Statement::CreateView);
966 }
967
968 self.expect(TokenType::Table)?;
969
970 let if_not_exists = if self.match_token(TokenType::If) {
971 self.expect(TokenType::Not)?;
972 self.expect(TokenType::Exists)?;
973 true
974 } else {
975 false
976 };
977
978 let table = self.parse_table_ref_no_alias()?;
979
980 if self.match_token(TokenType::As) {
982 let query = self.parse_statement_inner()?;
983 return Ok(Statement::CreateTable(CreateTableStatement {
984 if_not_exists,
985 temporary,
986 table,
987 columns: vec![],
988 constraints: vec![],
989 as_select: Some(Box::new(query)),
990 }));
991 }
992
993 self.expect(TokenType::LParen)?;
994
995 let mut columns = Vec::new();
996 let mut constraints = Vec::new();
997
998 loop {
999 if matches!(self.peek_type(), TokenType::Primary | TokenType::Unique | TokenType::Foreign | TokenType::Check | TokenType::Constraint) {
1001 constraints.push(self.parse_table_constraint()?);
1002 } else if self.peek_type() != &TokenType::RParen {
1003 columns.push(self.parse_column_def()?);
1004 }
1005
1006 if !self.match_token(TokenType::Comma) {
1007 break;
1008 }
1009 }
1010 self.expect(TokenType::RParen)?;
1011
1012 Ok(Statement::CreateTable(CreateTableStatement {
1013 if_not_exists,
1014 temporary,
1015 table,
1016 columns,
1017 constraints,
1018 as_select: None,
1019 }))
1020 }
1021
1022 fn parse_create_view(&mut self, or_replace: bool, materialized: bool) -> Result<CreateViewStatement> {
1023 let if_not_exists = if self.match_token(TokenType::If) {
1024 self.expect(TokenType::Not)?;
1025 self.expect(TokenType::Exists)?;
1026 true
1027 } else {
1028 false
1029 };
1030
1031 let name = self.parse_table_ref_no_alias()?;
1033
1034 let columns = if self.match_token(TokenType::LParen) {
1035 let mut cols = vec![self.expect_name()?];
1036 while self.match_token(TokenType::Comma) {
1037 cols.push(self.expect_name()?);
1038 }
1039 self.expect(TokenType::RParen)?;
1040 cols
1041 } else {
1042 vec![]
1043 };
1044
1045 self.expect(TokenType::As)?;
1046 let query = self.parse_statement_inner()?;
1047
1048 Ok(CreateViewStatement {
1049 name,
1050 columns,
1051 query: Box::new(query),
1052 or_replace,
1053 materialized,
1054 if_not_exists,
1055 })
1056 }
1057
1058 fn parse_table_constraint(&mut self) -> Result<TableConstraint> {
1059 let name = if self.match_token(TokenType::Constraint) {
1060 Some(self.expect_name()?)
1061 } else {
1062 None
1063 };
1064
1065 if self.match_token(TokenType::Primary) {
1066 self.expect(TokenType::Key)?;
1067 self.expect(TokenType::LParen)?;
1068 let columns = self.parse_name_list()?;
1069 self.expect(TokenType::RParen)?;
1070 Ok(TableConstraint::PrimaryKey { name, columns })
1071 } else if self.match_token(TokenType::Unique) {
1072 self.expect(TokenType::LParen)?;
1073 let columns = self.parse_name_list()?;
1074 self.expect(TokenType::RParen)?;
1075 Ok(TableConstraint::Unique { name, columns })
1076 } else if self.match_token(TokenType::Foreign) {
1077 self.expect(TokenType::Key)?;
1078 self.expect(TokenType::LParen)?;
1079 let columns = self.parse_name_list()?;
1080 self.expect(TokenType::RParen)?;
1081 self.expect(TokenType::References)?;
1082 let ref_table = self.parse_table_ref()?;
1083 self.expect(TokenType::LParen)?;
1084 let ref_columns = self.parse_name_list()?;
1085 self.expect(TokenType::RParen)?;
1086
1087 let on_delete = if self.match_token(TokenType::On) && self.match_token(TokenType::Delete) {
1088 Some(self.parse_referential_action()?)
1089 } else {
1090 None
1091 };
1092 let on_update = if self.match_token(TokenType::On) && self.match_token(TokenType::Update) {
1093 Some(self.parse_referential_action()?)
1094 } else {
1095 None
1096 };
1097
1098 Ok(TableConstraint::ForeignKey {
1099 name,
1100 columns,
1101 ref_table,
1102 ref_columns,
1103 on_delete,
1104 on_update,
1105 })
1106 } else if self.match_token(TokenType::Check) {
1107 self.expect(TokenType::LParen)?;
1108 let expr = self.parse_expr()?;
1109 self.expect(TokenType::RParen)?;
1110 Ok(TableConstraint::Check { name, expr })
1111 } else {
1112 Err(SqlglotError::ParserError {
1113 message: "Expected constraint type".into(),
1114 })
1115 }
1116 }
1117
1118 fn parse_referential_action(&mut self) -> Result<ReferentialAction> {
1119 if self.match_token(TokenType::Cascade) {
1120 Ok(ReferentialAction::Cascade)
1121 } else if self.match_token(TokenType::Restrict) {
1122 Ok(ReferentialAction::Restrict)
1123 } else if self.match_token(TokenType::Set) {
1124 if self.match_token(TokenType::Null) {
1125 Ok(ReferentialAction::SetNull)
1126 } else if self.match_token(TokenType::Default) {
1127 Ok(ReferentialAction::SetDefault)
1128 } else {
1129 Err(SqlglotError::ParserError {
1130 message: "Expected NULL or DEFAULT after SET".into(),
1131 })
1132 }
1133 } else if self.check_keyword("NO") {
1134 self.advance();
1135 self.expect(TokenType::Identifier)?; Ok(ReferentialAction::NoAction)
1137 } else {
1138 Err(SqlglotError::ParserError {
1139 message: "Expected referential action (CASCADE, RESTRICT, SET NULL, SET DEFAULT, NO ACTION)".into(),
1140 })
1141 }
1142 }
1143
1144 fn parse_name_list(&mut self) -> Result<Vec<String>> {
1145 let mut names = vec![self.expect_name()?];
1146 while self.match_token(TokenType::Comma) {
1147 names.push(self.expect_name()?);
1148 }
1149 Ok(names)
1150 }
1151
1152 fn parse_column_def(&mut self) -> Result<ColumnDef> {
1153 let name = self.expect_name()?;
1154 let data_type = self.parse_data_type()?;
1155
1156 let mut nullable = None;
1157 let mut default = None;
1158 let mut primary_key = false;
1159 let mut unique = false;
1160 let mut auto_increment = false;
1161 let mut collation = None;
1162 let mut comment = None;
1163
1164 loop {
1165 if self.match_token(TokenType::Not) {
1166 self.expect(TokenType::Null)?;
1167 nullable = Some(false);
1168 } else if self.peek_type() == &TokenType::Null {
1169 self.advance();
1170 nullable = Some(true);
1171 } else if self.match_token(TokenType::Default) {
1172 default = Some(self.parse_expr()?);
1173 } else if self.match_token(TokenType::Primary) {
1174 self.expect(TokenType::Key)?;
1175 primary_key = true;
1176 } else if self.match_token(TokenType::Unique) {
1177 unique = true;
1178 } else if self.match_token(TokenType::AutoIncrement) {
1179 auto_increment = true;
1180 } else if self.match_token(TokenType::Collate) {
1181 collation = Some(self.expect_name()?);
1182 } else if self.match_token(TokenType::Comment) {
1183 let tok = self.expect(TokenType::String)?;
1184 comment = Some(tok.value);
1185 } else if self.match_token(TokenType::References) {
1186 let _ = self.parse_table_ref()?;
1188 if self.match_token(TokenType::LParen) {
1189 while !self.match_token(TokenType::RParen) {
1190 self.advance();
1191 }
1192 }
1193 } else {
1194 break;
1195 }
1196 }
1197
1198 Ok(ColumnDef {
1199 name,
1200 data_type,
1201 nullable,
1202 default,
1203 primary_key,
1204 unique,
1205 auto_increment,
1206 collation,
1207 comment,
1208 })
1209 }
1210
1211 fn parse_data_type(&mut self) -> Result<DataType> {
1212 let token = self.peek().clone();
1213 let type_result = match &token.token_type {
1214 TokenType::Int | TokenType::Integer => { self.advance(); Ok(DataType::Int) }
1215 TokenType::BigInt => { self.advance(); Ok(DataType::BigInt) }
1216 TokenType::SmallInt => { self.advance(); Ok(DataType::SmallInt) }
1217 TokenType::TinyInt => { self.advance(); Ok(DataType::TinyInt) }
1218 TokenType::Float => { self.advance(); Ok(DataType::Float) }
1219 TokenType::Double => {
1220 self.advance();
1221 let _ = self.match_keyword("PRECISION");
1222 Ok(DataType::Double)
1223 }
1224 TokenType::Real => { self.advance(); Ok(DataType::Real) }
1225 TokenType::Decimal | TokenType::Numeric => {
1226 let is_numeric = token.token_type == TokenType::Numeric;
1227 self.advance();
1228 let (precision, scale) = self.parse_type_params()?;
1229 if is_numeric {
1230 Ok(DataType::Numeric { precision, scale })
1231 } else {
1232 Ok(DataType::Decimal { precision, scale })
1233 }
1234 }
1235 TokenType::Varchar => {
1236 self.advance();
1237 let len = self.parse_single_type_param()?;
1238 Ok(DataType::Varchar(len))
1239 }
1240 TokenType::Char => {
1241 self.advance();
1242 let len = self.parse_single_type_param()?;
1243 Ok(DataType::Char(len))
1244 }
1245 TokenType::Text => { self.advance(); Ok(DataType::Text) }
1246 TokenType::Boolean => { self.advance(); Ok(DataType::Boolean) }
1247 TokenType::Date => { self.advance(); Ok(DataType::Date) }
1248 TokenType::Timestamp => {
1249 self.advance();
1250 let precision = self.parse_single_type_param()?;
1251 let with_tz = if self.match_keyword("WITH") {
1252 let _ = self.match_keyword("TIME");
1253 let _ = self.match_keyword("ZONE");
1254 true
1255 } else if self.match_keyword("WITHOUT") {
1256 let _ = self.match_keyword("TIME");
1257 let _ = self.match_keyword("ZONE");
1258 false
1259 } else {
1260 false
1261 };
1262 Ok(DataType::Timestamp { precision, with_tz })
1263 }
1264 TokenType::TimestampTz => {
1265 self.advance();
1266 let precision = self.parse_single_type_param()?;
1267 Ok(DataType::Timestamp { precision, with_tz: true })
1268 }
1269 TokenType::Time => {
1270 self.advance();
1271 let precision = self.parse_single_type_param()?;
1272 Ok(DataType::Time { precision })
1273 }
1274 TokenType::Interval => { self.advance(); Ok(DataType::Interval) }
1275 TokenType::Blob => { self.advance(); Ok(DataType::Blob) }
1276 TokenType::Bytea => { self.advance(); Ok(DataType::Bytea) }
1277 TokenType::Json => { self.advance(); Ok(DataType::Json) }
1278 TokenType::Jsonb => { self.advance(); Ok(DataType::Jsonb) }
1279 TokenType::Uuid => { self.advance(); Ok(DataType::Uuid) }
1280 TokenType::Array => {
1281 self.advance();
1282 if self.match_token(TokenType::Lt) {
1283 let inner = self.parse_data_type()?;
1284 self.expect(TokenType::Gt)?;
1285 Ok(DataType::Array(Some(Box::new(inner))))
1286 } else {
1287 Ok(DataType::Array(None))
1288 }
1289 }
1290 TokenType::Identifier => {
1291 let name = token.value.to_uppercase();
1292 self.advance();
1293 match name.as_str() {
1294 "STRING" => Ok(DataType::String),
1295 "BINARY" => { let len = self.parse_single_type_param()?; Ok(DataType::Binary(len)) }
1296 "VARBINARY" => { let len = self.parse_single_type_param()?; Ok(DataType::Varbinary(len)) }
1297 "DATETIME" => Ok(DataType::DateTime),
1298 "BYTES" => Ok(DataType::Bytes),
1299 "VARIANT" => Ok(DataType::Variant),
1300 "OBJECT" => Ok(DataType::Object),
1301 "XML" => Ok(DataType::Xml),
1302 "INET" => Ok(DataType::Inet),
1303 "CIDR" => Ok(DataType::Cidr),
1304 "MACADDR" => Ok(DataType::Macaddr),
1305 "BIT" => { let len = self.parse_single_type_param()?; Ok(DataType::Bit(len)) }
1306 "MONEY" => Ok(DataType::Money),
1307 "SERIAL" => Ok(DataType::Serial),
1308 "BIGSERIAL" => Ok(DataType::BigSerial),
1309 "SMALLSERIAL" => Ok(DataType::SmallSerial),
1310 "REGCLASS" => Ok(DataType::Regclass),
1311 "REGTYPE" => Ok(DataType::Regtype),
1312 "HSTORE" => Ok(DataType::Hstore),
1313 "GEOGRAPHY" => Ok(DataType::Geography),
1314 "GEOMETRY" => Ok(DataType::Geometry),
1315 "SUPER" => Ok(DataType::Super),
1316 _ => Ok(DataType::Unknown(name)),
1317 }
1318 }
1319 _ => Err(SqlglotError::ParserError {
1320 message: format!("Expected data type, got {:?}", token.token_type),
1321 }),
1322 };
1323 type_result
1324 }
1325
1326 fn parse_type_params(&mut self) -> Result<(Option<u32>, Option<u32>)> {
1327 if self.match_token(TokenType::LParen) {
1328 let p: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1329 let s = if self.match_token(TokenType::Comma) {
1330 self.expect(TokenType::Number)?.value.parse().ok()
1331 } else {
1332 None
1333 };
1334 self.expect(TokenType::RParen)?;
1335 Ok((p, s))
1336 } else {
1337 Ok((None, None))
1338 }
1339 }
1340
1341 fn parse_single_type_param(&mut self) -> Result<Option<u32>> {
1342 if self.match_token(TokenType::LParen) {
1343 let n: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1344 self.expect(TokenType::RParen)?;
1345 Ok(n)
1346 } else {
1347 Ok(None)
1348 }
1349 }
1350
1351 fn parse_drop(&mut self) -> Result<Statement> {
1354 self.expect(TokenType::Drop)?;
1355
1356 if self.match_token(TokenType::Materialized) {
1357 self.expect(TokenType::View)?;
1358 let if_exists = if self.match_token(TokenType::If) {
1359 self.expect(TokenType::Exists)?;
1360 true
1361 } else {
1362 false
1363 };
1364 let name = self.parse_table_ref()?;
1365 return Ok(Statement::DropView(DropViewStatement {
1366 name,
1367 if_exists,
1368 materialized: true,
1369 }));
1370 }
1371
1372 if self.match_token(TokenType::View) {
1373 let if_exists = if self.match_token(TokenType::If) {
1374 self.expect(TokenType::Exists)?;
1375 true
1376 } else {
1377 false
1378 };
1379 let name = self.parse_table_ref()?;
1380 return Ok(Statement::DropView(DropViewStatement {
1381 name,
1382 if_exists,
1383 materialized: false,
1384 }));
1385 }
1386
1387 self.expect(TokenType::Table)?;
1388
1389 let if_exists = if self.match_token(TokenType::If) {
1390 self.expect(TokenType::Exists)?;
1391 true
1392 } else {
1393 false
1394 };
1395
1396 let table = self.parse_table_ref()?;
1397 let cascade = self.match_token(TokenType::Cascade);
1398
1399 Ok(Statement::DropTable(DropTableStatement {
1400 if_exists,
1401 table,
1402 cascade,
1403 }))
1404 }
1405
1406 fn parse_alter_table(&mut self) -> Result<AlterTableStatement> {
1409 self.expect(TokenType::Alter)?;
1410 self.expect(TokenType::Table)?;
1411 let table = self.parse_table_ref_no_alias()?;
1412
1413 let mut actions = Vec::new();
1414 loop {
1415 let action = self.parse_alter_action()?;
1416 actions.push(action);
1417 if !self.match_token(TokenType::Comma) {
1418 break;
1419 }
1420 }
1421
1422 Ok(AlterTableStatement { table, actions })
1423 }
1424
1425 fn parse_alter_action(&mut self) -> Result<AlterTableAction> {
1426 if self.match_keyword("ADD") {
1427 if matches!(self.peek_type(), TokenType::Constraint | TokenType::Primary | TokenType::Unique | TokenType::Foreign | TokenType::Check) {
1428 let constraint = self.parse_table_constraint()?;
1429 Ok(AlterTableAction::AddConstraint(constraint))
1430 } else {
1431 let _ = self.match_keyword("COLUMN");
1432 let col = self.parse_column_def()?;
1433 Ok(AlterTableAction::AddColumn(col))
1434 }
1435 } else if self.match_token(TokenType::Drop) {
1436 let _ = self.match_keyword("COLUMN");
1437 let if_exists = if self.match_token(TokenType::If) {
1438 self.expect(TokenType::Exists)?;
1439 true
1440 } else {
1441 false
1442 };
1443 let name = self.expect_name()?;
1444 Ok(AlterTableAction::DropColumn { name, if_exists })
1445 } else if self.match_keyword("RENAME") {
1446 if self.match_keyword("COLUMN") {
1447 let old_name = self.expect_name()?;
1448 self.expect(TokenType::Identifier)?; let new_name = self.expect_name()?;
1450 Ok(AlterTableAction::RenameColumn { old_name, new_name })
1451 } else if self.match_keyword("TO") {
1452 let new_name = self.expect_name()?;
1453 Ok(AlterTableAction::RenameTable { new_name })
1454 } else {
1455 Err(SqlglotError::ParserError {
1456 message: "Expected COLUMN or TO after RENAME".into(),
1457 })
1458 }
1459 } else {
1460 Err(SqlglotError::ParserError {
1461 message: "Expected ADD, DROP, or RENAME in ALTER TABLE".into(),
1462 })
1463 }
1464 }
1465
1466 fn parse_truncate(&mut self) -> Result<TruncateStatement> {
1469 self.expect(TokenType::Truncate)?;
1470 let _ = self.match_token(TokenType::Table);
1471 let table = self.parse_table_ref()?;
1472 Ok(TruncateStatement { table })
1473 }
1474
1475 fn parse_transaction(&mut self) -> Result<TransactionStatement> {
1478 match self.peek_type() {
1479 TokenType::Begin => {
1480 self.advance();
1481 let _ = self.match_token(TokenType::Transaction);
1482 Ok(TransactionStatement::Begin)
1483 }
1484 TokenType::Commit => {
1485 self.advance();
1486 let _ = self.match_token(TokenType::Transaction);
1487 Ok(TransactionStatement::Commit)
1488 }
1489 TokenType::Rollback => {
1490 self.advance();
1491 let _ = self.match_token(TokenType::Transaction);
1492 if self.match_keyword("TO") {
1493 let _ = self.match_token(TokenType::Savepoint);
1494 let name = self.expect_name()?;
1495 Ok(TransactionStatement::RollbackTo(name))
1496 } else {
1497 Ok(TransactionStatement::Rollback)
1498 }
1499 }
1500 TokenType::Savepoint => {
1501 self.advance();
1502 let name = self.expect_name()?;
1503 Ok(TransactionStatement::Savepoint(name))
1504 }
1505 _ => Err(SqlglotError::ParserError {
1506 message: "Expected transaction statement".into(),
1507 }),
1508 }
1509 }
1510
1511 fn parse_explain(&mut self) -> Result<ExplainStatement> {
1514 self.expect(TokenType::Explain)?;
1515 let analyze = self.match_token(TokenType::Analyze);
1516 let statement = self.parse_statement_inner()?;
1517 Ok(ExplainStatement {
1518 analyze,
1519 statement: Box::new(statement),
1520 })
1521 }
1522
1523 fn parse_use(&mut self) -> Result<UseStatement> {
1526 self.expect(TokenType::Use)?;
1527 let name = self.expect_name()?;
1528 Ok(UseStatement { name })
1529 }
1530
1531 fn parse_expr(&mut self) -> Result<Expr> {
1536 self.parse_or_expr()
1537 }
1538
1539 fn parse_or_expr(&mut self) -> Result<Expr> {
1540 let mut left = self.parse_and_expr()?;
1541 while self.match_token(TokenType::Or) {
1542 let right = self.parse_and_expr()?;
1543 left = Expr::BinaryOp {
1544 left: Box::new(left),
1545 op: BinaryOperator::Or,
1546 right: Box::new(right),
1547 };
1548 }
1549 Ok(left)
1550 }
1551
1552 fn parse_and_expr(&mut self) -> Result<Expr> {
1553 let mut left = self.parse_not_expr()?;
1554 while self.match_token(TokenType::And) {
1555 let right = self.parse_not_expr()?;
1556 left = Expr::BinaryOp {
1557 left: Box::new(left),
1558 op: BinaryOperator::And,
1559 right: Box::new(right),
1560 };
1561 }
1562 Ok(left)
1563 }
1564
1565 fn parse_not_expr(&mut self) -> Result<Expr> {
1566 if self.match_token(TokenType::Not) {
1567 let expr = self.parse_not_expr()?;
1568 Ok(Expr::UnaryOp {
1569 op: UnaryOperator::Not,
1570 expr: Box::new(expr),
1571 })
1572 } else {
1573 self.parse_comparison()
1574 }
1575 }
1576
1577 fn parse_comparison(&mut self) -> Result<Expr> {
1578 let mut left = self.parse_addition()?;
1579
1580 loop {
1581 let op = match self.peek_type() {
1582 TokenType::Eq => Some(BinaryOperator::Eq),
1583 TokenType::Neq => Some(BinaryOperator::Neq),
1584 TokenType::Lt => Some(BinaryOperator::Lt),
1585 TokenType::Gt => Some(BinaryOperator::Gt),
1586 TokenType::LtEq => Some(BinaryOperator::LtEq),
1587 TokenType::GtEq => Some(BinaryOperator::GtEq),
1588 _ => None,
1589 };
1590
1591 if let Some(op) = op {
1592 self.advance();
1593 let right = self.parse_addition()?;
1594 left = Expr::BinaryOp {
1595 left: Box::new(left),
1596 op,
1597 right: Box::new(right),
1598 };
1599 } else if self.peek_type() == &TokenType::Is {
1600 self.advance();
1601 let negated = self.match_token(TokenType::Not);
1602 if self.match_token(TokenType::True) {
1603 left = Expr::IsBool {
1604 expr: Box::new(left),
1605 value: true,
1606 negated,
1607 };
1608 } else if self.match_token(TokenType::False) {
1609 left = Expr::IsBool {
1610 expr: Box::new(left),
1611 value: false,
1612 negated,
1613 };
1614 } else {
1615 self.expect(TokenType::Null)?;
1616 left = Expr::IsNull {
1617 expr: Box::new(left),
1618 negated,
1619 };
1620 }
1621 } else if matches!(
1622 self.peek_type(),
1623 TokenType::Not | TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1624 ) {
1625 if self.peek_type() == &TokenType::Not {
1627 let saved_pos = self.pos;
1628 self.advance(); if !matches!(
1630 self.peek_type(),
1631 TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1632 ) {
1633 self.pos = saved_pos;
1635 break;
1636 }
1637 }
1639 let negated = self.pos > 0
1640 && self.tokens[self.pos - 1].token_type == TokenType::Not;
1641
1642 if self.match_token(TokenType::In) {
1643 self.expect(TokenType::LParen)?;
1644 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
1646 let subquery = self.parse_statement_inner()?;
1647 self.expect(TokenType::RParen)?;
1648 left = Expr::InSubquery {
1649 expr: Box::new(left),
1650 subquery: Box::new(subquery),
1651 negated,
1652 };
1653 } else {
1654 let list = self.parse_expr_list()?;
1655 self.expect(TokenType::RParen)?;
1656 left = Expr::InList {
1657 expr: Box::new(left),
1658 list,
1659 negated,
1660 };
1661 }
1662 } else if self.match_token(TokenType::Like) {
1663 let pattern = self.parse_addition()?;
1664 let escape = if self.match_token(TokenType::Escape) {
1665 Some(Box::new(self.parse_primary()?))
1666 } else {
1667 None
1668 };
1669 left = Expr::Like {
1670 expr: Box::new(left),
1671 pattern: Box::new(pattern),
1672 negated,
1673 escape,
1674 };
1675 } else if self.match_token(TokenType::ILike) {
1676 let pattern = self.parse_addition()?;
1677 let escape = if self.match_token(TokenType::Escape) {
1678 Some(Box::new(self.parse_primary()?))
1679 } else {
1680 None
1681 };
1682 left = Expr::ILike {
1683 expr: Box::new(left),
1684 pattern: Box::new(pattern),
1685 negated,
1686 escape,
1687 };
1688 } else if self.match_token(TokenType::Between) {
1689 let low = self.parse_addition()?;
1690 self.expect(TokenType::And)?;
1691 let high = self.parse_addition()?;
1692 left = Expr::Between {
1693 expr: Box::new(left),
1694 low: Box::new(low),
1695 high: Box::new(high),
1696 negated,
1697 };
1698 } else {
1699 break;
1700 }
1701 } else {
1702 break;
1703 }
1704 }
1705
1706 Ok(left)
1707 }
1708
1709 fn parse_addition(&mut self) -> Result<Expr> {
1710 let mut left = self.parse_multiplication()?;
1711 loop {
1712 let op = match self.peek_type() {
1713 TokenType::Plus => Some(BinaryOperator::Plus),
1714 TokenType::Minus => Some(BinaryOperator::Minus),
1715 TokenType::Concat => Some(BinaryOperator::Concat),
1716 TokenType::BitwiseOr => Some(BinaryOperator::BitwiseOr),
1717 TokenType::BitwiseXor => Some(BinaryOperator::BitwiseXor),
1718 TokenType::ShiftLeft => Some(BinaryOperator::ShiftLeft),
1719 TokenType::ShiftRight => Some(BinaryOperator::ShiftRight),
1720 _ => None,
1721 };
1722 if let Some(op) = op {
1723 self.advance();
1724 let right = self.parse_multiplication()?;
1725 left = Expr::BinaryOp {
1726 left: Box::new(left),
1727 op,
1728 right: Box::new(right),
1729 };
1730 } else {
1731 break;
1732 }
1733 }
1734 Ok(left)
1735 }
1736
1737 fn parse_multiplication(&mut self) -> Result<Expr> {
1738 let mut left = self.parse_unary()?;
1739 loop {
1740 let op = match self.peek_type() {
1741 TokenType::Star => Some(BinaryOperator::Multiply),
1742 TokenType::Slash => Some(BinaryOperator::Divide),
1743 TokenType::Percent2 => Some(BinaryOperator::Modulo),
1744 TokenType::BitwiseAnd => Some(BinaryOperator::BitwiseAnd),
1745 _ => None,
1746 };
1747 if let Some(op) = op {
1748 self.advance();
1749 let right = self.parse_unary()?;
1750 left = Expr::BinaryOp {
1751 left: Box::new(left),
1752 op,
1753 right: Box::new(right),
1754 };
1755 } else {
1756 break;
1757 }
1758 }
1759 Ok(left)
1760 }
1761
1762 fn parse_unary(&mut self) -> Result<Expr> {
1763 match self.peek_type() {
1764 TokenType::Minus => {
1765 self.advance();
1766 let expr = self.parse_postfix()?;
1767 Ok(Expr::UnaryOp {
1768 op: UnaryOperator::Minus,
1769 expr: Box::new(expr),
1770 })
1771 }
1772 TokenType::Plus => {
1773 self.advance();
1774 let expr = self.parse_postfix()?;
1775 Ok(Expr::UnaryOp {
1776 op: UnaryOperator::Plus,
1777 expr: Box::new(expr),
1778 })
1779 }
1780 TokenType::BitwiseNot => {
1781 self.advance();
1782 let expr = self.parse_postfix()?;
1783 Ok(Expr::UnaryOp {
1784 op: UnaryOperator::BitwiseNot,
1785 expr: Box::new(expr),
1786 })
1787 }
1788 _ => self.parse_postfix(),
1789 }
1790 }
1791
1792 fn parse_postfix(&mut self) -> Result<Expr> {
1794 let mut expr = self.parse_primary()?;
1795
1796 loop {
1797 if self.match_token(TokenType::DoubleColon) {
1798 let data_type = self.parse_data_type()?;
1800 expr = Expr::Cast {
1801 expr: Box::new(expr),
1802 data_type,
1803 };
1804 } else if self.match_token(TokenType::LBracket) {
1805 let index = self.parse_expr()?;
1807 self.expect(TokenType::RBracket)?;
1808 expr = Expr::ArrayIndex {
1809 expr: Box::new(expr),
1810 index: Box::new(index),
1811 };
1812 } else if self.match_token(TokenType::Arrow) {
1813 let path = self.parse_primary()?;
1814 expr = Expr::JsonAccess {
1815 expr: Box::new(expr),
1816 path: Box::new(path),
1817 as_text: false,
1818 };
1819 } else if self.match_token(TokenType::DoubleArrow) {
1820 let path = self.parse_primary()?;
1821 expr = Expr::JsonAccess {
1822 expr: Box::new(expr),
1823 path: Box::new(path),
1824 as_text: true,
1825 };
1826 } else {
1827 break;
1828 }
1829 }
1830
1831 if self.match_token(TokenType::Over) {
1833 if let Expr::Function { name, args, distinct, filter, .. } = expr {
1834 let spec = if self.match_token(TokenType::LParen) {
1835 let ws = self.parse_window_spec()?;
1836 self.expect(TokenType::RParen)?;
1837 ws
1838 } else {
1839 let wref = self.expect_name()?;
1841 WindowSpec {
1842 window_ref: Some(wref),
1843 partition_by: vec![],
1844 order_by: vec![],
1845 frame: None,
1846 }
1847 };
1848 expr = Expr::Function {
1849 name,
1850 args,
1851 distinct,
1852 filter,
1853 over: Some(spec),
1854 };
1855 }
1856 }
1857
1858 if self.match_token(TokenType::Filter) {
1860 if let Expr::Function { name, args, distinct, over, .. } = expr {
1861 self.expect(TokenType::LParen)?;
1862 self.expect(TokenType::Where)?;
1863 let filter_expr = self.parse_expr()?;
1864 self.expect(TokenType::RParen)?;
1865 expr = Expr::Function {
1866 name,
1867 args,
1868 distinct,
1869 filter: Some(Box::new(filter_expr)),
1870 over,
1871 };
1872 }
1873 }
1874
1875 Ok(expr)
1876 }
1877
1878 fn parse_window_spec(&mut self) -> Result<WindowSpec> {
1879 let window_ref = if self.is_name_token() && !matches!(self.peek_type(), TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1880 let saved = self.pos;
1881 let name = self.expect_name()?;
1882 if matches!(self.peek_type(), TokenType::RParen | TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1884 Some(name)
1885 } else {
1886 self.pos = saved;
1887 None
1888 }
1889 } else {
1890 None
1891 };
1892
1893 let partition_by = if self.match_token(TokenType::Partition) {
1894 self.expect(TokenType::By)?;
1895 self.parse_expr_list()?
1896 } else {
1897 vec![]
1898 };
1899
1900 let order_by = if self.match_token(TokenType::Order) {
1901 self.expect(TokenType::By)?;
1902 self.parse_order_by_items()?
1903 } else {
1904 vec![]
1905 };
1906
1907 let frame = if matches!(self.peek_type(), TokenType::Rows | TokenType::Range) {
1908 Some(self.parse_window_frame()?)
1909 } else {
1910 None
1911 };
1912
1913 Ok(WindowSpec {
1914 window_ref,
1915 partition_by,
1916 order_by,
1917 frame,
1918 })
1919 }
1920
1921 fn parse_window_frame(&mut self) -> Result<WindowFrame> {
1922 let kind = if self.match_token(TokenType::Rows) {
1923 WindowFrameKind::Rows
1924 } else if self.match_token(TokenType::Range) {
1925 WindowFrameKind::Range
1926 } else {
1927 WindowFrameKind::Rows
1928 };
1929
1930 if self.match_keyword("BETWEEN") {
1931 let start = self.parse_window_frame_bound()?;
1932 self.expect(TokenType::And)?;
1933 let end = self.parse_window_frame_bound()?;
1934 Ok(WindowFrame {
1935 kind,
1936 start,
1937 end: Some(end),
1938 })
1939 } else {
1940 let start = self.parse_window_frame_bound()?;
1941 Ok(WindowFrame {
1942 kind,
1943 start,
1944 end: None,
1945 })
1946 }
1947 }
1948
1949 fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound> {
1950 if self.check_keyword("CURRENT") {
1951 self.advance();
1952 let _ = self.match_keyword("ROW");
1953 Ok(WindowFrameBound::CurrentRow)
1954 } else if self.match_token(TokenType::Unbounded) {
1955 if self.match_token(TokenType::Preceding) {
1956 Ok(WindowFrameBound::Preceding(None))
1957 } else {
1958 self.expect(TokenType::Following)?;
1959 Ok(WindowFrameBound::Following(None))
1960 }
1961 } else {
1962 let n = self.parse_expr()?;
1963 if self.match_token(TokenType::Preceding) {
1964 Ok(WindowFrameBound::Preceding(Some(Box::new(n))))
1965 } else {
1966 self.expect(TokenType::Following)?;
1967 Ok(WindowFrameBound::Following(Some(Box::new(n))))
1968 }
1969 }
1970 }
1971
1972 fn parse_primary(&mut self) -> Result<Expr> {
1973 let token = self.peek().clone();
1974
1975 match &token.token_type {
1976 TokenType::Number => {
1977 self.advance();
1978 Ok(Expr::Number(token.value))
1979 }
1980 TokenType::String => {
1981 self.advance();
1982 Ok(Expr::StringLiteral(token.value))
1983 }
1984 TokenType::True => {
1985 self.advance();
1986 Ok(Expr::Boolean(true))
1987 }
1988 TokenType::False => {
1989 self.advance();
1990 Ok(Expr::Boolean(false))
1991 }
1992 TokenType::Null => {
1993 self.advance();
1994 Ok(Expr::Null)
1995 }
1996 TokenType::Default => {
1997 self.advance();
1998 Ok(Expr::Default)
1999 }
2000 TokenType::Star => {
2001 self.advance();
2002 Ok(Expr::Wildcard)
2003 }
2004 TokenType::Parameter => {
2005 self.advance();
2006 Ok(Expr::Parameter(token.value))
2007 }
2008
2009 TokenType::Cast => {
2011 self.advance();
2012 self.expect(TokenType::LParen)?;
2013 let expr = self.parse_expr()?;
2014 self.expect(TokenType::As)?;
2015 let data_type = self.parse_data_type()?;
2016 self.expect(TokenType::RParen)?;
2017 Ok(Expr::Cast {
2018 expr: Box::new(expr),
2019 data_type,
2020 })
2021 }
2022
2023 TokenType::Extract => {
2025 self.advance();
2026 self.expect(TokenType::LParen)?;
2027 let field = self.parse_datetime_field()?;
2028 self.expect(TokenType::From)?;
2029 let expr = self.parse_expr()?;
2030 self.expect(TokenType::RParen)?;
2031 Ok(Expr::Extract {
2032 field,
2033 expr: Box::new(expr),
2034 })
2035 }
2036
2037 TokenType::Case => self.parse_case_expr(),
2039
2040 TokenType::Exists => {
2042 self.advance();
2043 self.expect(TokenType::LParen)?;
2044 let subquery = self.parse_statement_inner()?;
2045 self.expect(TokenType::RParen)?;
2046 Ok(Expr::Exists {
2047 subquery: Box::new(subquery),
2048 negated: false,
2049 })
2050 }
2051
2052 TokenType::Not if {
2054 let next_pos = self.pos + 1;
2055 next_pos < self.tokens.len() && self.tokens[next_pos].token_type == TokenType::Exists
2056 } => {
2057 self.advance(); self.advance(); self.expect(TokenType::LParen)?;
2060 let subquery = self.parse_statement_inner()?;
2061 self.expect(TokenType::RParen)?;
2062 Ok(Expr::Exists {
2063 subquery: Box::new(subquery),
2064 negated: true,
2065 })
2066 }
2067
2068 TokenType::Interval => {
2070 self.advance();
2071 let value = self.parse_primary()?;
2072 let unit = self.try_parse_datetime_field();
2073 Ok(Expr::Interval {
2074 value: Box::new(value),
2075 unit,
2076 })
2077 }
2078
2079 TokenType::LParen => {
2081 self.advance();
2082 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2084 let subquery = self.parse_statement_inner()?;
2085 self.expect(TokenType::RParen)?;
2086 Ok(Expr::Subquery(Box::new(subquery)))
2087 } else {
2088 let expr = self.parse_expr()?;
2089 if self.match_token(TokenType::Comma) {
2091 let mut items = vec![expr];
2092 items.push(self.parse_expr()?);
2093 while self.match_token(TokenType::Comma) {
2094 items.push(self.parse_expr()?);
2095 }
2096 self.expect(TokenType::RParen)?;
2097 Ok(Expr::Tuple(items))
2098 } else {
2099 self.expect(TokenType::RParen)?;
2100 Ok(Expr::Nested(Box::new(expr)))
2101 }
2102 }
2103 }
2104
2105 TokenType::Array => {
2107 self.advance();
2108 if self.match_token(TokenType::LBracket) {
2109 let items = if self.peek_type() != &TokenType::RBracket {
2110 self.parse_expr_list()?
2111 } else {
2112 vec![]
2113 };
2114 self.expect(TokenType::RBracket)?;
2115 Ok(Expr::ArrayLiteral(items))
2116 } else if self.match_token(TokenType::LParen) {
2117 let subquery = self.parse_statement_inner()?;
2119 self.expect(TokenType::RParen)?;
2120 Ok(Expr::Subquery(Box::new(subquery)))
2121 } else {
2122 Ok(Expr::Column {
2123 table: None,
2124 name: "ARRAY".to_string(),
2125 quote_style: QuoteStyle::None,
2126 table_quote_style: QuoteStyle::None,
2127 })
2128 }
2129 }
2130
2131 TokenType::LBracket => {
2133 self.advance();
2134 let items = if self.peek_type() != &TokenType::RBracket {
2135 self.parse_expr_list()?
2136 } else {
2137 vec![]
2138 };
2139 self.expect(TokenType::RBracket)?;
2140 Ok(Expr::ArrayLiteral(items))
2141 }
2142
2143 _ if self.is_name_token() || self.is_data_type_token() => {
2145 let name_token = self.advance().clone();
2146 let name = name_token.value.clone();
2147 let name_qs = quote_style_from_char(name_token.quote_char);
2148
2149 if self.peek_type() == &TokenType::LParen {
2151 self.advance();
2152
2153 let distinct = self.match_token(TokenType::Distinct);
2155
2156 let args = if self.peek_type() == &TokenType::RParen {
2157 vec![]
2158 } else if self.peek_type() == &TokenType::Star {
2159 self.advance();
2160 vec![Expr::Wildcard]
2161 } else {
2162 self.parse_expr_list()?
2163 };
2164 self.expect(TokenType::RParen)?;
2165
2166 Ok(Expr::Function {
2167 name,
2168 args,
2169 distinct,
2170 filter: None,
2171 over: None,
2172 })
2173 }
2174 else if self.match_token(TokenType::Dot) {
2176 if self.peek_type() == &TokenType::Star {
2177 self.advance();
2178 Ok(Expr::QualifiedWildcard { table: name })
2179 } else {
2180 let (col, col_qs) = self.expect_name_with_quote()?;
2181 Ok(Expr::Column {
2182 table: Some(name),
2183 name: col,
2184 quote_style: col_qs,
2185 table_quote_style: name_qs,
2186 })
2187 }
2188 } else {
2189 Ok(Expr::Column {
2190 table: None,
2191 name,
2192 quote_style: name_qs,
2193 table_quote_style: QuoteStyle::None,
2194 })
2195 }
2196 }
2197
2198 _ => Err(SqlglotError::UnexpectedToken { token }),
2199 }
2200 }
2201
2202 fn is_data_type_token(&self) -> bool {
2203 matches!(
2204 self.peek_type(),
2205 TokenType::Int
2206 | TokenType::Integer
2207 | TokenType::BigInt
2208 | TokenType::SmallInt
2209 | TokenType::TinyInt
2210 | TokenType::Float
2211 | TokenType::Double
2212 | TokenType::Decimal
2213 | TokenType::Numeric
2214 | TokenType::Real
2215 | TokenType::Varchar
2216 | TokenType::Char
2217 | TokenType::Text
2218 | TokenType::Boolean
2219 | TokenType::Date
2220 | TokenType::Timestamp
2221 | TokenType::TimestampTz
2222 | TokenType::Time
2223 | TokenType::Interval
2224 | TokenType::Blob
2225 | TokenType::Bytea
2226 | TokenType::Json
2227 | TokenType::Jsonb
2228 | TokenType::Uuid
2229 | TokenType::Array
2230 | TokenType::Map
2231 | TokenType::Struct
2232 )
2233 }
2234
2235 fn parse_datetime_field(&mut self) -> Result<DateTimeField> {
2236 let token = self.peek().clone();
2237 let field = match &token.token_type {
2238 TokenType::Year => DateTimeField::Year,
2239 TokenType::Month => DateTimeField::Month,
2240 TokenType::Day => DateTimeField::Day,
2241 TokenType::Hour => DateTimeField::Hour,
2242 TokenType::Minute => DateTimeField::Minute,
2243 TokenType::Second => DateTimeField::Second,
2244 TokenType::Epoch => DateTimeField::Epoch,
2245 _ => {
2246 let name = token.value.to_uppercase();
2247 match name.as_str() {
2248 "YEAR" => DateTimeField::Year,
2249 "QUARTER" => DateTimeField::Quarter,
2250 "MONTH" => DateTimeField::Month,
2251 "WEEK" => DateTimeField::Week,
2252 "DAY" => DateTimeField::Day,
2253 "DOW" | "DAYOFWEEK" => DateTimeField::DayOfWeek,
2254 "DOY" | "DAYOFYEAR" => DateTimeField::DayOfYear,
2255 "HOUR" => DateTimeField::Hour,
2256 "MINUTE" => DateTimeField::Minute,
2257 "SECOND" => DateTimeField::Second,
2258 "MILLISECOND" => DateTimeField::Millisecond,
2259 "MICROSECOND" => DateTimeField::Microsecond,
2260 "NANOSECOND" => DateTimeField::Nanosecond,
2261 "EPOCH" => DateTimeField::Epoch,
2262 "TIMEZONE" => DateTimeField::Timezone,
2263 "TIMEZONE_HOUR" => DateTimeField::TimezoneHour,
2264 "TIMEZONE_MINUTE" => DateTimeField::TimezoneMinute,
2265 _ => {
2266 return Err(SqlglotError::ParserError {
2267 message: format!("Unknown datetime field: {name}"),
2268 });
2269 }
2270 }
2271 }
2272 };
2273 self.advance();
2274 Ok(field)
2275 }
2276
2277 fn try_parse_datetime_field(&mut self) -> Option<DateTimeField> {
2278 let saved = self.pos;
2279 match self.parse_datetime_field() {
2280 Ok(field) => Some(field),
2281 Err(_) => {
2282 self.pos = saved;
2283 None
2284 }
2285 }
2286 }
2287
2288 fn parse_case_expr(&mut self) -> Result<Expr> {
2289 self.expect(TokenType::Case)?;
2290
2291 let operand = if self.peek_type() != &TokenType::When {
2292 Some(Box::new(self.parse_expr()?))
2293 } else {
2294 None
2295 };
2296
2297 let mut when_clauses = Vec::new();
2298 while self.match_token(TokenType::When) {
2299 let condition = self.parse_expr()?;
2300 self.expect(TokenType::Then)?;
2301 let result = self.parse_expr()?;
2302 when_clauses.push((condition, result));
2303 }
2304
2305 let else_clause = if self.match_token(TokenType::Else) {
2306 Some(Box::new(self.parse_expr()?))
2307 } else {
2308 None
2309 };
2310
2311 self.expect(TokenType::End)?;
2312
2313 Ok(Expr::Case {
2314 operand,
2315 when_clauses,
2316 else_clause,
2317 })
2318 }
2319}
2320
2321#[cfg(test)]
2322mod tests {
2323 use super::*;
2324
2325 #[test]
2326 fn test_parse_simple_select() {
2327 let stmt = Parser::new("SELECT a, b FROM t")
2328 .unwrap()
2329 .parse_statement()
2330 .unwrap();
2331 match stmt {
2332 Statement::Select(sel) => {
2333 assert_eq!(sel.columns.len(), 2);
2334 assert!(sel.from.is_some());
2335 }
2336 _ => panic!("Expected SELECT"),
2337 }
2338 }
2339
2340 #[test]
2341 fn test_parse_select_with_where() {
2342 let stmt = Parser::new("SELECT x FROM t WHERE x > 10")
2343 .unwrap()
2344 .parse_statement()
2345 .unwrap();
2346 match stmt {
2347 Statement::Select(sel) => assert!(sel.where_clause.is_some()),
2348 _ => panic!("Expected SELECT"),
2349 }
2350 }
2351
2352 #[test]
2353 fn test_parse_select_wildcard() {
2354 let stmt = Parser::new("SELECT * FROM users")
2355 .unwrap()
2356 .parse_statement()
2357 .unwrap();
2358 match stmt {
2359 Statement::Select(sel) => {
2360 assert_eq!(sel.columns.len(), 1);
2361 assert!(matches!(sel.columns[0], SelectItem::Wildcard));
2362 }
2363 _ => panic!("Expected SELECT"),
2364 }
2365 }
2366
2367 #[test]
2368 fn test_parse_insert() {
2369 let stmt = Parser::new("INSERT INTO t (a, b) VALUES (1, 'hello')")
2370 .unwrap()
2371 .parse_statement()
2372 .unwrap();
2373 match stmt {
2374 Statement::Insert(ins) => {
2375 assert_eq!(ins.table.name, "t");
2376 assert_eq!(ins.columns, vec!["a", "b"]);
2377 match &ins.source {
2378 InsertSource::Values(rows) => {
2379 assert_eq!(rows.len(), 1);
2380 assert_eq!(rows[0].len(), 2);
2381 }
2382 _ => panic!("Expected VALUES"),
2383 }
2384 }
2385 _ => panic!("Expected INSERT"),
2386 }
2387 }
2388
2389 #[test]
2390 fn test_parse_delete() {
2391 let stmt = Parser::new("DELETE FROM users WHERE id = 1")
2392 .unwrap()
2393 .parse_statement()
2394 .unwrap();
2395 match stmt {
2396 Statement::Delete(del) => {
2397 assert_eq!(del.table.name, "users");
2398 assert!(del.where_clause.is_some());
2399 }
2400 _ => panic!("Expected DELETE"),
2401 }
2402 }
2403
2404 #[test]
2405 fn test_parse_join() {
2406 let stmt =
2407 Parser::new("SELECT a.id, b.name FROM a INNER JOIN b ON a.id = b.a_id")
2408 .unwrap()
2409 .parse_statement()
2410 .unwrap();
2411 match stmt {
2412 Statement::Select(sel) => {
2413 assert_eq!(sel.joins.len(), 1);
2414 assert_eq!(sel.joins[0].join_type, JoinType::Inner);
2415 }
2416 _ => panic!("Expected SELECT"),
2417 }
2418 }
2419
2420 #[test]
2421 fn test_parse_cte() {
2422 let stmt = Parser::new(
2423 "WITH cte AS (SELECT 1 AS x) SELECT x FROM cte",
2424 )
2425 .unwrap()
2426 .parse_statement()
2427 .unwrap();
2428 match stmt {
2429 Statement::Select(sel) => {
2430 assert_eq!(sel.ctes.len(), 1);
2431 assert_eq!(sel.ctes[0].name, "cte");
2432 }
2433 _ => panic!("Expected SELECT"),
2434 }
2435 }
2436
2437 #[test]
2438 fn test_parse_union() {
2439 let stmt = Parser::new("SELECT 1 UNION ALL SELECT 2")
2440 .unwrap()
2441 .parse_statement()
2442 .unwrap();
2443 match stmt {
2444 Statement::SetOperation(sop) => {
2445 assert_eq!(sop.op, SetOperationType::Union);
2446 assert!(sop.all);
2447 }
2448 _ => panic!("Expected SetOperation"),
2449 }
2450 }
2451
2452 #[test]
2453 fn test_parse_cast() {
2454 let stmt = Parser::new("SELECT CAST(x AS INT) FROM t")
2455 .unwrap()
2456 .parse_statement()
2457 .unwrap();
2458 match stmt {
2459 Statement::Select(sel) => {
2460 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2461 assert!(matches!(expr, Expr::Cast { .. }));
2462 }
2463 }
2464 _ => panic!("Expected SELECT"),
2465 }
2466 }
2467
2468 #[test]
2469 fn test_parse_subquery() {
2470 let stmt = Parser::new(
2471 "SELECT * FROM (SELECT 1 AS x) AS sub",
2472 )
2473 .unwrap()
2474 .parse_statement()
2475 .unwrap();
2476 match stmt {
2477 Statement::Select(sel) => {
2478 if let Some(from) = &sel.from {
2479 assert!(matches!(from.source, TableSource::Subquery { .. }));
2480 }
2481 }
2482 _ => panic!("Expected SELECT"),
2483 }
2484 }
2485
2486 #[test]
2487 fn test_parse_exists() {
2488 let stmt = Parser::new(
2489 "SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2)",
2490 )
2491 .unwrap()
2492 .parse_statement()
2493 .unwrap();
2494 match stmt {
2495 Statement::Select(sel) => {
2496 assert!(sel.where_clause.is_some());
2497 }
2498 _ => panic!("Expected SELECT"),
2499 }
2500 }
2501
2502 #[test]
2503 fn test_parse_window_function() {
2504 let stmt = Parser::new(
2505 "SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp",
2506 )
2507 .unwrap()
2508 .parse_statement()
2509 .unwrap();
2510 match stmt {
2511 Statement::Select(sel) => {
2512 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2513 if let Expr::Function { over, .. } = expr {
2514 assert!(over.is_some());
2515 } else {
2516 panic!("Expected function");
2517 }
2518 }
2519 }
2520 _ => panic!("Expected SELECT"),
2521 }
2522 }
2523
2524 #[test]
2525 fn test_parse_multiple_statements() {
2526 let stmts = Parser::new("SELECT 1; SELECT 2;")
2527 .unwrap()
2528 .parse_statements()
2529 .unwrap();
2530 assert_eq!(stmts.len(), 2);
2531 }
2532
2533 #[test]
2534 fn test_parse_insert_select() {
2535 let stmt = Parser::new("INSERT INTO t SELECT * FROM s")
2536 .unwrap()
2537 .parse_statement()
2538 .unwrap();
2539 match stmt {
2540 Statement::Insert(ins) => {
2541 assert!(matches!(ins.source, InsertSource::Query(_)));
2542 }
2543 _ => panic!("Expected INSERT"),
2544 }
2545 }
2546
2547 #[test]
2548 fn test_parse_create_table_constraints() {
2549 let stmt = Parser::new(
2550 "CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE)",
2551 )
2552 .unwrap()
2553 .parse_statement()
2554 .unwrap();
2555 match stmt {
2556 Statement::CreateTable(ct) => {
2557 assert_eq!(ct.columns.len(), 2);
2558 assert!(ct.columns[0].primary_key);
2559 assert!(ct.columns[1].unique);
2560 }
2561 _ => panic!("Expected CREATE TABLE"),
2562 }
2563 }
2564
2565 #[test]
2566 fn test_parse_extract() {
2567 let stmt = Parser::new("SELECT EXTRACT(YEAR FROM created_at) FROM t")
2568 .unwrap()
2569 .parse_statement()
2570 .unwrap();
2571 match stmt {
2572 Statement::Select(sel) => {
2573 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2574 assert!(matches!(expr, Expr::Extract { .. }));
2575 }
2576 }
2577 _ => panic!("Expected SELECT"),
2578 }
2579 }
2580
2581 #[test]
2582 fn test_parse_postgres_cast() {
2583 let stmt = Parser::new("SELECT x::int FROM t")
2584 .unwrap()
2585 .parse_statement()
2586 .unwrap();
2587 match stmt {
2588 Statement::Select(sel) => {
2589 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2590 assert!(matches!(expr, Expr::Cast { .. }));
2591 }
2592 }
2593 _ => panic!("Expected SELECT"),
2594 }
2595 }
2596}