Skip to main content

sqlglot_rust/parser/
sql_parser.rs

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