Skip to main content

sqlglot_rust/parser/
sql_parser.rs

1use crate::ast::*;
2use crate::errors::{Result, SqlglotError};
3use crate::tokens::{Token, TokenType, Tokenizer};
4
5/// Convert a token's `quote_char` into a `QuoteStyle`.
6fn 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
15/// A recursive-descent SQL parser.
16///
17/// Supports CTEs (WITH), subqueries, UNION/INTERSECT/EXCEPT, CAST,
18/// window functions (OVER), EXISTS, EXTRACT, INTERVAL, and more.
19pub struct Parser {
20    tokens: Vec<Token>,
21    pos: usize,
22}
23
24impl Parser {
25    /// Create a new parser from a SQL string.
26    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    // ── Token helpers ──────────────────────────────────────────────
33
34    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    /// Check if the current token's uppercased value matches a keyword string.
75    fn check_keyword(&self, keyword: &str) -> bool {
76        self.peek().value.to_uppercase() == keyword
77    }
78
79    /// Match a keyword by string value (for multi-word context-sensitive keywords).
80    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    /// Helper to check if current token is an identifier or keyword that can serve as a name.
90    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    /// Consume a name token (identifier or unreserved keyword used as identifier).
116    fn expect_name(&mut self) -> Result<String> {
117        let (name, _) = self.expect_name_with_quote()?;
118        Ok(name)
119    }
120
121    /// Like `expect_name` but also returns the quote style of the token.
122    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        // Also accept any keyword-like identifier
129        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    // ── Top-level parsing ──────────────────────────────────────────
175
176    /// Parse a single SQL statement.
177    pub fn parse_statement(&mut self) -> Result<Statement> {
178        let stmt = self.parse_statement_inner()?;
179        // Consume trailing semicolons
180        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                // Could be a parenthesized SELECT
193                let saved_pos = self.pos;
194                self.advance(); // consume '('
195                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    /// Parse multiple statements separated by semicolons.
225    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    // ── WITH / CTE parsing ─────────────────────────────────────────
238
239    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        // Now parse the main query
248        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                // WITH ... INSERT is supported in some dialects
255                let ins = self.parse_insert()?;
256                // Attach CTEs if needed (simplification)
257                let _ = ctes; // CTEs with INSERT - we'll handle this later
258                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    // ── SELECT ──────────────────────────────────────────────────────
311
312    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        // TOP N (SQL Server style)
318        // Use parse_primary() instead of parse_expr() to prevent the parser
319        // from consuming `*` (SELECT all columns) as a multiplication operator.
320        // This correctly handles: TOP 5, TOP 100, TOP (expr), TOP (@var)
321        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        // Named WINDOW definitions
365        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        // FETCH FIRST|NEXT n ROWS ONLY (Oracle / ANSI SQL:2008)
391        let fetch_first = if self.match_token(TokenType::Fetch) {
392            // consume FIRST or NEXT
393            let _ = self.match_token(TokenType::First) || self.match_token(TokenType::Next);
394            let count = self.parse_expr()?;
395            // consume ROWS or ROW
396            let _ = self.match_keyword("ROWS") || self.match_keyword("ROW");
397            // consume ONLY
398            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    /// Check if we should parse a set operation (UNION / INTERSECT / EXCEPT)
440    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); // UNION DISTINCT
451
452        let right = self.parse_statement_inner()?;
453
454        // Check for further set operations chaining
455        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        // Parse trailing ORDER BY / LIMIT / OFFSET that applies to the whole set operation
466        if matches!(self.peek_type(), TokenType::Union | TokenType::Intersect | TokenType::Except) {
467            self.maybe_parse_set_operation(combined)
468        } else {
469            // Check for global ORDER BY / LIMIT
470            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        // Check for table.* pattern
505        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        // Implicit alias
521        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        // LATERAL
555        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        // UNNEST(expr)
563        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        // Subquery: (SELECT ...)
577        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        // Regular table reference (possibly with function syntax)
593        let table_ref = self.parse_table_ref()?;
594
595        // Check if it's actually a table function: name(args...)
596        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        // Check for schema.table or catalog.schema.table
619        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    /// Like `parse_table_ref` but does not consume an alias.
643    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)?; // LAST
747                    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    // ── INSERT ──────────────────────────────────────────────────────
774
775    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        // ON CONFLICT
815        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    // ── UPDATE ──────────────────────────────────────────────────────
869
870    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    // ── DELETE ──────────────────────────────────────────────────────
916
917    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    // ── CREATE ──────────────────────────────────────────────────────
951
952    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        // CREATE TABLE ... AS SELECT ...
984        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            // Check for table-level constraints
1003            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        // Parse name without alias (so AS is not consumed as an alias)
1035        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)?; // ACTION
1139            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                // Inline foreign key — skip for now
1190                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    // ── DROP ────────────────────────────────────────────────────────
1355
1356    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    // ── ALTER TABLE ─────────────────────────────────────────────────
1410
1411    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)?; // TO
1452                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    // ── TRUNCATE ────────────────────────────────────────────────────
1470
1471    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    // ── Transaction ─────────────────────────────────────────────────
1479
1480    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    // ── EXPLAIN ─────────────────────────────────────────────────────
1515
1516    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    // ── USE ─────────────────────────────────────────────────────────
1527
1528    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    // ══════════════════════════════════════════════════════════════
1535    // Expression parsing (precedence climbing)
1536    // ══════════════════════════════════════════════════════════════
1537
1538    fn parse_expr(&mut self) -> Result<Expr> {
1539        self.parse_or_expr()
1540    }
1541
1542    fn parse_or_expr(&mut self) -> Result<Expr> {
1543        let mut left = self.parse_and_expr()?;
1544        while self.match_token(TokenType::Or) {
1545            let right = self.parse_and_expr()?;
1546            left = Expr::BinaryOp {
1547                left: Box::new(left),
1548                op: BinaryOperator::Or,
1549                right: Box::new(right),
1550            };
1551        }
1552        Ok(left)
1553    }
1554
1555    fn parse_and_expr(&mut self) -> Result<Expr> {
1556        let mut left = self.parse_not_expr()?;
1557        while self.match_token(TokenType::And) {
1558            let right = self.parse_not_expr()?;
1559            left = Expr::BinaryOp {
1560                left: Box::new(left),
1561                op: BinaryOperator::And,
1562                right: Box::new(right),
1563            };
1564        }
1565        Ok(left)
1566    }
1567
1568    fn parse_not_expr(&mut self) -> Result<Expr> {
1569        if self.match_token(TokenType::Not) {
1570            let expr = self.parse_not_expr()?;
1571            Ok(Expr::UnaryOp {
1572                op: UnaryOperator::Not,
1573                expr: Box::new(expr),
1574            })
1575        } else {
1576            self.parse_comparison()
1577        }
1578    }
1579
1580    fn parse_comparison(&mut self) -> Result<Expr> {
1581        let mut left = self.parse_addition()?;
1582
1583        loop {
1584            let op = match self.peek_type() {
1585                TokenType::Eq => Some(BinaryOperator::Eq),
1586                TokenType::Neq => Some(BinaryOperator::Neq),
1587                TokenType::Lt => Some(BinaryOperator::Lt),
1588                TokenType::Gt => Some(BinaryOperator::Gt),
1589                TokenType::LtEq => Some(BinaryOperator::LtEq),
1590                TokenType::GtEq => Some(BinaryOperator::GtEq),
1591                _ => None,
1592            };
1593
1594            if let Some(op) = op {
1595                self.advance();
1596                let right = self.parse_addition()?;
1597                left = Expr::BinaryOp {
1598                    left: Box::new(left),
1599                    op,
1600                    right: Box::new(right),
1601                };
1602            } else if self.peek_type() == &TokenType::Is {
1603                self.advance();
1604                let negated = self.match_token(TokenType::Not);
1605                if self.match_token(TokenType::True) {
1606                    left = Expr::IsBool {
1607                        expr: Box::new(left),
1608                        value: true,
1609                        negated,
1610                    };
1611                } else if self.match_token(TokenType::False) {
1612                    left = Expr::IsBool {
1613                        expr: Box::new(left),
1614                        value: false,
1615                        negated,
1616                    };
1617                } else {
1618                    self.expect(TokenType::Null)?;
1619                    left = Expr::IsNull {
1620                        expr: Box::new(left),
1621                        negated,
1622                    };
1623                }
1624            } else if matches!(
1625                self.peek_type(),
1626                TokenType::Not | TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1627            ) {
1628                // Peek ahead: if NOT, only consume it if followed by IN/LIKE/ILIKE/BETWEEN
1629                if self.peek_type() == &TokenType::Not {
1630                    let saved_pos = self.pos;
1631                    self.advance(); // consume NOT
1632                    if !matches!(
1633                        self.peek_type(),
1634                        TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
1635                    ) {
1636                        // NOT is not part of a comparison predicate — restore position
1637                        self.pos = saved_pos;
1638                        break;
1639                    }
1640                    // NOT was consumed, negated = true
1641                }
1642                let negated = self.pos > 0
1643                    && self.tokens[self.pos - 1].token_type == TokenType::Not;
1644
1645                if self.match_token(TokenType::In) {
1646                    self.expect(TokenType::LParen)?;
1647                    // Check for subquery
1648                    if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
1649                        let subquery = self.parse_statement_inner()?;
1650                        self.expect(TokenType::RParen)?;
1651                        left = Expr::InSubquery {
1652                            expr: Box::new(left),
1653                            subquery: Box::new(subquery),
1654                            negated,
1655                        };
1656                    } else {
1657                        let list = self.parse_expr_list()?;
1658                        self.expect(TokenType::RParen)?;
1659                        left = Expr::InList {
1660                            expr: Box::new(left),
1661                            list,
1662                            negated,
1663                        };
1664                    }
1665                } else if self.match_token(TokenType::Like) {
1666                    let pattern = self.parse_addition()?;
1667                    let escape = if self.match_token(TokenType::Escape) {
1668                        Some(Box::new(self.parse_primary()?))
1669                    } else {
1670                        None
1671                    };
1672                    left = Expr::Like {
1673                        expr: Box::new(left),
1674                        pattern: Box::new(pattern),
1675                        negated,
1676                        escape,
1677                    };
1678                } else if self.match_token(TokenType::ILike) {
1679                    let pattern = self.parse_addition()?;
1680                    let escape = if self.match_token(TokenType::Escape) {
1681                        Some(Box::new(self.parse_primary()?))
1682                    } else {
1683                        None
1684                    };
1685                    left = Expr::ILike {
1686                        expr: Box::new(left),
1687                        pattern: Box::new(pattern),
1688                        negated,
1689                        escape,
1690                    };
1691                } else if self.match_token(TokenType::Between) {
1692                    let low = self.parse_addition()?;
1693                    self.expect(TokenType::And)?;
1694                    let high = self.parse_addition()?;
1695                    left = Expr::Between {
1696                        expr: Box::new(left),
1697                        low: Box::new(low),
1698                        high: Box::new(high),
1699                        negated,
1700                    };
1701                } else {
1702                    break;
1703                }
1704            } else {
1705                break;
1706            }
1707        }
1708
1709        Ok(left)
1710    }
1711
1712    fn parse_addition(&mut self) -> Result<Expr> {
1713        let mut left = self.parse_multiplication()?;
1714        loop {
1715            let op = match self.peek_type() {
1716                TokenType::Plus => Some(BinaryOperator::Plus),
1717                TokenType::Minus => Some(BinaryOperator::Minus),
1718                TokenType::Concat => Some(BinaryOperator::Concat),
1719                TokenType::BitwiseOr => Some(BinaryOperator::BitwiseOr),
1720                TokenType::BitwiseXor => Some(BinaryOperator::BitwiseXor),
1721                TokenType::ShiftLeft => Some(BinaryOperator::ShiftLeft),
1722                TokenType::ShiftRight => Some(BinaryOperator::ShiftRight),
1723                _ => None,
1724            };
1725            if let Some(op) = op {
1726                self.advance();
1727                let right = self.parse_multiplication()?;
1728                left = Expr::BinaryOp {
1729                    left: Box::new(left),
1730                    op,
1731                    right: Box::new(right),
1732                };
1733            } else {
1734                break;
1735            }
1736        }
1737        Ok(left)
1738    }
1739
1740    fn parse_multiplication(&mut self) -> Result<Expr> {
1741        let mut left = self.parse_unary()?;
1742        loop {
1743            let op = match self.peek_type() {
1744                TokenType::Star => Some(BinaryOperator::Multiply),
1745                TokenType::Slash => Some(BinaryOperator::Divide),
1746                TokenType::Percent2 => Some(BinaryOperator::Modulo),
1747                TokenType::BitwiseAnd => Some(BinaryOperator::BitwiseAnd),
1748                _ => None,
1749            };
1750            if let Some(op) = op {
1751                self.advance();
1752                let right = self.parse_unary()?;
1753                left = Expr::BinaryOp {
1754                    left: Box::new(left),
1755                    op,
1756                    right: Box::new(right),
1757                };
1758            } else {
1759                break;
1760            }
1761        }
1762        Ok(left)
1763    }
1764
1765    fn parse_unary(&mut self) -> Result<Expr> {
1766        match self.peek_type() {
1767            TokenType::Minus => {
1768                self.advance();
1769                let expr = self.parse_postfix()?;
1770                Ok(Expr::UnaryOp {
1771                    op: UnaryOperator::Minus,
1772                    expr: Box::new(expr),
1773                })
1774            }
1775            TokenType::Plus => {
1776                self.advance();
1777                let expr = self.parse_postfix()?;
1778                Ok(Expr::UnaryOp {
1779                    op: UnaryOperator::Plus,
1780                    expr: Box::new(expr),
1781                })
1782            }
1783            TokenType::BitwiseNot => {
1784                self.advance();
1785                let expr = self.parse_postfix()?;
1786                Ok(Expr::UnaryOp {
1787                    op: UnaryOperator::BitwiseNot,
1788                    expr: Box::new(expr),
1789                })
1790            }
1791            _ => self.parse_postfix(),
1792        }
1793    }
1794
1795    /// Parse postfix operators: `::type`, `[index]`, `->`, `->>`
1796    fn parse_postfix(&mut self) -> Result<Expr> {
1797        let mut expr = self.parse_primary()?;
1798
1799        loop {
1800            if self.match_token(TokenType::DoubleColon) {
1801                // PostgreSQL-style cast: expr::type
1802                let data_type = self.parse_data_type()?;
1803                expr = Expr::Cast {
1804                    expr: Box::new(expr),
1805                    data_type,
1806                };
1807            } else if self.match_token(TokenType::LBracket) {
1808                // Array index: expr[index]
1809                let index = self.parse_expr()?;
1810                self.expect(TokenType::RBracket)?;
1811                expr = Expr::ArrayIndex {
1812                    expr: Box::new(expr),
1813                    index: Box::new(index),
1814                };
1815            } else if self.match_token(TokenType::Arrow) {
1816                let path = self.parse_primary()?;
1817                expr = Expr::JsonAccess {
1818                    expr: Box::new(expr),
1819                    path: Box::new(path),
1820                    as_text: false,
1821                };
1822            } else if self.match_token(TokenType::DoubleArrow) {
1823                let path = self.parse_primary()?;
1824                expr = Expr::JsonAccess {
1825                    expr: Box::new(expr),
1826                    path: Box::new(path),
1827                    as_text: true,
1828                };
1829            } else {
1830                break;
1831            }
1832        }
1833
1834        // Check for window function: expr OVER (...)
1835        if self.match_token(TokenType::Over) {
1836            if let Expr::Function { name, args, distinct, filter, .. } = expr {
1837                let spec = if self.match_token(TokenType::LParen) {
1838                    let ws = self.parse_window_spec()?;
1839                    self.expect(TokenType::RParen)?;
1840                    ws
1841                } else {
1842                    // Named window reference
1843                    let wref = self.expect_name()?;
1844                    WindowSpec {
1845                        window_ref: Some(wref),
1846                        partition_by: vec![],
1847                        order_by: vec![],
1848                        frame: None,
1849                    }
1850                };
1851                expr = Expr::Function {
1852                    name,
1853                    args,
1854                    distinct,
1855                    filter,
1856                    over: Some(spec),
1857                };
1858            }
1859        }
1860
1861        // FILTER (WHERE ...) for aggregate functions
1862        if self.match_token(TokenType::Filter) {
1863            if let Expr::Function { name, args, distinct, over, .. } = expr {
1864                self.expect(TokenType::LParen)?;
1865                self.expect(TokenType::Where)?;
1866                let filter_expr = self.parse_expr()?;
1867                self.expect(TokenType::RParen)?;
1868                expr = Expr::Function {
1869                    name,
1870                    args,
1871                    distinct,
1872                    filter: Some(Box::new(filter_expr)),
1873                    over,
1874                };
1875            }
1876        }
1877
1878        Ok(expr)
1879    }
1880
1881    fn parse_window_spec(&mut self) -> Result<WindowSpec> {
1882        let window_ref = if self.is_name_token() && !matches!(self.peek_type(), TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1883            let saved = self.pos;
1884            let name = self.expect_name()?;
1885            // Check if it's actually a keyword we need
1886            if matches!(self.peek_type(), TokenType::RParen | TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range) {
1887                Some(name)
1888            } else {
1889                self.pos = saved;
1890                None
1891            }
1892        } else {
1893            None
1894        };
1895
1896        let partition_by = if self.match_token(TokenType::Partition) {
1897            self.expect(TokenType::By)?;
1898            self.parse_expr_list()?
1899        } else {
1900            vec![]
1901        };
1902
1903        let order_by = if self.match_token(TokenType::Order) {
1904            self.expect(TokenType::By)?;
1905            self.parse_order_by_items()?
1906        } else {
1907            vec![]
1908        };
1909
1910        let frame = if matches!(self.peek_type(), TokenType::Rows | TokenType::Range) {
1911            Some(self.parse_window_frame()?)
1912        } else {
1913            None
1914        };
1915
1916        Ok(WindowSpec {
1917            window_ref,
1918            partition_by,
1919            order_by,
1920            frame,
1921        })
1922    }
1923
1924    fn parse_window_frame(&mut self) -> Result<WindowFrame> {
1925        let kind = if self.match_token(TokenType::Rows) {
1926            WindowFrameKind::Rows
1927        } else if self.match_token(TokenType::Range) {
1928            WindowFrameKind::Range
1929        } else {
1930            WindowFrameKind::Rows
1931        };
1932
1933        if self.match_keyword("BETWEEN") {
1934            let start = self.parse_window_frame_bound()?;
1935            self.expect(TokenType::And)?;
1936            let end = self.parse_window_frame_bound()?;
1937            Ok(WindowFrame {
1938                kind,
1939                start,
1940                end: Some(end),
1941            })
1942        } else {
1943            let start = self.parse_window_frame_bound()?;
1944            Ok(WindowFrame {
1945                kind,
1946                start,
1947                end: None,
1948            })
1949        }
1950    }
1951
1952    fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound> {
1953        if self.check_keyword("CURRENT") {
1954            self.advance();
1955            let _ = self.match_keyword("ROW");
1956            Ok(WindowFrameBound::CurrentRow)
1957        } else if self.match_token(TokenType::Unbounded) {
1958            if self.match_token(TokenType::Preceding) {
1959                Ok(WindowFrameBound::Preceding(None))
1960            } else {
1961                self.expect(TokenType::Following)?;
1962                Ok(WindowFrameBound::Following(None))
1963            }
1964        } else {
1965            let n = self.parse_expr()?;
1966            if self.match_token(TokenType::Preceding) {
1967                Ok(WindowFrameBound::Preceding(Some(Box::new(n))))
1968            } else {
1969                self.expect(TokenType::Following)?;
1970                Ok(WindowFrameBound::Following(Some(Box::new(n))))
1971            }
1972        }
1973    }
1974
1975    fn parse_primary(&mut self) -> Result<Expr> {
1976        let token = self.peek().clone();
1977
1978        match &token.token_type {
1979            TokenType::Number => {
1980                self.advance();
1981                Ok(Expr::Number(token.value))
1982            }
1983            TokenType::String => {
1984                self.advance();
1985                Ok(Expr::StringLiteral(token.value))
1986            }
1987            TokenType::True => {
1988                self.advance();
1989                Ok(Expr::Boolean(true))
1990            }
1991            TokenType::False => {
1992                self.advance();
1993                Ok(Expr::Boolean(false))
1994            }
1995            TokenType::Null => {
1996                self.advance();
1997                Ok(Expr::Null)
1998            }
1999            TokenType::Default => {
2000                self.advance();
2001                Ok(Expr::Default)
2002            }
2003            TokenType::Star => {
2004                self.advance();
2005                Ok(Expr::Wildcard)
2006            }
2007            TokenType::Parameter => {
2008                self.advance();
2009                Ok(Expr::Parameter(token.value))
2010            }
2011
2012            // ── CAST ────────────────────────────────────────────────
2013            TokenType::Cast => {
2014                self.advance();
2015                self.expect(TokenType::LParen)?;
2016                let expr = self.parse_expr()?;
2017                self.expect(TokenType::As)?;
2018                let data_type = self.parse_data_type()?;
2019                self.expect(TokenType::RParen)?;
2020                Ok(Expr::Cast {
2021                    expr: Box::new(expr),
2022                    data_type,
2023                })
2024            }
2025
2026            // ── EXTRACT ─────────────────────────────────────────────
2027            TokenType::Extract => {
2028                self.advance();
2029                self.expect(TokenType::LParen)?;
2030                let field = self.parse_datetime_field()?;
2031                self.expect(TokenType::From)?;
2032                let expr = self.parse_expr()?;
2033                self.expect(TokenType::RParen)?;
2034                Ok(Expr::Extract {
2035                    field,
2036                    expr: Box::new(expr),
2037                })
2038            }
2039
2040            // ── CASE ────────────────────────────────────────────────
2041            TokenType::Case => self.parse_case_expr(),
2042
2043            // ── EXISTS ──────────────────────────────────────────────
2044            TokenType::Exists => {
2045                self.advance();
2046                self.expect(TokenType::LParen)?;
2047                let subquery = self.parse_statement_inner()?;
2048                self.expect(TokenType::RParen)?;
2049                Ok(Expr::Exists {
2050                    subquery: Box::new(subquery),
2051                    negated: false,
2052                })
2053            }
2054
2055            // ── NOT EXISTS ──────────────────────────────────────────
2056            TokenType::Not if {
2057                let next_pos = self.pos + 1;
2058                next_pos < self.tokens.len() && self.tokens[next_pos].token_type == TokenType::Exists
2059            } => {
2060                self.advance(); // NOT
2061                self.advance(); // EXISTS
2062                self.expect(TokenType::LParen)?;
2063                let subquery = self.parse_statement_inner()?;
2064                self.expect(TokenType::RParen)?;
2065                Ok(Expr::Exists {
2066                    subquery: Box::new(subquery),
2067                    negated: true,
2068                })
2069            }
2070
2071            // ── INTERVAL ────────────────────────────────────────────
2072            TokenType::Interval => {
2073                self.advance();
2074                let value = self.parse_primary()?;
2075                let unit = self.try_parse_datetime_field();
2076                Ok(Expr::Interval {
2077                    value: Box::new(value),
2078                    unit,
2079                })
2080            }
2081
2082            // ── Parenthesized expression or subquery ────────────────
2083            TokenType::LParen => {
2084                self.advance();
2085                // Check for subquery
2086                if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2087                    let subquery = self.parse_statement_inner()?;
2088                    self.expect(TokenType::RParen)?;
2089                    Ok(Expr::Subquery(Box::new(subquery)))
2090                } else {
2091                    let expr = self.parse_expr()?;
2092                    // Tuple: (a, b, c)
2093                    if self.match_token(TokenType::Comma) {
2094                        let mut items = vec![expr];
2095                        items.push(self.parse_expr()?);
2096                        while self.match_token(TokenType::Comma) {
2097                            items.push(self.parse_expr()?);
2098                        }
2099                        self.expect(TokenType::RParen)?;
2100                        Ok(Expr::Tuple(items))
2101                    } else {
2102                        self.expect(TokenType::RParen)?;
2103                        Ok(Expr::Nested(Box::new(expr)))
2104                    }
2105                }
2106            }
2107
2108            // ── Array literal: ARRAY[...] ──────────────────────────
2109            TokenType::Array => {
2110                self.advance();
2111                if self.match_token(TokenType::LBracket) {
2112                    let items = if self.peek_type() != &TokenType::RBracket {
2113                        self.parse_expr_list()?
2114                    } else {
2115                        vec![]
2116                    };
2117                    self.expect(TokenType::RBracket)?;
2118                    Ok(Expr::ArrayLiteral(items))
2119                } else if self.match_token(TokenType::LParen) {
2120                    // ARRAY(SELECT ...)
2121                    let subquery = self.parse_statement_inner()?;
2122                    self.expect(TokenType::RParen)?;
2123                    Ok(Expr::Subquery(Box::new(subquery)))
2124                } else {
2125                    Ok(Expr::Column {
2126                        table: None,
2127                        name: "ARRAY".to_string(),
2128                        quote_style: QuoteStyle::None,
2129                        table_quote_style: QuoteStyle::None,
2130                    })
2131                }
2132            }
2133
2134            // ── Bracket array literal: [...] ────────────────────────
2135            TokenType::LBracket => {
2136                self.advance();
2137                let items = if self.peek_type() != &TokenType::RBracket {
2138                    self.parse_expr_list()?
2139                } else {
2140                    vec![]
2141                };
2142                self.expect(TokenType::RBracket)?;
2143                Ok(Expr::ArrayLiteral(items))
2144            }
2145
2146            // ── Identifier: column ref, function call, or qualified name ─
2147            _ if self.is_name_token() || self.is_data_type_token() => {
2148                let name_token = self.advance().clone();
2149                let name = name_token.value.clone();
2150                let name_qs = quote_style_from_char(name_token.quote_char);
2151
2152                // Function call: name(...)
2153                if self.peek_type() == &TokenType::LParen {
2154                    self.advance();
2155
2156                    // Special: COUNT(*), COUNT(DISTINCT x)
2157                    let distinct = self.match_token(TokenType::Distinct);
2158
2159                    let args = if self.peek_type() == &TokenType::RParen {
2160                        vec![]
2161                    } else if self.peek_type() == &TokenType::Star {
2162                        self.advance();
2163                        vec![Expr::Wildcard]
2164                    } else {
2165                        self.parse_expr_list()?
2166                    };
2167                    self.expect(TokenType::RParen)?;
2168
2169                    Ok(Expr::Function {
2170                        name,
2171                        args,
2172                        distinct,
2173                        filter: None,
2174                        over: None,
2175                    })
2176                }
2177                // Qualified column: table.column or table.*
2178                else if self.match_token(TokenType::Dot) {
2179                    if self.peek_type() == &TokenType::Star {
2180                        self.advance();
2181                        Ok(Expr::QualifiedWildcard { table: name })
2182                    } else {
2183                        let (col, col_qs) = self.expect_name_with_quote()?;
2184                        Ok(Expr::Column {
2185                            table: Some(name),
2186                            name: col,
2187                            quote_style: col_qs,
2188                            table_quote_style: name_qs,
2189                        })
2190                    }
2191                } else {
2192                    Ok(Expr::Column {
2193                        table: None,
2194                        name,
2195                        quote_style: name_qs,
2196                        table_quote_style: QuoteStyle::None,
2197                    })
2198                }
2199            }
2200
2201            _ => Err(SqlglotError::UnexpectedToken { token }),
2202        }
2203    }
2204
2205    fn is_data_type_token(&self) -> bool {
2206        matches!(
2207            self.peek_type(),
2208            TokenType::Int
2209                | TokenType::Integer
2210                | TokenType::BigInt
2211                | TokenType::SmallInt
2212                | TokenType::TinyInt
2213                | TokenType::Float
2214                | TokenType::Double
2215                | TokenType::Decimal
2216                | TokenType::Numeric
2217                | TokenType::Real
2218                | TokenType::Varchar
2219                | TokenType::Char
2220                | TokenType::Text
2221                | TokenType::Boolean
2222                | TokenType::Date
2223                | TokenType::Timestamp
2224                | TokenType::TimestampTz
2225                | TokenType::Time
2226                | TokenType::Interval
2227                | TokenType::Blob
2228                | TokenType::Bytea
2229                | TokenType::Json
2230                | TokenType::Jsonb
2231                | TokenType::Uuid
2232                | TokenType::Array
2233                | TokenType::Map
2234                | TokenType::Struct
2235        )
2236    }
2237
2238    fn parse_datetime_field(&mut self) -> Result<DateTimeField> {
2239        let token = self.peek().clone();
2240        let field = match &token.token_type {
2241            TokenType::Year => DateTimeField::Year,
2242            TokenType::Month => DateTimeField::Month,
2243            TokenType::Day => DateTimeField::Day,
2244            TokenType::Hour => DateTimeField::Hour,
2245            TokenType::Minute => DateTimeField::Minute,
2246            TokenType::Second => DateTimeField::Second,
2247            TokenType::Epoch => DateTimeField::Epoch,
2248            _ => {
2249                let name = token.value.to_uppercase();
2250                match name.as_str() {
2251                    "YEAR" => DateTimeField::Year,
2252                    "QUARTER" => DateTimeField::Quarter,
2253                    "MONTH" => DateTimeField::Month,
2254                    "WEEK" => DateTimeField::Week,
2255                    "DAY" => DateTimeField::Day,
2256                    "DOW" | "DAYOFWEEK" => DateTimeField::DayOfWeek,
2257                    "DOY" | "DAYOFYEAR" => DateTimeField::DayOfYear,
2258                    "HOUR" => DateTimeField::Hour,
2259                    "MINUTE" => DateTimeField::Minute,
2260                    "SECOND" => DateTimeField::Second,
2261                    "MILLISECOND" => DateTimeField::Millisecond,
2262                    "MICROSECOND" => DateTimeField::Microsecond,
2263                    "NANOSECOND" => DateTimeField::Nanosecond,
2264                    "EPOCH" => DateTimeField::Epoch,
2265                    "TIMEZONE" => DateTimeField::Timezone,
2266                    "TIMEZONE_HOUR" => DateTimeField::TimezoneHour,
2267                    "TIMEZONE_MINUTE" => DateTimeField::TimezoneMinute,
2268                    _ => {
2269                        return Err(SqlglotError::ParserError {
2270                            message: format!("Unknown datetime field: {name}"),
2271                        });
2272                    }
2273                }
2274            }
2275        };
2276        self.advance();
2277        Ok(field)
2278    }
2279
2280    fn try_parse_datetime_field(&mut self) -> Option<DateTimeField> {
2281        let saved = self.pos;
2282        match self.parse_datetime_field() {
2283            Ok(field) => Some(field),
2284            Err(_) => {
2285                self.pos = saved;
2286                None
2287            }
2288        }
2289    }
2290
2291    fn parse_case_expr(&mut self) -> Result<Expr> {
2292        self.expect(TokenType::Case)?;
2293
2294        let operand = if self.peek_type() != &TokenType::When {
2295            Some(Box::new(self.parse_expr()?))
2296        } else {
2297            None
2298        };
2299
2300        let mut when_clauses = Vec::new();
2301        while self.match_token(TokenType::When) {
2302            let condition = self.parse_expr()?;
2303            self.expect(TokenType::Then)?;
2304            let result = self.parse_expr()?;
2305            when_clauses.push((condition, result));
2306        }
2307
2308        let else_clause = if self.match_token(TokenType::Else) {
2309            Some(Box::new(self.parse_expr()?))
2310        } else {
2311            None
2312        };
2313
2314        self.expect(TokenType::End)?;
2315
2316        Ok(Expr::Case {
2317            operand,
2318            when_clauses,
2319            else_clause,
2320        })
2321    }
2322}
2323
2324#[cfg(test)]
2325mod tests {
2326    use super::*;
2327
2328    #[test]
2329    fn test_parse_simple_select() {
2330        let stmt = Parser::new("SELECT a, b FROM t")
2331            .unwrap()
2332            .parse_statement()
2333            .unwrap();
2334        match stmt {
2335            Statement::Select(sel) => {
2336                assert_eq!(sel.columns.len(), 2);
2337                assert!(sel.from.is_some());
2338            }
2339            _ => panic!("Expected SELECT"),
2340        }
2341    }
2342
2343    #[test]
2344    fn test_parse_select_with_where() {
2345        let stmt = Parser::new("SELECT x FROM t WHERE x > 10")
2346            .unwrap()
2347            .parse_statement()
2348            .unwrap();
2349        match stmt {
2350            Statement::Select(sel) => assert!(sel.where_clause.is_some()),
2351            _ => panic!("Expected SELECT"),
2352        }
2353    }
2354
2355    #[test]
2356    fn test_parse_select_wildcard() {
2357        let stmt = Parser::new("SELECT * FROM users")
2358            .unwrap()
2359            .parse_statement()
2360            .unwrap();
2361        match stmt {
2362            Statement::Select(sel) => {
2363                assert_eq!(sel.columns.len(), 1);
2364                assert!(matches!(sel.columns[0], SelectItem::Wildcard));
2365            }
2366            _ => panic!("Expected SELECT"),
2367        }
2368    }
2369
2370    #[test]
2371    fn test_parse_insert() {
2372        let stmt = Parser::new("INSERT INTO t (a, b) VALUES (1, 'hello')")
2373            .unwrap()
2374            .parse_statement()
2375            .unwrap();
2376        match stmt {
2377            Statement::Insert(ins) => {
2378                assert_eq!(ins.table.name, "t");
2379                assert_eq!(ins.columns, vec!["a", "b"]);
2380                match &ins.source {
2381                    InsertSource::Values(rows) => {
2382                        assert_eq!(rows.len(), 1);
2383                        assert_eq!(rows[0].len(), 2);
2384                    }
2385                    _ => panic!("Expected VALUES"),
2386                }
2387            }
2388            _ => panic!("Expected INSERT"),
2389        }
2390    }
2391
2392    #[test]
2393    fn test_parse_delete() {
2394        let stmt = Parser::new("DELETE FROM users WHERE id = 1")
2395            .unwrap()
2396            .parse_statement()
2397            .unwrap();
2398        match stmt {
2399            Statement::Delete(del) => {
2400                assert_eq!(del.table.name, "users");
2401                assert!(del.where_clause.is_some());
2402            }
2403            _ => panic!("Expected DELETE"),
2404        }
2405    }
2406
2407    #[test]
2408    fn test_parse_join() {
2409        let stmt =
2410            Parser::new("SELECT a.id, b.name FROM a INNER JOIN b ON a.id = b.a_id")
2411                .unwrap()
2412                .parse_statement()
2413                .unwrap();
2414        match stmt {
2415            Statement::Select(sel) => {
2416                assert_eq!(sel.joins.len(), 1);
2417                assert_eq!(sel.joins[0].join_type, JoinType::Inner);
2418            }
2419            _ => panic!("Expected SELECT"),
2420        }
2421    }
2422
2423    #[test]
2424    fn test_parse_cte() {
2425        let stmt = Parser::new(
2426            "WITH cte AS (SELECT 1 AS x) SELECT x FROM cte",
2427        )
2428        .unwrap()
2429        .parse_statement()
2430        .unwrap();
2431        match stmt {
2432            Statement::Select(sel) => {
2433                assert_eq!(sel.ctes.len(), 1);
2434                assert_eq!(sel.ctes[0].name, "cte");
2435            }
2436            _ => panic!("Expected SELECT"),
2437        }
2438    }
2439
2440    #[test]
2441    fn test_parse_union() {
2442        let stmt = Parser::new("SELECT 1 UNION ALL SELECT 2")
2443            .unwrap()
2444            .parse_statement()
2445            .unwrap();
2446        match stmt {
2447            Statement::SetOperation(sop) => {
2448                assert_eq!(sop.op, SetOperationType::Union);
2449                assert!(sop.all);
2450            }
2451            _ => panic!("Expected SetOperation"),
2452        }
2453    }
2454
2455    #[test]
2456    fn test_parse_cast() {
2457        let stmt = Parser::new("SELECT CAST(x AS INT) FROM t")
2458            .unwrap()
2459            .parse_statement()
2460            .unwrap();
2461        match stmt {
2462            Statement::Select(sel) => {
2463                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2464                    assert!(matches!(expr, Expr::Cast { .. }));
2465                }
2466            }
2467            _ => panic!("Expected SELECT"),
2468        }
2469    }
2470
2471    #[test]
2472    fn test_parse_subquery() {
2473        let stmt = Parser::new(
2474            "SELECT * FROM (SELECT 1 AS x) AS sub",
2475        )
2476        .unwrap()
2477        .parse_statement()
2478        .unwrap();
2479        match stmt {
2480            Statement::Select(sel) => {
2481                if let Some(from) = &sel.from {
2482                    assert!(matches!(from.source, TableSource::Subquery { .. }));
2483                }
2484            }
2485            _ => panic!("Expected SELECT"),
2486        }
2487    }
2488
2489    #[test]
2490    fn test_parse_exists() {
2491        let stmt = Parser::new(
2492            "SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2)",
2493        )
2494        .unwrap()
2495        .parse_statement()
2496        .unwrap();
2497        match stmt {
2498            Statement::Select(sel) => {
2499                assert!(sel.where_clause.is_some());
2500            }
2501            _ => panic!("Expected SELECT"),
2502        }
2503    }
2504
2505    #[test]
2506    fn test_parse_window_function() {
2507        let stmt = Parser::new(
2508            "SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp",
2509        )
2510        .unwrap()
2511        .parse_statement()
2512        .unwrap();
2513        match stmt {
2514            Statement::Select(sel) => {
2515                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2516                    if let Expr::Function { over, .. } = expr {
2517                        assert!(over.is_some());
2518                    } else {
2519                        panic!("Expected function");
2520                    }
2521                }
2522            }
2523            _ => panic!("Expected SELECT"),
2524        }
2525    }
2526
2527    #[test]
2528    fn test_parse_multiple_statements() {
2529        let stmts = Parser::new("SELECT 1; SELECT 2;")
2530            .unwrap()
2531            .parse_statements()
2532            .unwrap();
2533        assert_eq!(stmts.len(), 2);
2534    }
2535
2536    #[test]
2537    fn test_parse_insert_select() {
2538        let stmt = Parser::new("INSERT INTO t SELECT * FROM s")
2539            .unwrap()
2540            .parse_statement()
2541            .unwrap();
2542        match stmt {
2543            Statement::Insert(ins) => {
2544                assert!(matches!(ins.source, InsertSource::Query(_)));
2545            }
2546            _ => panic!("Expected INSERT"),
2547        }
2548    }
2549
2550    #[test]
2551    fn test_parse_create_table_constraints() {
2552        let stmt = Parser::new(
2553            "CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE)",
2554        )
2555        .unwrap()
2556        .parse_statement()
2557        .unwrap();
2558        match stmt {
2559            Statement::CreateTable(ct) => {
2560                assert_eq!(ct.columns.len(), 2);
2561                assert!(ct.columns[0].primary_key);
2562                assert!(ct.columns[1].unique);
2563            }
2564            _ => panic!("Expected CREATE TABLE"),
2565        }
2566    }
2567
2568    #[test]
2569    fn test_parse_extract() {
2570        let stmt = Parser::new("SELECT EXTRACT(YEAR FROM created_at) FROM t")
2571            .unwrap()
2572            .parse_statement()
2573            .unwrap();
2574        match stmt {
2575            Statement::Select(sel) => {
2576                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2577                    assert!(matches!(expr, Expr::Extract { .. }));
2578                }
2579            }
2580            _ => panic!("Expected SELECT"),
2581        }
2582    }
2583
2584    #[test]
2585    fn test_parse_postgres_cast() {
2586        let stmt = Parser::new("SELECT x::int FROM t")
2587            .unwrap()
2588            .parse_statement()
2589            .unwrap();
2590        match stmt {
2591            Statement::Select(sel) => {
2592                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
2593                    assert!(matches!(expr, Expr::Cast { .. }));
2594                }
2595            }
2596            _ => panic!("Expected SELECT"),
2597        }
2598    }
2599}