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