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