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