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 if matches!(self.peek_type(), TokenType::Any | TokenType::Some) {
1597 self.advance();
1598 self.expect(TokenType::LParen)?;
1599 let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
1600 Expr::Subquery(Box::new(self.parse_statement_inner()?))
1601 } else {
1602 self.parse_expr()?
1603 };
1604 self.expect(TokenType::RParen)?;
1605 left = Expr::AnyOp {
1606 expr: Box::new(left),
1607 op,
1608 right: Box::new(right),
1609 };
1610 } else if self.peek_type() == &TokenType::All {
1611 self.advance();
1612 self.expect(TokenType::LParen)?;
1613 let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
1614 Expr::Subquery(Box::new(self.parse_statement_inner()?))
1615 } else {
1616 self.parse_expr()?
1617 };
1618 self.expect(TokenType::RParen)?;
1619 left = Expr::AllOp {
1620 expr: Box::new(left),
1621 op,
1622 right: Box::new(right),
1623 };
1624 } else {
1625 let right = self.parse_addition()?;
1626 left = Expr::BinaryOp {
1627 left: Box::new(left),
1628 op,
1629 right: Box::new(right),
1630 };
1631 }
1632 } else if self.peek_type() == &TokenType::Is {
1633 self.advance();
1634 let negated = self.match_token(TokenType::Not);
1635 if self.match_token(TokenType::True) {
1636 left = Expr::IsBool {
1637 expr: Box::new(left),
1638 value: true,
1639 negated,
1640 };
1641 } else if self.match_token(TokenType::False) {
1642 left = Expr::IsBool {
1643 expr: Box::new(left),
1644 value: false,
1645 negated,
1646 };
1647 } else {
1648 self.expect(TokenType::Null)?;
1649 left = Expr::IsNull {
1650 expr: Box::new(left),
1651 negated,
1652 };
1653 }
1654 } else if matches!(
1655 self.peek_type(),
1656 TokenType::Not | TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1657 ) {
1658 if self.peek_type() == &TokenType::Not {
1660 let saved_pos = self.pos;
1661 self.advance(); if !matches!(
1663 self.peek_type(),
1664 TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1665 ) {
1666 self.pos = saved_pos;
1668 break;
1669 }
1670 }
1672 let negated = self.pos > 0
1673 && self.tokens[self.pos - 1].token_type == TokenType::Not;
1674
1675 if self.match_token(TokenType::In) {
1676 self.expect(TokenType::LParen)?;
1677 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
1679 let subquery = self.parse_statement_inner()?;
1680 self.expect(TokenType::RParen)?;
1681 left = Expr::InSubquery {
1682 expr: Box::new(left),
1683 subquery: Box::new(subquery),
1684 negated,
1685 };
1686 } else {
1687 let list = self.parse_expr_list()?;
1688 self.expect(TokenType::RParen)?;
1689 left = Expr::InList {
1690 expr: Box::new(left),
1691 list,
1692 negated,
1693 };
1694 }
1695 } else if self.match_token(TokenType::Like) {
1696 let pattern = self.parse_addition()?;
1697 let escape = if self.match_token(TokenType::Escape) {
1698 Some(Box::new(self.parse_primary()?))
1699 } else {
1700 None
1701 };
1702 left = Expr::Like {
1703 expr: Box::new(left),
1704 pattern: Box::new(pattern),
1705 negated,
1706 escape,
1707 };
1708 } else if self.match_token(TokenType::ILike) {
1709 let pattern = self.parse_addition()?;
1710 let escape = if self.match_token(TokenType::Escape) {
1711 Some(Box::new(self.parse_primary()?))
1712 } else {
1713 None
1714 };
1715 left = Expr::ILike {
1716 expr: Box::new(left),
1717 pattern: Box::new(pattern),
1718 negated,
1719 escape,
1720 };
1721 } else if self.match_token(TokenType::Between) {
1722 let low = self.parse_addition()?;
1723 self.expect(TokenType::And)?;
1724 let high = self.parse_addition()?;
1725 left = Expr::Between {
1726 expr: Box::new(left),
1727 low: Box::new(low),
1728 high: Box::new(high),
1729 negated,
1730 };
1731 } else {
1732 break;
1733 }
1734 } else {
1735 break;
1736 }
1737 }
1738
1739 Ok(left)
1740 }
1741
1742 fn parse_addition(&mut self) -> Result<Expr> {
1743 let mut left = self.parse_multiplication()?;
1744 loop {
1745 let op = match self.peek_type() {
1746 TokenType::Plus => Some(BinaryOperator::Plus),
1747 TokenType::Minus => Some(BinaryOperator::Minus),
1748 TokenType::Concat => Some(BinaryOperator::Concat),
1749 TokenType::BitwiseOr => Some(BinaryOperator::BitwiseOr),
1750 TokenType::BitwiseXor => Some(BinaryOperator::BitwiseXor),
1751 TokenType::ShiftLeft => Some(BinaryOperator::ShiftLeft),
1752 TokenType::ShiftRight => Some(BinaryOperator::ShiftRight),
1753 _ => None,
1754 };
1755 if let Some(op) = op {
1756 self.advance();
1757 let right = self.parse_multiplication()?;
1758 left = Expr::BinaryOp {
1759 left: Box::new(left),
1760 op,
1761 right: Box::new(right),
1762 };
1763 } else {
1764 break;
1765 }
1766 }
1767 Ok(left)
1768 }
1769
1770 fn parse_multiplication(&mut self) -> Result<Expr> {
1771 let mut left = self.parse_unary()?;
1772 loop {
1773 let op = match self.peek_type() {
1774 TokenType::Star => Some(BinaryOperator::Multiply),
1775 TokenType::Slash => Some(BinaryOperator::Divide),
1776 TokenType::Percent2 => Some(BinaryOperator::Modulo),
1777 TokenType::BitwiseAnd => Some(BinaryOperator::BitwiseAnd),
1778 _ => None,
1779 };
1780 if let Some(op) = op {
1781 self.advance();
1782 let right = self.parse_unary()?;
1783 left = Expr::BinaryOp {
1784 left: Box::new(left),
1785 op,
1786 right: Box::new(right),
1787 };
1788 } else {
1789 break;
1790 }
1791 }
1792 Ok(left)
1793 }
1794
1795 fn parse_unary(&mut self) -> Result<Expr> {
1796 match self.peek_type() {
1797 TokenType::Minus => {
1798 self.advance();
1799 let expr = self.parse_postfix()?;
1800 Ok(Expr::UnaryOp {
1801 op: UnaryOperator::Minus,
1802 expr: Box::new(expr),
1803 })
1804 }
1805 TokenType::Plus => {
1806 self.advance();
1807 let expr = self.parse_postfix()?;
1808 Ok(Expr::UnaryOp {
1809 op: UnaryOperator::Plus,
1810 expr: Box::new(expr),
1811 })
1812 }
1813 TokenType::BitwiseNot => {
1814 self.advance();
1815 let expr = self.parse_postfix()?;
1816 Ok(Expr::UnaryOp {
1817 op: UnaryOperator::BitwiseNot,
1818 expr: Box::new(expr),
1819 })
1820 }
1821 _ => self.parse_postfix(),
1822 }
1823 }
1824
1825 fn parse_postfix(&mut self) -> Result<Expr> {
1827 let mut expr = self.parse_primary()?;
1828
1829 loop {
1830 if self.match_token(TokenType::DoubleColon) {
1831 let data_type = self.parse_data_type()?;
1833 expr = Expr::Cast {
1834 expr: Box::new(expr),
1835 data_type,
1836 };
1837 } else if self.match_token(TokenType::LBracket) {
1838 let index = self.parse_expr()?;
1840 self.expect(TokenType::RBracket)?;
1841 expr = Expr::ArrayIndex {
1842 expr: Box::new(expr),
1843 index: Box::new(index),
1844 };
1845 } else if self.match_token(TokenType::Arrow) {
1846 let path = self.parse_primary()?;
1847 expr = Expr::JsonAccess {
1848 expr: Box::new(expr),
1849 path: Box::new(path),
1850 as_text: false,
1851 };
1852 } else if self.match_token(TokenType::DoubleArrow) {
1853 let path = self.parse_primary()?;
1854 expr = Expr::JsonAccess {
1855 expr: Box::new(expr),
1856 path: Box::new(path),
1857 as_text: true,
1858 };
1859 } else {
1860 break;
1861 }
1862 }
1863
1864 if self.match_token(TokenType::Over) {
1866 if let Expr::Function { name, args, distinct, filter, .. } = expr {
1867 let spec = if self.match_token(TokenType::LParen) {
1868 let ws = self.parse_window_spec()?;
1869 self.expect(TokenType::RParen)?;
1870 ws
1871 } else {
1872 let wref = self.expect_name()?;
1874 WindowSpec {
1875 window_ref: Some(wref),
1876 partition_by: vec![],
1877 order_by: vec![],
1878 frame: None,
1879 }
1880 };
1881 expr = Expr::Function {
1882 name,
1883 args,
1884 distinct,
1885 filter,
1886 over: Some(spec),
1887 };
1888 }
1889 }
1890
1891 if self.match_token(TokenType::Filter) {
1893 if let Expr::Function { name, args, distinct, over, .. } = expr {
1894 self.expect(TokenType::LParen)?;
1895 self.expect(TokenType::Where)?;
1896 let filter_expr = self.parse_expr()?;
1897 self.expect(TokenType::RParen)?;
1898 expr = Expr::Function {
1899 name,
1900 args,
1901 distinct,
1902 filter: Some(Box::new(filter_expr)),
1903 over,
1904 };
1905 }
1906 }
1907
1908 Ok(expr)
1909 }
1910
1911 fn parse_window_spec(&mut self) -> Result<WindowSpec> {
1912 let window_ref = if self.is_name_token() && !matches!(self.peek_type(), TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1913 let saved = self.pos;
1914 let name = self.expect_name()?;
1915 if matches!(self.peek_type(), TokenType::RParen | TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1917 Some(name)
1918 } else {
1919 self.pos = saved;
1920 None
1921 }
1922 } else {
1923 None
1924 };
1925
1926 let partition_by = if self.match_token(TokenType::Partition) {
1927 self.expect(TokenType::By)?;
1928 self.parse_expr_list()?
1929 } else {
1930 vec![]
1931 };
1932
1933 let order_by = if self.match_token(TokenType::Order) {
1934 self.expect(TokenType::By)?;
1935 self.parse_order_by_items()?
1936 } else {
1937 vec![]
1938 };
1939
1940 let frame = if matches!(self.peek_type(), TokenType::Rows | TokenType::Range) {
1941 Some(self.parse_window_frame()?)
1942 } else {
1943 None
1944 };
1945
1946 Ok(WindowSpec {
1947 window_ref,
1948 partition_by,
1949 order_by,
1950 frame,
1951 })
1952 }
1953
1954 fn parse_window_frame(&mut self) -> Result<WindowFrame> {
1955 let kind = if self.match_token(TokenType::Rows) {
1956 WindowFrameKind::Rows
1957 } else if self.match_token(TokenType::Range) {
1958 WindowFrameKind::Range
1959 } else {
1960 WindowFrameKind::Rows
1961 };
1962
1963 if self.match_keyword("BETWEEN") {
1964 let start = self.parse_window_frame_bound()?;
1965 self.expect(TokenType::And)?;
1966 let end = self.parse_window_frame_bound()?;
1967 Ok(WindowFrame {
1968 kind,
1969 start,
1970 end: Some(end),
1971 })
1972 } else {
1973 let start = self.parse_window_frame_bound()?;
1974 Ok(WindowFrame {
1975 kind,
1976 start,
1977 end: None,
1978 })
1979 }
1980 }
1981
1982 fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound> {
1983 if self.check_keyword("CURRENT") {
1984 self.advance();
1985 let _ = self.match_keyword("ROW");
1986 Ok(WindowFrameBound::CurrentRow)
1987 } else if self.match_token(TokenType::Unbounded) {
1988 if self.match_token(TokenType::Preceding) {
1989 Ok(WindowFrameBound::Preceding(None))
1990 } else {
1991 self.expect(TokenType::Following)?;
1992 Ok(WindowFrameBound::Following(None))
1993 }
1994 } else {
1995 let n = self.parse_expr()?;
1996 if self.match_token(TokenType::Preceding) {
1997 Ok(WindowFrameBound::Preceding(Some(Box::new(n))))
1998 } else {
1999 self.expect(TokenType::Following)?;
2000 Ok(WindowFrameBound::Following(Some(Box::new(n))))
2001 }
2002 }
2003 }
2004
2005 fn parse_primary(&mut self) -> Result<Expr> {
2006 let token = self.peek().clone();
2007
2008 match &token.token_type {
2009 TokenType::Number => {
2010 self.advance();
2011 Ok(Expr::Number(token.value))
2012 }
2013 TokenType::String => {
2014 self.advance();
2015 Ok(Expr::StringLiteral(token.value))
2016 }
2017 TokenType::True => {
2018 self.advance();
2019 Ok(Expr::Boolean(true))
2020 }
2021 TokenType::False => {
2022 self.advance();
2023 Ok(Expr::Boolean(false))
2024 }
2025 TokenType::Null => {
2026 self.advance();
2027 Ok(Expr::Null)
2028 }
2029 TokenType::Default => {
2030 self.advance();
2031 Ok(Expr::Default)
2032 }
2033 TokenType::Star => {
2034 self.advance();
2035 Ok(Expr::Wildcard)
2036 }
2037 TokenType::Parameter => {
2038 self.advance();
2039 Ok(Expr::Parameter(token.value))
2040 }
2041
2042 TokenType::Cast => {
2044 self.advance();
2045 self.expect(TokenType::LParen)?;
2046 let expr = self.parse_expr()?;
2047 self.expect(TokenType::As)?;
2048 let data_type = self.parse_data_type()?;
2049 self.expect(TokenType::RParen)?;
2050 Ok(Expr::Cast {
2051 expr: Box::new(expr),
2052 data_type,
2053 })
2054 }
2055
2056 TokenType::Extract => {
2058 self.advance();
2059 self.expect(TokenType::LParen)?;
2060 let field = self.parse_datetime_field()?;
2061 self.expect(TokenType::From)?;
2062 let expr = self.parse_expr()?;
2063 self.expect(TokenType::RParen)?;
2064 Ok(Expr::Extract {
2065 field,
2066 expr: Box::new(expr),
2067 })
2068 }
2069
2070 TokenType::Case => self.parse_case_expr(),
2072
2073 TokenType::Exists => {
2075 self.advance();
2076 self.expect(TokenType::LParen)?;
2077 let subquery = self.parse_statement_inner()?;
2078 self.expect(TokenType::RParen)?;
2079 Ok(Expr::Exists {
2080 subquery: Box::new(subquery),
2081 negated: false,
2082 })
2083 }
2084
2085 TokenType::Not if {
2087 let next_pos = self.pos + 1;
2088 next_pos < self.tokens.len() && self.tokens[next_pos].token_type == TokenType::Exists
2089 } => {
2090 self.advance(); self.advance(); self.expect(TokenType::LParen)?;
2093 let subquery = self.parse_statement_inner()?;
2094 self.expect(TokenType::RParen)?;
2095 Ok(Expr::Exists {
2096 subquery: Box::new(subquery),
2097 negated: true,
2098 })
2099 }
2100
2101 TokenType::Interval => {
2103 self.advance();
2104 let value = self.parse_primary()?;
2105 let unit = self.try_parse_datetime_field();
2106 Ok(Expr::Interval {
2107 value: Box::new(value),
2108 unit,
2109 })
2110 }
2111
2112 TokenType::LParen => {
2114 self.advance();
2115 if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2117 let subquery = self.parse_statement_inner()?;
2118 self.expect(TokenType::RParen)?;
2119 Ok(Expr::Subquery(Box::new(subquery)))
2120 } else {
2121 let expr = self.parse_expr()?;
2122 if self.match_token(TokenType::Comma) {
2124 let mut items = vec![expr];
2125 items.push(self.parse_expr()?);
2126 while self.match_token(TokenType::Comma) {
2127 items.push(self.parse_expr()?);
2128 }
2129 self.expect(TokenType::RParen)?;
2130 Ok(Expr::Tuple(items))
2131 } else {
2132 self.expect(TokenType::RParen)?;
2133 Ok(Expr::Nested(Box::new(expr)))
2134 }
2135 }
2136 }
2137
2138 TokenType::Array => {
2140 self.advance();
2141 if self.match_token(TokenType::LBracket) {
2142 let items = if self.peek_type() != &TokenType::RBracket {
2143 self.parse_expr_list()?
2144 } else {
2145 vec![]
2146 };
2147 self.expect(TokenType::RBracket)?;
2148 Ok(Expr::ArrayLiteral(items))
2149 } else if self.match_token(TokenType::LParen) {
2150 let subquery = self.parse_statement_inner()?;
2152 self.expect(TokenType::RParen)?;
2153 Ok(Expr::Subquery(Box::new(subquery)))
2154 } else {
2155 Ok(Expr::Column {
2156 table: None,
2157 name: "ARRAY".to_string(),
2158 quote_style: QuoteStyle::None,
2159 table_quote_style: QuoteStyle::None,
2160 })
2161 }
2162 }
2163
2164 TokenType::LBracket => {
2166 self.advance();
2167 let items = if self.peek_type() != &TokenType::RBracket {
2168 self.parse_expr_list()?
2169 } else {
2170 vec![]
2171 };
2172 self.expect(TokenType::RBracket)?;
2173 Ok(Expr::ArrayLiteral(items))
2174 }
2175
2176 _ if self.is_name_token() || self.is_data_type_token() => {
2178 let name_token = self.advance().clone();
2179 let name = name_token.value.clone();
2180 let name_qs = quote_style_from_char(name_token.quote_char);
2181
2182 if self.peek_type() == &TokenType::LParen {
2184 self.advance();
2185
2186 let distinct = self.match_token(TokenType::Distinct);
2188
2189 let args = if self.peek_type() == &TokenType::RParen {
2190 vec![]
2191 } else if self.peek_type() == &TokenType::Star {
2192 self.advance();
2193 vec![Expr::Wildcard]
2194 } else {
2195 self.parse_expr_list()?
2196 };
2197 self.expect(TokenType::RParen)?;
2198
2199 Ok(Expr::Function {
2200 name,
2201 args,
2202 distinct,
2203 filter: None,
2204 over: None,
2205 })
2206 }
2207 else if self.match_token(TokenType::Dot) {
2209 if self.peek_type() == &TokenType::Star {
2210 self.advance();
2211 Ok(Expr::QualifiedWildcard { table: name })
2212 } else {
2213 let (col, col_qs) = self.expect_name_with_quote()?;
2214 Ok(Expr::Column {
2215 table: Some(name),
2216 name: col,
2217 quote_style: col_qs,
2218 table_quote_style: name_qs,
2219 })
2220 }
2221 } else {
2222 Ok(Expr::Column {
2223 table: None,
2224 name,
2225 quote_style: name_qs,
2226 table_quote_style: QuoteStyle::None,
2227 })
2228 }
2229 }
2230
2231 _ => Err(SqlglotError::UnexpectedToken { token }),
2232 }
2233 }
2234
2235 fn is_data_type_token(&self) -> bool {
2236 matches!(
2237 self.peek_type(),
2238 TokenType::Int
2239 | TokenType::Integer
2240 | TokenType::BigInt
2241 | TokenType::SmallInt
2242 | TokenType::TinyInt
2243 | TokenType::Float
2244 | TokenType::Double
2245 | TokenType::Decimal
2246 | TokenType::Numeric
2247 | TokenType::Real
2248 | TokenType::Varchar
2249 | TokenType::Char
2250 | TokenType::Text
2251 | TokenType::Boolean
2252 | TokenType::Date
2253 | TokenType::Timestamp
2254 | TokenType::TimestampTz
2255 | TokenType::Time
2256 | TokenType::Interval
2257 | TokenType::Blob
2258 | TokenType::Bytea
2259 | TokenType::Json
2260 | TokenType::Jsonb
2261 | TokenType::Uuid
2262 | TokenType::Array
2263 | TokenType::Map
2264 | TokenType::Struct
2265 )
2266 }
2267
2268 fn parse_datetime_field(&mut self) -> Result<DateTimeField> {
2269 let token = self.peek().clone();
2270 let field = match &token.token_type {
2271 TokenType::Year => DateTimeField::Year,
2272 TokenType::Month => DateTimeField::Month,
2273 TokenType::Day => DateTimeField::Day,
2274 TokenType::Hour => DateTimeField::Hour,
2275 TokenType::Minute => DateTimeField::Minute,
2276 TokenType::Second => DateTimeField::Second,
2277 TokenType::Epoch => DateTimeField::Epoch,
2278 _ => {
2279 let name = token.value.to_uppercase();
2280 match name.as_str() {
2281 "YEAR" => DateTimeField::Year,
2282 "QUARTER" => DateTimeField::Quarter,
2283 "MONTH" => DateTimeField::Month,
2284 "WEEK" => DateTimeField::Week,
2285 "DAY" => DateTimeField::Day,
2286 "DOW" | "DAYOFWEEK" => DateTimeField::DayOfWeek,
2287 "DOY" | "DAYOFYEAR" => DateTimeField::DayOfYear,
2288 "HOUR" => DateTimeField::Hour,
2289 "MINUTE" => DateTimeField::Minute,
2290 "SECOND" => DateTimeField::Second,
2291 "MILLISECOND" => DateTimeField::Millisecond,
2292 "MICROSECOND" => DateTimeField::Microsecond,
2293 "NANOSECOND" => DateTimeField::Nanosecond,
2294 "EPOCH" => DateTimeField::Epoch,
2295 "TIMEZONE" => DateTimeField::Timezone,
2296 "TIMEZONE_HOUR" => DateTimeField::TimezoneHour,
2297 "TIMEZONE_MINUTE" => DateTimeField::TimezoneMinute,
2298 _ => {
2299 return Err(SqlglotError::ParserError {
2300 message: format!("Unknown datetime field: {name}"),
2301 });
2302 }
2303 }
2304 }
2305 };
2306 self.advance();
2307 Ok(field)
2308 }
2309
2310 fn try_parse_datetime_field(&mut self) -> Option<DateTimeField> {
2311 let saved = self.pos;
2312 match self.parse_datetime_field() {
2313 Ok(field) => Some(field),
2314 Err(_) => {
2315 self.pos = saved;
2316 None
2317 }
2318 }
2319 }
2320
2321 fn parse_case_expr(&mut self) -> Result<Expr> {
2322 self.expect(TokenType::Case)?;
2323
2324 let operand = if self.peek_type() != &TokenType::When {
2325 Some(Box::new(self.parse_expr()?))
2326 } else {
2327 None
2328 };
2329
2330 let mut when_clauses = Vec::new();
2331 while self.match_token(TokenType::When) {
2332 let condition = self.parse_expr()?;
2333 self.expect(TokenType::Then)?;
2334 let result = self.parse_expr()?;
2335 when_clauses.push((condition, result));
2336 }
2337
2338 let else_clause = if self.match_token(TokenType::Else) {
2339 Some(Box::new(self.parse_expr()?))
2340 } else {
2341 None
2342 };
2343
2344 self.expect(TokenType::End)?;
2345
2346 Ok(Expr::Case {
2347 operand,
2348 when_clauses,
2349 else_clause,
2350 })
2351 }
2352}
2353
2354#[cfg(test)]
2355mod tests {
2356 use super::*;
2357
2358 #[test]
2359 fn test_parse_simple_select() {
2360 let stmt = Parser::new("SELECT a, b FROM t")
2361 .unwrap()
2362 .parse_statement()
2363 .unwrap();
2364 match stmt {
2365 Statement::Select(sel) => {
2366 assert_eq!(sel.columns.len(), 2);
2367 assert!(sel.from.is_some());
2368 }
2369 _ => panic!("Expected SELECT"),
2370 }
2371 }
2372
2373 #[test]
2374 fn test_parse_select_with_where() {
2375 let stmt = Parser::new("SELECT x FROM t WHERE x > 10")
2376 .unwrap()
2377 .parse_statement()
2378 .unwrap();
2379 match stmt {
2380 Statement::Select(sel) => assert!(sel.where_clause.is_some()),
2381 _ => panic!("Expected SELECT"),
2382 }
2383 }
2384
2385 #[test]
2386 fn test_parse_select_wildcard() {
2387 let stmt = Parser::new("SELECT * FROM users")
2388 .unwrap()
2389 .parse_statement()
2390 .unwrap();
2391 match stmt {
2392 Statement::Select(sel) => {
2393 assert_eq!(sel.columns.len(), 1);
2394 assert!(matches!(sel.columns[0], SelectItem::Wildcard));
2395 }
2396 _ => panic!("Expected SELECT"),
2397 }
2398 }
2399
2400 #[test]
2401 fn test_parse_insert() {
2402 let stmt = Parser::new("INSERT INTO t (a, b) VALUES (1, 'hello')")
2403 .unwrap()
2404 .parse_statement()
2405 .unwrap();
2406 match stmt {
2407 Statement::Insert(ins) => {
2408 assert_eq!(ins.table.name, "t");
2409 assert_eq!(ins.columns, vec!["a", "b"]);
2410 match &ins.source {
2411 InsertSource::Values(rows) => {
2412 assert_eq!(rows.len(), 1);
2413 assert_eq!(rows[0].len(), 2);
2414 }
2415 _ => panic!("Expected VALUES"),
2416 }
2417 }
2418 _ => panic!("Expected INSERT"),
2419 }
2420 }
2421
2422 #[test]
2423 fn test_parse_delete() {
2424 let stmt = Parser::new("DELETE FROM users WHERE id = 1")
2425 .unwrap()
2426 .parse_statement()
2427 .unwrap();
2428 match stmt {
2429 Statement::Delete(del) => {
2430 assert_eq!(del.table.name, "users");
2431 assert!(del.where_clause.is_some());
2432 }
2433 _ => panic!("Expected DELETE"),
2434 }
2435 }
2436
2437 #[test]
2438 fn test_parse_join() {
2439 let stmt =
2440 Parser::new("SELECT a.id, b.name FROM a INNER JOIN b ON a.id = b.a_id")
2441 .unwrap()
2442 .parse_statement()
2443 .unwrap();
2444 match stmt {
2445 Statement::Select(sel) => {
2446 assert_eq!(sel.joins.len(), 1);
2447 assert_eq!(sel.joins[0].join_type, JoinType::Inner);
2448 }
2449 _ => panic!("Expected SELECT"),
2450 }
2451 }
2452
2453 #[test]
2454 fn test_parse_cte() {
2455 let stmt = Parser::new(
2456 "WITH cte AS (SELECT 1 AS x) SELECT x FROM cte",
2457 )
2458 .unwrap()
2459 .parse_statement()
2460 .unwrap();
2461 match stmt {
2462 Statement::Select(sel) => {
2463 assert_eq!(sel.ctes.len(), 1);
2464 assert_eq!(sel.ctes[0].name, "cte");
2465 }
2466 _ => panic!("Expected SELECT"),
2467 }
2468 }
2469
2470 #[test]
2471 fn test_parse_union() {
2472 let stmt = Parser::new("SELECT 1 UNION ALL SELECT 2")
2473 .unwrap()
2474 .parse_statement()
2475 .unwrap();
2476 match stmt {
2477 Statement::SetOperation(sop) => {
2478 assert_eq!(sop.op, SetOperationType::Union);
2479 assert!(sop.all);
2480 }
2481 _ => panic!("Expected SetOperation"),
2482 }
2483 }
2484
2485 #[test]
2486 fn test_parse_cast() {
2487 let stmt = Parser::new("SELECT CAST(x AS INT) FROM t")
2488 .unwrap()
2489 .parse_statement()
2490 .unwrap();
2491 match stmt {
2492 Statement::Select(sel) => {
2493 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2494 assert!(matches!(expr, Expr::Cast { .. }));
2495 }
2496 }
2497 _ => panic!("Expected SELECT"),
2498 }
2499 }
2500
2501 #[test]
2502 fn test_parse_subquery() {
2503 let stmt = Parser::new(
2504 "SELECT * FROM (SELECT 1 AS x) AS sub",
2505 )
2506 .unwrap()
2507 .parse_statement()
2508 .unwrap();
2509 match stmt {
2510 Statement::Select(sel) => {
2511 if let Some(from) = &sel.from {
2512 assert!(matches!(from.source, TableSource::Subquery { .. }));
2513 }
2514 }
2515 _ => panic!("Expected SELECT"),
2516 }
2517 }
2518
2519 #[test]
2520 fn test_parse_exists() {
2521 let stmt = Parser::new(
2522 "SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2)",
2523 )
2524 .unwrap()
2525 .parse_statement()
2526 .unwrap();
2527 match stmt {
2528 Statement::Select(sel) => {
2529 assert!(sel.where_clause.is_some());
2530 }
2531 _ => panic!("Expected SELECT"),
2532 }
2533 }
2534
2535 #[test]
2536 fn test_parse_window_function() {
2537 let stmt = Parser::new(
2538 "SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp",
2539 )
2540 .unwrap()
2541 .parse_statement()
2542 .unwrap();
2543 match stmt {
2544 Statement::Select(sel) => {
2545 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2546 if let Expr::Function { over, .. } = expr {
2547 assert!(over.is_some());
2548 } else {
2549 panic!("Expected function");
2550 }
2551 }
2552 }
2553 _ => panic!("Expected SELECT"),
2554 }
2555 }
2556
2557 #[test]
2558 fn test_parse_multiple_statements() {
2559 let stmts = Parser::new("SELECT 1; SELECT 2;")
2560 .unwrap()
2561 .parse_statements()
2562 .unwrap();
2563 assert_eq!(stmts.len(), 2);
2564 }
2565
2566 #[test]
2567 fn test_parse_insert_select() {
2568 let stmt = Parser::new("INSERT INTO t SELECT * FROM s")
2569 .unwrap()
2570 .parse_statement()
2571 .unwrap();
2572 match stmt {
2573 Statement::Insert(ins) => {
2574 assert!(matches!(ins.source, InsertSource::Query(_)));
2575 }
2576 _ => panic!("Expected INSERT"),
2577 }
2578 }
2579
2580 #[test]
2581 fn test_parse_create_table_constraints() {
2582 let stmt = Parser::new(
2583 "CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE)",
2584 )
2585 .unwrap()
2586 .parse_statement()
2587 .unwrap();
2588 match stmt {
2589 Statement::CreateTable(ct) => {
2590 assert_eq!(ct.columns.len(), 2);
2591 assert!(ct.columns[0].primary_key);
2592 assert!(ct.columns[1].unique);
2593 }
2594 _ => panic!("Expected CREATE TABLE"),
2595 }
2596 }
2597
2598 #[test]
2599 fn test_parse_extract() {
2600 let stmt = Parser::new("SELECT EXTRACT(YEAR FROM created_at) FROM t")
2601 .unwrap()
2602 .parse_statement()
2603 .unwrap();
2604 match stmt {
2605 Statement::Select(sel) => {
2606 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2607 assert!(matches!(expr, Expr::Extract { .. }));
2608 }
2609 }
2610 _ => panic!("Expected SELECT"),
2611 }
2612 }
2613
2614 #[test]
2615 fn test_parse_postgres_cast() {
2616 let stmt = Parser::new("SELECT x::int FROM t")
2617 .unwrap()
2618 .parse_statement()
2619 .unwrap();
2620 match stmt {
2621 Statement::Select(sel) => {
2622 if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2623 assert!(matches!(expr, Expr::Cast { .. }));
2624 }
2625 }
2626 _ => panic!("Expected SELECT"),
2627 }
2628 }
2629}