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    /// Whether to preserve comments during parsing.
23    #[allow(dead_code)]
24    preserve_comments: bool,
25    /// Accumulated comments pending attachment to the next AST node.
26    pending_comments: Vec<String>,
27}
28
29impl Parser {
30    /// Create a new parser from a SQL string.
31    pub fn new(sql: &str) -> Result<Self> {
32        let mut tokenizer = Tokenizer::new(sql);
33        let tokens = tokenizer.tokenize()?;
34        Ok(Self {
35            tokens,
36            pos: 0,
37            preserve_comments: false,
38            pending_comments: Vec::new(),
39        })
40    }
41
42    /// Create a new parser that preserves SQL comments in the AST.
43    pub fn new_with_comments(sql: &str) -> Result<Self> {
44        let mut tokenizer = Tokenizer::with_comments(sql);
45        let tokens = tokenizer.tokenize()?;
46        Ok(Self {
47            tokens,
48            pos: 0,
49            preserve_comments: true,
50            pending_comments: Vec::new(),
51        })
52    }
53
54    // ── Comment helpers ────────────────────────────────────────────
55
56    /// Consume any comment tokens at the current position, accumulating
57    /// their text into `pending_comments`.
58    fn collect_comments(&mut self) {
59        while self.pos < self.tokens.len() {
60            match self.tokens[self.pos].token_type {
61                TokenType::LineComment | TokenType::BlockComment => {
62                    let token = &self.tokens[self.pos];
63                    self.pending_comments.push(token.value.clone());
64                    self.pos += 1;
65                }
66                _ => break,
67            }
68        }
69    }
70
71    /// Take all pending comments, leaving the buffer empty.
72    fn take_comments(&mut self) -> Vec<String> {
73        std::mem::take(&mut self.pending_comments)
74    }
75
76    // ── Token helpers ──────────────────────────────────────────────
77
78    fn peek(&self) -> &Token {
79        &self.tokens[self.pos.min(self.tokens.len() - 1)]
80    }
81
82    fn peek_type(&self) -> &TokenType {
83        &self.peek().token_type
84    }
85
86    fn advance(&mut self) -> &Token {
87        let token = &self.tokens[self.pos.min(self.tokens.len() - 1)];
88        if self.pos < self.tokens.len() {
89            self.pos += 1;
90        }
91        token
92    }
93
94    fn expect(&mut self, expected: TokenType) -> Result<Token> {
95        let token = self.peek().clone();
96        if token.token_type == expected {
97            self.advance();
98            Ok(token)
99        } else {
100            Err(SqlglotError::ParserError {
101                message: format!(
102                    "Expected {expected:?}, got {:?} ('{}') at line {} col {}",
103                    token.token_type, token.value, token.line, token.col
104                ),
105            })
106        }
107    }
108
109    fn match_token(&mut self, expected: TokenType) -> bool {
110        if self.peek().token_type == expected {
111            self.advance();
112            true
113        } else {
114            false
115        }
116    }
117
118    /// Check if the current token's uppercased value matches a keyword string.
119    fn check_keyword(&self, keyword: &str) -> bool {
120        self.peek().value.to_uppercase() == keyword
121    }
122
123    /// Check if the token at `current + offset` matches a keyword string.
124    fn check_keyword_offset(&self, keyword: &str, offset: usize) -> bool {
125        let idx = self.pos + offset;
126        if idx < self.tokens.len() {
127            self.tokens[idx].value.to_uppercase() == keyword
128        } else {
129            false
130        }
131    }
132
133    /// Match a keyword by string value (for multi-word context-sensitive keywords).
134    fn match_keyword(&mut self, keyword: &str) -> bool {
135        if self.check_keyword(keyword) {
136            self.advance();
137            true
138        } else {
139            false
140        }
141    }
142
143    /// Expect a keyword by string value, returning an error if not found.
144    fn expect_keyword(&mut self, keyword: &str) -> Result<()> {
145        if self.check_keyword(keyword) {
146            self.advance();
147            Ok(())
148        } else {
149            let token = self.peek().clone();
150            Err(SqlglotError::ParserError {
151                message: format!(
152                    "Expected keyword '{keyword}', got '{value}' at line {line} col {col}",
153                    value = token.value,
154                    line = token.line,
155                    col = token.col
156                ),
157            })
158        }
159    }
160
161    /// Helper to check if current token is an identifier or keyword that can serve as a name.
162    fn is_name_token(&self) -> bool {
163        matches!(
164            self.peek_type(),
165            TokenType::Identifier
166                | TokenType::Year
167                | TokenType::Month
168                | TokenType::Day
169                | TokenType::Hour
170                | TokenType::Minute
171                | TokenType::Second
172                | TokenType::Key
173                | TokenType::Filter
174                | TokenType::First
175                | TokenType::Next
176                | TokenType::Only
177                | TokenType::Respect
178                | TokenType::Epoch
179                | TokenType::Schema
180                | TokenType::Database
181                | TokenType::View
182                | TokenType::Collate
183                | TokenType::Comment
184                | TokenType::Left
185                | TokenType::Right
186                | TokenType::Replace
187                | TokenType::Cube
188                | TokenType::Rollup
189                | TokenType::Grouping
190                | TokenType::Pivot
191                | TokenType::Unpivot
192                | TokenType::Sets
193        )
194    }
195
196    /// Consume a name token (identifier or unreserved keyword used as identifier).
197    fn expect_name(&mut self) -> Result<String> {
198        let (name, _) = self.expect_name_with_quote()?;
199        Ok(name)
200    }
201
202    /// Like `expect_name` but also returns the quote style of the token.
203    fn expect_name_with_quote(&mut self) -> Result<(String, QuoteStyle)> {
204        if self.is_name_token() {
205            let token = self.advance().clone();
206            let qs = quote_style_from_char(token.quote_char);
207            return Ok((token.value.clone(), qs));
208        }
209        // Also accept any keyword-like identifier
210        let token = self.peek().clone();
211        if matches!(
212            token.token_type,
213            TokenType::Identifier
214                | TokenType::Int
215                | TokenType::Integer
216                | TokenType::BigInt
217                | TokenType::SmallInt
218                | TokenType::TinyInt
219                | TokenType::Float
220                | TokenType::Double
221                | TokenType::Decimal
222                | TokenType::Numeric
223                | TokenType::Real
224                | TokenType::Varchar
225                | TokenType::Char
226                | TokenType::Text
227                | TokenType::Boolean
228                | TokenType::Date
229                | TokenType::Timestamp
230                | TokenType::TimestampTz
231                | TokenType::Time
232                | TokenType::Interval
233                | TokenType::Blob
234                | TokenType::Bytea
235                | TokenType::Json
236                | TokenType::Jsonb
237                | TokenType::Uuid
238                | TokenType::Array
239                | TokenType::Map
240                | TokenType::Struct
241        ) {
242            let t = self.advance().clone();
243            let qs = quote_style_from_char(t.quote_char);
244            Ok((t.value.clone(), qs))
245        } else {
246            Err(SqlglotError::ParserError {
247                message: format!(
248                    "Expected identifier, got {:?} ('{}') at line {} col {}",
249                    token.token_type, token.value, token.line, token.col
250                ),
251            })
252        }
253    }
254
255    // ── Top-level parsing ──────────────────────────────────────────
256
257    /// Parse a single SQL statement.
258    pub fn parse_statement(&mut self) -> Result<Statement> {
259        self.collect_comments();
260        let stmt = self.parse_statement_inner()?;
261        // Consume trailing semicolons
262        while self.match_token(TokenType::Semicolon) {}
263        Ok(stmt)
264    }
265
266    fn parse_statement_inner(&mut self) -> Result<Statement> {
267        self.collect_comments();
268        let comments = self.take_comments();
269        let mut stmt = match self.peek_type() {
270            TokenType::With => self.parse_with_statement(),
271            TokenType::Select => {
272                let select = self.parse_select_body(vec![])?;
273                self.maybe_parse_set_operation(Statement::Select(select))
274            }
275            TokenType::LParen => {
276                // Could be a parenthesized SELECT
277                let saved_pos = self.pos;
278                self.advance(); // consume '('
279                if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
280                    let inner = self.parse_statement_inner()?;
281                    self.expect(TokenType::RParen)?;
282                    self.maybe_parse_set_operation(inner)
283                } else {
284                    self.pos = saved_pos;
285                    Err(SqlglotError::ParserError {
286                        message: "Expected statement".into(),
287                    })
288                }
289            }
290            TokenType::Insert => self.parse_insert().map(Statement::Insert),
291            TokenType::Update => self.parse_update().map(Statement::Update),
292            TokenType::Delete => self.parse_delete().map(Statement::Delete),
293            TokenType::Merge => self.parse_merge().map(Statement::Merge),
294            TokenType::Create => self.parse_create(),
295            TokenType::Drop => self.parse_drop(),
296            TokenType::Alter => self.parse_alter_table().map(Statement::AlterTable),
297            TokenType::Truncate => self.parse_truncate().map(Statement::Truncate),
298            TokenType::Begin | TokenType::Commit | TokenType::Rollback | TokenType::Savepoint => {
299                self.parse_transaction().map(Statement::Transaction)
300            }
301            TokenType::Explain => self.parse_explain().map(Statement::Explain),
302            TokenType::Use => self.parse_use().map(Statement::Use),
303            _ => Err(SqlglotError::UnexpectedToken {
304                token: self.peek().clone(),
305            }),
306        }?;
307        if !comments.is_empty() {
308            attach_comments_to_statement(&mut stmt, comments);
309        }
310        Ok(stmt)
311    }
312
313    /// Parse multiple statements separated by semicolons.
314    pub fn parse_statements(&mut self) -> Result<Vec<Statement>> {
315        let mut stmts = Vec::new();
316        while !matches!(self.peek_type(), TokenType::Eof) {
317            while self.match_token(TokenType::Semicolon) {}
318            if matches!(self.peek_type(), TokenType::Eof) {
319                break;
320            }
321            stmts.push(self.parse_statement()?);
322        }
323        Ok(stmts)
324    }
325
326    // ── WITH / CTE parsing ─────────────────────────────────────────
327
328    fn parse_with_statement(&mut self) -> Result<Statement> {
329        self.expect(TokenType::With)?;
330        let recursive = self.match_token(TokenType::Recursive);
331        let mut ctes = vec![self.parse_cte(recursive)?];
332        while self.match_token(TokenType::Comma) {
333            ctes.push(self.parse_cte(recursive)?);
334        }
335
336        // Now parse the main query
337        match self.peek_type() {
338            TokenType::Select => {
339                let select = self.parse_select_body(ctes)?;
340                self.maybe_parse_set_operation(Statement::Select(select))
341            }
342            TokenType::Insert => {
343                // WITH ... INSERT is supported in some dialects
344                let ins = self.parse_insert()?;
345                // Attach CTEs if needed (simplification)
346                let _ = ctes; // CTEs with INSERT - we'll handle this later
347                Ok(Statement::Insert(ins))
348            }
349            _ => Err(SqlglotError::ParserError {
350                message: "Expected SELECT or INSERT after WITH clause".into(),
351            }),
352        }
353    }
354
355    fn parse_cte(&mut self, recursive: bool) -> Result<Cte> {
356        let (name, name_quote_style) = self.expect_name_with_quote()?;
357
358        let columns = if self.match_token(TokenType::LParen) {
359            let mut cols = vec![self.expect_name()?];
360            while self.match_token(TokenType::Comma) {
361                cols.push(self.expect_name()?);
362            }
363            self.expect(TokenType::RParen)?;
364            cols
365        } else {
366            vec![]
367        };
368
369        self.expect(TokenType::As)?;
370
371        let materialized = if self.match_keyword("MATERIALIZED") {
372            Some(true)
373        } else if self.check_keyword("NOT") {
374            let saved = self.pos;
375            self.advance();
376            if self.match_keyword("MATERIALIZED") {
377                Some(false)
378            } else {
379                self.pos = saved;
380                None
381            }
382        } else {
383            None
384        };
385
386        self.expect(TokenType::LParen)?;
387        let query = self.parse_statement_inner()?;
388        self.expect(TokenType::RParen)?;
389
390        Ok(Cte {
391            name,
392            name_quote_style,
393            columns,
394            query: Box::new(query),
395            materialized,
396            recursive,
397        })
398    }
399
400    // ── SELECT ──────────────────────────────────────────────────────
401
402    fn parse_select_body(&mut self, ctes: Vec<Cte>) -> Result<SelectStatement> {
403        self.expect(TokenType::Select)?;
404
405        let distinct = self.match_token(TokenType::Distinct);
406
407        // TOP N (SQL Server style)
408        // Use parse_primary() instead of parse_expr() to prevent the parser
409        // from consuming `*` (SELECT all columns) as a multiplication operator.
410        // This correctly handles: TOP 5, TOP 100, TOP (expr), TOP (@var)
411        let top = if self.match_token(TokenType::Top) {
412            Some(Box::new(self.parse_primary()?))
413        } else {
414            None
415        };
416
417        let columns = self.parse_select_items()?;
418
419        let from = if self.match_token(TokenType::From) {
420            Some(FromClause {
421                source: self.parse_table_source()?,
422            })
423        } else {
424            None
425        };
426
427        let joins = self.parse_joins()?;
428
429        let where_clause = if self.match_token(TokenType::Where) {
430            Some(self.parse_expr()?)
431        } else {
432            None
433        };
434
435        let group_by = if self.match_token(TokenType::Group) {
436            self.expect(TokenType::By)?;
437            self.parse_group_by_list()?
438        } else {
439            vec![]
440        };
441
442        let having = if self.match_token(TokenType::Having) {
443            Some(self.parse_expr()?)
444        } else {
445            None
446        };
447
448        let qualify = if self.match_token(TokenType::Qualify) {
449            Some(self.parse_expr()?)
450        } else {
451            None
452        };
453
454        // Named WINDOW definitions
455        let window_definitions = if self.match_token(TokenType::Window) {
456            self.parse_window_definitions()?
457        } else {
458            vec![]
459        };
460
461        let order_by = if self.match_token(TokenType::Order) {
462            self.expect(TokenType::By)?;
463            self.parse_order_by_items()?
464        } else {
465            vec![]
466        };
467
468        let limit = if self.match_token(TokenType::Limit) {
469            Some(self.parse_expr()?)
470        } else {
471            None
472        };
473
474        let offset = if self.match_token(TokenType::Offset) {
475            let expr = self.parse_expr()?;
476            // T-SQL / ANSI SQL:2008 form: OFFSET n ROWS [FETCH …].
477            // Consume the optional ROWS/ROW keyword so FETCH can match next.
478            let _ = self.match_token(TokenType::Rows) || self.match_keyword("ROW");
479            Some(expr)
480        } else {
481            None
482        };
483
484        // FETCH FIRST|NEXT n ROWS ONLY (Oracle / ANSI SQL:2008 / T-SQL)
485        let fetch_first = if self.match_token(TokenType::Fetch) {
486            // consume FIRST or NEXT
487            let _ = self.match_token(TokenType::First) || self.match_token(TokenType::Next);
488            let count = self.parse_expr()?;
489            // consume ROWS or ROW
490            let _ = self.match_keyword("ROWS") || self.match_keyword("ROW");
491            // consume ONLY
492            let _ = self.match_token(TokenType::Only);
493            Some(count)
494        } else {
495            None
496        };
497
498        Ok(SelectStatement {
499            comments: vec![],
500            ctes,
501            distinct,
502            top,
503            columns,
504            from,
505            joins,
506            where_clause,
507            group_by,
508            having,
509            order_by,
510            limit,
511            offset,
512            fetch_first,
513            qualify,
514            window_definitions,
515        })
516    }
517
518    fn parse_window_definitions(&mut self) -> Result<Vec<WindowDefinition>> {
519        let mut defs = Vec::new();
520        loop {
521            let name = self.expect_name()?;
522            self.expect(TokenType::As)?;
523            self.expect(TokenType::LParen)?;
524            let spec = self.parse_window_spec()?;
525            self.expect(TokenType::RParen)?;
526            defs.push(WindowDefinition { name, spec });
527            if !self.match_token(TokenType::Comma) {
528                break;
529            }
530        }
531        Ok(defs)
532    }
533
534    /// Check if we should parse a set operation (UNION / INTERSECT / EXCEPT)
535    fn maybe_parse_set_operation(&mut self, left: Statement) -> Result<Statement> {
536        let op = match self.peek_type() {
537            TokenType::Union => SetOperationType::Union,
538            TokenType::Intersect => SetOperationType::Intersect,
539            TokenType::Except => SetOperationType::Except,
540            _ => return Ok(left),
541        };
542        self.advance();
543
544        let all = self.match_token(TokenType::All);
545        let _ = self.match_token(TokenType::Distinct); // UNION DISTINCT
546
547        let right = self.parse_statement_inner()?;
548
549        // Check for further set operations chaining
550        let combined = Statement::SetOperation(SetOperationStatement {
551            comments: vec![],
552            op,
553            all,
554            left: Box::new(left),
555            right: Box::new(right),
556            order_by: vec![],
557            limit: None,
558            offset: None,
559        });
560
561        // Parse trailing ORDER BY / LIMIT / OFFSET that applies to the whole set operation
562        if matches!(
563            self.peek_type(),
564            TokenType::Union | TokenType::Intersect | TokenType::Except
565        ) {
566            self.maybe_parse_set_operation(combined)
567        } else {
568            // Check for global ORDER BY / LIMIT
569            if let Statement::SetOperation(mut sop) = combined {
570                if self.match_token(TokenType::Order) {
571                    self.expect(TokenType::By)?;
572                    sop.order_by = self.parse_order_by_items()?;
573                }
574                if self.match_token(TokenType::Limit) {
575                    sop.limit = Some(self.parse_expr()?);
576                }
577                if self.match_token(TokenType::Offset) {
578                    sop.offset = Some(self.parse_expr()?);
579                }
580                Ok(Statement::SetOperation(sop))
581            } else {
582                Ok(combined)
583            }
584        }
585    }
586
587    fn parse_select_items(&mut self) -> Result<Vec<SelectItem>> {
588        let mut items = vec![self.parse_select_item()?];
589        while self.match_token(TokenType::Comma) {
590            items.push(self.parse_select_item()?);
591        }
592        Ok(items)
593    }
594
595    fn parse_select_item(&mut self) -> Result<SelectItem> {
596        if self.peek().token_type == TokenType::Star {
597            self.advance();
598            return Ok(SelectItem::Wildcard);
599        }
600
601        let expr = self.parse_expr()?;
602
603        // Check for table.* pattern
604        if let Expr::QualifiedWildcard { ref table } = expr {
605            return Ok(SelectItem::QualifiedWildcard {
606                table: table.clone(),
607            });
608        }
609
610        let (alias, alias_quote_style) = match self.parse_optional_alias()? {
611            Some((name, qs)) => (Some(name), qs),
612            None => (None, QuoteStyle::None),
613        };
614
615        Ok(SelectItem::Expr {
616            expr,
617            alias,
618            alias_quote_style,
619        })
620    }
621
622    fn parse_optional_alias(&mut self) -> Result<Option<(String, QuoteStyle)>> {
623        if self.match_token(TokenType::As) {
624            return Ok(Some(self.expect_name_with_quote()?));
625        }
626        // Implicit alias
627        if self.is_name_token() {
628            let peeked_upper = self.peek().value.to_uppercase();
629            if !matches!(
630                peeked_upper.as_str(),
631                "FROM"
632                    | "WHERE"
633                    | "GROUP"
634                    | "ORDER"
635                    | "LIMIT"
636                    | "HAVING"
637                    | "UNION"
638                    | "INTERSECT"
639                    | "EXCEPT"
640                    | "JOIN"
641                    | "INNER"
642                    | "LEFT"
643                    | "RIGHT"
644                    | "FULL"
645                    | "CROSS"
646                    | "ON"
647                    | "WINDOW"
648                    | "QUALIFY"
649                    | "INTO"
650                    | "SET"
651                    | "RETURNING"
652                    | "PIVOT"
653                    | "UNPIVOT"
654            ) {
655                let token = self.advance().clone();
656                let qs = quote_style_from_char(token.quote_char);
657                return Ok(Some((token.value.clone(), qs)));
658            }
659        }
660        Ok(None)
661    }
662
663    fn parse_table_source(&mut self) -> Result<TableSource> {
664        let source = self.parse_base_table_source()?;
665        // Check for trailing PIVOT / UNPIVOT
666        self.parse_pivot_or_unpivot(source)
667    }
668
669    fn parse_base_table_source(&mut self) -> Result<TableSource> {
670        // LATERAL
671        if self.match_token(TokenType::Lateral) {
672            let source = self.parse_table_source()?;
673            return Ok(TableSource::Lateral {
674                source: Box::new(source),
675            });
676        }
677
678        // UNNEST(expr)
679        if self.match_token(TokenType::Unnest) {
680            self.expect(TokenType::LParen)?;
681            let expr = self.parse_expr()?;
682            self.expect(TokenType::RParen)?;
683            let (alias, alias_quote_style) = match self.parse_optional_alias()? {
684                Some((name, qs)) => (Some(name), qs),
685                None => (None, QuoteStyle::None),
686            };
687            let with_offset = self.match_keyword("WITH") && self.match_keyword("OFFSET");
688            return Ok(TableSource::Unnest {
689                expr: Box::new(expr),
690                alias,
691                alias_quote_style,
692                with_offset,
693            });
694        }
695
696        // Subquery: (SELECT ...)
697        if self.peek_type() == &TokenType::LParen {
698            let saved = self.pos;
699            self.advance();
700            if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
701                let query = self.parse_statement_inner()?;
702                self.expect(TokenType::RParen)?;
703                let (alias, alias_quote_style) = match self.parse_optional_alias()? {
704                    Some((name, qs)) => (Some(name), qs),
705                    None => (None, QuoteStyle::None),
706                };
707                return Ok(TableSource::Subquery {
708                    query: Box::new(query),
709                    alias,
710                    alias_quote_style,
711                });
712            }
713            self.pos = saved;
714        }
715
716        // Regular table reference (possibly with function syntax)
717        let table_ref = self.parse_table_ref()?;
718
719        // Check if it's actually a table function: name(args...)
720        if self.peek_type() == &TokenType::LParen && table_ref.schema.is_none() {
721            self.advance();
722            let args = if self.peek_type() != &TokenType::RParen {
723                self.parse_expr_list()?
724            } else {
725                vec![]
726            };
727            self.expect(TokenType::RParen)?;
728            let (alias, alias_quote_style) = match self.parse_optional_alias()? {
729                Some((name, qs)) => (Some(name), qs),
730                None => (None, QuoteStyle::None),
731            };
732            return Ok(TableSource::TableFunction {
733                name: table_ref.name,
734                args,
735                alias,
736                alias_quote_style,
737            });
738        }
739
740        Ok(TableSource::Table(table_ref))
741    }
742
743    /// After parsing a base table source, check if PIVOT or UNPIVOT follows.
744    fn parse_pivot_or_unpivot(&mut self, source: TableSource) -> Result<TableSource> {
745        if self.match_token(TokenType::Pivot) {
746            self.expect(TokenType::LParen)?;
747            let aggregate = self.parse_expr()?;
748            self.expect_keyword("FOR")?;
749            let for_column = self.expect_name()?;
750            self.expect(TokenType::In)?;
751            self.expect(TokenType::LParen)?;
752            let in_values = self.parse_pivot_values()?;
753            self.expect(TokenType::RParen)?;
754            self.expect(TokenType::RParen)?;
755            let (alias, alias_quote_style) = match self.parse_optional_alias()? {
756                Some((name, qs)) => (Some(name), qs),
757                None => (None, QuoteStyle::None),
758            };
759            return Ok(TableSource::Pivot {
760                source: Box::new(source),
761                aggregate: Box::new(aggregate),
762                for_column,
763                in_values,
764                alias,
765                alias_quote_style,
766            });
767        }
768        if self.match_token(TokenType::Unpivot) {
769            self.expect(TokenType::LParen)?;
770            let value_column = self.expect_name()?;
771            self.expect_keyword("FOR")?;
772            let for_column = self.expect_name()?;
773            self.expect(TokenType::In)?;
774            self.expect(TokenType::LParen)?;
775            let in_columns = self.parse_pivot_values()?;
776            self.expect(TokenType::RParen)?;
777            self.expect(TokenType::RParen)?;
778            let (alias, alias_quote_style) = match self.parse_optional_alias()? {
779                Some((name, qs)) => (Some(name), qs),
780                None => (None, QuoteStyle::None),
781            };
782            return Ok(TableSource::Unpivot {
783                source: Box::new(source),
784                value_column,
785                for_column,
786                in_columns,
787                alias,
788                alias_quote_style,
789            });
790        }
791        Ok(source)
792    }
793
794    /// Parse comma-separated pivot values, each optionally aliased.
795    fn parse_pivot_values(&mut self) -> Result<Vec<PivotValue>> {
796        let mut values = Vec::new();
797        loop {
798            let value = self.parse_expr()?;
799            let (alias, alias_quote_style) = match self.parse_optional_alias()? {
800                Some((name, qs)) => (Some(name), qs),
801                None => (None, QuoteStyle::None),
802            };
803            values.push(PivotValue {
804                value,
805                alias,
806                alias_quote_style,
807            });
808            if !self.match_token(TokenType::Comma) {
809                break;
810            }
811        }
812        Ok(values)
813    }
814
815    fn parse_table_ref(&mut self) -> Result<TableRef> {
816        let (first, first_qs) = self.expect_name_with_quote()?;
817
818        // Check for schema.table or catalog.schema.table
819        let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
820            let (second, second_qs) = self.expect_name_with_quote()?;
821            if self.match_token(TokenType::Dot) {
822                let (third, third_qs) = self.expect_name_with_quote()?;
823                (Some(first), Some(second), third, third_qs)
824            } else {
825                (None, Some(first), second, second_qs)
826            }
827        } else {
828            (None, None, first, first_qs)
829        };
830
831        let (alias, alias_quote_style) = match self.parse_optional_alias()? {
832            Some((name, qs)) => (Some(name), qs),
833            None => (None, QuoteStyle::None),
834        };
835
836        Ok(TableRef {
837            catalog,
838            schema,
839            name,
840            alias,
841            name_quote_style: name_qs,
842            alias_quote_style,
843        })
844    }
845
846    /// Like `parse_table_ref` but does not consume an alias.
847    fn parse_table_ref_no_alias(&mut self) -> Result<TableRef> {
848        let (first, first_qs) = self.expect_name_with_quote()?;
849
850        let (catalog, schema, name, name_qs) = if self.match_token(TokenType::Dot) {
851            let (second, second_qs) = self.expect_name_with_quote()?;
852            if self.match_token(TokenType::Dot) {
853                let (third, third_qs) = self.expect_name_with_quote()?;
854                (Some(first), Some(second), third, third_qs)
855            } else {
856                (None, Some(first), second, second_qs)
857            }
858        } else {
859            (None, None, first, first_qs)
860        };
861
862        Ok(TableRef {
863            catalog,
864            schema,
865            name,
866            alias: None,
867            name_quote_style: name_qs,
868            alias_quote_style: QuoteStyle::None,
869        })
870    }
871
872    fn parse_joins(&mut self) -> Result<Vec<JoinClause>> {
873        let mut joins = Vec::new();
874        loop {
875            let join_type = match self.peek_type() {
876                // `FROM a, b` is treated as `FROM a CROSS JOIN b`. Note the
877                // SQL standard gives comma a lower precedence than explicit
878                // JOIN operators (so `FROM a, b JOIN c ON ...` should be
879                // `a CROSS JOIN (b JOIN c ...)`), but we flatten everything
880                // into a left-deep chain. Column resolution still works for
881                // the common cases since the join order is associative when
882                // ON-clauses only reference adjacent tables.
883                TokenType::Comma => {
884                    self.advance();
885                    JoinType::Cross
886                }
887                TokenType::Join => {
888                    self.advance();
889                    JoinType::Inner
890                }
891                TokenType::Inner => {
892                    self.advance();
893                    self.expect(TokenType::Join)?;
894                    JoinType::Inner
895                }
896                TokenType::Left => {
897                    self.advance();
898                    let _ = self.match_token(TokenType::Outer);
899                    self.expect(TokenType::Join)?;
900                    JoinType::Left
901                }
902                TokenType::Right => {
903                    self.advance();
904                    let _ = self.match_token(TokenType::Outer);
905                    self.expect(TokenType::Join)?;
906                    JoinType::Right
907                }
908                TokenType::Full => {
909                    self.advance();
910                    let _ = self.match_token(TokenType::Outer);
911                    self.expect(TokenType::Join)?;
912                    JoinType::Full
913                }
914                TokenType::Cross => {
915                    self.advance();
916                    self.expect(TokenType::Join)?;
917                    JoinType::Cross
918                }
919                _ => break,
920            };
921
922            let table = self.parse_table_source()?;
923            let mut on = None;
924            let mut using = vec![];
925
926            if self.match_token(TokenType::On) {
927                on = Some(self.parse_expr()?);
928            } else if self.match_token(TokenType::Using) {
929                self.expect(TokenType::LParen)?;
930                using = vec![self.expect_name()?];
931                while self.match_token(TokenType::Comma) {
932                    using.push(self.expect_name()?);
933                }
934                self.expect(TokenType::RParen)?;
935            }
936
937            joins.push(JoinClause {
938                join_type,
939                table,
940                on,
941                using,
942            });
943        }
944        Ok(joins)
945    }
946
947    fn parse_order_by_items(&mut self) -> Result<Vec<OrderByItem>> {
948        let mut items = Vec::new();
949        loop {
950            let expr = self.parse_expr()?;
951            let ascending = if self.match_token(TokenType::Desc) {
952                false
953            } else {
954                let _ = self.match_token(TokenType::Asc);
955                true
956            };
957
958            let nulls_first = if self.match_token(TokenType::Nulls) {
959                if self.match_token(TokenType::First) {
960                    Some(true)
961                } else {
962                    self.expect(TokenType::Identifier)?; // LAST
963                    Some(false)
964                }
965            } else {
966                None
967            };
968
969            items.push(OrderByItem {
970                expr,
971                ascending,
972                nulls_first,
973            });
974            if !self.match_token(TokenType::Comma) {
975                break;
976            }
977        }
978        Ok(items)
979    }
980
981    fn parse_expr_list(&mut self) -> Result<Vec<Expr>> {
982        let mut exprs = vec![self.parse_expr()?];
983        while self.match_token(TokenType::Comma) {
984            exprs.push(self.parse_expr()?);
985        }
986        Ok(exprs)
987    }
988
989    /// Parse a GROUP BY list, which may contain regular expressions,
990    /// CUBE(...), ROLLUP(...), and GROUPING SETS(...).
991    fn parse_group_by_list(&mut self) -> Result<Vec<Expr>> {
992        let mut items = vec![self.parse_group_by_item()?];
993        while self.match_token(TokenType::Comma) {
994            items.push(self.parse_group_by_item()?);
995        }
996        Ok(items)
997    }
998
999    /// Parse a single GROUP BY item: a CUBE, ROLLUP, GROUPING SETS, or regular expression.
1000    fn parse_group_by_item(&mut self) -> Result<Expr> {
1001        match self.peek_type() {
1002            TokenType::Cube => {
1003                self.advance();
1004                self.expect(TokenType::LParen)?;
1005                let exprs = if self.peek_type() == &TokenType::RParen {
1006                    vec![]
1007                } else {
1008                    self.parse_group_by_element_list()?
1009                };
1010                self.expect(TokenType::RParen)?;
1011                Ok(Expr::Cube { exprs })
1012            }
1013            TokenType::Rollup => {
1014                self.advance();
1015                self.expect(TokenType::LParen)?;
1016                let exprs = if self.peek_type() == &TokenType::RParen {
1017                    vec![]
1018                } else {
1019                    self.parse_group_by_element_list()?
1020                };
1021                self.expect(TokenType::RParen)?;
1022                Ok(Expr::Rollup { exprs })
1023            }
1024            TokenType::Grouping => {
1025                // Could be GROUPING SETS or GROUPING() function
1026                let saved = self.pos;
1027                self.advance();
1028                if self.peek_type() == &TokenType::Sets {
1029                    // GROUPING SETS (...)
1030                    self.advance();
1031                    self.expect(TokenType::LParen)?;
1032                    let sets = self.parse_grouping_sets_elements()?;
1033                    self.expect(TokenType::RParen)?;
1034                    Ok(Expr::GroupingSets { sets })
1035                } else {
1036                    // It's the GROUPING() function, backtrack and parse as expression
1037                    self.pos = saved;
1038                    self.parse_expr()
1039                }
1040            }
1041            _ => self.parse_expr(),
1042        }
1043    }
1044
1045    /// Parse elements inside CUBE(...) or ROLLUP(...).
1046    /// Each element can be a single expression or a parenthesized tuple of expressions.
1047    fn parse_group_by_element_list(&mut self) -> Result<Vec<Expr>> {
1048        let mut items = vec![self.parse_group_by_element()?];
1049        while self.match_token(TokenType::Comma) {
1050            items.push(self.parse_group_by_element()?);
1051        }
1052        Ok(items)
1053    }
1054
1055    /// Parse a single element inside CUBE/ROLLUP: either `expr` or `(expr, expr, ...)`.
1056    fn parse_group_by_element(&mut self) -> Result<Expr> {
1057        if self.peek_type() == &TokenType::LParen {
1058            self.advance();
1059            let exprs = self.parse_expr_list()?;
1060            self.expect(TokenType::RParen)?;
1061            if exprs.len() == 1 {
1062                Ok(Expr::Nested(Box::new(exprs.into_iter().next().unwrap())))
1063            } else {
1064                Ok(Expr::Tuple(exprs))
1065            }
1066        } else {
1067            self.parse_expr()
1068        }
1069    }
1070
1071    /// Parse elements inside GROUPING SETS (...).
1072    /// Each element can be: (), (expr, ...), CUBE(...), ROLLUP(...), or a single expr.
1073    fn parse_grouping_sets_elements(&mut self) -> Result<Vec<Expr>> {
1074        let mut items = vec![self.parse_grouping_sets_element()?];
1075        while self.match_token(TokenType::Comma) {
1076            items.push(self.parse_grouping_sets_element()?);
1077        }
1078        Ok(items)
1079    }
1080
1081    /// Parse a single GROUPING SETS element.
1082    fn parse_grouping_sets_element(&mut self) -> Result<Expr> {
1083        match self.peek_type() {
1084            TokenType::Cube => {
1085                self.advance();
1086                self.expect(TokenType::LParen)?;
1087                let exprs = if self.peek_type() == &TokenType::RParen {
1088                    vec![]
1089                } else {
1090                    self.parse_group_by_element_list()?
1091                };
1092                self.expect(TokenType::RParen)?;
1093                Ok(Expr::Cube { exprs })
1094            }
1095            TokenType::Rollup => {
1096                self.advance();
1097                self.expect(TokenType::LParen)?;
1098                let exprs = if self.peek_type() == &TokenType::RParen {
1099                    vec![]
1100                } else {
1101                    self.parse_group_by_element_list()?
1102                };
1103                self.expect(TokenType::RParen)?;
1104                Ok(Expr::Rollup { exprs })
1105            }
1106            TokenType::LParen => {
1107                self.advance();
1108                if self.peek_type() == &TokenType::RParen {
1109                    // Empty grouping set: ()
1110                    self.advance();
1111                    Ok(Expr::Tuple(vec![]))
1112                } else {
1113                    let exprs = self.parse_expr_list()?;
1114                    self.expect(TokenType::RParen)?;
1115                    if exprs.len() == 1 {
1116                        Ok(Expr::Nested(Box::new(exprs.into_iter().next().unwrap())))
1117                    } else {
1118                        Ok(Expr::Tuple(exprs))
1119                    }
1120                }
1121            }
1122            _ => self.parse_expr(),
1123        }
1124    }
1125
1126    // ── INSERT ──────────────────────────────────────────────────────
1127
1128    fn parse_insert(&mut self) -> Result<InsertStatement> {
1129        self.expect(TokenType::Insert)?;
1130        let _ = self.match_token(TokenType::Into);
1131        let table = self.parse_table_ref()?;
1132
1133        let columns = if self.match_token(TokenType::LParen) {
1134            let mut cols = vec![self.expect_name()?];
1135            while self.match_token(TokenType::Comma) {
1136                cols.push(self.expect_name()?);
1137            }
1138            self.expect(TokenType::RParen)?;
1139            cols
1140        } else {
1141            vec![]
1142        };
1143
1144        let source = if self.match_token(TokenType::Values) {
1145            let mut rows = Vec::new();
1146            loop {
1147                self.expect(TokenType::LParen)?;
1148                let row = self.parse_expr_list()?;
1149                self.expect(TokenType::RParen)?;
1150                rows.push(row);
1151                if !self.match_token(TokenType::Comma) {
1152                    break;
1153                }
1154            }
1155            InsertSource::Values(rows)
1156        } else if matches!(
1157            self.peek_type(),
1158            TokenType::Select | TokenType::With | TokenType::LParen
1159        ) {
1160            InsertSource::Query(Box::new(self.parse_statement_inner()?))
1161        } else if self.match_token(TokenType::Default) {
1162            self.expect(TokenType::Values)?;
1163            InsertSource::Default
1164        } else {
1165            return Err(SqlglotError::ParserError {
1166                message: "Expected VALUES, SELECT, or DEFAULT VALUES after INSERT".into(),
1167            });
1168        };
1169
1170        // ON CONFLICT
1171        let on_conflict = if self.match_token(TokenType::On) {
1172            if self.match_token(TokenType::Conflict) {
1173                let columns = if self.match_token(TokenType::LParen) {
1174                    let mut cols = vec![self.expect_name()?];
1175                    while self.match_token(TokenType::Comma) {
1176                        cols.push(self.expect_name()?);
1177                    }
1178                    self.expect(TokenType::RParen)?;
1179                    cols
1180                } else {
1181                    vec![]
1182                };
1183                self.expect(TokenType::Do)?;
1184                let action = if self.match_token(TokenType::Nothing) {
1185                    ConflictAction::DoNothing
1186                } else {
1187                    self.expect(TokenType::Update)?;
1188                    self.expect(TokenType::Set)?;
1189                    let mut assignments = Vec::new();
1190                    loop {
1191                        let col = self.expect_name()?;
1192                        self.expect(TokenType::Eq)?;
1193                        let val = self.parse_expr()?;
1194                        assignments.push((col, val));
1195                        if !self.match_token(TokenType::Comma) {
1196                            break;
1197                        }
1198                    }
1199                    ConflictAction::DoUpdate(assignments)
1200                };
1201                Some(OnConflict { columns, action })
1202            } else {
1203                None
1204            }
1205        } else {
1206            None
1207        };
1208
1209        let returning = if self.match_token(TokenType::Returning) {
1210            self.parse_select_items()?
1211        } else {
1212            vec![]
1213        };
1214
1215        Ok(InsertStatement {
1216            comments: vec![],
1217            table,
1218            columns,
1219            source,
1220            on_conflict,
1221            returning,
1222        })
1223    }
1224
1225    // ── UPDATE ──────────────────────────────────────────────────────
1226
1227    fn parse_update(&mut self) -> Result<UpdateStatement> {
1228        self.expect(TokenType::Update)?;
1229        let table = self.parse_table_ref()?;
1230        self.expect(TokenType::Set)?;
1231
1232        let mut assignments = Vec::new();
1233        loop {
1234            let col = self.expect_name()?;
1235            self.expect(TokenType::Eq)?;
1236            let val = self.parse_expr()?;
1237            assignments.push((col, val));
1238            if !self.match_token(TokenType::Comma) {
1239                break;
1240            }
1241        }
1242
1243        let from = if self.match_token(TokenType::From) {
1244            Some(FromClause {
1245                source: self.parse_table_source()?,
1246            })
1247        } else {
1248            None
1249        };
1250
1251        let where_clause = if self.match_token(TokenType::Where) {
1252            Some(self.parse_expr()?)
1253        } else {
1254            None
1255        };
1256
1257        let returning = if self.match_token(TokenType::Returning) {
1258            self.parse_select_items()?
1259        } else {
1260            vec![]
1261        };
1262
1263        Ok(UpdateStatement {
1264            comments: vec![],
1265            table,
1266            assignments,
1267            from,
1268            where_clause,
1269            returning,
1270        })
1271    }
1272
1273    // ── DELETE ──────────────────────────────────────────────────────
1274
1275    fn parse_delete(&mut self) -> Result<DeleteStatement> {
1276        self.expect(TokenType::Delete)?;
1277        self.expect(TokenType::From)?;
1278        let table = self.parse_table_ref()?;
1279
1280        let using = if self.match_token(TokenType::Using) {
1281            Some(FromClause {
1282                source: self.parse_table_source()?,
1283            })
1284        } else {
1285            None
1286        };
1287
1288        let where_clause = if self.match_token(TokenType::Where) {
1289            Some(self.parse_expr()?)
1290        } else {
1291            None
1292        };
1293
1294        let returning = if self.match_token(TokenType::Returning) {
1295            self.parse_select_items()?
1296        } else {
1297            vec![]
1298        };
1299
1300        Ok(DeleteStatement {
1301            comments: vec![],
1302            table,
1303            using,
1304            where_clause,
1305            returning,
1306        })
1307    }
1308
1309    // ── MERGE ───────────────────────────────────────────────────────
1310
1311    fn parse_merge(&mut self) -> Result<MergeStatement> {
1312        self.expect(TokenType::Merge)?;
1313        let _ = self.match_token(TokenType::Into);
1314        let target = self.parse_table_ref()?;
1315
1316        self.expect(TokenType::Using)?;
1317        let source = self.parse_table_source()?;
1318
1319        self.expect(TokenType::On)?;
1320        let on = self.parse_expr()?;
1321
1322        let mut clauses = Vec::new();
1323        while self.match_token(TokenType::When) {
1324            clauses.push(self.parse_merge_clause()?);
1325        }
1326
1327        if clauses.is_empty() {
1328            return Err(SqlglotError::ParserError {
1329                message: "MERGE requires at least one WHEN clause".into(),
1330            });
1331        }
1332
1333        // OUTPUT clause (T-SQL extension)
1334        let output = if self.match_keyword("OUTPUT") {
1335            self.parse_select_items()?
1336        } else {
1337            vec![]
1338        };
1339
1340        Ok(MergeStatement {
1341            comments: vec![],
1342            target,
1343            source,
1344            on,
1345            clauses,
1346            output,
1347        })
1348    }
1349
1350    fn parse_merge_clause(&mut self) -> Result<MergeClause> {
1351        let kind = if self.match_token(TokenType::Not) {
1352            self.expect(TokenType::Matched)?;
1353            if self.match_keyword("BY") {
1354                if self.match_keyword("SOURCE") {
1355                    MergeClauseKind::NotMatchedBySource
1356                } else {
1357                    // BY TARGET is the default / explicit form
1358                    let _ = self.match_keyword("TARGET");
1359                    MergeClauseKind::NotMatched
1360                }
1361            } else {
1362                MergeClauseKind::NotMatched
1363            }
1364        } else {
1365            self.expect(TokenType::Matched)?;
1366            MergeClauseKind::Matched
1367        };
1368
1369        let condition = if self.match_token(TokenType::And) {
1370            Some(self.parse_expr()?)
1371        } else {
1372            None
1373        };
1374
1375        self.expect(TokenType::Then)?;
1376
1377        let action = self.parse_merge_action(&kind)?;
1378
1379        Ok(MergeClause {
1380            kind,
1381            condition,
1382            action,
1383        })
1384    }
1385
1386    fn parse_merge_action(&mut self, kind: &MergeClauseKind) -> Result<MergeAction> {
1387        if self.match_token(TokenType::Update) {
1388            self.expect(TokenType::Set)?;
1389            let mut assignments = Vec::new();
1390            loop {
1391                let mut col = self.expect_name()?;
1392                // Support dotted column names like target.col
1393                while self.match_token(TokenType::Dot) {
1394                    col.push('.');
1395                    col.push_str(&self.expect_name()?);
1396                }
1397                self.expect(TokenType::Eq)?;
1398                let val = self.parse_expr()?;
1399                assignments.push((col, val));
1400                if !self.match_token(TokenType::Comma) {
1401                    break;
1402                }
1403            }
1404            Ok(MergeAction::Update(assignments))
1405        } else if self.match_token(TokenType::Insert) {
1406            // INSERT ROW (BigQuery)
1407            if self.match_keyword("ROW") {
1408                return Ok(MergeAction::InsertRow);
1409            }
1410
1411            let columns = if self.match_token(TokenType::LParen) {
1412                let mut cols = vec![self.expect_name()?];
1413                while self.match_token(TokenType::Comma) {
1414                    cols.push(self.expect_name()?);
1415                }
1416                self.expect(TokenType::RParen)?;
1417                cols
1418            } else {
1419                vec![]
1420            };
1421
1422            self.expect(TokenType::Values)?;
1423            self.expect(TokenType::LParen)?;
1424            let values = self.parse_expr_list()?;
1425            self.expect(TokenType::RParen)?;
1426
1427            Ok(MergeAction::Insert { columns, values })
1428        } else if self.match_token(TokenType::Delete) {
1429            Ok(MergeAction::Delete)
1430        } else {
1431            Err(SqlglotError::ParserError {
1432                message: format!(
1433                    "Expected UPDATE, INSERT, or DELETE after WHEN {} THEN",
1434                    match kind {
1435                        MergeClauseKind::Matched => "MATCHED",
1436                        MergeClauseKind::NotMatched => "NOT MATCHED",
1437                        MergeClauseKind::NotMatchedBySource => "NOT MATCHED BY SOURCE",
1438                    }
1439                ),
1440            })
1441        }
1442    }
1443
1444    // ── CREATE ──────────────────────────────────────────────────────
1445
1446    fn parse_create(&mut self) -> Result<Statement> {
1447        self.expect(TokenType::Create)?;
1448
1449        let or_replace = if self.check_keyword("OR") {
1450            self.advance();
1451            self.expect(TokenType::Replace)?;
1452            true
1453        } else {
1454            false
1455        };
1456
1457        let temporary = self.match_token(TokenType::Temporary) || self.match_token(TokenType::Temp);
1458
1459        let materialized = self.match_token(TokenType::Materialized);
1460
1461        if self.match_token(TokenType::View) {
1462            return self
1463                .parse_create_view(or_replace, materialized)
1464                .map(Statement::CreateView);
1465        }
1466
1467        self.expect(TokenType::Table)?;
1468
1469        let if_not_exists = if self.match_token(TokenType::If) {
1470            self.expect(TokenType::Not)?;
1471            self.expect(TokenType::Exists)?;
1472            true
1473        } else {
1474            false
1475        };
1476
1477        let table = self.parse_table_ref_no_alias()?;
1478
1479        // CREATE TABLE ... AS SELECT ...
1480        if self.match_token(TokenType::As) {
1481            let query = self.parse_statement_inner()?;
1482            return Ok(Statement::CreateTable(CreateTableStatement {
1483                comments: vec![],
1484                if_not_exists,
1485                temporary,
1486                table,
1487                columns: vec![],
1488                constraints: vec![],
1489                as_select: Some(Box::new(query)),
1490            }));
1491        }
1492
1493        self.expect(TokenType::LParen)?;
1494
1495        let mut columns = Vec::new();
1496        let mut constraints = Vec::new();
1497
1498        loop {
1499            // Check for table-level constraints
1500            if matches!(
1501                self.peek_type(),
1502                TokenType::Primary
1503                    | TokenType::Unique
1504                    | TokenType::Foreign
1505                    | TokenType::Check
1506                    | TokenType::Constraint
1507            ) {
1508                constraints.push(self.parse_table_constraint()?);
1509            } else if self.peek_type() != &TokenType::RParen {
1510                columns.push(self.parse_column_def()?);
1511            }
1512
1513            if !self.match_token(TokenType::Comma) {
1514                break;
1515            }
1516        }
1517        self.expect(TokenType::RParen)?;
1518
1519        Ok(Statement::CreateTable(CreateTableStatement {
1520            comments: vec![],
1521            if_not_exists,
1522            temporary,
1523            table,
1524            columns,
1525            constraints,
1526            as_select: None,
1527        }))
1528    }
1529
1530    fn parse_create_view(
1531        &mut self,
1532        or_replace: bool,
1533        materialized: bool,
1534    ) -> Result<CreateViewStatement> {
1535        let if_not_exists = if self.match_token(TokenType::If) {
1536            self.expect(TokenType::Not)?;
1537            self.expect(TokenType::Exists)?;
1538            true
1539        } else {
1540            false
1541        };
1542
1543        // Parse name without alias (so AS is not consumed as an alias)
1544        let name = self.parse_table_ref_no_alias()?;
1545
1546        let columns = if self.match_token(TokenType::LParen) {
1547            let mut cols = vec![self.expect_name()?];
1548            while self.match_token(TokenType::Comma) {
1549                cols.push(self.expect_name()?);
1550            }
1551            self.expect(TokenType::RParen)?;
1552            cols
1553        } else {
1554            vec![]
1555        };
1556
1557        self.expect(TokenType::As)?;
1558        let query = self.parse_statement_inner()?;
1559
1560        Ok(CreateViewStatement {
1561            comments: vec![],
1562            name,
1563            columns,
1564            query: Box::new(query),
1565            or_replace,
1566            materialized,
1567            if_not_exists,
1568        })
1569    }
1570
1571    fn parse_table_constraint(&mut self) -> Result<TableConstraint> {
1572        let name = if self.match_token(TokenType::Constraint) {
1573            Some(self.expect_name()?)
1574        } else {
1575            None
1576        };
1577
1578        if self.match_token(TokenType::Primary) {
1579            self.expect(TokenType::Key)?;
1580            self.expect(TokenType::LParen)?;
1581            let columns = self.parse_name_list()?;
1582            self.expect(TokenType::RParen)?;
1583            Ok(TableConstraint::PrimaryKey { name, columns })
1584        } else if self.match_token(TokenType::Unique) {
1585            self.expect(TokenType::LParen)?;
1586            let columns = self.parse_name_list()?;
1587            self.expect(TokenType::RParen)?;
1588            Ok(TableConstraint::Unique { name, columns })
1589        } else if self.match_token(TokenType::Foreign) {
1590            self.expect(TokenType::Key)?;
1591            self.expect(TokenType::LParen)?;
1592            let columns = self.parse_name_list()?;
1593            self.expect(TokenType::RParen)?;
1594            self.expect(TokenType::References)?;
1595            let ref_table = self.parse_table_ref()?;
1596            self.expect(TokenType::LParen)?;
1597            let ref_columns = self.parse_name_list()?;
1598            self.expect(TokenType::RParen)?;
1599
1600            let on_delete =
1601                if self.match_token(TokenType::On) && self.match_token(TokenType::Delete) {
1602                    Some(self.parse_referential_action()?)
1603                } else {
1604                    None
1605                };
1606            let on_update =
1607                if self.match_token(TokenType::On) && self.match_token(TokenType::Update) {
1608                    Some(self.parse_referential_action()?)
1609                } else {
1610                    None
1611                };
1612
1613            Ok(TableConstraint::ForeignKey {
1614                name,
1615                columns,
1616                ref_table,
1617                ref_columns,
1618                on_delete,
1619                on_update,
1620            })
1621        } else if self.match_token(TokenType::Check) {
1622            self.expect(TokenType::LParen)?;
1623            let expr = self.parse_expr()?;
1624            self.expect(TokenType::RParen)?;
1625            Ok(TableConstraint::Check { name, expr })
1626        } else {
1627            Err(SqlglotError::ParserError {
1628                message: "Expected constraint type".into(),
1629            })
1630        }
1631    }
1632
1633    fn parse_referential_action(&mut self) -> Result<ReferentialAction> {
1634        if self.match_token(TokenType::Cascade) {
1635            Ok(ReferentialAction::Cascade)
1636        } else if self.match_token(TokenType::Restrict) {
1637            Ok(ReferentialAction::Restrict)
1638        } else if self.match_token(TokenType::Set) {
1639            if self.match_token(TokenType::Null) {
1640                Ok(ReferentialAction::SetNull)
1641            } else if self.match_token(TokenType::Default) {
1642                Ok(ReferentialAction::SetDefault)
1643            } else {
1644                Err(SqlglotError::ParserError {
1645                    message: "Expected NULL or DEFAULT after SET".into(),
1646                })
1647            }
1648        } else if self.check_keyword("NO") {
1649            self.advance();
1650            self.expect(TokenType::Identifier)?; // ACTION
1651            Ok(ReferentialAction::NoAction)
1652        } else {
1653            Err(SqlglotError::ParserError {
1654                message: "Expected referential action (CASCADE, RESTRICT, SET NULL, SET DEFAULT, NO ACTION)".into(),
1655            })
1656        }
1657    }
1658
1659    fn parse_name_list(&mut self) -> Result<Vec<String>> {
1660        let mut names = vec![self.expect_name()?];
1661        while self.match_token(TokenType::Comma) {
1662            names.push(self.expect_name()?);
1663        }
1664        Ok(names)
1665    }
1666
1667    fn parse_column_def(&mut self) -> Result<ColumnDef> {
1668        let name = self.expect_name()?;
1669        let data_type = self.parse_data_type()?;
1670
1671        let mut nullable = None;
1672        let mut default = None;
1673        let mut primary_key = false;
1674        let mut unique = false;
1675        let mut auto_increment = false;
1676        let mut collation = None;
1677        let mut comment = None;
1678
1679        loop {
1680            if self.match_token(TokenType::Not) {
1681                self.expect(TokenType::Null)?;
1682                nullable = Some(false);
1683            } else if self.peek_type() == &TokenType::Null {
1684                self.advance();
1685                nullable = Some(true);
1686            } else if self.match_token(TokenType::Default) {
1687                default = Some(self.parse_expr()?);
1688            } else if self.match_token(TokenType::Primary) {
1689                self.expect(TokenType::Key)?;
1690                primary_key = true;
1691            } else if self.match_token(TokenType::Unique) {
1692                unique = true;
1693            } else if self.match_token(TokenType::AutoIncrement) {
1694                auto_increment = true;
1695            } else if self.match_token(TokenType::Collate) {
1696                collation = Some(self.expect_name()?);
1697            } else if self.match_token(TokenType::Comment) {
1698                let tok = self.expect(TokenType::String)?;
1699                comment = Some(tok.value);
1700            } else if self.match_token(TokenType::References) {
1701                // Inline foreign key — skip for now
1702                let _ = self.parse_table_ref()?;
1703                if self.match_token(TokenType::LParen) {
1704                    while !self.match_token(TokenType::RParen) {
1705                        self.advance();
1706                    }
1707                }
1708            } else {
1709                break;
1710            }
1711        }
1712
1713        Ok(ColumnDef {
1714            name,
1715            data_type,
1716            nullable,
1717            default,
1718            primary_key,
1719            unique,
1720            auto_increment,
1721            collation,
1722            comment,
1723        })
1724    }
1725
1726    fn parse_data_type(&mut self) -> Result<DataType> {
1727        let token = self.peek().clone();
1728        let type_result = match &token.token_type {
1729            TokenType::Int | TokenType::Integer => {
1730                self.advance();
1731                Ok(DataType::Int)
1732            }
1733            TokenType::BigInt => {
1734                self.advance();
1735                Ok(DataType::BigInt)
1736            }
1737            TokenType::SmallInt => {
1738                self.advance();
1739                Ok(DataType::SmallInt)
1740            }
1741            TokenType::TinyInt => {
1742                self.advance();
1743                Ok(DataType::TinyInt)
1744            }
1745            TokenType::Float => {
1746                self.advance();
1747                Ok(DataType::Float)
1748            }
1749            TokenType::Double => {
1750                self.advance();
1751                let _ = self.match_keyword("PRECISION");
1752                Ok(DataType::Double)
1753            }
1754            TokenType::Real => {
1755                self.advance();
1756                Ok(DataType::Real)
1757            }
1758            TokenType::Decimal | TokenType::Numeric => {
1759                let is_numeric = token.token_type == TokenType::Numeric;
1760                self.advance();
1761                let (precision, scale) = self.parse_type_params()?;
1762                if is_numeric {
1763                    Ok(DataType::Numeric { precision, scale })
1764                } else {
1765                    Ok(DataType::Decimal { precision, scale })
1766                }
1767            }
1768            TokenType::Varchar => {
1769                self.advance();
1770                let len = self.parse_single_type_param()?;
1771                Ok(DataType::Varchar(len))
1772            }
1773            TokenType::Char => {
1774                self.advance();
1775                let len = self.parse_single_type_param()?;
1776                Ok(DataType::Char(len))
1777            }
1778            TokenType::Text => {
1779                self.advance();
1780                Ok(DataType::Text)
1781            }
1782            TokenType::Boolean => {
1783                self.advance();
1784                Ok(DataType::Boolean)
1785            }
1786            TokenType::Date => {
1787                self.advance();
1788                Ok(DataType::Date)
1789            }
1790            TokenType::Timestamp => {
1791                self.advance();
1792                let precision = self.parse_single_type_param()?;
1793                let with_tz = if self.match_keyword("WITH") {
1794                    let _ = self.match_keyword("TIME");
1795                    let _ = self.match_keyword("ZONE");
1796                    true
1797                } else if self.match_keyword("WITHOUT") {
1798                    let _ = self.match_keyword("TIME");
1799                    let _ = self.match_keyword("ZONE");
1800                    false
1801                } else {
1802                    false
1803                };
1804                Ok(DataType::Timestamp { precision, with_tz })
1805            }
1806            TokenType::TimestampTz => {
1807                self.advance();
1808                let precision = self.parse_single_type_param()?;
1809                Ok(DataType::Timestamp {
1810                    precision,
1811                    with_tz: true,
1812                })
1813            }
1814            TokenType::Time => {
1815                self.advance();
1816                let precision = self.parse_single_type_param()?;
1817                Ok(DataType::Time { precision })
1818            }
1819            TokenType::Interval => {
1820                self.advance();
1821                Ok(DataType::Interval)
1822            }
1823            TokenType::Blob => {
1824                self.advance();
1825                Ok(DataType::Blob)
1826            }
1827            TokenType::Bytea => {
1828                self.advance();
1829                Ok(DataType::Bytea)
1830            }
1831            TokenType::Json => {
1832                self.advance();
1833                Ok(DataType::Json)
1834            }
1835            TokenType::Jsonb => {
1836                self.advance();
1837                Ok(DataType::Jsonb)
1838            }
1839            TokenType::Uuid => {
1840                self.advance();
1841                Ok(DataType::Uuid)
1842            }
1843            TokenType::Array => {
1844                self.advance();
1845                if self.match_token(TokenType::Lt) {
1846                    let inner = self.parse_data_type()?;
1847                    self.expect(TokenType::Gt)?;
1848                    Ok(DataType::Array(Some(Box::new(inner))))
1849                } else {
1850                    Ok(DataType::Array(None))
1851                }
1852            }
1853            TokenType::Identifier => {
1854                let name = token.value.to_uppercase();
1855                self.advance();
1856                match name.as_str() {
1857                    "STRING" => Ok(DataType::String),
1858                    "BINARY" => {
1859                        let len = self.parse_single_type_param()?;
1860                        Ok(DataType::Binary(len))
1861                    }
1862                    "VARBINARY" => {
1863                        let len = self.parse_single_type_param()?;
1864                        Ok(DataType::Varbinary(len))
1865                    }
1866                    "DATETIME" => Ok(DataType::DateTime),
1867                    "BYTES" => Ok(DataType::Bytes),
1868                    "VARIANT" => Ok(DataType::Variant),
1869                    "OBJECT" => Ok(DataType::Object),
1870                    "XML" => Ok(DataType::Xml),
1871                    "INET" => Ok(DataType::Inet),
1872                    "CIDR" => Ok(DataType::Cidr),
1873                    "MACADDR" => Ok(DataType::Macaddr),
1874                    "BIT" => {
1875                        let len = self.parse_single_type_param()?;
1876                        Ok(DataType::Bit(len))
1877                    }
1878                    "MONEY" => Ok(DataType::Money),
1879                    "SERIAL" => Ok(DataType::Serial),
1880                    "BIGSERIAL" => Ok(DataType::BigSerial),
1881                    "SMALLSERIAL" => Ok(DataType::SmallSerial),
1882                    "REGCLASS" => Ok(DataType::Regclass),
1883                    "REGTYPE" => Ok(DataType::Regtype),
1884                    "HSTORE" => Ok(DataType::Hstore),
1885                    "GEOGRAPHY" => Ok(DataType::Geography),
1886                    "GEOMETRY" => Ok(DataType::Geometry),
1887                    "SUPER" => Ok(DataType::Super),
1888                    _ => Ok(DataType::Unknown(name)),
1889                }
1890            }
1891            _ => Err(SqlglotError::ParserError {
1892                message: format!("Expected data type, got {:?}", token.token_type),
1893            }),
1894        };
1895
1896        // PostgreSQL opt_array_bounds: typename[], typename[N], typename[][]...
1897        let mut dt = type_result?;
1898        while self.match_token(TokenType::LBracket) {
1899            // Consume optional integer bound (PostgreSQL ignores it but accepts it)
1900            let _ = self.match_token(TokenType::Number);
1901            self.expect(TokenType::RBracket)?;
1902            dt = DataType::Array(Some(Box::new(dt)));
1903        }
1904        Ok(dt)
1905    }
1906
1907    fn parse_type_params(&mut self) -> Result<(Option<u32>, Option<u32>)> {
1908        if self.match_token(TokenType::LParen) {
1909            let p: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1910            let s = if self.match_token(TokenType::Comma) {
1911                self.expect(TokenType::Number)?.value.parse().ok()
1912            } else {
1913                None
1914            };
1915            self.expect(TokenType::RParen)?;
1916            Ok((p, s))
1917        } else {
1918            Ok((None, None))
1919        }
1920    }
1921
1922    fn parse_single_type_param(&mut self) -> Result<Option<u32>> {
1923        if self.match_token(TokenType::LParen) {
1924            // Handle TSQL MAX keyword (e.g. VARBINARY(MAX), VARCHAR(MAX))
1925            if self.check_keyword("MAX") {
1926                self.advance(); // consume MAX
1927                self.expect(TokenType::RParen)?;
1928                return Ok(None);
1929            }
1930            let n: Option<u32> = self.expect(TokenType::Number)?.value.parse().ok();
1931            self.expect(TokenType::RParen)?;
1932            Ok(n)
1933        } else {
1934            Ok(None)
1935        }
1936    }
1937
1938    // ── DROP ────────────────────────────────────────────────────────
1939
1940    fn parse_drop(&mut self) -> Result<Statement> {
1941        self.expect(TokenType::Drop)?;
1942
1943        if self.match_token(TokenType::Materialized) {
1944            self.expect(TokenType::View)?;
1945            let if_exists = if self.match_token(TokenType::If) {
1946                self.expect(TokenType::Exists)?;
1947                true
1948            } else {
1949                false
1950            };
1951            let name = self.parse_table_ref()?;
1952            return Ok(Statement::DropView(DropViewStatement {
1953                comments: vec![],
1954                name,
1955                if_exists,
1956                materialized: true,
1957            }));
1958        }
1959
1960        if self.match_token(TokenType::View) {
1961            let if_exists = if self.match_token(TokenType::If) {
1962                self.expect(TokenType::Exists)?;
1963                true
1964            } else {
1965                false
1966            };
1967            let name = self.parse_table_ref()?;
1968            return Ok(Statement::DropView(DropViewStatement {
1969                comments: vec![],
1970                name,
1971                if_exists,
1972                materialized: false,
1973            }));
1974        }
1975
1976        self.expect(TokenType::Table)?;
1977
1978        let if_exists = if self.match_token(TokenType::If) {
1979            self.expect(TokenType::Exists)?;
1980            true
1981        } else {
1982            false
1983        };
1984
1985        let table = self.parse_table_ref()?;
1986        let cascade = self.match_token(TokenType::Cascade);
1987
1988        Ok(Statement::DropTable(DropTableStatement {
1989            comments: vec![],
1990            if_exists,
1991            table,
1992            cascade,
1993        }))
1994    }
1995
1996    // ── ALTER TABLE ─────────────────────────────────────────────────
1997
1998    fn parse_alter_table(&mut self) -> Result<AlterTableStatement> {
1999        self.expect(TokenType::Alter)?;
2000        self.expect(TokenType::Table)?;
2001        let table = self.parse_table_ref_no_alias()?;
2002
2003        let mut actions = Vec::new();
2004        loop {
2005            let action = self.parse_alter_action()?;
2006            actions.push(action);
2007            if !self.match_token(TokenType::Comma) {
2008                break;
2009            }
2010        }
2011
2012        Ok(AlterTableStatement {
2013            comments: vec![],
2014            table,
2015            actions,
2016        })
2017    }
2018
2019    fn parse_alter_action(&mut self) -> Result<AlterTableAction> {
2020        if self.match_keyword("ADD") {
2021            if matches!(
2022                self.peek_type(),
2023                TokenType::Constraint
2024                    | TokenType::Primary
2025                    | TokenType::Unique
2026                    | TokenType::Foreign
2027                    | TokenType::Check
2028            ) {
2029                let constraint = self.parse_table_constraint()?;
2030                Ok(AlterTableAction::AddConstraint(constraint))
2031            } else {
2032                let _ = self.match_keyword("COLUMN");
2033                let col = self.parse_column_def()?;
2034                Ok(AlterTableAction::AddColumn(col))
2035            }
2036        } else if self.match_token(TokenType::Drop) {
2037            let _ = self.match_keyword("COLUMN");
2038            let if_exists = if self.match_token(TokenType::If) {
2039                self.expect(TokenType::Exists)?;
2040                true
2041            } else {
2042                false
2043            };
2044            let name = self.expect_name()?;
2045            Ok(AlterTableAction::DropColumn { name, if_exists })
2046        } else if self.match_keyword("RENAME") {
2047            if self.match_keyword("COLUMN") {
2048                let old_name = self.expect_name()?;
2049                self.expect(TokenType::Identifier)?; // TO
2050                let new_name = self.expect_name()?;
2051                Ok(AlterTableAction::RenameColumn { old_name, new_name })
2052            } else if self.match_keyword("TO") {
2053                let new_name = self.expect_name()?;
2054                Ok(AlterTableAction::RenameTable { new_name })
2055            } else {
2056                Err(SqlglotError::ParserError {
2057                    message: "Expected COLUMN or TO after RENAME".into(),
2058                })
2059            }
2060        } else {
2061            Err(SqlglotError::ParserError {
2062                message: "Expected ADD, DROP, or RENAME in ALTER TABLE".into(),
2063            })
2064        }
2065    }
2066
2067    // ── TRUNCATE ────────────────────────────────────────────────────
2068
2069    fn parse_truncate(&mut self) -> Result<TruncateStatement> {
2070        self.expect(TokenType::Truncate)?;
2071        let _ = self.match_token(TokenType::Table);
2072        let table = self.parse_table_ref()?;
2073        Ok(TruncateStatement {
2074            comments: vec![],
2075            table,
2076        })
2077    }
2078
2079    // ── Transaction ─────────────────────────────────────────────────
2080
2081    fn parse_transaction(&mut self) -> Result<TransactionStatement> {
2082        match self.peek_type() {
2083            TokenType::Begin => {
2084                self.advance();
2085                let _ = self.match_token(TokenType::Transaction);
2086                Ok(TransactionStatement::Begin)
2087            }
2088            TokenType::Commit => {
2089                self.advance();
2090                let _ = self.match_token(TokenType::Transaction);
2091                Ok(TransactionStatement::Commit)
2092            }
2093            TokenType::Rollback => {
2094                self.advance();
2095                let _ = self.match_token(TokenType::Transaction);
2096                if self.match_keyword("TO") {
2097                    let _ = self.match_token(TokenType::Savepoint);
2098                    let name = self.expect_name()?;
2099                    Ok(TransactionStatement::RollbackTo(name))
2100                } else {
2101                    Ok(TransactionStatement::Rollback)
2102                }
2103            }
2104            TokenType::Savepoint => {
2105                self.advance();
2106                let name = self.expect_name()?;
2107                Ok(TransactionStatement::Savepoint(name))
2108            }
2109            _ => Err(SqlglotError::ParserError {
2110                message: "Expected transaction statement".into(),
2111            }),
2112        }
2113    }
2114
2115    // ── EXPLAIN ─────────────────────────────────────────────────────
2116
2117    fn parse_explain(&mut self) -> Result<ExplainStatement> {
2118        self.expect(TokenType::Explain)?;
2119        let analyze = self.match_token(TokenType::Analyze);
2120        let statement = self.parse_statement_inner()?;
2121        Ok(ExplainStatement {
2122            comments: vec![],
2123            analyze,
2124            statement: Box::new(statement),
2125        })
2126    }
2127
2128    // ── USE ─────────────────────────────────────────────────────────
2129
2130    fn parse_use(&mut self) -> Result<UseStatement> {
2131        self.expect(TokenType::Use)?;
2132        let name = self.expect_name()?;
2133        Ok(UseStatement {
2134            comments: vec![],
2135            name,
2136        })
2137    }
2138
2139    // ══════════════════════════════════════════════════════════════
2140    // Expression parsing (precedence climbing)
2141    // ══════════════════════════════════════════════════════════════
2142
2143    fn parse_expr(&mut self) -> Result<Expr> {
2144        self.parse_or_expr()
2145    }
2146
2147    fn parse_or_expr(&mut self) -> Result<Expr> {
2148        let mut left = self.parse_and_expr()?;
2149        while self.match_token(TokenType::Or) {
2150            let right = self.parse_and_expr()?;
2151            left = Expr::BinaryOp {
2152                left: Box::new(left),
2153                op: BinaryOperator::Or,
2154                right: Box::new(right),
2155            };
2156        }
2157        Ok(left)
2158    }
2159
2160    fn parse_and_expr(&mut self) -> Result<Expr> {
2161        let mut left = self.parse_not_expr()?;
2162        while self.match_token(TokenType::And) {
2163            let right = self.parse_not_expr()?;
2164            left = Expr::BinaryOp {
2165                left: Box::new(left),
2166                op: BinaryOperator::And,
2167                right: Box::new(right),
2168            };
2169        }
2170        Ok(left)
2171    }
2172
2173    fn parse_not_expr(&mut self) -> Result<Expr> {
2174        if self.match_token(TokenType::Not) {
2175            let expr = self.parse_not_expr()?;
2176            Ok(Expr::UnaryOp {
2177                op: UnaryOperator::Not,
2178                expr: Box::new(expr),
2179            })
2180        } else {
2181            self.parse_comparison()
2182        }
2183    }
2184
2185    fn parse_comparison(&mut self) -> Result<Expr> {
2186        let mut left = self.parse_addition()?;
2187
2188        loop {
2189            let op = match self.peek_type() {
2190                TokenType::Eq => Some(BinaryOperator::Eq),
2191                TokenType::Neq => Some(BinaryOperator::Neq),
2192                TokenType::Lt => Some(BinaryOperator::Lt),
2193                TokenType::Gt => Some(BinaryOperator::Gt),
2194                TokenType::LtEq => Some(BinaryOperator::LtEq),
2195                TokenType::GtEq => Some(BinaryOperator::GtEq),
2196                _ => None,
2197            };
2198
2199            if let Some(op) = op {
2200                self.advance();
2201                if matches!(self.peek_type(), TokenType::Any | TokenType::Some) {
2202                    self.advance();
2203                    self.expect(TokenType::LParen)?;
2204                    let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2205                        Expr::Subquery(Box::new(self.parse_statement_inner()?))
2206                    } else {
2207                        self.parse_expr()?
2208                    };
2209                    self.expect(TokenType::RParen)?;
2210                    left = Expr::AnyOp {
2211                        expr: Box::new(left),
2212                        op,
2213                        right: Box::new(right),
2214                    };
2215                } else if self.peek_type() == &TokenType::All {
2216                    self.advance();
2217                    self.expect(TokenType::LParen)?;
2218                    let right = if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2219                        Expr::Subquery(Box::new(self.parse_statement_inner()?))
2220                    } else {
2221                        self.parse_expr()?
2222                    };
2223                    self.expect(TokenType::RParen)?;
2224                    left = Expr::AllOp {
2225                        expr: Box::new(left),
2226                        op,
2227                        right: Box::new(right),
2228                    };
2229                } else {
2230                    let right = self.parse_addition()?;
2231                    left = Expr::BinaryOp {
2232                        left: Box::new(left),
2233                        op,
2234                        right: Box::new(right),
2235                    };
2236                }
2237            } else if self.peek_type() == &TokenType::Is {
2238                self.advance();
2239                let negated = self.match_token(TokenType::Not);
2240                if self.match_token(TokenType::True) {
2241                    left = Expr::IsBool {
2242                        expr: Box::new(left),
2243                        value: true,
2244                        negated,
2245                    };
2246                } else if self.match_token(TokenType::False) {
2247                    left = Expr::IsBool {
2248                        expr: Box::new(left),
2249                        value: false,
2250                        negated,
2251                    };
2252                } else {
2253                    self.expect(TokenType::Null)?;
2254                    left = Expr::IsNull {
2255                        expr: Box::new(left),
2256                        negated,
2257                    };
2258                }
2259            } else if matches!(
2260                self.peek_type(),
2261                TokenType::Not
2262                    | TokenType::In
2263                    | TokenType::Like
2264                    | TokenType::ILike
2265                    | TokenType::Between
2266            ) {
2267                // Peek ahead: if NOT, only consume it if followed by IN/LIKE/ILIKE/BETWEEN
2268                if self.peek_type() == &TokenType::Not {
2269                    let saved_pos = self.pos;
2270                    self.advance(); // consume NOT
2271                    if !matches!(
2272                        self.peek_type(),
2273                        TokenType::In | TokenType::Like | TokenType::ILike | TokenType::Between
2274                    ) {
2275                        // NOT is not part of a comparison predicate — restore position
2276                        self.pos = saved_pos;
2277                        break;
2278                    }
2279                    // NOT was consumed, negated = true
2280                }
2281                let negated =
2282                    self.pos > 0 && self.tokens[self.pos - 1].token_type == TokenType::Not;
2283
2284                if self.match_token(TokenType::In) {
2285                    self.expect(TokenType::LParen)?;
2286                    // Check for subquery
2287                    if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2288                        let subquery = self.parse_statement_inner()?;
2289                        self.expect(TokenType::RParen)?;
2290                        left = Expr::InSubquery {
2291                            expr: Box::new(left),
2292                            subquery: Box::new(subquery),
2293                            negated,
2294                        };
2295                    } else {
2296                        let list = self.parse_expr_list()?;
2297                        self.expect(TokenType::RParen)?;
2298                        left = Expr::InList {
2299                            expr: Box::new(left),
2300                            list,
2301                            negated,
2302                        };
2303                    }
2304                } else if self.match_token(TokenType::Like) {
2305                    let pattern = self.parse_addition()?;
2306                    let escape = if self.match_token(TokenType::Escape) {
2307                        Some(Box::new(self.parse_primary()?))
2308                    } else {
2309                        None
2310                    };
2311                    left = Expr::Like {
2312                        expr: Box::new(left),
2313                        pattern: Box::new(pattern),
2314                        negated,
2315                        escape,
2316                    };
2317                } else if self.match_token(TokenType::ILike) {
2318                    let pattern = self.parse_addition()?;
2319                    let escape = if self.match_token(TokenType::Escape) {
2320                        Some(Box::new(self.parse_primary()?))
2321                    } else {
2322                        None
2323                    };
2324                    left = Expr::ILike {
2325                        expr: Box::new(left),
2326                        pattern: Box::new(pattern),
2327                        negated,
2328                        escape,
2329                    };
2330                } else if self.match_token(TokenType::Between) {
2331                    let low = self.parse_addition()?;
2332                    self.expect(TokenType::And)?;
2333                    let high = self.parse_addition()?;
2334                    left = Expr::Between {
2335                        expr: Box::new(left),
2336                        low: Box::new(low),
2337                        high: Box::new(high),
2338                        negated,
2339                    };
2340                } else {
2341                    break;
2342                }
2343            } else if self.check_keyword("SIMILAR") {
2344                // SIMILAR TO pattern [ESCAPE escape_char]
2345                self.advance(); // consume SIMILAR
2346                self.expect_keyword("TO")?;
2347                let pattern = self.parse_addition()?;
2348                let escape = if self.match_token(TokenType::Escape) {
2349                    Some(Box::new(self.parse_primary()?))
2350                } else {
2351                    None
2352                };
2353                left = Expr::SimilarTo {
2354                    expr: Box::new(left),
2355                    pattern: Box::new(pattern),
2356                    negated: false,
2357                    escape,
2358                };
2359            } else if self.peek_type() == &TokenType::Not && self.check_keyword_offset("SIMILAR", 1)
2360            {
2361                // NOT SIMILAR TO pattern [ESCAPE escape_char]
2362                self.advance(); // consume NOT
2363                self.advance(); // consume SIMILAR
2364                self.expect_keyword("TO")?;
2365                let pattern = self.parse_addition()?;
2366                let escape = if self.match_token(TokenType::Escape) {
2367                    Some(Box::new(self.parse_primary()?))
2368                } else {
2369                    None
2370                };
2371                left = Expr::SimilarTo {
2372                    expr: Box::new(left),
2373                    pattern: Box::new(pattern),
2374                    negated: true,
2375                    escape,
2376                };
2377            } else {
2378                break;
2379            }
2380        }
2381
2382        Ok(left)
2383    }
2384
2385    fn parse_addition(&mut self) -> Result<Expr> {
2386        let mut left = self.parse_multiplication()?;
2387        loop {
2388            let op = match self.peek_type() {
2389                TokenType::Plus => Some(BinaryOperator::Plus),
2390                TokenType::Minus => Some(BinaryOperator::Minus),
2391                TokenType::Concat => Some(BinaryOperator::Concat),
2392                TokenType::BitwiseOr => Some(BinaryOperator::BitwiseOr),
2393                TokenType::BitwiseXor => Some(BinaryOperator::BitwiseXor),
2394                TokenType::ShiftLeft => Some(BinaryOperator::ShiftLeft),
2395                TokenType::ShiftRight => Some(BinaryOperator::ShiftRight),
2396                _ => None,
2397            };
2398            if let Some(op) = op {
2399                self.advance();
2400                let right = self.parse_multiplication()?;
2401                left = Expr::BinaryOp {
2402                    left: Box::new(left),
2403                    op,
2404                    right: Box::new(right),
2405                };
2406            } else {
2407                break;
2408            }
2409        }
2410        Ok(left)
2411    }
2412
2413    fn parse_multiplication(&mut self) -> Result<Expr> {
2414        let mut left = self.parse_unary()?;
2415        loop {
2416            let op = match self.peek_type() {
2417                TokenType::Star => Some(BinaryOperator::Multiply),
2418                TokenType::Slash => Some(BinaryOperator::Divide),
2419                TokenType::Percent2 => Some(BinaryOperator::Modulo),
2420                TokenType::BitwiseAnd => Some(BinaryOperator::BitwiseAnd),
2421                _ => None,
2422            };
2423            if let Some(op) = op {
2424                self.advance();
2425                let right = self.parse_unary()?;
2426                left = Expr::BinaryOp {
2427                    left: Box::new(left),
2428                    op,
2429                    right: Box::new(right),
2430                };
2431            } else {
2432                break;
2433            }
2434        }
2435        Ok(left)
2436    }
2437
2438    fn parse_unary(&mut self) -> Result<Expr> {
2439        match self.peek_type() {
2440            TokenType::Minus => {
2441                self.advance();
2442                let expr = self.parse_postfix()?;
2443                Ok(Expr::UnaryOp {
2444                    op: UnaryOperator::Minus,
2445                    expr: Box::new(expr),
2446                })
2447            }
2448            TokenType::Plus => {
2449                self.advance();
2450                let expr = self.parse_postfix()?;
2451                Ok(Expr::UnaryOp {
2452                    op: UnaryOperator::Plus,
2453                    expr: Box::new(expr),
2454                })
2455            }
2456            TokenType::BitwiseNot => {
2457                self.advance();
2458                let expr = self.parse_postfix()?;
2459                Ok(Expr::UnaryOp {
2460                    op: UnaryOperator::BitwiseNot,
2461                    expr: Box::new(expr),
2462                })
2463            }
2464            _ => self.parse_postfix(),
2465        }
2466    }
2467
2468    /// Parse postfix operators: `::type`, `[index]`, `->`, `->>`
2469    fn parse_postfix(&mut self) -> Result<Expr> {
2470        let mut expr = self.parse_primary()?;
2471
2472        loop {
2473            if self.match_token(TokenType::DoubleColon) {
2474                // PostgreSQL-style cast: expr::type
2475                let data_type = self.parse_data_type()?;
2476                expr = Expr::Cast {
2477                    expr: Box::new(expr),
2478                    data_type,
2479                };
2480            } else if self.match_token(TokenType::LBracket) {
2481                // Array index: expr[index]
2482                let index = self.parse_expr()?;
2483                self.expect(TokenType::RBracket)?;
2484                expr = Expr::ArrayIndex {
2485                    expr: Box::new(expr),
2486                    index: Box::new(index),
2487                };
2488            } else if self.match_token(TokenType::Arrow) {
2489                let path = self.parse_primary()?;
2490                expr = Expr::JsonAccess {
2491                    expr: Box::new(expr),
2492                    path: Box::new(path),
2493                    as_text: false,
2494                };
2495            } else if self.match_token(TokenType::DoubleArrow) {
2496                let path = self.parse_primary()?;
2497                expr = Expr::JsonAccess {
2498                    expr: Box::new(expr),
2499                    path: Box::new(path),
2500                    as_text: true,
2501                };
2502            } else {
2503                break;
2504            }
2505        }
2506
2507        // Check for window function: expr OVER (...)
2508        if self.match_token(TokenType::Over) {
2509            let spec = if self.match_token(TokenType::LParen) {
2510                let ws = self.parse_window_spec()?;
2511                self.expect(TokenType::RParen)?;
2512                ws
2513            } else {
2514                // Named window reference
2515                let wref = self.expect_name()?;
2516                WindowSpec {
2517                    window_ref: Some(wref),
2518                    partition_by: vec![],
2519                    order_by: vec![],
2520                    frame: None,
2521                }
2522            };
2523            match expr {
2524                Expr::Function {
2525                    name,
2526                    args,
2527                    distinct,
2528                    filter,
2529                    ..
2530                } => {
2531                    expr = Expr::Function {
2532                        name,
2533                        args,
2534                        distinct,
2535                        filter,
2536                        over: Some(spec),
2537                    };
2538                }
2539                Expr::TypedFunction { func, filter, .. } => {
2540                    expr = Expr::TypedFunction {
2541                        func,
2542                        filter,
2543                        over: Some(spec),
2544                    };
2545                }
2546                _ => {}
2547            }
2548        }
2549
2550        // FILTER (WHERE ...) for aggregate functions
2551        if self.match_token(TokenType::Filter) {
2552            self.expect(TokenType::LParen)?;
2553            self.expect(TokenType::Where)?;
2554            let filter_expr = self.parse_expr()?;
2555            self.expect(TokenType::RParen)?;
2556            match expr {
2557                Expr::Function {
2558                    name,
2559                    args,
2560                    distinct,
2561                    over,
2562                    ..
2563                } => {
2564                    expr = Expr::Function {
2565                        name,
2566                        args,
2567                        distinct,
2568                        filter: Some(Box::new(filter_expr)),
2569                        over,
2570                    };
2571                }
2572                Expr::TypedFunction { func, over, .. } => {
2573                    expr = Expr::TypedFunction {
2574                        func,
2575                        filter: Some(Box::new(filter_expr)),
2576                        over,
2577                    };
2578                }
2579                _ => {}
2580            }
2581        }
2582
2583        Ok(expr)
2584    }
2585
2586    fn parse_window_spec(&mut self) -> Result<WindowSpec> {
2587        let window_ref = if self.is_name_token()
2588            && !matches!(
2589                self.peek_type(),
2590                TokenType::Partition | TokenType::Order | TokenType::Rows | TokenType::Range
2591            ) {
2592            let saved = self.pos;
2593            let name = self.expect_name()?;
2594            // Check if it's actually a keyword we need
2595            if matches!(
2596                self.peek_type(),
2597                TokenType::RParen
2598                    | TokenType::Partition
2599                    | TokenType::Order
2600                    | TokenType::Rows
2601                    | TokenType::Range
2602            ) {
2603                Some(name)
2604            } else {
2605                self.pos = saved;
2606                None
2607            }
2608        } else {
2609            None
2610        };
2611
2612        let partition_by = if self.match_token(TokenType::Partition) {
2613            self.expect(TokenType::By)?;
2614            self.parse_expr_list()?
2615        } else {
2616            vec![]
2617        };
2618
2619        let order_by = if self.match_token(TokenType::Order) {
2620            self.expect(TokenType::By)?;
2621            self.parse_order_by_items()?
2622        } else {
2623            vec![]
2624        };
2625
2626        let frame = if matches!(self.peek_type(), TokenType::Rows | TokenType::Range) {
2627            Some(self.parse_window_frame()?)
2628        } else {
2629            None
2630        };
2631
2632        Ok(WindowSpec {
2633            window_ref,
2634            partition_by,
2635            order_by,
2636            frame,
2637        })
2638    }
2639
2640    fn parse_window_frame(&mut self) -> Result<WindowFrame> {
2641        let kind = if self.match_token(TokenType::Rows) {
2642            WindowFrameKind::Rows
2643        } else if self.match_token(TokenType::Range) {
2644            WindowFrameKind::Range
2645        } else {
2646            WindowFrameKind::Rows
2647        };
2648
2649        if self.match_keyword("BETWEEN") {
2650            let start = self.parse_window_frame_bound()?;
2651            self.expect(TokenType::And)?;
2652            let end = self.parse_window_frame_bound()?;
2653            Ok(WindowFrame {
2654                kind,
2655                start,
2656                end: Some(end),
2657            })
2658        } else {
2659            let start = self.parse_window_frame_bound()?;
2660            Ok(WindowFrame {
2661                kind,
2662                start,
2663                end: None,
2664            })
2665        }
2666    }
2667
2668    fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound> {
2669        if self.check_keyword("CURRENT") {
2670            self.advance();
2671            let _ = self.match_keyword("ROW");
2672            Ok(WindowFrameBound::CurrentRow)
2673        } else if self.match_token(TokenType::Unbounded) {
2674            if self.match_token(TokenType::Preceding) {
2675                Ok(WindowFrameBound::Preceding(None))
2676            } else {
2677                self.expect(TokenType::Following)?;
2678                Ok(WindowFrameBound::Following(None))
2679            }
2680        } else {
2681            let n = self.parse_expr()?;
2682            if self.match_token(TokenType::Preceding) {
2683                Ok(WindowFrameBound::Preceding(Some(Box::new(n))))
2684            } else {
2685                self.expect(TokenType::Following)?;
2686                Ok(WindowFrameBound::Following(Some(Box::new(n))))
2687            }
2688        }
2689    }
2690
2691    fn parse_primary(&mut self) -> Result<Expr> {
2692        let token = self.peek().clone();
2693
2694        match &token.token_type {
2695            TokenType::Number => {
2696                self.advance();
2697                Ok(Expr::Number(token.value))
2698            }
2699            TokenType::String => {
2700                self.advance();
2701                Ok(Expr::StringLiteral(token.value))
2702            }
2703            TokenType::NationalString => {
2704                self.advance();
2705                Ok(Expr::NationalStringLiteral(token.value))
2706            }
2707            TokenType::True => {
2708                self.advance();
2709                Ok(Expr::Boolean(true))
2710            }
2711            TokenType::False => {
2712                self.advance();
2713                Ok(Expr::Boolean(false))
2714            }
2715            TokenType::Null => {
2716                self.advance();
2717                Ok(Expr::Null)
2718            }
2719            TokenType::Default => {
2720                self.advance();
2721                Ok(Expr::Default)
2722            }
2723            TokenType::Star => {
2724                self.advance();
2725                Ok(Expr::Wildcard)
2726            }
2727            TokenType::Parameter => {
2728                self.advance();
2729                Ok(Expr::Parameter(token.value))
2730            }
2731
2732            // ── CAST ────────────────────────────────────────────────
2733            TokenType::Cast => {
2734                self.advance();
2735                self.expect(TokenType::LParen)?;
2736                let expr = self.parse_expr()?;
2737                self.expect(TokenType::As)?;
2738                let data_type = self.parse_data_type()?;
2739                self.expect(TokenType::RParen)?;
2740                Ok(Expr::Cast {
2741                    expr: Box::new(expr),
2742                    data_type,
2743                })
2744            }
2745
2746            // ── EXTRACT ─────────────────────────────────────────────
2747            TokenType::Extract => {
2748                self.advance();
2749                self.expect(TokenType::LParen)?;
2750                let field = self.parse_datetime_field()?;
2751                self.expect(TokenType::From)?;
2752                let expr = self.parse_expr()?;
2753                self.expect(TokenType::RParen)?;
2754                Ok(Expr::Extract {
2755                    field,
2756                    expr: Box::new(expr),
2757                })
2758            }
2759
2760            // ── CASE ────────────────────────────────────────────────
2761            TokenType::Case => self.parse_case_expr(),
2762
2763            // ── EXISTS ──────────────────────────────────────────────
2764            TokenType::Exists => {
2765                self.advance();
2766                self.expect(TokenType::LParen)?;
2767                let subquery = self.parse_statement_inner()?;
2768                self.expect(TokenType::RParen)?;
2769                Ok(Expr::Exists {
2770                    subquery: Box::new(subquery),
2771                    negated: false,
2772                })
2773            }
2774
2775            // ── NOT EXISTS ──────────────────────────────────────────
2776            TokenType::Not
2777                if {
2778                    let next_pos = self.pos + 1;
2779                    next_pos < self.tokens.len()
2780                        && self.tokens[next_pos].token_type == TokenType::Exists
2781                } =>
2782            {
2783                self.advance(); // NOT
2784                self.advance(); // EXISTS
2785                self.expect(TokenType::LParen)?;
2786                let subquery = self.parse_statement_inner()?;
2787                self.expect(TokenType::RParen)?;
2788                Ok(Expr::Exists {
2789                    subquery: Box::new(subquery),
2790                    negated: true,
2791                })
2792            }
2793
2794            // ── INTERVAL ────────────────────────────────────────────
2795            TokenType::Interval => {
2796                self.advance();
2797                let value = self.parse_primary()?;
2798                let unit = self.try_parse_datetime_field();
2799                Ok(Expr::Interval {
2800                    value: Box::new(value),
2801                    unit,
2802                })
2803            }
2804
2805            // ── Parenthesized expression or subquery ────────────────
2806            TokenType::LParen => {
2807                self.advance();
2808                // Check for subquery
2809                if matches!(self.peek_type(), TokenType::Select | TokenType::With) {
2810                    let subquery = self.parse_statement_inner()?;
2811                    self.expect(TokenType::RParen)?;
2812                    Ok(Expr::Subquery(Box::new(subquery)))
2813                } else {
2814                    let expr = self.parse_expr()?;
2815                    // Tuple: (a, b, c)
2816                    if self.match_token(TokenType::Comma) {
2817                        let mut items = vec![expr];
2818                        items.push(self.parse_expr()?);
2819                        while self.match_token(TokenType::Comma) {
2820                            items.push(self.parse_expr()?);
2821                        }
2822                        self.expect(TokenType::RParen)?;
2823                        Ok(Expr::Tuple(items))
2824                    } else {
2825                        self.expect(TokenType::RParen)?;
2826                        Ok(Expr::Nested(Box::new(expr)))
2827                    }
2828                }
2829            }
2830
2831            // ── Array literal: ARRAY[...] ──────────────────────────
2832            TokenType::Array => {
2833                self.advance();
2834                if self.match_token(TokenType::LBracket) {
2835                    let items = if self.peek_type() != &TokenType::RBracket {
2836                        self.parse_expr_list()?
2837                    } else {
2838                        vec![]
2839                    };
2840                    self.expect(TokenType::RBracket)?;
2841                    Ok(Expr::ArrayLiteral(items))
2842                } else if self.match_token(TokenType::LParen) {
2843                    // ARRAY(SELECT ...)
2844                    let subquery = self.parse_statement_inner()?;
2845                    self.expect(TokenType::RParen)?;
2846                    Ok(Expr::Subquery(Box::new(subquery)))
2847                } else {
2848                    Ok(Expr::Column {
2849                        table: None,
2850                        name: "ARRAY".to_string(),
2851                        quote_style: QuoteStyle::None,
2852                        table_quote_style: QuoteStyle::None,
2853                    })
2854                }
2855            }
2856
2857            // ── Bracket array literal: [...] ────────────────────────
2858            TokenType::LBracket => {
2859                self.advance();
2860                let items = if self.peek_type() != &TokenType::RBracket {
2861                    self.parse_expr_list()?
2862                } else {
2863                    vec![]
2864                };
2865                self.expect(TokenType::RBracket)?;
2866                Ok(Expr::ArrayLiteral(items))
2867            }
2868
2869            // ── Identifier: column ref, function call, or qualified name ─
2870            _ if self.is_name_token() || self.is_data_type_token() => {
2871                let name_token = self.advance().clone();
2872                let name = name_token.value.clone();
2873                let name_qs = quote_style_from_char(name_token.quote_char);
2874
2875                // ── ANSI typed string literals: DATE 'x', TIMESTAMP 'x', TIME 'x' ──
2876                if matches!(
2877                    name_token.token_type,
2878                    TokenType::Date
2879                        | TokenType::Timestamp
2880                        | TokenType::TimestampTz
2881                        | TokenType::Time
2882                ) && self.peek_type() == &TokenType::String
2883                {
2884                    let value_token = self.advance().clone();
2885                    let data_type = match name_token.token_type {
2886                        TokenType::Date => DataType::Date,
2887                        TokenType::Timestamp => DataType::Timestamp {
2888                            precision: None,
2889                            with_tz: false,
2890                        },
2891                        TokenType::TimestampTz => DataType::Timestamp {
2892                            precision: None,
2893                            with_tz: true,
2894                        },
2895                        TokenType::Time => DataType::Time { precision: None },
2896                        _ => unreachable!(),
2897                    };
2898                    return Ok(Expr::Cast {
2899                        expr: Box::new(Expr::StringLiteral(value_token.value)),
2900                        data_type,
2901                    });
2902                }
2903
2904                // ── Bare niladic temporal keywords: CURRENT_TIME, CURRENT_DATE,
2905                //    CURRENT_TIMESTAMP, LOCALTIMESTAMP (no parens) ──
2906                // ANSI SQL allows these without parentheses. Materialize them
2907                // as typed functions so the generator can emit dialect-specific
2908                // forms (e.g. TSQL requires CAST(GETDATE() AS TIME) rather than
2909                // a bare CURRENT_TIME reserved word).
2910                if name_qs == QuoteStyle::None && self.peek_type() != &TokenType::LParen {
2911                    let upper = name.to_ascii_uppercase();
2912                    let typed = match upper.as_str() {
2913                        "CURRENT_DATE" => Some(TypedFunction::CurrentDate),
2914                        "CURRENT_TIME" => Some(TypedFunction::CurrentTime),
2915                        "CURRENT_TIMESTAMP" | "LOCALTIMESTAMP" => {
2916                            Some(TypedFunction::CurrentTimestamp)
2917                        }
2918                        _ => None,
2919                    };
2920                    if let Some(tf) = typed {
2921                        return Ok(Expr::TypedFunction {
2922                            func: tf,
2923                            filter: None,
2924                            over: None,
2925                        });
2926                    }
2927                }
2928
2929                // Function call: name(...)
2930                if self.peek_type() == &TokenType::LParen {
2931                    self.advance();
2932
2933                    // Special: COUNT(*), COUNT(DISTINCT x)
2934                    let distinct = self.match_token(TokenType::Distinct);
2935
2936                    // MySQL's GROUP_CONCAT has bespoke grammar
2937                    // (ORDER BY ..., SEPARATOR ...) — parse it into a typed
2938                    // expression so the structure is preserved across dialects.
2939                    if name.eq_ignore_ascii_case("GROUP_CONCAT") {
2940                        let expr = self.parse_group_concat_call(distinct)?;
2941                        self.expect(TokenType::RParen)?;
2942                        return Ok(expr);
2943                    }
2944
2945                    let args = if self.peek_type() == &TokenType::RParen {
2946                        vec![]
2947                    } else if self.peek_type() == &TokenType::Star {
2948                        self.advance();
2949                        vec![Expr::Wildcard]
2950                    } else {
2951                        self.parse_expr_list()?
2952                    };
2953                    self.expect(TokenType::RParen)?;
2954
2955                    // Try to construct a typed function variant
2956                    if let Some(typed) = Self::try_typed_function(&name, args.clone(), distinct) {
2957                        Ok(typed)
2958                    } else {
2959                        Ok(Expr::Function {
2960                            name,
2961                            args,
2962                            distinct,
2963                            filter: None,
2964                            over: None,
2965                        })
2966                    }
2967                }
2968                // Qualified column: table.column or table.*
2969                else if self.match_token(TokenType::Dot) {
2970                    if self.peek_type() == &TokenType::Star {
2971                        self.advance();
2972                        Ok(Expr::QualifiedWildcard { table: name })
2973                    } else {
2974                        let (col, col_qs) = self.expect_name_with_quote()?;
2975                        Ok(Expr::Column {
2976                            table: Some(name),
2977                            name: col,
2978                            quote_style: col_qs,
2979                            table_quote_style: name_qs,
2980                        })
2981                    }
2982                } else {
2983                    Ok(Expr::Column {
2984                        table: None,
2985                        name,
2986                        quote_style: name_qs,
2987                        table_quote_style: QuoteStyle::None,
2988                    })
2989                }
2990            }
2991
2992            _ => Err(SqlglotError::UnexpectedToken { token }),
2993        }
2994    }
2995
2996    fn is_data_type_token(&self) -> bool {
2997        matches!(
2998            self.peek_type(),
2999            TokenType::Int
3000                | TokenType::Integer
3001                | TokenType::BigInt
3002                | TokenType::SmallInt
3003                | TokenType::TinyInt
3004                | TokenType::Float
3005                | TokenType::Double
3006                | TokenType::Decimal
3007                | TokenType::Numeric
3008                | TokenType::Real
3009                | TokenType::Varchar
3010                | TokenType::Char
3011                | TokenType::Text
3012                | TokenType::Boolean
3013                | TokenType::Date
3014                | TokenType::Timestamp
3015                | TokenType::TimestampTz
3016                | TokenType::Time
3017                | TokenType::Interval
3018                | TokenType::Blob
3019                | TokenType::Bytea
3020                | TokenType::Json
3021                | TokenType::Jsonb
3022                | TokenType::Uuid
3023                | TokenType::Array
3024                | TokenType::Map
3025                | TokenType::Struct
3026        )
3027    }
3028
3029    fn parse_datetime_field(&mut self) -> Result<DateTimeField> {
3030        let token = self.peek().clone();
3031        let field = match &token.token_type {
3032            TokenType::Year => DateTimeField::Year,
3033            TokenType::Month => DateTimeField::Month,
3034            TokenType::Day => DateTimeField::Day,
3035            TokenType::Hour => DateTimeField::Hour,
3036            TokenType::Minute => DateTimeField::Minute,
3037            TokenType::Second => DateTimeField::Second,
3038            TokenType::Epoch => DateTimeField::Epoch,
3039            _ => {
3040                let name = token.value.to_uppercase();
3041                match name.as_str() {
3042                    "YEAR" => DateTimeField::Year,
3043                    "QUARTER" => DateTimeField::Quarter,
3044                    "MONTH" => DateTimeField::Month,
3045                    "WEEK" => DateTimeField::Week,
3046                    "DAY" => DateTimeField::Day,
3047                    "DOW" | "DAYOFWEEK" => DateTimeField::DayOfWeek,
3048                    "DOY" | "DAYOFYEAR" => DateTimeField::DayOfYear,
3049                    "HOUR" => DateTimeField::Hour,
3050                    "MINUTE" => DateTimeField::Minute,
3051                    "SECOND" => DateTimeField::Second,
3052                    "MILLISECOND" => DateTimeField::Millisecond,
3053                    "MICROSECOND" => DateTimeField::Microsecond,
3054                    "NANOSECOND" => DateTimeField::Nanosecond,
3055                    "EPOCH" => DateTimeField::Epoch,
3056                    "TIMEZONE" => DateTimeField::Timezone,
3057                    "TIMEZONE_HOUR" => DateTimeField::TimezoneHour,
3058                    "TIMEZONE_MINUTE" => DateTimeField::TimezoneMinute,
3059                    _ => {
3060                        return Err(SqlglotError::ParserError {
3061                            message: format!("Unknown datetime field: {name}"),
3062                        });
3063                    }
3064                }
3065            }
3066        };
3067        self.advance();
3068        Ok(field)
3069    }
3070
3071    fn try_parse_datetime_field(&mut self) -> Option<DateTimeField> {
3072        let saved = self.pos;
3073        match self.parse_datetime_field() {
3074            Ok(field) => Some(field),
3075            Err(_) => {
3076                self.pos = saved;
3077                None
3078            }
3079        }
3080    }
3081
3082    /// Parse the inside of `GROUP_CONCAT(...)` (caller has already consumed
3083    /// the `(` and optional `DISTINCT`). Returns a typed `GroupConcat`
3084    /// expression. Does NOT consume the trailing `)`.
3085    fn parse_group_concat_call(&mut self, distinct: bool) -> Result<Expr> {
3086        let mut exprs: Vec<Expr> = Vec::new();
3087        let mut order_by: Vec<OrderByItem> = Vec::new();
3088        let mut separator: Option<Box<Expr>> = None;
3089
3090        if self.peek_type() != &TokenType::RParen {
3091            exprs.push(self.parse_expr()?);
3092            while self.peek_type() == &TokenType::Comma {
3093                // ORDER BY / SEPARATOR are alternative terminators, not args.
3094                // Peek one past the comma to disambiguate `f(a, b)` from
3095                // `f(a, b ORDER BY ...)` — but comma here always introduces
3096                // another positional arg, so just keep consuming.
3097                self.advance();
3098                exprs.push(self.parse_expr()?);
3099            }
3100
3101            if self.match_token(TokenType::Order) {
3102                self.expect(TokenType::By)?;
3103                order_by = self.parse_order_by_items()?;
3104            }
3105
3106            if self.match_keyword("SEPARATOR") {
3107                separator = Some(Box::new(self.parse_expr()?));
3108            }
3109        }
3110
3111        Ok(Expr::TypedFunction {
3112            func: TypedFunction::GroupConcat {
3113                exprs,
3114                separator,
3115                order_by,
3116                distinct,
3117            },
3118            filter: None,
3119            over: None,
3120        })
3121    }
3122
3123    /// Try to construct a typed function expression from a parsed function call.
3124    /// Returns `None` if the function name is not recognized, falling back to
3125    /// the generic `Expr::Function`.
3126    fn try_typed_function(name: &str, args: Vec<Expr>, distinct: bool) -> Option<Expr> {
3127        let upper = name.to_uppercase();
3128        let tf = match upper.as_str() {
3129            // ── Date/Time ──────────────────────────────────────────
3130            "DATE_ADD" | "DATEADD" | "TIMESTAMPADD" => {
3131                let mut it = args.into_iter();
3132                let first = it.next()?;
3133                let second = it.next()?;
3134                let third = it.next();
3135                // Handle DATEADD(unit, interval, expr) — TSQL/Snowflake arg order
3136                if upper == "DATEADD" {
3137                    if let Some(third_arg) = third {
3138                        // 3-arg: DATEADD(unit, interval, expr)
3139                        let unit = Self::expr_to_datetime_field(&first);
3140                        TypedFunction::DateAdd {
3141                            expr: Box::new(third_arg),
3142                            interval: Box::new(second),
3143                            unit,
3144                        }
3145                    } else {
3146                        TypedFunction::DateAdd {
3147                            expr: Box::new(first),
3148                            interval: Box::new(second),
3149                            unit: None,
3150                        }
3151                    }
3152                } else {
3153                    // DATE_ADD(expr, interval [, unit])
3154                    let unit = third.as_ref().and_then(Self::expr_to_datetime_field);
3155                    TypedFunction::DateAdd {
3156                        expr: Box::new(first),
3157                        interval: Box::new(second),
3158                        unit,
3159                    }
3160                }
3161            }
3162            "DATE_DIFF" | "DATEDIFF" | "TIMESTAMPDIFF" => {
3163                let mut it = args.into_iter();
3164                let first = it.next()?;
3165                let second = it.next()?;
3166                let third = it.next();
3167                if let Some(third_arg) = third {
3168                    if upper == "DATEDIFF" {
3169                        // DATEDIFF(unit, start, end) — TSQL/Snowflake
3170                        let unit = Self::expr_to_datetime_field(&first);
3171                        TypedFunction::DateDiff {
3172                            start: Box::new(second),
3173                            end: Box::new(third_arg),
3174                            unit,
3175                        }
3176                    } else {
3177                        let unit = Self::expr_to_datetime_field(&third_arg);
3178                        TypedFunction::DateDiff {
3179                            start: Box::new(first),
3180                            end: Box::new(second),
3181                            unit,
3182                        }
3183                    }
3184                } else {
3185                    TypedFunction::DateDiff {
3186                        start: Box::new(first),
3187                        end: Box::new(second),
3188                        unit: None,
3189                    }
3190                }
3191            }
3192            "DATE_TRUNC" | "DATETRUNC" => {
3193                let mut it = args.into_iter();
3194                let first = it.next()?;
3195                let second = it.next()?;
3196                // DATE_TRUNC('unit', expr) or DATE_TRUNC(unit, expr)
3197                let (unit, expr) = if let Some(u) = Self::expr_to_datetime_field(&first) {
3198                    (u, second)
3199                } else if let Some(u) = Self::expr_to_datetime_field(&second) {
3200                    (u, first)
3201                } else {
3202                    // Default: first = unit string, second = expr
3203                    return None;
3204                };
3205                TypedFunction::DateTrunc {
3206                    unit,
3207                    expr: Box::new(expr),
3208                }
3209            }
3210            "DATE_SUB" | "DATESUB" => {
3211                let mut it = args.into_iter();
3212                let first = it.next()?;
3213                let second = it.next()?;
3214                let third = it.next();
3215                let unit = third.as_ref().and_then(Self::expr_to_datetime_field);
3216                TypedFunction::DateSub {
3217                    expr: Box::new(first),
3218                    interval: Box::new(second),
3219                    unit,
3220                }
3221            }
3222            "CURRENT_DATE" => TypedFunction::CurrentDate,
3223            "CURRENT_TIME" | "CURTIME" => TypedFunction::CurrentTime,
3224            "CURRENT_TIMESTAMP" | "NOW" | "GETDATE" | "SYSDATE" => TypedFunction::CurrentTimestamp,
3225            "STR_TO_TIME" | "STR_TO_DATE" | "TO_TIMESTAMP" | "PARSE_TIMESTAMP"
3226            | "PARSE_DATETIME" => {
3227                let mut it = args.into_iter();
3228                let expr = it.next()?;
3229                let format = it.next()?;
3230                TypedFunction::StrToTime {
3231                    expr: Box::new(expr),
3232                    format: Box::new(format),
3233                }
3234            }
3235            "TIME_TO_STR" | "DATE_FORMAT" | "FORMAT_TIMESTAMP" | "FORMAT_DATETIME" | "TO_CHAR" => {
3236                let mut it = args.into_iter();
3237                let expr = it.next()?;
3238                let format = it.next()?;
3239                TypedFunction::TimeToStr {
3240                    expr: Box::new(expr),
3241                    format: Box::new(format),
3242                }
3243            }
3244            "TS_OR_DS_TO_DATE" => {
3245                let mut it = args.into_iter();
3246                TypedFunction::TsOrDsToDate {
3247                    expr: Box::new(it.next()?),
3248                }
3249            }
3250            "YEAR" => {
3251                let mut it = args.into_iter();
3252                TypedFunction::Year {
3253                    expr: Box::new(it.next()?),
3254                }
3255            }
3256            "MONTH" => {
3257                let mut it = args.into_iter();
3258                TypedFunction::Month {
3259                    expr: Box::new(it.next()?),
3260                }
3261            }
3262            "DAY" | "DAYOFMONTH" => {
3263                let mut it = args.into_iter();
3264                TypedFunction::Day {
3265                    expr: Box::new(it.next()?),
3266                }
3267            }
3268
3269            // ── String ─────────────────────────────────────────────
3270            "TRIM" => {
3271                let mut it = args.into_iter();
3272                let expr = it.next()?;
3273                TypedFunction::Trim {
3274                    expr: Box::new(expr),
3275                    trim_type: TrimType::Both,
3276                    trim_chars: None,
3277                }
3278            }
3279            "LTRIM" => {
3280                let mut it = args.into_iter();
3281                let expr = it.next()?;
3282                TypedFunction::Trim {
3283                    expr: Box::new(expr),
3284                    trim_type: TrimType::Leading,
3285                    trim_chars: None,
3286                }
3287            }
3288            "RTRIM" => {
3289                let mut it = args.into_iter();
3290                let expr = it.next()?;
3291                TypedFunction::Trim {
3292                    expr: Box::new(expr),
3293                    trim_type: TrimType::Trailing,
3294                    trim_chars: None,
3295                }
3296            }
3297            "SUBSTRING" | "SUBSTR" => {
3298                let mut it = args.into_iter();
3299                let expr = it.next()?;
3300                let start = it.next()?;
3301                let length = it.next();
3302                TypedFunction::Substring {
3303                    expr: Box::new(expr),
3304                    start: Box::new(start),
3305                    length: length.map(Box::new),
3306                }
3307            }
3308            "UPPER" | "UCASE" => {
3309                let mut it = args.into_iter();
3310                TypedFunction::Upper {
3311                    expr: Box::new(it.next()?),
3312                }
3313            }
3314            "LOWER" | "LCASE" => {
3315                let mut it = args.into_iter();
3316                TypedFunction::Lower {
3317                    expr: Box::new(it.next()?),
3318                }
3319            }
3320            "REGEXP_LIKE" | "RLIKE" => {
3321                let mut it = args.into_iter();
3322                let expr = it.next()?;
3323                let pattern = it.next()?;
3324                let flags = it.next();
3325                TypedFunction::RegexpLike {
3326                    expr: Box::new(expr),
3327                    pattern: Box::new(pattern),
3328                    flags: flags.map(Box::new),
3329                }
3330            }
3331            "REGEXP_EXTRACT" | "REGEXP_SUBSTR" => {
3332                let mut it = args.into_iter();
3333                let expr = it.next()?;
3334                let pattern = it.next()?;
3335                let group_index = it.next();
3336                TypedFunction::RegexpExtract {
3337                    expr: Box::new(expr),
3338                    pattern: Box::new(pattern),
3339                    group_index: group_index.map(Box::new),
3340                }
3341            }
3342            "REGEXP_REPLACE" => {
3343                let mut it = args.into_iter();
3344                let expr = it.next()?;
3345                let pattern = it.next()?;
3346                let replacement = it.next()?;
3347                let flags = it.next();
3348                TypedFunction::RegexpReplace {
3349                    expr: Box::new(expr),
3350                    pattern: Box::new(pattern),
3351                    replacement: Box::new(replacement),
3352                    flags: flags.map(Box::new),
3353                }
3354            }
3355            "CONCAT_WS" => {
3356                let mut it = args.into_iter();
3357                let separator = it.next()?;
3358                let exprs: Vec<Expr> = it.collect();
3359                TypedFunction::ConcatWs {
3360                    separator: Box::new(separator),
3361                    exprs,
3362                }
3363            }
3364            "SPLIT" | "STRING_SPLIT" => {
3365                let mut it = args.into_iter();
3366                let expr = it.next()?;
3367                let delimiter = it.next()?;
3368                TypedFunction::Split {
3369                    expr: Box::new(expr),
3370                    delimiter: Box::new(delimiter),
3371                }
3372            }
3373            "INITCAP" => {
3374                let mut it = args.into_iter();
3375                TypedFunction::Initcap {
3376                    expr: Box::new(it.next()?),
3377                }
3378            }
3379            "LENGTH" | "LEN" | "CHAR_LENGTH" | "CHARACTER_LENGTH" => {
3380                let mut it = args.into_iter();
3381                TypedFunction::Length {
3382                    expr: Box::new(it.next()?),
3383                }
3384            }
3385            "REPLACE" => {
3386                let mut it = args.into_iter();
3387                let expr = it.next()?;
3388                let from = it.next()?;
3389                let to = it.next()?;
3390                TypedFunction::Replace {
3391                    expr: Box::new(expr),
3392                    from: Box::new(from),
3393                    to: Box::new(to),
3394                }
3395            }
3396            "REVERSE" => {
3397                let mut it = args.into_iter();
3398                TypedFunction::Reverse {
3399                    expr: Box::new(it.next()?),
3400                }
3401            }
3402            "LEFT" => {
3403                let mut it = args.into_iter();
3404                let expr = it.next()?;
3405                let n = it.next()?;
3406                TypedFunction::Left {
3407                    expr: Box::new(expr),
3408                    n: Box::new(n),
3409                }
3410            }
3411            "RIGHT" => {
3412                let mut it = args.into_iter();
3413                let expr = it.next()?;
3414                let n = it.next()?;
3415                TypedFunction::Right {
3416                    expr: Box::new(expr),
3417                    n: Box::new(n),
3418                }
3419            }
3420            "LPAD" => {
3421                let mut it = args.into_iter();
3422                let expr = it.next()?;
3423                let length = it.next()?;
3424                let pad = it.next();
3425                TypedFunction::Lpad {
3426                    expr: Box::new(expr),
3427                    length: Box::new(length),
3428                    pad: pad.map(Box::new),
3429                }
3430            }
3431            "RPAD" => {
3432                let mut it = args.into_iter();
3433                let expr = it.next()?;
3434                let length = it.next()?;
3435                let pad = it.next();
3436                TypedFunction::Rpad {
3437                    expr: Box::new(expr),
3438                    length: Box::new(length),
3439                    pad: pad.map(Box::new),
3440                }
3441            }
3442
3443            // ── Aggregate ──────────────────────────────────────────
3444            "COUNT" => {
3445                let mut it = args.into_iter();
3446                let expr = it.next().unwrap_or(Expr::Wildcard);
3447                TypedFunction::Count {
3448                    expr: Box::new(expr),
3449                    distinct,
3450                }
3451            }
3452            "SUM" => {
3453                let mut it = args.into_iter();
3454                TypedFunction::Sum {
3455                    expr: Box::new(it.next()?),
3456                    distinct,
3457                }
3458            }
3459            "AVG" => {
3460                let mut it = args.into_iter();
3461                TypedFunction::Avg {
3462                    expr: Box::new(it.next()?),
3463                    distinct,
3464                }
3465            }
3466            "MIN" => {
3467                let mut it = args.into_iter();
3468                TypedFunction::Min {
3469                    expr: Box::new(it.next()?),
3470                }
3471            }
3472            "MAX" => {
3473                let mut it = args.into_iter();
3474                TypedFunction::Max {
3475                    expr: Box::new(it.next()?),
3476                }
3477            }
3478            "ARRAY_AGG" | "LIST" | "COLLECT_LIST" => {
3479                let mut it = args.into_iter();
3480                TypedFunction::ArrayAgg {
3481                    expr: Box::new(it.next()?),
3482                    distinct,
3483                }
3484            }
3485            "APPROX_DISTINCT" | "APPROX_COUNT_DISTINCT" => {
3486                let mut it = args.into_iter();
3487                TypedFunction::ApproxDistinct {
3488                    expr: Box::new(it.next()?),
3489                }
3490            }
3491            "VARIANCE" | "VAR_SAMP" | "VAR" => {
3492                let mut it = args.into_iter();
3493                TypedFunction::Variance {
3494                    expr: Box::new(it.next()?),
3495                }
3496            }
3497            "STDDEV" | "STDDEV_SAMP" => {
3498                let mut it = args.into_iter();
3499                TypedFunction::Stddev {
3500                    expr: Box::new(it.next()?),
3501                }
3502            }
3503
3504            // ── Array ──────────────────────────────────────────────
3505            "ARRAY_CONCAT" | "ARRAY_CAT" => TypedFunction::ArrayConcat { arrays: args },
3506            "ARRAY_CONTAINS" => {
3507                let mut it = args.into_iter();
3508                let array = it.next()?;
3509                let element = it.next()?;
3510                TypedFunction::ArrayContains {
3511                    array: Box::new(array),
3512                    element: Box::new(element),
3513                }
3514            }
3515            "ARRAY_SIZE" | "ARRAY_LENGTH" | "CARDINALITY" => {
3516                let mut it = args.into_iter();
3517                TypedFunction::ArraySize {
3518                    expr: Box::new(it.next()?),
3519                }
3520            }
3521            "EXPLODE" => {
3522                let mut it = args.into_iter();
3523                TypedFunction::Explode {
3524                    expr: Box::new(it.next()?),
3525                }
3526            }
3527            "GENERATE_SERIES" | "SEQUENCE" => {
3528                let mut it = args.into_iter();
3529                let start = it.next()?;
3530                let stop = it.next()?;
3531                let step = it.next();
3532                TypedFunction::GenerateSeries {
3533                    start: Box::new(start),
3534                    stop: Box::new(stop),
3535                    step: step.map(Box::new),
3536                }
3537            }
3538            "FLATTEN" => {
3539                let mut it = args.into_iter();
3540                TypedFunction::Flatten {
3541                    expr: Box::new(it.next()?),
3542                }
3543            }
3544
3545            // ── JSON ───────────────────────────────────────────────
3546            "JSON_EXTRACT" | "JSON_VALUE" => {
3547                let mut it = args.into_iter();
3548                let expr = it.next()?;
3549                let path = it.next()?;
3550                TypedFunction::JSONExtract {
3551                    expr: Box::new(expr),
3552                    path: Box::new(path),
3553                }
3554            }
3555            "JSON_EXTRACT_SCALAR" => {
3556                let mut it = args.into_iter();
3557                let expr = it.next()?;
3558                let path = it.next()?;
3559                TypedFunction::JSONExtractScalar {
3560                    expr: Box::new(expr),
3561                    path: Box::new(path),
3562                }
3563            }
3564            "PARSE_JSON" | "JSON_PARSE" => {
3565                let mut it = args.into_iter();
3566                TypedFunction::ParseJSON {
3567                    expr: Box::new(it.next()?),
3568                }
3569            }
3570            "JSON_FORMAT" | "TO_JSON" | "TO_JSON_STRING" => {
3571                let mut it = args.into_iter();
3572                TypedFunction::JSONFormat {
3573                    expr: Box::new(it.next()?),
3574                }
3575            }
3576
3577            // ── Window ─────────────────────────────────────────────
3578            "ROW_NUMBER" => TypedFunction::RowNumber,
3579            "RANK" => TypedFunction::Rank,
3580            "DENSE_RANK" => TypedFunction::DenseRank,
3581            "NTILE" => {
3582                let mut it = args.into_iter();
3583                TypedFunction::NTile {
3584                    n: Box::new(it.next()?),
3585                }
3586            }
3587            "LEAD" => {
3588                let mut it = args.into_iter();
3589                let expr = it.next()?;
3590                let offset = it.next();
3591                let default = it.next();
3592                TypedFunction::Lead {
3593                    expr: Box::new(expr),
3594                    offset: offset.map(Box::new),
3595                    default: default.map(Box::new),
3596                }
3597            }
3598            "LAG" => {
3599                let mut it = args.into_iter();
3600                let expr = it.next()?;
3601                let offset = it.next();
3602                let default = it.next();
3603                TypedFunction::Lag {
3604                    expr: Box::new(expr),
3605                    offset: offset.map(Box::new),
3606                    default: default.map(Box::new),
3607                }
3608            }
3609            "FIRST_VALUE" => {
3610                let mut it = args.into_iter();
3611                TypedFunction::FirstValue {
3612                    expr: Box::new(it.next()?),
3613                }
3614            }
3615            "LAST_VALUE" => {
3616                let mut it = args.into_iter();
3617                TypedFunction::LastValue {
3618                    expr: Box::new(it.next()?),
3619                }
3620            }
3621
3622            // ── Math ───────────────────────────────────────────────
3623            "ABS" => {
3624                let mut it = args.into_iter();
3625                TypedFunction::Abs {
3626                    expr: Box::new(it.next()?),
3627                }
3628            }
3629            "CEIL" | "CEILING" => {
3630                let mut it = args.into_iter();
3631                TypedFunction::Ceil {
3632                    expr: Box::new(it.next()?),
3633                }
3634            }
3635            "FLOOR" => {
3636                let mut it = args.into_iter();
3637                TypedFunction::Floor {
3638                    expr: Box::new(it.next()?),
3639                }
3640            }
3641            "ROUND" => {
3642                let mut it = args.into_iter();
3643                let expr = it.next()?;
3644                let decimals = it.next();
3645                TypedFunction::Round {
3646                    expr: Box::new(expr),
3647                    decimals: decimals.map(Box::new),
3648                }
3649            }
3650            "LOG" => {
3651                let mut it = args.into_iter();
3652                let expr = it.next()?;
3653                let base = it.next();
3654                TypedFunction::Log {
3655                    expr: Box::new(expr),
3656                    base: base.map(Box::new),
3657                }
3658            }
3659            "LN" => {
3660                let mut it = args.into_iter();
3661                TypedFunction::Ln {
3662                    expr: Box::new(it.next()?),
3663                }
3664            }
3665            "POW" | "POWER" => {
3666                let mut it = args.into_iter();
3667                let base = it.next()?;
3668                let exponent = it.next()?;
3669                TypedFunction::Pow {
3670                    base: Box::new(base),
3671                    exponent: Box::new(exponent),
3672                }
3673            }
3674            "SQRT" => {
3675                let mut it = args.into_iter();
3676                TypedFunction::Sqrt {
3677                    expr: Box::new(it.next()?),
3678                }
3679            }
3680            "GREATEST" => TypedFunction::Greatest { exprs: args },
3681            "LEAST" => TypedFunction::Least { exprs: args },
3682            "MOD" => {
3683                let mut it = args.into_iter();
3684                let left = it.next()?;
3685                let right = it.next()?;
3686                TypedFunction::Mod {
3687                    left: Box::new(left),
3688                    right: Box::new(right),
3689                }
3690            }
3691
3692            // ── Conversion ─────────────────────────────────────────
3693            "HEX" | "TO_HEX" => {
3694                let mut it = args.into_iter();
3695                TypedFunction::Hex {
3696                    expr: Box::new(it.next()?),
3697                }
3698            }
3699            "UNHEX" | "FROM_HEX" => {
3700                let mut it = args.into_iter();
3701                TypedFunction::Unhex {
3702                    expr: Box::new(it.next()?),
3703                }
3704            }
3705            "MD5" => {
3706                let mut it = args.into_iter();
3707                TypedFunction::Md5 {
3708                    expr: Box::new(it.next()?),
3709                }
3710            }
3711            "SHA" | "SHA1" => {
3712                let mut it = args.into_iter();
3713                TypedFunction::Sha {
3714                    expr: Box::new(it.next()?),
3715                }
3716            }
3717            "SHA2" | "SHA256" | "SHA512" => {
3718                let mut it = args.into_iter();
3719                let expr = it.next()?;
3720                let bit_length = it.next().unwrap_or(Expr::Number("256".to_string()));
3721                TypedFunction::Sha2 {
3722                    expr: Box::new(expr),
3723                    bit_length: Box::new(bit_length),
3724                }
3725            }
3726
3727            // Not a recognized typed function
3728            _ => return None,
3729        };
3730
3731        Some(Expr::TypedFunction {
3732            func: tf,
3733            filter: None,
3734            over: None,
3735        })
3736    }
3737
3738    /// Try to extract a DateTimeField from a column-name expression.
3739    fn expr_to_datetime_field(expr: &Expr) -> Option<DateTimeField> {
3740        match expr {
3741            Expr::Column {
3742                name, table: None, ..
3743            } => match name.to_uppercase().as_str() {
3744                "YEAR" => Some(DateTimeField::Year),
3745                "QUARTER" => Some(DateTimeField::Quarter),
3746                "MONTH" => Some(DateTimeField::Month),
3747                "WEEK" => Some(DateTimeField::Week),
3748                "DAY" => Some(DateTimeField::Day),
3749                "HOUR" => Some(DateTimeField::Hour),
3750                "MINUTE" => Some(DateTimeField::Minute),
3751                "SECOND" => Some(DateTimeField::Second),
3752                "MILLISECOND" => Some(DateTimeField::Millisecond),
3753                "MICROSECOND" => Some(DateTimeField::Microsecond),
3754                _ => None,
3755            },
3756            Expr::StringLiteral(s) | Expr::NationalStringLiteral(s) => {
3757                match s.to_uppercase().as_str() {
3758                    "YEAR" => Some(DateTimeField::Year),
3759                    "QUARTER" => Some(DateTimeField::Quarter),
3760                    "MONTH" => Some(DateTimeField::Month),
3761                    "WEEK" => Some(DateTimeField::Week),
3762                    "DAY" => Some(DateTimeField::Day),
3763                    "HOUR" => Some(DateTimeField::Hour),
3764                    "MINUTE" => Some(DateTimeField::Minute),
3765                    "SECOND" => Some(DateTimeField::Second),
3766                    "MILLISECOND" => Some(DateTimeField::Millisecond),
3767                    "MICROSECOND" => Some(DateTimeField::Microsecond),
3768                    _ => None,
3769                }
3770            }
3771            _ => None,
3772        }
3773    }
3774
3775    fn parse_case_expr(&mut self) -> Result<Expr> {
3776        self.expect(TokenType::Case)?;
3777
3778        let operand = if self.peek_type() != &TokenType::When {
3779            Some(Box::new(self.parse_expr()?))
3780        } else {
3781            None
3782        };
3783
3784        let mut when_clauses = Vec::new();
3785        while self.match_token(TokenType::When) {
3786            let condition = self.parse_expr()?;
3787            self.expect(TokenType::Then)?;
3788            let result = self.parse_expr()?;
3789            when_clauses.push((condition, result));
3790        }
3791
3792        let else_clause = if self.match_token(TokenType::Else) {
3793            Some(Box::new(self.parse_expr()?))
3794        } else {
3795            None
3796        };
3797
3798        self.expect(TokenType::End)?;
3799
3800        Ok(Expr::Case {
3801            operand,
3802            when_clauses,
3803            else_clause,
3804        })
3805    }
3806}
3807
3808#[cfg(test)]
3809mod tests {
3810    use super::*;
3811
3812    #[test]
3813    fn test_parse_simple_select() {
3814        let stmt = Parser::new("SELECT a, b FROM t")
3815            .unwrap()
3816            .parse_statement()
3817            .unwrap();
3818        match stmt {
3819            Statement::Select(sel) => {
3820                assert_eq!(sel.columns.len(), 2);
3821                assert!(sel.from.is_some());
3822            }
3823            _ => panic!("Expected SELECT"),
3824        }
3825    }
3826
3827    #[test]
3828    fn test_parse_select_with_where() {
3829        let stmt = Parser::new("SELECT x FROM t WHERE x > 10")
3830            .unwrap()
3831            .parse_statement()
3832            .unwrap();
3833        match stmt {
3834            Statement::Select(sel) => assert!(sel.where_clause.is_some()),
3835            _ => panic!("Expected SELECT"),
3836        }
3837    }
3838
3839    #[test]
3840    fn test_parse_select_wildcard() {
3841        let stmt = Parser::new("SELECT * FROM users")
3842            .unwrap()
3843            .parse_statement()
3844            .unwrap();
3845        match stmt {
3846            Statement::Select(sel) => {
3847                assert_eq!(sel.columns.len(), 1);
3848                assert!(matches!(sel.columns[0], SelectItem::Wildcard));
3849            }
3850            _ => panic!("Expected SELECT"),
3851        }
3852    }
3853
3854    #[test]
3855    fn test_parse_insert() {
3856        let stmt = Parser::new("INSERT INTO t (a, b) VALUES (1, 'hello')")
3857            .unwrap()
3858            .parse_statement()
3859            .unwrap();
3860        match stmt {
3861            Statement::Insert(ins) => {
3862                assert_eq!(ins.table.name, "t");
3863                assert_eq!(ins.columns, vec!["a", "b"]);
3864                match &ins.source {
3865                    InsertSource::Values(rows) => {
3866                        assert_eq!(rows.len(), 1);
3867                        assert_eq!(rows[0].len(), 2);
3868                    }
3869                    _ => panic!("Expected VALUES"),
3870                }
3871            }
3872            _ => panic!("Expected INSERT"),
3873        }
3874    }
3875
3876    #[test]
3877    fn test_parse_delete() {
3878        let stmt = Parser::new("DELETE FROM users WHERE id = 1")
3879            .unwrap()
3880            .parse_statement()
3881            .unwrap();
3882        match stmt {
3883            Statement::Delete(del) => {
3884                assert_eq!(del.table.name, "users");
3885                assert!(del.where_clause.is_some());
3886            }
3887            _ => panic!("Expected DELETE"),
3888        }
3889    }
3890
3891    #[test]
3892    fn test_parse_join() {
3893        let stmt = Parser::new("SELECT a.id, b.name FROM a INNER JOIN b ON a.id = b.a_id")
3894            .unwrap()
3895            .parse_statement()
3896            .unwrap();
3897        match stmt {
3898            Statement::Select(sel) => {
3899                assert_eq!(sel.joins.len(), 1);
3900                assert_eq!(sel.joins[0].join_type, JoinType::Inner);
3901            }
3902            _ => panic!("Expected SELECT"),
3903        }
3904    }
3905
3906    #[test]
3907    fn test_parse_cte() {
3908        let stmt = Parser::new("WITH cte AS (SELECT 1 AS x) SELECT x FROM cte")
3909            .unwrap()
3910            .parse_statement()
3911            .unwrap();
3912        match stmt {
3913            Statement::Select(sel) => {
3914                assert_eq!(sel.ctes.len(), 1);
3915                assert_eq!(sel.ctes[0].name, "cte");
3916            }
3917            _ => panic!("Expected SELECT"),
3918        }
3919    }
3920
3921    #[test]
3922    fn test_parse_union() {
3923        let stmt = Parser::new("SELECT 1 UNION ALL SELECT 2")
3924            .unwrap()
3925            .parse_statement()
3926            .unwrap();
3927        match stmt {
3928            Statement::SetOperation(sop) => {
3929                assert_eq!(sop.op, SetOperationType::Union);
3930                assert!(sop.all);
3931            }
3932            _ => panic!("Expected SetOperation"),
3933        }
3934    }
3935
3936    #[test]
3937    fn test_parse_cast() {
3938        let stmt = Parser::new("SELECT CAST(x AS INT) FROM t")
3939            .unwrap()
3940            .parse_statement()
3941            .unwrap();
3942        match stmt {
3943            Statement::Select(sel) => {
3944                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
3945                    assert!(matches!(expr, Expr::Cast { .. }));
3946                }
3947            }
3948            _ => panic!("Expected SELECT"),
3949        }
3950    }
3951
3952    #[test]
3953    fn test_parse_subquery() {
3954        let stmt = Parser::new("SELECT * FROM (SELECT 1 AS x) AS sub")
3955            .unwrap()
3956            .parse_statement()
3957            .unwrap();
3958        match stmt {
3959            Statement::Select(sel) => {
3960                if let Some(from) = &sel.from {
3961                    assert!(matches!(from.source, TableSource::Subquery { .. }));
3962                }
3963            }
3964            _ => panic!("Expected SELECT"),
3965        }
3966    }
3967
3968    #[test]
3969    fn test_parse_exists() {
3970        let stmt = Parser::new("SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2)")
3971            .unwrap()
3972            .parse_statement()
3973            .unwrap();
3974        match stmt {
3975            Statement::Select(sel) => {
3976                assert!(sel.where_clause.is_some());
3977            }
3978            _ => panic!("Expected SELECT"),
3979        }
3980    }
3981
3982    #[test]
3983    fn test_parse_window_function() {
3984        let stmt = Parser::new(
3985            "SELECT ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp",
3986        )
3987        .unwrap()
3988        .parse_statement()
3989        .unwrap();
3990        match stmt {
3991            Statement::Select(sel) => {
3992                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
3993                    match expr {
3994                        Expr::TypedFunction { over, .. } => {
3995                            assert!(over.is_some());
3996                        }
3997                        Expr::Function { over, .. } => {
3998                            assert!(over.is_some());
3999                        }
4000                        _ => panic!("Expected function"),
4001                    }
4002                }
4003            }
4004            _ => panic!("Expected SELECT"),
4005        }
4006    }
4007
4008    #[test]
4009    fn test_parse_multiple_statements() {
4010        let stmts = Parser::new("SELECT 1; SELECT 2;")
4011            .unwrap()
4012            .parse_statements()
4013            .unwrap();
4014        assert_eq!(stmts.len(), 2);
4015    }
4016
4017    #[test]
4018    fn test_parse_insert_select() {
4019        let stmt = Parser::new("INSERT INTO t SELECT * FROM s")
4020            .unwrap()
4021            .parse_statement()
4022            .unwrap();
4023        match stmt {
4024            Statement::Insert(ins) => {
4025                assert!(matches!(ins.source, InsertSource::Query(_)));
4026            }
4027            _ => panic!("Expected INSERT"),
4028        }
4029    }
4030
4031    #[test]
4032    fn test_parse_create_table_constraints() {
4033        let stmt =
4034            Parser::new("CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE)")
4035                .unwrap()
4036                .parse_statement()
4037                .unwrap();
4038        match stmt {
4039            Statement::CreateTable(ct) => {
4040                assert_eq!(ct.columns.len(), 2);
4041                assert!(ct.columns[0].primary_key);
4042                assert!(ct.columns[1].unique);
4043            }
4044            _ => panic!("Expected CREATE TABLE"),
4045        }
4046    }
4047
4048    #[test]
4049    fn test_parse_extract() {
4050        let stmt = Parser::new("SELECT EXTRACT(YEAR FROM created_at) FROM t")
4051            .unwrap()
4052            .parse_statement()
4053            .unwrap();
4054        match stmt {
4055            Statement::Select(sel) => {
4056                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
4057                    assert!(matches!(expr, Expr::Extract { .. }));
4058                }
4059            }
4060            _ => panic!("Expected SELECT"),
4061        }
4062    }
4063
4064    #[test]
4065    fn test_parse_postgres_cast() {
4066        let stmt = Parser::new("SELECT x::int FROM t")
4067            .unwrap()
4068            .parse_statement()
4069            .unwrap();
4070        match stmt {
4071            Statement::Select(sel) => {
4072                if let SelectItem::Expr { expr, .. } = &sel.columns[0] {
4073                    assert!(matches!(expr, Expr::Cast { .. }));
4074                }
4075            }
4076            _ => panic!("Expected SELECT"),
4077        }
4078    }
4079}
4080
4081/// Attach comments to the appropriate field on a parsed statement.
4082fn attach_comments_to_statement(stmt: &mut Statement, comments: Vec<String>) {
4083    match stmt {
4084        Statement::Select(s) => s.comments = comments,
4085        Statement::Insert(s) => s.comments = comments,
4086        Statement::Update(s) => s.comments = comments,
4087        Statement::Delete(s) => s.comments = comments,
4088        Statement::CreateTable(s) => s.comments = comments,
4089        Statement::DropTable(s) => s.comments = comments,
4090        Statement::SetOperation(s) => s.comments = comments,
4091        Statement::AlterTable(s) => s.comments = comments,
4092        Statement::CreateView(s) => s.comments = comments,
4093        Statement::DropView(s) => s.comments = comments,
4094        Statement::Truncate(s) => s.comments = comments,
4095        Statement::Explain(s) => s.comments = comments,
4096        Statement::Use(s) => s.comments = comments,
4097        Statement::Merge(s) => s.comments = comments,
4098        // Transaction and Expression don't have comment fields
4099        Statement::Transaction(_) | Statement::Expression(_) => {}
4100    }
4101}