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