databend_common_ast/parser/
expr.rs

1// Copyright 2021 Datafuse Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use ethnum::i256;
16use itertools::Itertools;
17use nom::branch::alt;
18use nom::combinator::consumed;
19use nom::combinator::map;
20use nom::combinator::value;
21use nom::error::context;
22use nom_rule::rule;
23use pratt::Affix;
24use pratt::Associativity;
25use pratt::PrattParser;
26use pratt::Precedence;
27
28use crate::ast::quote::AtString;
29use crate::ast::*;
30use crate::parser::common::*;
31use crate::parser::input::Input;
32use crate::parser::input::WithSpan;
33use crate::parser::query::*;
34use crate::parser::token::*;
35use crate::parser::Error;
36use crate::parser::ErrorKind;
37use crate::Span;
38
39pub fn expr(i: Input) -> IResult<Expr> {
40    context("expression", subexpr(0))(i)
41}
42
43pub fn values(i: Input) -> IResult<Vec<Expr>> {
44    let values = comma_separated_list0(expr);
45    map(rule! { ( "(" ~ #values ~ ")" ) }, |(_, v, _)| v)(i)
46}
47
48pub fn subexpr(min_precedence: u32) -> impl FnMut(Input) -> IResult<Expr> {
49    move |i| {
50        let higher_prec_expr_element = |i| {
51            expr_element(i).and_then(|(rest, elem)| match elem.elem.affix() {
52                Affix::Infix(prec, _) | Affix::Prefix(prec) | Affix::Postfix(prec)
53                    if prec <= Precedence(min_precedence) =>
54                {
55                    Err(nom::Err::Error(Error::from_error_kind(
56                        i,
57                        ErrorKind::Other("expected more tokens for expression"),
58                    )))
59                }
60                _ => Ok((rest, elem)),
61            })
62        };
63
64        let (rest, mut expr_elements) = rule! { #higher_prec_expr_element+ }(i)?;
65
66        for (prev, curr) in (-1..(expr_elements.len() as isize)).tuple_windows() {
67            // If it's following a prefix or infix element or it's the first element, ...
68            if prev == -1
69                || matches!(
70                    expr_elements[prev as usize].elem.affix(),
71                    Affix::Prefix(_) | Affix::Infix(_, _)
72                )
73            {
74                let span = expr_elements[curr as usize].span;
75                let elem = &mut expr_elements[curr as usize].elem;
76                match elem {
77                    // replace bracket map access to an array, ...
78                    ExprElement::MapAccess {
79                        accessor: MapAccessor::Bracket { key },
80                    } => {
81                        *elem = ExprElement::Array {
82                            exprs: vec![(**key).clone()],
83                        };
84                    }
85                    // replace binary `+` and `-` to unary one, ...
86                    ExprElement::BinaryOp {
87                        op: BinaryOperator::Plus,
88                    } => {
89                        *elem = ExprElement::UnaryOp {
90                            op: UnaryOperator::Plus,
91                        };
92                    }
93                    ExprElement::BinaryOp {
94                        op: BinaryOperator::Minus,
95                    } => {
96                        *elem = ExprElement::UnaryOp {
97                            op: UnaryOperator::Minus,
98                        };
99                    }
100                    // replace `:ident` to hole, ...
101                    ExprElement::MapAccess {
102                        accessor: MapAccessor::Colon { key },
103                    } => {
104                        if !key.is_quoted() && !key.is_hole() {
105                            *elem = ExprElement::Hole {
106                                name: key.to_string(),
107                            };
108                        }
109                    }
110                    // and replace `.<number>` map access to floating point literal.
111                    ExprElement::MapAccess {
112                        accessor: MapAccessor::DotNumber { .. },
113                    } => {
114                        *elem = ExprElement::Literal {
115                            value: literal(span)?.1,
116                        };
117                    }
118                    // replace json operator `?` to placeholder.
119                    ExprElement::JsonOp { op } => {
120                        if *op == JsonOperator::Question {
121                            *elem = ExprElement::Placeholder;
122                        }
123                    }
124                    _ => {}
125                }
126            }
127        }
128
129        run_pratt_parser(ExprParser, &expr_elements.into_iter(), rest, i)
130    }
131}
132
133/// A 'flattened' AST of expressions.
134///
135/// This is used to parse expressions in Pratt parser.
136/// The Pratt parser is not able to parse expressions by grammar. So we need to extract
137/// the expression operands and operators to be the input of Pratt parser, by running a
138/// nom parser in advance.
139///
140/// For example, `a + b AND c is null` is parsed as `[col(a), PLUS, col(b), AND, col(c), ISNULL]` by nom parsers.
141/// Then the Pratt parser is able to parse the expression into `AND(PLUS(col(a), col(b)), ISNULL(col(c)))`.
142#[derive(Debug, Clone, PartialEq)]
143#[allow(clippy::large_enum_variant)]
144pub enum ExprElement {
145    /// Column reference, with indirection like `table.column`
146    ColumnRef {
147        column: ColumnRef,
148    },
149    /// `.a.b` after column ref, currently it'll be taken as column reference
150    DotAccess {
151        key: ColumnID,
152    },
153    /// `IS [NOT] NULL` expression
154    IsNull {
155        not: bool,
156    },
157    /// `IS [NOT] DISTINCT FROM` expression
158    IsDistinctFrom {
159        not: bool,
160    },
161    /// `[ NOT ] IN (list, ...)`
162    InList {
163        list: Vec<Expr>,
164        not: bool,
165    },
166    /// `[ NOT ] IN (SELECT ...)`
167    InSubquery {
168        subquery: Box<Query>,
169        not: bool,
170    },
171    /// `LIKE (SELECT ...) [ESCAPE '<escape>']`
172    LikeSubquery {
173        modifier: SubqueryModifier,
174        subquery: Box<Query>,
175        escape: Option<String>,
176    },
177    /// `ESCAPE '<escape>'`
178    Escape {
179        escape: String,
180    },
181    /// `BETWEEN ... AND ...`
182    Between {
183        low: Box<Expr>,
184        high: Box<Expr>,
185        not: bool,
186    },
187    /// Binary operation
188    BinaryOp {
189        op: BinaryOperator,
190    },
191    /// JSON operation
192    JsonOp {
193        op: JsonOperator,
194    },
195    /// Unary operation
196    UnaryOp {
197        op: UnaryOperator,
198    },
199    VariableAccess(String),
200    /// `CAST` expression, like `CAST(expr AS target_type)`
201    Cast {
202        expr: Box<Expr>,
203        target_type: TypeName,
204    },
205    /// `TRY_CAST` expression`
206    TryCast {
207        expr: Box<Expr>,
208        target_type: TypeName,
209    },
210    /// `::<type_name>` expression
211    PgCast {
212        target_type: TypeName,
213    },
214    /// EXTRACT(IntervalKind FROM <expr>)
215    Extract {
216        field: IntervalKind,
217        expr: Box<Expr>,
218    },
219    /// DATE_PART(IntervalKind, <expr>)
220    DatePart {
221        field: IntervalKind,
222        expr: Box<Expr>,
223    },
224    /// POSITION(<expr> IN <expr>)
225    Position {
226        substr_expr: Box<Expr>,
227        str_expr: Box<Expr>,
228    },
229    /// SUBSTRING(<expr> [FROM <expr>] [FOR <expr>])
230    SubString {
231        expr: Box<Expr>,
232        substring_from: Box<Expr>,
233        substring_for: Option<Box<Expr>>,
234    },
235    /// TRIM([[BOTH | LEADING | TRAILING] <expr> FROM] <expr>)
236    /// Or
237    /// TRIM(<expr>)
238    Trim {
239        expr: Box<Expr>,
240        // ([BOTH | LEADING | TRAILING], <expr>)
241        trim_where: Option<(TrimWhere, Box<Expr>)>,
242    },
243    /// A literal value, such as string, number, date or NULL
244    Literal {
245        value: Literal,
246    },
247    /// `Count(*)` expression
248    CountAll {
249        qualified: QualifiedName,
250        window: Option<Window>,
251    },
252    /// `(foo, bar)`
253    Tuple {
254        exprs: Vec<Expr>,
255    },
256    /// Scalar function call
257    FunctionCall {
258        func: FunctionCall,
259    },
260    /// `CASE ... WHEN ... ELSE ...` expression
261    Case {
262        operand: Option<Box<Expr>>,
263        conditions: Vec<Expr>,
264        results: Vec<Expr>,
265        else_result: Option<Box<Expr>>,
266    },
267    /// `EXISTS` expression
268    Exists {
269        subquery: Query,
270        not: bool,
271    },
272    /// Scalar/ANY/ALL/SOME subquery
273    Subquery {
274        modifier: Option<SubqueryModifier>,
275        subquery: Query,
276    },
277    /// Access elements of `Array`, `Object` and `Variant` by index or key, like `arr[0]`, or `obj:k1`
278    MapAccess {
279        accessor: MapAccessor,
280    },
281    /// python/rust style function call, like `a.foo(b).bar(c)` ---> `bar(foo(a, b), c)`
282    ChainFunctionCall {
283        name: Identifier,
284        args: Vec<Expr>,
285        lambda: Option<Lambda>,
286    },
287    /// python/rust list comprehension
288    ListComprehension {
289        source: Expr,
290        param: Identifier,
291        filter: Option<Expr>,
292        result: Expr,
293    },
294    /// An expression between parentheses
295    Group(Expr),
296    /// `[1, 2, 3]`
297    Array {
298        exprs: Vec<Expr>,
299    },
300    /// `{'k1':'v1','k2':'v2'}`
301    Map {
302        kvs: Vec<(Literal, Expr)>,
303    },
304    Interval {
305        expr: Expr,
306        unit: IntervalKind,
307    },
308    DateAdd {
309        unit: IntervalKind,
310        interval: Expr,
311        date: Expr,
312    },
313    DateDiff {
314        unit: IntervalKind,
315        date_start: Expr,
316        date_end: Expr,
317    },
318    DateBetween {
319        unit: IntervalKind,
320        date_start: Expr,
321        date_end: Expr,
322    },
323    DateSub {
324        unit: IntervalKind,
325        interval: Expr,
326        date: Expr,
327    },
328    DateTrunc {
329        unit: IntervalKind,
330        date: Expr,
331    },
332    LastDay {
333        unit: IntervalKind,
334        date: Expr,
335    },
336    PreviousDay {
337        unit: Weekday,
338        date: Expr,
339    },
340    NextDay {
341        unit: Weekday,
342        date: Expr,
343    },
344    Hole {
345        name: String,
346    },
347    Placeholder,
348}
349
350pub const BETWEEN_PREC: u32 = 20;
351pub const NOT_PREC: u32 = 15;
352const CHAIN_FUNCTION_AFFIX: Affix = Affix::Postfix(Precedence(61));
353const DOT_ACCESS_AFFIX: Affix = Affix::Postfix(Precedence(60));
354const MAP_ACCESS_AFFIX: Affix = Affix::Postfix(Precedence(60));
355const IS_NULL_AFFIX: Affix = Affix::Postfix(Precedence(17));
356const BETWEEN_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
357const IS_DISTINCT_FROM_AFFIX: Affix = Affix::Infix(Precedence(BETWEEN_PREC), Associativity::Left);
358const IN_LIST_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
359const IN_SUBQUERY_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
360const LIKE_SUBQUERY_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
361const LIKE_ANY_WITH_ESCAPE_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
362const LIKE_WITH_ESCAPE_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
363const ESCAPE_AFFIX: Affix = Affix::Postfix(Precedence(BETWEEN_PREC));
364const JSON_OP_AFFIX: Affix = Affix::Infix(Precedence(40), Associativity::Left);
365const PG_CAST_AFFIX: Affix = Affix::Postfix(Precedence(60));
366
367const fn unary_affix(op: &UnaryOperator) -> Affix {
368    match op {
369        UnaryOperator::Not => Affix::Prefix(Precedence(NOT_PREC)),
370        UnaryOperator::Plus => Affix::Prefix(Precedence(50)),
371        UnaryOperator::Minus => Affix::Prefix(Precedence(50)),
372        UnaryOperator::BitwiseNot => Affix::Prefix(Precedence(50)),
373        UnaryOperator::SquareRoot => Affix::Prefix(Precedence(60)),
374        UnaryOperator::CubeRoot => Affix::Prefix(Precedence(60)),
375        UnaryOperator::Abs => Affix::Prefix(Precedence(60)),
376        UnaryOperator::Factorial => Affix::Postfix(Precedence(60)),
377    }
378}
379
380const fn binary_affix(op: &BinaryOperator) -> Affix {
381    match op {
382        BinaryOperator::Or => Affix::Infix(Precedence(5), Associativity::Left),
383        BinaryOperator::And => Affix::Infix(Precedence(10), Associativity::Left),
384        BinaryOperator::Eq => Affix::Infix(Precedence(20), Associativity::Left),
385        BinaryOperator::NotEq => Affix::Infix(Precedence(20), Associativity::Left),
386        BinaryOperator::Gt => Affix::Infix(Precedence(20), Associativity::Left),
387        BinaryOperator::Lt => Affix::Infix(Precedence(20), Associativity::Left),
388        BinaryOperator::Gte => Affix::Infix(Precedence(20), Associativity::Left),
389        BinaryOperator::Lte => Affix::Infix(Precedence(20), Associativity::Left),
390        BinaryOperator::Like(_) => Affix::Infix(Precedence(20), Associativity::Left),
391        BinaryOperator::LikeAny(_) => Affix::Infix(Precedence(20), Associativity::Left),
392        BinaryOperator::NotLike(_) => Affix::Infix(Precedence(20), Associativity::Left),
393        BinaryOperator::Regexp => Affix::Infix(Precedence(20), Associativity::Left),
394        BinaryOperator::NotRegexp => Affix::Infix(Precedence(20), Associativity::Left),
395        BinaryOperator::RLike => Affix::Infix(Precedence(20), Associativity::Left),
396        BinaryOperator::NotRLike => Affix::Infix(Precedence(20), Associativity::Left),
397        BinaryOperator::SoundsLike => Affix::Infix(Precedence(20), Associativity::Left),
398        BinaryOperator::BitwiseOr => Affix::Infix(Precedence(22), Associativity::Left),
399        BinaryOperator::BitwiseAnd => Affix::Infix(Precedence(22), Associativity::Left),
400        BinaryOperator::BitwiseXor => Affix::Infix(Precedence(22), Associativity::Left),
401        BinaryOperator::CosineDistance => Affix::Infix(Precedence(22), Associativity::Left),
402        BinaryOperator::L1Distance => Affix::Infix(Precedence(22), Associativity::Left),
403        BinaryOperator::L2Distance => Affix::Infix(Precedence(22), Associativity::Left),
404        BinaryOperator::BitwiseShiftLeft => Affix::Infix(Precedence(23), Associativity::Left),
405        BinaryOperator::BitwiseShiftRight => Affix::Infix(Precedence(23), Associativity::Left),
406        BinaryOperator::Xor => Affix::Infix(Precedence(24), Associativity::Left),
407        BinaryOperator::Plus => Affix::Infix(Precedence(30), Associativity::Left),
408        BinaryOperator::Minus => Affix::Infix(Precedence(30), Associativity::Left),
409        BinaryOperator::Multiply => Affix::Infix(Precedence(40), Associativity::Left),
410        BinaryOperator::Div => Affix::Infix(Precedence(40), Associativity::Left),
411        BinaryOperator::Divide => Affix::Infix(Precedence(40), Associativity::Left),
412        BinaryOperator::IntDiv => Affix::Infix(Precedence(40), Associativity::Left),
413        BinaryOperator::Modulo => Affix::Infix(Precedence(40), Associativity::Left),
414        BinaryOperator::StringConcat => Affix::Infix(Precedence(40), Associativity::Left),
415        BinaryOperator::Caret => Affix::Infix(Precedence(40), Associativity::Right),
416    }
417}
418
419impl ExprElement {
420    pub fn affix(&self) -> Affix {
421        match &self {
422            ExprElement::ChainFunctionCall { .. } => CHAIN_FUNCTION_AFFIX,
423            ExprElement::DotAccess { .. } => DOT_ACCESS_AFFIX,
424            ExprElement::MapAccess { .. } => MAP_ACCESS_AFFIX,
425            ExprElement::IsNull { .. } => IS_NULL_AFFIX,
426            ExprElement::Between { .. } => BETWEEN_AFFIX,
427            ExprElement::IsDistinctFrom { .. } => IS_DISTINCT_FROM_AFFIX,
428            ExprElement::InList { .. } => IN_LIST_AFFIX,
429            ExprElement::InSubquery { .. } => IN_SUBQUERY_AFFIX,
430            ExprElement::LikeSubquery { .. } => LIKE_SUBQUERY_AFFIX,
431            ExprElement::Escape { .. } => ESCAPE_AFFIX,
432            ExprElement::UnaryOp { op } => unary_affix(op),
433            ExprElement::BinaryOp { op } => binary_affix(op),
434            ExprElement::JsonOp { .. } => JSON_OP_AFFIX,
435            ExprElement::PgCast { .. } => PG_CAST_AFFIX,
436            ExprElement::ColumnRef { .. } => Affix::Nilfix,
437            ExprElement::Cast { .. } => Affix::Nilfix,
438            ExprElement::TryCast { .. } => Affix::Nilfix,
439            ExprElement::Extract { .. } => Affix::Nilfix,
440            ExprElement::DatePart { .. } => Affix::Nilfix,
441            ExprElement::Position { .. } => Affix::Nilfix,
442            ExprElement::SubString { .. } => Affix::Nilfix,
443            ExprElement::Trim { .. } => Affix::Nilfix,
444            ExprElement::Literal { .. } => Affix::Nilfix,
445            ExprElement::CountAll { .. } => Affix::Nilfix,
446            ExprElement::Tuple { .. } => Affix::Nilfix,
447            ExprElement::FunctionCall { .. } => Affix::Nilfix,
448            ExprElement::Case { .. } => Affix::Nilfix,
449            ExprElement::Exists { .. } => Affix::Nilfix,
450            ExprElement::Subquery { .. } => Affix::Nilfix,
451            ExprElement::ListComprehension { .. } => Affix::Nilfix,
452            ExprElement::Group(_) => Affix::Nilfix,
453            ExprElement::Array { .. } => Affix::Nilfix,
454            ExprElement::Map { .. } => Affix::Nilfix,
455            ExprElement::Interval { .. } => Affix::Nilfix,
456            ExprElement::DateAdd { .. } => Affix::Nilfix,
457            ExprElement::DateDiff { .. } => Affix::Nilfix,
458            ExprElement::DateBetween { .. } => Affix::Nilfix,
459            ExprElement::DateSub { .. } => Affix::Nilfix,
460            ExprElement::DateTrunc { .. } => Affix::Nilfix,
461            ExprElement::LastDay { .. } => Affix::Nilfix,
462            ExprElement::PreviousDay { .. } => Affix::Nilfix,
463            ExprElement::NextDay { .. } => Affix::Nilfix,
464            ExprElement::Hole { .. } => Affix::Nilfix,
465            ExprElement::Placeholder => Affix::Nilfix,
466            ExprElement::VariableAccess { .. } => Affix::Nilfix,
467        }
468    }
469}
470
471impl Expr {
472    pub fn affix(&self) -> Affix {
473        match self {
474            Expr::MapAccess { .. } => MAP_ACCESS_AFFIX,
475            Expr::IsNull { .. } => IS_NULL_AFFIX,
476            Expr::Between { .. } => BETWEEN_AFFIX,
477            Expr::IsDistinctFrom { .. } => Affix::Nilfix,
478            Expr::InList { .. } => IN_LIST_AFFIX,
479            Expr::InSubquery { .. } => IN_SUBQUERY_AFFIX,
480            Expr::LikeSubquery { .. } => LIKE_SUBQUERY_AFFIX,
481            Expr::LikeAnyWithEscape { .. } => LIKE_ANY_WITH_ESCAPE_AFFIX,
482            Expr::LikeWithEscape { .. } => LIKE_WITH_ESCAPE_AFFIX,
483            Expr::UnaryOp { op, .. } => unary_affix(op),
484            Expr::BinaryOp { op, .. } => binary_affix(op),
485            Expr::JsonOp { .. } => JSON_OP_AFFIX,
486            Expr::Cast { pg_style: true, .. } => PG_CAST_AFFIX,
487            Expr::Cast {
488                pg_style: false, ..
489            } => Affix::Nilfix,
490            Expr::TryCast { .. } => Affix::Nilfix,
491            Expr::Extract { .. } => Affix::Nilfix,
492            Expr::DatePart { .. } => Affix::Nilfix,
493            Expr::Position { .. } => Affix::Nilfix,
494            Expr::Substring { .. } => Affix::Nilfix,
495            Expr::ColumnRef { .. } => Affix::Nilfix,
496            Expr::Trim { .. } => Affix::Nilfix,
497            Expr::Literal { .. } => Affix::Nilfix,
498            Expr::CountAll { .. } => Affix::Nilfix,
499            Expr::Tuple { .. } => Affix::Nilfix,
500            Expr::FunctionCall { .. } => Affix::Nilfix,
501            Expr::Case { .. } => Affix::Nilfix,
502            Expr::Exists { .. } => Affix::Nilfix,
503            Expr::Subquery { .. } => Affix::Nilfix,
504            Expr::Array { .. } => Affix::Nilfix,
505            Expr::Map { .. } => Affix::Nilfix,
506            Expr::Interval { .. } => Affix::Nilfix,
507            Expr::DateAdd { .. } => Affix::Nilfix,
508            Expr::DateDiff { .. } => Affix::Nilfix,
509            Expr::DateBetween { .. } => Affix::Nilfix,
510            Expr::DateSub { .. } => Affix::Nilfix,
511            Expr::DateTrunc { .. } => Affix::Nilfix,
512            Expr::LastDay { .. } => Affix::Nilfix,
513            Expr::PreviousDay { .. } => Affix::Nilfix,
514            Expr::NextDay { .. } => Affix::Nilfix,
515            Expr::Hole { .. } => Affix::Nilfix,
516            Expr::Placeholder { .. } => Affix::Nilfix,
517        }
518    }
519}
520
521struct ExprParser;
522
523impl<'a, I: Iterator<Item = WithSpan<'a, ExprElement>>> PrattParser<I> for ExprParser {
524    type Error = &'static str;
525    type Input = WithSpan<'a, ExprElement>;
526    type Output = Expr;
527
528    fn query(&mut self, elem: &WithSpan<ExprElement>) -> Result<Affix, &'static str> {
529        Ok(elem.elem.affix())
530    }
531
532    fn primary(&mut self, elem: WithSpan<'a, ExprElement>) -> Result<Expr, &'static str> {
533        let expr = match elem.elem {
534            ExprElement::ColumnRef { column } => Expr::ColumnRef {
535                span: transform_span(elem.span.tokens),
536                column,
537            },
538            ExprElement::Cast { expr, target_type } => Expr::Cast {
539                span: transform_span(elem.span.tokens),
540                expr,
541                target_type,
542                pg_style: false,
543            },
544            ExprElement::TryCast { expr, target_type } => Expr::TryCast {
545                span: transform_span(elem.span.tokens),
546                expr,
547                target_type,
548            },
549            ExprElement::Extract { field, expr } => Expr::Extract {
550                span: transform_span(elem.span.tokens),
551                kind: field,
552                expr,
553            },
554            ExprElement::DatePart { field, expr } => Expr::DatePart {
555                span: transform_span(elem.span.tokens),
556                kind: field,
557                expr,
558            },
559            ExprElement::Position {
560                substr_expr,
561                str_expr,
562            } => Expr::Position {
563                span: transform_span(elem.span.tokens),
564                substr_expr,
565                str_expr,
566            },
567            ExprElement::SubString {
568                expr,
569                substring_from,
570                substring_for,
571            } => Expr::Substring {
572                span: transform_span(elem.span.tokens),
573                expr,
574                substring_from,
575                substring_for,
576            },
577            ExprElement::Trim { expr, trim_where } => Expr::Trim {
578                span: transform_span(elem.span.tokens),
579                expr,
580                trim_where,
581            },
582            ExprElement::Literal { value } => Expr::Literal {
583                span: transform_span(elem.span.tokens),
584                value,
585            },
586            ExprElement::CountAll { qualified, window } => Expr::CountAll {
587                span: transform_span(elem.span.tokens),
588                qualified,
589                window,
590            },
591            ExprElement::Tuple { exprs } => Expr::Tuple {
592                span: transform_span(elem.span.tokens),
593                exprs,
594            },
595            ExprElement::FunctionCall { func } => Expr::FunctionCall {
596                span: transform_span(elem.span.tokens),
597                func,
598            },
599            ExprElement::Case {
600                operand,
601                conditions,
602                results,
603                else_result,
604            } => Expr::Case {
605                span: transform_span(elem.span.tokens),
606                operand,
607                conditions,
608                results,
609                else_result,
610            },
611            ExprElement::Exists { subquery, not } => Expr::Exists {
612                span: transform_span(elem.span.tokens),
613                not,
614                subquery: Box::new(subquery),
615            },
616            ExprElement::Subquery { subquery, modifier } => Expr::Subquery {
617                span: transform_span(elem.span.tokens),
618                modifier,
619                subquery: Box::new(subquery),
620            },
621            ExprElement::Group(expr) => expr,
622            ExprElement::Array { exprs } => Expr::Array {
623                span: transform_span(elem.span.tokens),
624                exprs,
625            },
626            ExprElement::ListComprehension {
627                source,
628                param,
629                filter,
630                result,
631            } => {
632                let span = transform_span(elem.span.tokens);
633                let mut source = source;
634
635                // array_filter(source, filter)
636                if let Some(filter) = filter {
637                    source = Expr::FunctionCall {
638                        span,
639                        func: FunctionCall {
640                            distinct: false,
641                            name: Identifier::from_name(
642                                transform_span(elem.span.tokens),
643                                "array_filter",
644                            ),
645                            args: vec![source],
646                            params: vec![],
647                            order_by: vec![],
648                            window: None,
649                            lambda: Some(Lambda {
650                                params: vec![param.clone()],
651                                expr: Box::new(filter),
652                            }),
653                        },
654                    };
655                }
656                // array_map(source, result)
657                Expr::FunctionCall {
658                    span,
659                    func: FunctionCall {
660                        distinct: false,
661                        name: Identifier::from_name(transform_span(elem.span.tokens), "array_map"),
662                        args: vec![source],
663                        params: vec![],
664                        order_by: vec![],
665                        window: None,
666                        lambda: Some(Lambda {
667                            params: vec![param.clone()],
668                            expr: Box::new(result),
669                        }),
670                    },
671                }
672            }
673            ExprElement::Map { kvs } => Expr::Map {
674                span: transform_span(elem.span.tokens),
675                kvs,
676            },
677            ExprElement::Interval { expr, unit } => Expr::Interval {
678                span: transform_span(elem.span.tokens),
679                expr: Box::new(expr),
680                unit,
681            },
682            ExprElement::DateAdd {
683                unit,
684                interval,
685                date,
686            } => Expr::DateAdd {
687                span: transform_span(elem.span.tokens),
688                unit,
689                interval: Box::new(interval),
690                date: Box::new(date),
691            },
692            ExprElement::DateDiff {
693                unit,
694                date_start,
695                date_end,
696            } => Expr::DateDiff {
697                span: transform_span(elem.span.tokens),
698                unit,
699                date_start: Box::new(date_start),
700                date_end: Box::new(date_end),
701            },
702            ExprElement::DateBetween {
703                unit,
704                date_start,
705                date_end,
706            } => Expr::DateBetween {
707                span: transform_span(elem.span.tokens),
708                unit,
709                date_start: Box::new(date_start),
710                date_end: Box::new(date_end),
711            },
712            ExprElement::DateSub {
713                unit,
714                interval,
715                date,
716            } => Expr::DateSub {
717                span: transform_span(elem.span.tokens),
718                unit,
719                interval: Box::new(interval),
720                date: Box::new(date),
721            },
722            ExprElement::DateTrunc { unit, date } => Expr::DateTrunc {
723                span: transform_span(elem.span.tokens),
724                unit,
725                date: Box::new(date),
726            },
727            ExprElement::LastDay { unit, date } => Expr::LastDay {
728                span: transform_span(elem.span.tokens),
729                unit,
730                date: Box::new(date),
731            },
732            ExprElement::PreviousDay { unit, date } => Expr::PreviousDay {
733                span: transform_span(elem.span.tokens),
734                unit,
735                date: Box::new(date),
736            },
737            ExprElement::NextDay { unit, date } => Expr::NextDay {
738                span: transform_span(elem.span.tokens),
739                unit,
740                date: Box::new(date),
741            },
742            ExprElement::Hole { name } => Expr::Hole {
743                span: transform_span(elem.span.tokens),
744                name,
745            },
746            ExprElement::Placeholder => Expr::Placeholder {
747                span: transform_span(elem.span.tokens),
748            },
749            ExprElement::VariableAccess(name) => {
750                let span = transform_span(elem.span.tokens);
751                make_func_get_variable(span, name)
752            }
753            _ => unreachable!(),
754        };
755        Ok(expr)
756    }
757
758    fn infix(
759        &mut self,
760        lhs: Expr,
761        elem: WithSpan<'a, ExprElement>,
762        rhs: Expr,
763    ) -> Result<Expr, &'static str> {
764        let expr = match elem.elem {
765            ExprElement::BinaryOp { op } => Expr::BinaryOp {
766                span: transform_span(elem.span.tokens),
767                left: Box::new(lhs),
768                right: Box::new(rhs),
769                op,
770            },
771            ExprElement::IsDistinctFrom { not } => Expr::IsDistinctFrom {
772                span: transform_span(elem.span.tokens),
773                left: Box::new(lhs),
774                right: Box::new(rhs),
775                not,
776            },
777            ExprElement::JsonOp { op } => Expr::JsonOp {
778                span: transform_span(elem.span.tokens),
779                left: Box::new(lhs),
780                right: Box::new(rhs),
781                op,
782            },
783            _ => unreachable!(),
784        };
785        Ok(expr)
786    }
787
788    fn prefix(&mut self, elem: WithSpan<'a, ExprElement>, rhs: Expr) -> Result<Expr, &'static str> {
789        let expr = match elem.elem {
790            ExprElement::UnaryOp { op } => Expr::UnaryOp {
791                span: transform_span(elem.span.tokens),
792                op,
793                expr: Box::new(rhs),
794            },
795            _ => unreachable!(),
796        };
797        Ok(expr)
798    }
799
800    fn postfix(
801        &mut self,
802        mut lhs: Expr,
803        elem: WithSpan<'a, ExprElement>,
804    ) -> Result<Expr, &'static str> {
805        let expr = match elem.elem {
806            ExprElement::MapAccess { accessor } => Expr::MapAccess {
807                span: transform_span(elem.span.tokens),
808                expr: Box::new(lhs),
809                accessor,
810            },
811            ExprElement::DotAccess { key } => {
812                // `database.table.column` is parsed into [database] [.table] [.column],
813                // so we need to transform it into the right `ColumnRef` form.
814                if let Expr::ColumnRef { column, .. } = &mut lhs {
815                    if let ColumnID::Name(name) = &column.column {
816                        column.database = column.table.take();
817                        column.table = Some(name.clone());
818                        column.column = key.clone();
819                        return Ok(lhs);
820                    }
821                }
822
823                match key {
824                    ColumnID::Name(id) => Expr::MapAccess {
825                        span: transform_span(elem.span.tokens),
826                        expr: Box::new(lhs),
827                        accessor: MapAccessor::Colon { key: id },
828                    },
829                    _ => {
830                        return Err("dot access position must be after ident");
831                    }
832                }
833            }
834            ExprElement::ChainFunctionCall { name, args, lambda } => Expr::FunctionCall {
835                span: transform_span(elem.span.tokens),
836                func: FunctionCall {
837                    distinct: false,
838                    name,
839                    args: [vec![lhs], args].concat(),
840                    params: vec![],
841                    order_by: vec![],
842                    window: None,
843                    lambda,
844                },
845            },
846            ExprElement::IsNull { not } => Expr::IsNull {
847                span: transform_span(elem.span.tokens),
848                expr: Box::new(lhs),
849                not,
850            },
851            ExprElement::InList { list, not } => Expr::InList {
852                span: transform_span(elem.span.tokens),
853                expr: Box::new(lhs),
854                list,
855                not,
856            },
857            ExprElement::InSubquery { subquery, not } => Expr::InSubquery {
858                span: transform_span(elem.span.tokens),
859                expr: Box::new(lhs),
860                subquery,
861                not,
862            },
863            ExprElement::LikeSubquery {
864                subquery,
865                modifier,
866                escape,
867            } => Expr::LikeSubquery {
868                span: transform_span(elem.span.tokens),
869                expr: Box::new(lhs),
870                subquery,
871                modifier,
872                escape,
873            },
874            ExprElement::Escape { escape } => match lhs {
875                Expr::BinaryOp {
876                    span,
877                    op: BinaryOperator::Like(_),
878                    left,
879                    right,
880                } => Expr::LikeWithEscape {
881                    span,
882                    left,
883                    right,
884                    is_not: false,
885                    escape,
886                },
887                Expr::BinaryOp {
888                    span,
889                    op: BinaryOperator::NotLike(_),
890                    left,
891                    right,
892                } => Expr::LikeWithEscape {
893                    span,
894                    left,
895                    right,
896                    is_not: true,
897                    escape,
898                },
899                Expr::BinaryOp {
900                    span,
901                    op: BinaryOperator::LikeAny(_),
902                    left,
903                    right,
904                } => Expr::LikeAnyWithEscape {
905                    span,
906                    left,
907                    right,
908                    escape,
909                },
910                _ => return Err("escape clause must be after LIKE/NOT LIKE/LIKE ANY binary expr"),
911            },
912            ExprElement::Between { low, high, not } => Expr::Between {
913                span: transform_span(elem.span.tokens),
914                expr: Box::new(lhs),
915                low,
916                high,
917                not,
918            },
919            ExprElement::PgCast { target_type } => Expr::Cast {
920                span: transform_span(elem.span.tokens),
921                expr: Box::new(lhs),
922                target_type,
923                pg_style: true,
924            },
925            ExprElement::UnaryOp { op } => Expr::UnaryOp {
926                span: transform_span(elem.span.tokens),
927                op,
928                expr: Box::new(lhs),
929            },
930            _ => unreachable!(),
931        };
932        Ok(expr)
933    }
934}
935
936pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
937    let column_ref = map(column_id, |column| ExprElement::ColumnRef {
938        column: ColumnRef {
939            database: None,
940            table: None,
941            column,
942        },
943    });
944    let is_null = map(
945        rule! {
946            IS ~ NOT? ~ NULL
947        },
948        |(_, opt_not, _)| ExprElement::IsNull {
949            not: opt_not.is_some(),
950        },
951    );
952    let in_list = map(
953        rule! {
954            NOT? ~ IN ~ "(" ~ #comma_separated_list1(subexpr(0)) ~ ^")"
955        },
956        |(opt_not, _, _, list, _)| ExprElement::InList {
957            list,
958            not: opt_not.is_some(),
959        },
960    );
961    let in_subquery = map(
962        rule! {
963            NOT? ~ IN ~ "(" ~ #query  ~ ^")"
964        },
965        |(opt_not, _, _, subquery, _)| ExprElement::InSubquery {
966            subquery: Box::new(subquery),
967            not: opt_not.is_some(),
968        },
969    );
970    let like_subquery = map(
971        rule! {
972            LIKE ~ ( ANY | SOME | ALL ) ~ "(" ~ #query ~ ^")" ~ (ESCAPE ~  ^#literal_string)?
973        },
974        |(_, m, _, subquery, _, option_escape)| {
975            let modifier = match m.kind {
976                TokenKind::ALL => SubqueryModifier::All,
977                TokenKind::ANY => SubqueryModifier::Any,
978                TokenKind::SOME => SubqueryModifier::Some,
979                _ => unreachable!(),
980            };
981            ExprElement::LikeSubquery {
982                modifier,
983                subquery: Box::new(subquery),
984                escape: option_escape.map(|(_, escape)| escape),
985            }
986        },
987    );
988    let escape = map(
989        rule! {
990            ESCAPE ~  ^#literal_string
991        },
992        |(_, escape)| ExprElement::Escape { escape },
993    );
994    let between = map(
995        rule! {
996            NOT? ~ BETWEEN ~ ^#subexpr(BETWEEN_PREC) ~ ^AND ~ ^#subexpr(BETWEEN_PREC)
997        },
998        |(opt_not, _, low, _, high)| ExprElement::Between {
999            low: Box::new(low),
1000            high: Box::new(high),
1001            not: opt_not.is_some(),
1002        },
1003    );
1004    let cast = map(
1005        rule! {
1006            ( CAST | TRY_CAST )
1007            ~ "("
1008            ~ ^#subexpr(0)
1009            ~ ^( AS | "," )
1010            ~ ^#type_name
1011            ~ ^")"
1012        },
1013        |(cast, _, expr, _, target_type, _)| {
1014            if cast.kind == CAST {
1015                ExprElement::Cast {
1016                    expr: Box::new(expr),
1017                    target_type,
1018                }
1019            } else {
1020                ExprElement::TryCast {
1021                    expr: Box::new(expr),
1022                    target_type,
1023                }
1024            }
1025        },
1026    );
1027    let pg_cast = map(
1028        rule! {
1029            "::" ~ ^#type_name
1030        },
1031        |(_, target_type)| ExprElement::PgCast { target_type },
1032    );
1033    let date_part = map(
1034        rule! {
1035            (DATE_PART | DATEPART) ~ "(" ~ ^#interval_kind ~ "," ~ ^#subexpr(0) ~ ^")"
1036        },
1037        |(_, _, field, _, expr, _)| ExprElement::DatePart {
1038            field,
1039            expr: Box::new(expr),
1040        },
1041    );
1042    let extract = map(
1043        rule! {
1044            EXTRACT ~ "(" ~ ^#interval_kind ~ ^FROM ~ ^#subexpr(0) ~ ^")"
1045        },
1046        |(_, _, field, _, expr, _)| ExprElement::Extract {
1047            field,
1048            expr: Box::new(expr),
1049        },
1050    );
1051    let position = map(
1052        rule! {
1053            POSITION
1054            ~ "("
1055            ~ ^#subexpr(BETWEEN_PREC)
1056            ~ ^IN
1057            ~ ^#subexpr(0)
1058            ~ ^")"
1059        },
1060        |(_, _, substr_expr, _, str_expr, _)| ExprElement::Position {
1061            substr_expr: Box::new(substr_expr),
1062            str_expr: Box::new(str_expr),
1063        },
1064    );
1065    let substring = map(
1066        rule! {
1067            ( SUBSTRING | SUBSTR )
1068            ~ "("
1069            ~ ^#subexpr(0)
1070            ~ ( FROM | "," )
1071            ~ ^#subexpr(0)
1072            ~ ( ( FOR | "," ) ~ ^#subexpr(0) )?
1073            ~ ^")"
1074        },
1075        |(_, _, expr, _, substring_from, opt_substring_for, _)| ExprElement::SubString {
1076            expr: Box::new(expr),
1077            substring_from: Box::new(substring_from),
1078            substring_for: opt_substring_for.map(|(_, expr)| Box::new(expr)),
1079        },
1080    );
1081    let trim_where = alt((
1082        value(TrimWhere::Both, rule! { BOTH }),
1083        value(TrimWhere::Leading, rule! { LEADING }),
1084        value(TrimWhere::Trailing, rule! { TRAILING }),
1085    ));
1086    let trim_from = map(
1087        rule! {
1088            TRIM
1089            ~ "("
1090            ~ #trim_where
1091            ~ ^#subexpr(0)
1092            ~ ^FROM
1093            ~ ^#subexpr(0)
1094            ~ ^")"
1095        },
1096        |(_, _, trim_where, trim_str, _, expr, _)| ExprElement::Trim {
1097            expr: Box::new(expr),
1098            trim_where: Some((trim_where, Box::new(trim_str))),
1099        },
1100    );
1101
1102    let count_all_with_window = map(
1103        rule! {
1104            COUNT ~ "(" ~  ( #ident ~ "." ~ ( #ident ~ "." )? )? ~ "*" ~ ")" ~ ( OVER ~ #window_spec_ident )?
1105        },
1106        |(_, _, res, star, _, window)| match res {
1107            Some((fst, _, Some((snd, _)))) => ExprElement::CountAll {
1108                qualified: vec![
1109                    Indirection::Identifier(fst),
1110                    Indirection::Identifier(snd),
1111                    Indirection::Star(Some(star.span)),
1112                ],
1113                window: window.map(|w| w.1),
1114            },
1115            Some((fst, _, None)) => ExprElement::CountAll {
1116                qualified: vec![
1117                    Indirection::Identifier(fst),
1118                    Indirection::Star(Some(star.span)),
1119                ],
1120                window: window.map(|w| w.1),
1121            },
1122            None => ExprElement::CountAll {
1123                qualified: vec![Indirection::Star(Some(star.span))],
1124                window: window.map(|w| w.1),
1125            },
1126        },
1127    );
1128
1129    let tuple = map(
1130        rule! {
1131            "(" ~ #comma_separated_list1_ignore_trailing(subexpr(0)) ~ ","? ~ ^")"
1132        },
1133        |(_, mut exprs, opt_trail, _)| {
1134            if exprs.len() == 1 && opt_trail.is_none() {
1135                ExprElement::Group(exprs.remove(0))
1136            } else {
1137                ExprElement::Tuple { exprs }
1138            }
1139        },
1140    );
1141    let subquery = map(
1142        rule! {
1143            ( ANY | SOME | ALL )? ~ "(" ~ #query ~ ^")"
1144        },
1145        |(modifier, _, subquery, _)| {
1146            let modifier = modifier.map(|m| match m.kind {
1147                TokenKind::ALL => SubqueryModifier::All,
1148                TokenKind::ANY => SubqueryModifier::Any,
1149                TokenKind::SOME => SubqueryModifier::Some,
1150                _ => unreachable!(),
1151            });
1152            ExprElement::Subquery { modifier, subquery }
1153        },
1154    );
1155
1156    let case = map(
1157        rule! {
1158            CASE ~ #subexpr(0)?
1159            ~ ( WHEN ~ ^#subexpr(0) ~ ^THEN ~ ^#subexpr(0) )+
1160            ~ ( ELSE ~ ^#subexpr(0) )? ~ ^END
1161        },
1162        |(_, operand, branches, else_result, _)| {
1163            let (conditions, results) = branches
1164                .into_iter()
1165                .map(|(_, cond, _, result)| (cond, result))
1166                .unzip();
1167            let else_result = else_result.map(|(_, result)| result);
1168            ExprElement::Case {
1169                operand: operand.map(Box::new),
1170                conditions,
1171                results,
1172                else_result: else_result.map(Box::new),
1173            }
1174        },
1175    );
1176    let exists = map(
1177        rule! {
1178            NOT? ~ EXISTS ~ "(" ~ ^#query ~ ^")"
1179        },
1180        |(opt_not, _, _, subquery, _)| ExprElement::Exists {
1181            subquery,
1182            not: opt_not.is_some(),
1183        },
1184    );
1185    let binary_op = map(binary_op, |op| ExprElement::BinaryOp { op });
1186    let json_op = map(json_op, |op| ExprElement::JsonOp { op });
1187    let variable_access = map(variable_ident, ExprElement::VariableAccess);
1188
1189    let unary_op = map(unary_op, |op| ExprElement::UnaryOp { op });
1190    let map_access = map(map_access, |accessor| ExprElement::MapAccess { accessor });
1191    let dot_access = map(
1192        rule! {
1193           "." ~ #column_id
1194        },
1195        |(_, key)| ExprElement::DotAccess { key },
1196    );
1197
1198    let chain_function_call = check_experimental_chain_function(
1199        true,
1200        alt((
1201            map(
1202                rule! {
1203                    "." ~ #function_name
1204                    ~ "(" ~ #ident ~ "->" ~ #subexpr(0) ~ ")"
1205                },
1206                |(_, name, _, param, _, expr, _)| ExprElement::ChainFunctionCall {
1207                    name,
1208                    args: vec![],
1209                    lambda: Some(Lambda {
1210                        params: vec![param],
1211                        expr: Box::new(expr),
1212                    }),
1213                },
1214            ),
1215            map(
1216                rule! {
1217                    "." ~ #function_name ~ "(" ~ #comma_separated_list0(subexpr(0)) ~ ^")"
1218                },
1219                |(_, name, _, args, _)| ExprElement::ChainFunctionCall {
1220                    name,
1221                    args,
1222                    lambda: None,
1223                },
1224            ),
1225        )),
1226    );
1227
1228    // python style list comprehensions
1229    // python: [i for i in range(10) if i%2==0 ]
1230    // sql: [i for i in range(10) if i%2 = 0 ]
1231    let list_comprehensions = check_experimental_list_comprehension(
1232        true,
1233        map(
1234            rule! {
1235                "[" ~ #subexpr(0) ~ FOR ~ #ident ~ IN
1236                ~ #subexpr(0) ~ (IF ~ #subexpr(2))? ~ "]"
1237            },
1238            |(_, result, _, param, _, source, opt_filter, _)| {
1239                let filter = opt_filter.map(|(_, filter)| filter);
1240                ExprElement::ListComprehension {
1241                    source,
1242                    param,
1243                    filter,
1244                    result,
1245                }
1246            },
1247        ),
1248    );
1249
1250    // Floating point literal with leading dot will be parsed as a period map access,
1251    // and then will be converted back to a floating point literal if the map access
1252    // is not following a primary element nor a postfix element.
1253    let literal = map(literal, |value| ExprElement::Literal { value });
1254    let array = map(
1255        // Array that contains a single literal item will be parsed as a bracket map access,
1256        // and then will be converted back to an array if the map access is not following
1257        // a primary element nor a postfix element.
1258        rule! {
1259            "[" ~ #comma_separated_list0_ignore_trailing(subexpr(0))? ~ ","? ~ ^"]"
1260        },
1261        |(_, opt_args, _, _)| {
1262            let exprs = opt_args.unwrap_or_default();
1263            ExprElement::Array { exprs }
1264        },
1265    );
1266
1267    let map_expr = map(
1268        rule! { "{" ~ #comma_separated_list0(map_element) ~ "}" },
1269        |(_, kvs, _)| ExprElement::Map { kvs },
1270    );
1271
1272    let date_add = map(
1273        rule! {
1274            (DATEADD | DATE_ADD) ~ "(" ~ #interval_kind ~ "," ~ #subexpr(0) ~ "," ~ #subexpr(0) ~ ")"
1275        },
1276        |(_, _, unit, _, interval, _, date, _)| ExprElement::DateAdd {
1277            unit,
1278            interval,
1279            date,
1280        },
1281    );
1282
1283    let date_diff = map(
1284        rule! {
1285            (DATE_DIFF | DATEDIFF) ~ "(" ~ #interval_kind ~ "," ~ #subexpr(0) ~ "," ~ #subexpr(0) ~ ")"
1286        },
1287        |(_, _, unit, _, date_start, _, date_end, _)| ExprElement::DateDiff {
1288            unit,
1289            date_start,
1290            date_end,
1291        },
1292    );
1293
1294    let date_sub = map(
1295        rule! {
1296            (DATESUB | DATE_SUB) ~ "(" ~ #interval_kind ~ "," ~ #subexpr(0) ~ "," ~ #subexpr(0) ~ ")"
1297        },
1298        |(_, _, unit, _, interval, _, date, _)| ExprElement::DateSub {
1299            unit,
1300            interval,
1301            date,
1302        },
1303    );
1304
1305    let date_between = map(
1306        rule! {
1307            (DATEBETWEEN | DATE_BETWEEN) ~ "(" ~ #interval_kind ~ "," ~ #subexpr(0) ~ "," ~ #subexpr(0) ~ ")"
1308        },
1309        |(_, _, unit, _, date_start, _, date_end, _)| ExprElement::DateBetween {
1310            unit,
1311            date_start,
1312            date_end,
1313        },
1314    );
1315
1316    let interval = map(
1317        rule! {
1318            INTERVAL ~ #subexpr(0) ~ #interval_kind
1319        },
1320        |(_, operand, unit)| ExprElement::Interval {
1321            expr: operand,
1322            unit,
1323        },
1324    );
1325    let date_trunc = map(
1326        rule! {
1327            DATE_TRUNC ~ "(" ~ #interval_kind ~ "," ~ #subexpr(0) ~ ")"
1328        },
1329        |(_, _, unit, _, date, _)| ExprElement::DateTrunc { unit, date },
1330    );
1331
1332    let trunc = map(
1333        rule! {
1334            TRUNC ~ "(" ~  (#subexpr(0) ~ "," ~  #interval_kind)? ~ (#subexpr(0) ~ ("," ~  #subexpr(0))?)? ~ ")"
1335        },
1336        |(s, _, opt_date, opt_numeric, _)| {
1337            return match (opt_date, opt_numeric) {
1338                (Some((date, _, unit)), None) => ExprElement::DateTrunc { unit, date },
1339                (None, Some((expr, opt_expr2))) => {
1340                    if let Some((_, expr2)) = opt_expr2 {
1341                        ExprElement::FunctionCall {
1342                            func: FunctionCall {
1343                                distinct: false,
1344                                name: Identifier::from_name(Some(s.span), "TRUNCATE"),
1345                                args: vec![expr, expr2],
1346                                ..Default::default()
1347                            },
1348                        }
1349                    } else {
1350                        ExprElement::FunctionCall {
1351                            func: FunctionCall {
1352                                distinct: false,
1353                                name: Identifier::from_name(Some(s.span), "TRUNCATE"),
1354                                args: vec![expr],
1355                                ..Default::default()
1356                            },
1357                        }
1358                    }
1359                }
1360                _ => ExprElement::DateTrunc {
1361                    unit: IntervalKind::UnknownIntervalKind,
1362                    date: Expr::Literal {
1363                        span: None,
1364                        value: Literal::Null,
1365                    },
1366                },
1367            };
1368        },
1369    );
1370
1371    let last_day = map(
1372        rule! {
1373            LAST_DAY ~ "(" ~ #subexpr(0) ~ ("," ~ #interval_kind)? ~ ")"
1374        },
1375        |(_, _, date, opt_unit, _)| {
1376            if let Some((_, unit)) = opt_unit {
1377                ExprElement::LastDay { unit, date }
1378            } else {
1379                ExprElement::LastDay {
1380                    unit: IntervalKind::Month,
1381                    date,
1382                }
1383            }
1384        },
1385    );
1386
1387    let previous_day = map(
1388        rule! {
1389            PREVIOUS_DAY ~ "(" ~ #subexpr(0) ~ "," ~ #weekday ~ ")"
1390        },
1391        |(_, _, date, _, unit, _)| ExprElement::PreviousDay { unit, date },
1392    );
1393
1394    let next_day = map(
1395        rule! {
1396            NEXT_DAY ~ "(" ~ #subexpr(0) ~ "," ~ #weekday ~ ")"
1397        },
1398        |(_, _, date, _, unit, _)| ExprElement::NextDay { unit, date },
1399    );
1400
1401    let date_expr = map(
1402        rule! {
1403            DATE ~ #consumed(literal_string)
1404        },
1405        |(_, (span, date))| ExprElement::Cast {
1406            expr: Box::new(Expr::Literal {
1407                span: transform_span(span.tokens),
1408                value: Literal::String(date),
1409            }),
1410            target_type: TypeName::Date,
1411        },
1412    );
1413
1414    let timestamp_expr = map(
1415        rule! {
1416            TIMESTAMP ~ #consumed(literal_string)
1417        },
1418        |(_, (span, date))| ExprElement::Cast {
1419            expr: Box::new(Expr::Literal {
1420                span: transform_span(span.tokens),
1421                value: Literal::String(date),
1422            }),
1423            target_type: TypeName::Timestamp,
1424        },
1425    );
1426
1427    let interval_expr = map(
1428        rule! {
1429            INTERVAL ~ #consumed(literal_string)
1430        },
1431        |(_, (span, date))| ExprElement::Cast {
1432            expr: Box::new(Expr::Literal {
1433                span: transform_span(span.tokens),
1434                value: Literal::String(date),
1435            }),
1436            target_type: TypeName::Interval,
1437        },
1438    );
1439
1440    let is_distinct_from = map(
1441        rule! {
1442            IS ~ NOT? ~ DISTINCT ~ FROM
1443        },
1444        |(_, not, _, _)| ExprElement::IsDistinctFrom { not: not.is_some() },
1445    );
1446
1447    let current_timestamp = map(consumed(rule! { CURRENT_TIMESTAMP }), |(span, _)| {
1448        ExprElement::FunctionCall {
1449            func: FunctionCall {
1450                distinct: false,
1451                name: Identifier::from_name(transform_span(span.tokens), "current_timestamp"),
1452                args: vec![],
1453                params: vec![],
1454                order_by: vec![],
1455                window: None,
1456                lambda: None,
1457            },
1458        }
1459    });
1460
1461    map(
1462        consumed(alt((
1463            // Note: each `alt` call supports maximum of 21 parsers
1464            rule!(
1465                #is_null : "`... IS [NOT] NULL`"
1466                | #in_list : "`[NOT] IN (<expr>, ...)`"
1467                | #in_subquery : "`[NOT] IN (SELECT ...)`"
1468                | #like_subquery: "`LIKE ANY | ALL | SOME (SELECT ...)`"
1469                | #exists : "`[NOT] EXISTS (SELECT ...)`"
1470                | #between : "`[NOT] BETWEEN ... AND ...`"
1471                | #binary_op : "<operator>"
1472                | #json_op : "<operator>"
1473                | #unary_op : "<operator>"
1474                | #cast : "`CAST(... AS ...)`"
1475                | #pg_cast : "`::<type_name>`"
1476                | #position : "`POSITION(... IN ...)`"
1477                | #variable_access: "`$<ident>`"
1478            ),
1479            rule! (
1480                #date_add : "`DATE_ADD(..., ..., (YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | DOY | DOW))`"
1481                | #date_diff : "`DATE_DIFF(..., ..., (YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | DOY | DOW))`"
1482                | #date_sub : "`DATE_SUB(..., ..., (YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | DOY | DOW))`"
1483                | #date_between : "`DATE_BETWEEN((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | DOY | DOW), ..., ...,)`"
1484                | #date_trunc : "`DATE_TRUNC((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | WEEK), ...)`"
1485                | #trunc : "`TRUNC(..., (YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | WEEK))`"
1486                | #last_day : "`LAST_DAY(..., (YEAR | QUARTER | MONTH | WEEK)))`"
1487                | #previous_day : "`PREVIOUS_DAY(..., (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday))`"
1488                | #next_day : "`NEXT_DAY(..., (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday))`"
1489                | #date_expr : "`DATE <str_literal>`"
1490                | #timestamp_expr : "`TIMESTAMP <str_literal>`"
1491                | #interval : "`INTERVAL ... (YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | DOY | DOW)`"
1492                | #interval_expr : "`INTERVAL <str_literal>`"
1493                | #extract : "`EXTRACT((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | WEEK) FROM ...)`"
1494                | #date_part : "`DATE_PART((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND | WEEK), ...)`"
1495            ),
1496            rule!(
1497                #substring : "`SUBSTRING(... [FROM ...] [FOR ...])`"
1498                | #trim_from : "`TRIM([(BOTH | LEADEING | TRAILING) ... FROM ...)`"
1499                | #is_distinct_from: "`... IS [NOT] DISTINCT FROM ...`"
1500                | #chain_function_call : "x.function(...)"
1501                | #list_comprehensions: "[expr for x in ... [if ...]]"
1502                | #count_all_with_window : "`COUNT(*) OVER ...`"
1503                | #function_call
1504                | #escape: "`ESCAPE '<escape>'`"
1505            ),
1506            rule!(
1507                #case : "`CASE ... END`"
1508                | #tuple : "`(<expr> [, ...])`"
1509                | #subquery : "`(SELECT ...)`"
1510                | #column_ref : "<column>"
1511                | #dot_access : "<dot_access>"
1512                | #map_access : "[<key>] | .<key> | :<key>"
1513                | #literal : "<literal>"
1514                | #current_timestamp: "CURRENT_TIMESTAMP"
1515                | #array : "`[<expr>, ...]`"
1516                | #map_expr : "`{ <literal> : <expr>, ... }`"
1517            ),
1518        ))),
1519        |(span, elem)| WithSpan { span, elem },
1520    )(i)
1521}
1522
1523pub fn unary_op(i: Input) -> IResult<UnaryOperator> {
1524    // Plus and Minus are parsed as binary op at first.
1525    alt((
1526        value(UnaryOperator::Not, rule! { NOT }),
1527        value(UnaryOperator::Factorial, rule! { Factorial }),
1528        value(UnaryOperator::SquareRoot, rule! { SquareRoot }),
1529        value(UnaryOperator::BitwiseNot, rule! { BitWiseNot }),
1530        value(UnaryOperator::CubeRoot, rule! { CubeRoot }),
1531        value(UnaryOperator::Abs, rule! { Abs }),
1532    ))(i)
1533}
1534
1535pub fn binary_op(i: Input) -> IResult<BinaryOperator> {
1536    alt((
1537        alt((
1538            value(BinaryOperator::Plus, rule! { "+" }),
1539            value(BinaryOperator::Minus, rule! { "-" }),
1540            value(BinaryOperator::Multiply, rule! { "*" }),
1541            value(BinaryOperator::Divide, rule! { "/" }),
1542            value(BinaryOperator::IntDiv, rule! { "//" }),
1543            value(BinaryOperator::Div, rule! { DIV }),
1544            value(BinaryOperator::Modulo, rule! { "%" }),
1545            value(BinaryOperator::StringConcat, rule! { "||" }),
1546            value(BinaryOperator::CosineDistance, rule! { "<=>" }),
1547            value(BinaryOperator::L1Distance, rule! { "<+>" }),
1548            value(BinaryOperator::L2Distance, rule! { "<->" }),
1549            value(BinaryOperator::Gt, rule! { ">" }),
1550            value(BinaryOperator::Lt, rule! { "<" }),
1551            value(BinaryOperator::Gte, rule! { ">=" }),
1552            value(BinaryOperator::Lte, rule! { "<=" }),
1553            value(BinaryOperator::Eq, rule! { "=" }),
1554            value(BinaryOperator::NotEq, rule! { "<>" | "!=" }),
1555            value(BinaryOperator::Caret, rule! { "^" }),
1556        )),
1557        alt((
1558            value(BinaryOperator::And, rule! { AND }),
1559            value(BinaryOperator::Or, rule! { OR }),
1560            value(BinaryOperator::Xor, rule! { XOR }),
1561            value(BinaryOperator::LikeAny(None), rule! { LIKE ~ ANY }),
1562            value(BinaryOperator::Like(None), rule! { LIKE }),
1563            value(BinaryOperator::NotLike(None), rule! { NOT ~ LIKE }),
1564            value(BinaryOperator::Regexp, rule! { REGEXP }),
1565            value(BinaryOperator::NotRegexp, rule! { NOT ~ REGEXP }),
1566            value(BinaryOperator::RLike, rule! { RLIKE }),
1567            value(BinaryOperator::NotRLike, rule! { NOT ~ RLIKE }),
1568            value(BinaryOperator::SoundsLike, rule! { SOUNDS ~ LIKE }),
1569            value(BinaryOperator::BitwiseOr, rule! { BitWiseOr }),
1570            value(BinaryOperator::BitwiseAnd, rule! { BitWiseAnd }),
1571            value(BinaryOperator::BitwiseXor, rule! { BitWiseXor }),
1572            value(BinaryOperator::BitwiseShiftLeft, rule! { ShiftLeft }),
1573            value(BinaryOperator::BitwiseShiftRight, rule! { ShiftRight }),
1574        )),
1575    ))(i)
1576}
1577
1578pub fn json_op(i: Input) -> IResult<JsonOperator> {
1579    alt((
1580        value(JsonOperator::Arrow, rule! { "->" }),
1581        value(JsonOperator::LongArrow, rule! { "->>" }),
1582        value(JsonOperator::HashArrow, rule! { "#>" }),
1583        value(JsonOperator::HashLongArrow, rule! { "#>>" }),
1584        value(JsonOperator::Question, rule! { "?" }),
1585        value(JsonOperator::QuestionOr, rule! { "?|" }),
1586        value(JsonOperator::QuestionAnd, rule! { "?&" }),
1587        value(JsonOperator::AtArrow, rule! { "@>" }),
1588        value(JsonOperator::ArrowAt, rule! { "<@" }),
1589        value(JsonOperator::AtQuestion, rule! { "@?" }),
1590        value(JsonOperator::AtAt, rule! { "@@" }),
1591        value(JsonOperator::HashMinus, rule! { "#-" }),
1592    ))(i)
1593}
1594
1595pub fn literal(i: Input) -> IResult<Literal> {
1596    let string = map(literal_string, Literal::String);
1597    let code_string = map(code_string, Literal::String);
1598    let boolean = map(literal_bool, Literal::Boolean);
1599    let null = value(Literal::Null, rule! { NULL });
1600
1601    rule!(
1602        #string
1603        | #code_string
1604        | #boolean
1605        | #literal_number
1606        | #null
1607    )(i)
1608}
1609
1610pub fn literal_hex_str(i: Input) -> IResult<&str> {
1611    // 0XFFFF
1612    let mysql_hex = map(
1613        rule! {
1614            MySQLLiteralHex
1615        },
1616        |token| &token.text()[2..],
1617    );
1618    // x'FFFF'
1619    let pg_hex = map(
1620        rule! {
1621            PGLiteralHex
1622        },
1623        |token| &token.text()[2..token.text().len() - 1],
1624    );
1625
1626    rule!(
1627        #mysql_hex
1628        | #pg_hex
1629    )(i)
1630}
1631
1632#[allow(clippy::from_str_radix_10)]
1633pub fn literal_u64(i: Input) -> IResult<u64> {
1634    let decimal = map_res(
1635        rule! {
1636            LiteralInteger
1637        },
1638        |token| u64::from_str_radix(token.text(), 10).map_err(|e| nom::Err::Failure(e.into())),
1639    );
1640    let hex = map_res(literal_hex_str, |lit| {
1641        u64::from_str_radix(lit, 16).map_err(|e| nom::Err::Failure(e.into()))
1642    });
1643
1644    rule!(
1645        #decimal
1646        | #hex
1647    )(i)
1648}
1649
1650pub fn literal_number(i: Input) -> IResult<Literal> {
1651    let decimal_uint = map_res(
1652        rule! {
1653            LiteralInteger
1654        },
1655        |token| parse_uint(token.text(), 10).map_err(nom::Err::Failure),
1656    );
1657
1658    let hex_uint = map_res(literal_hex_str, |str| {
1659        parse_uint(str, 16).map_err(nom::Err::Failure)
1660    });
1661
1662    let decimal_float = map_res(
1663        rule! {
1664           LiteralFloat
1665        },
1666        |token| parse_float(token.text()).map_err(nom::Err::Failure),
1667    );
1668
1669    rule!(
1670        #decimal_uint
1671        | #decimal_float
1672        | #hex_uint
1673    )(i)
1674}
1675
1676pub fn literal_bool(i: Input) -> IResult<bool> {
1677    alt((value(true, rule! { TRUE }), value(false, rule! { FALSE })))(i)
1678}
1679
1680pub fn literal_string(i: Input) -> IResult<String> {
1681    map_res(
1682        rule! {
1683            LiteralString
1684        },
1685        |token| {
1686            let quote::QuotedString(s, quote) = token
1687                .text()
1688                .parse()
1689                .map_err(|_| nom::Err::Failure(ErrorKind::Other("invalid escape or unicode")))?;
1690
1691            if !i.dialect.is_string_quote(quote) {
1692                return Err(nom::Err::Error(ErrorKind::ExpectToken(LiteralString)));
1693            }
1694
1695            Ok(s)
1696        },
1697    )(i)
1698}
1699
1700pub fn literal_string_eq_ignore_case(s: &str) -> impl FnMut(Input) -> IResult<()> + '_ {
1701    move |i| {
1702        map_res(rule! { LiteralString }, |token| {
1703            if token.text()[1..token.text().len() - 1].eq_ignore_ascii_case(s) {
1704                Ok(())
1705            } else {
1706                Err(nom::Err::Error(ErrorKind::ExpectToken(LiteralString)))
1707            }
1708        })(i)
1709    }
1710}
1711
1712pub fn at_string(i: Input) -> IResult<String> {
1713    map_res(rule! { LiteralAtString }, |token| {
1714        let AtString(s) = token
1715            .text()
1716            .parse()
1717            .map_err(|_| nom::Err::Failure(ErrorKind::Other("invalid at string")))?;
1718        Ok(s)
1719    })(i)
1720}
1721
1722pub fn code_string(i: Input) -> IResult<String> {
1723    map_res(rule! { LiteralCodeString }, |token| {
1724        let content = &token.text()[2..token.text().len() - 2];
1725        let trimmed = unindent::unindent(content).trim().to_string();
1726        Ok(trimmed)
1727    })(i)
1728}
1729
1730pub fn nullable(i: Input) -> IResult<bool> {
1731    alt((
1732        value(true, rule! { NULL }),
1733        value(false, rule! { NOT ~ NULL }),
1734    ))(i)
1735}
1736
1737pub fn type_name(i: Input) -> IResult<TypeName> {
1738    let ty_boolean = value(TypeName::Boolean, rule! { BOOLEAN | BOOL });
1739    let ty_uint8 = value(TypeName::UInt8, rule! { (
1740            #map(rule! { UINT8 ~ ( "(" ~ ^#literal_u64 ~ ^")" )? }, |(t, _)| t) |
1741            #map(rule! { TINYINT ~ ( "(" ~ ^#literal_u64 ~ ^")" )? ~ UNSIGNED }, |(t, _, _)| t)
1742        )
1743    });
1744    let ty_uint16 = value(TypeName::UInt16, rule! { (
1745            #map(rule! { UINT16 ~ ( "(" ~ ^#literal_u64 ~ ^")" )? }, |(t, _)| t) |
1746            #map(rule! { SMALLINT ~ ( "(" ~ ^#literal_u64 ~ ^")" )? ~ UNSIGNED }, |(t, _, _)| t)
1747        )
1748    });
1749    let ty_uint32 = value(TypeName::UInt32, rule! { (
1750            #map(rule! { UINT32 ~ ( "(" ~ ^#literal_u64 ~ ^")" )? }, |(t, _)| t) |
1751            #map(rule! { ( INT | INTEGER ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? ~ UNSIGNED }, |(t, _, _)| t)
1752        )
1753    });
1754    let ty_uint64 = value(TypeName::UInt64, rule! { (
1755            #map(rule! { ( UINT64 | UNSIGNED) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? }, |(t, _)| t) |
1756            #map(rule! { BIGINT ~ ( "(" ~ ^#literal_u64 ~ ^")" )? ~ UNSIGNED }, |(t, _, _)| t)
1757        )
1758    });
1759    let ty_int8 = value(
1760        TypeName::Int8,
1761        rule! { ( INT8 | TINYINT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1762    );
1763    let ty_int16 = value(
1764        TypeName::Int16,
1765        rule! { ( INT16 | SMALLINT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1766    );
1767    let ty_int32 = value(
1768        TypeName::Int32,
1769        rule! { ( INT32 | INT | INTEGER ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1770    );
1771    let ty_int64 = value(
1772        TypeName::Int64,
1773        rule! { ( INT64 | SIGNED | BIGINT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1774    );
1775    let ty_float32 = value(TypeName::Float32, rule! { FLOAT32 | FLOAT | REAL });
1776    let ty_float64 = value(
1777        TypeName::Float64,
1778        rule! { (FLOAT64 | DOUBLE)  ~ PRECISION? },
1779    );
1780    let ty_decimal = map_res(
1781        rule! { DECIMAL ~ ( "(" ~ #literal_u64 ~ ( "," ~ ^#literal_u64 )? ~ ")" )? },
1782        |(_, opt_precision)| {
1783            let (precision, scale) = match opt_precision {
1784                Some((_, precision, scale, _)) => {
1785                    (precision, scale.map(|(_, scale)| scale).unwrap_or(0))
1786                }
1787                None => (18, 3),
1788            };
1789
1790            Ok(TypeName::Decimal {
1791                precision: precision
1792                    .try_into()
1793                    .map_err(|_| nom::Err::Failure(ErrorKind::Other("precision is too large")))?,
1794                scale: scale
1795                    .try_into()
1796                    .map_err(|_| nom::Err::Failure(ErrorKind::Other("scale is too large")))?,
1797            })
1798        },
1799    );
1800    let ty_numeric = value(
1801        TypeName::Decimal {
1802            precision: 18,
1803            scale: 3,
1804        },
1805        rule! { NUMERIC },
1806    );
1807
1808    let ty_array = map(
1809        rule! { ARRAY ~ "(" ~ #type_name ~ ")" },
1810        |(_, _, item_type, _)| TypeName::Array(Box::new(item_type)),
1811    );
1812    let ty_map = map(
1813        rule! { MAP ~ "(" ~ #type_name ~ "," ~ #type_name ~ ")" },
1814        |(_, _, key_type, _, val_type, _)| TypeName::Map {
1815            key_type: Box::new(key_type),
1816            val_type: Box::new(val_type),
1817        },
1818    );
1819    let ty_bitmap = value(TypeName::Bitmap, rule! { BITMAP });
1820    let ty_nullable = map(
1821        rule! { NULLABLE ~ ( "(" ~ #type_name ~ ")" ) },
1822        |(_, item_type)| TypeName::Nullable(Box::new(item_type.1)),
1823    );
1824    let ty_tuple = map(
1825        rule! { TUPLE ~ "(" ~ #comma_separated_list1(type_name) ~ ")" },
1826        |(_, _, fields_type, _)| TypeName::Tuple {
1827            fields_name: None,
1828            fields_type,
1829        },
1830    );
1831    let ty_named_tuple = map_res(
1832        rule! { TUPLE ~ "(" ~ #comma_separated_list1(rule! { #ident ~ #type_name }) ~ ")" },
1833        |(_, _, fields, _)| {
1834            let (fields_name, fields_type): (Vec<Identifier>, Vec<TypeName>) =
1835                fields.into_iter().unzip();
1836            Ok(TypeName::Tuple {
1837                fields_name: Some(fields_name),
1838                fields_type,
1839            })
1840        },
1841    );
1842    let ty_date = value(TypeName::Date, rule! { DATE });
1843    let ty_interval = value(TypeName::Interval, rule! { INTERVAL });
1844    let ty_datetime = map(
1845        rule! { ( DATETIME | TIMESTAMP ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1846        |(_, _)| TypeName::Timestamp,
1847    );
1848    let ty_binary = value(
1849        TypeName::Binary,
1850        rule! { ( BINARY | VARBINARY | LONGBLOB | MEDIUMBLOB |  TINYBLOB | BLOB ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1851    );
1852    let ty_string = value(
1853        TypeName::String,
1854        rule! { ( STRING | VARCHAR | CHAR | CHARACTER | TEXT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
1855    );
1856    let ty_variant = value(TypeName::Variant, rule! { VARIANT | JSON });
1857    let ty_geometry = value(TypeName::Geometry, rule! { GEOMETRY });
1858    let ty_geography = value(TypeName::Geography, rule! { GEOGRAPHY });
1859    let ty_vector = map(
1860        rule! { VECTOR ~ ^"(" ~ ^#literal_u64 ~ ^")" },
1861        |(_, _, dimension, _)| TypeName::Vector(dimension),
1862    );
1863    map_res(
1864        alt((
1865            rule! {
1866            ( #ty_boolean
1867            | #ty_uint8
1868            | #ty_uint16
1869            | #ty_uint32
1870            | #ty_uint64
1871            | #ty_int8
1872            | #ty_int16
1873            | #ty_int32
1874            | #ty_int64
1875            | #ty_float32
1876            | #ty_float64
1877            | #ty_decimal
1878            | #ty_array
1879            | #ty_map
1880            | #ty_bitmap
1881            | #ty_tuple : "TUPLE(<type>, ...)"
1882            | #ty_named_tuple : "TUPLE(<name> <type>, ...)"
1883            ) ~ #nullable? : "type name"
1884            },
1885            rule! {
1886            ( #ty_date
1887            | #ty_datetime
1888            | #ty_interval
1889            | #ty_numeric
1890            | #ty_binary
1891            | #ty_string
1892            | #ty_variant
1893            | #ty_geometry
1894            | #ty_geography
1895            | #ty_nullable
1896            | #ty_vector
1897            ) ~ #nullable? : "type name" },
1898        )),
1899        |(ty, opt_nullable)| match opt_nullable {
1900            Some(true) => Ok(ty.wrap_nullable()),
1901            Some(false) => {
1902                if matches!(ty, TypeName::Nullable(_)) {
1903                    Err(nom::Err::Failure(ErrorKind::Other(
1904                        "ambiguous NOT NULL constraint",
1905                    )))
1906                } else {
1907                    Ok(ty.wrap_not_null())
1908                }
1909            }
1910            None => Ok(ty),
1911        },
1912    )(i)
1913}
1914
1915pub fn weekday(i: Input) -> IResult<Weekday> {
1916    alt((
1917        value(Weekday::Sunday, rule! { SUNDAY }),
1918        value(Weekday::Monday, rule! { MONDAY }),
1919        value(Weekday::Tuesday, rule! { TUESDAY }),
1920        value(Weekday::Wednesday, rule! { WEDNESDAY }),
1921        value(Weekday::Thursday, rule! { THURSDAY }),
1922        value(Weekday::Friday, rule! { FRIDAY }),
1923        value(Weekday::Saturday, rule! { SATURDAY }),
1924        value(
1925            Weekday::Sunday,
1926            rule! { #literal_string_eq_ignore_case("SUNDAY") },
1927        ),
1928        value(
1929            Weekday::Monday,
1930            rule! { #literal_string_eq_ignore_case("MONDAY") },
1931        ),
1932        value(
1933            Weekday::Tuesday,
1934            rule! { #literal_string_eq_ignore_case("TUESDAY") },
1935        ),
1936        value(
1937            Weekday::Wednesday,
1938            rule! { #literal_string_eq_ignore_case("WEDNESDAY") },
1939        ),
1940        value(
1941            Weekday::Thursday,
1942            rule! { #literal_string_eq_ignore_case("THURSDAY") },
1943        ),
1944        value(
1945            Weekday::Friday,
1946            rule! { #literal_string_eq_ignore_case("FRIDAY") },
1947        ),
1948        value(
1949            Weekday::Saturday,
1950            rule! { #literal_string_eq_ignore_case("SATURDAY") },
1951        ),
1952    ))(i)
1953}
1954
1955pub fn interval_kind(i: Input) -> IResult<IntervalKind> {
1956    let iso_year = value(IntervalKind::ISOYear, rule! { ISOYEAR });
1957    let year = value(IntervalKind::Year, rule! { YEAR });
1958    let quarter = value(IntervalKind::Quarter, rule! { QUARTER });
1959    let month = value(IntervalKind::Month, rule! { MONTH });
1960    let day = value(IntervalKind::Day, rule! { DAY });
1961    let hour = value(IntervalKind::Hour, rule! { HOUR });
1962    let minute = value(IntervalKind::Minute, rule! { MINUTE });
1963    let second = value(IntervalKind::Second, rule! { SECOND });
1964    let doy = value(IntervalKind::Doy, rule! { DOY });
1965    let dow = value(IntervalKind::Dow, rule! { DOW });
1966    let isodow = value(IntervalKind::ISODow, rule! { ISODOW });
1967    let isoweek = value(IntervalKind::ISOWeek, rule! { ISOWEEK });
1968    let week = value(IntervalKind::Week, rule! { WEEK });
1969    let epoch = value(IntervalKind::Epoch, rule! { EPOCH });
1970    let microsecond = value(IntervalKind::MicroSecond, rule! { MICROSECOND });
1971    let millennium = value(IntervalKind::Millennium, rule! { MILLENNIUM });
1972    let yearweek = value(IntervalKind::YearWeek, rule! { YEARWEEK });
1973
1974    let iso_year_str = value(
1975        IntervalKind::ISOYear,
1976        rule! { #literal_string_eq_ignore_case("ISOYEAR") },
1977    );
1978
1979    let year_str = value(
1980        IntervalKind::Year,
1981        rule! { #literal_string_eq_ignore_case("YEAR")
1982            | #literal_string_eq_ignore_case("Y")
1983            | #literal_string_eq_ignore_case("YY")
1984            | #literal_string_eq_ignore_case("YYY")
1985            | #literal_string_eq_ignore_case("YYYY")
1986            | #literal_string_eq_ignore_case("YR")
1987            | #literal_string_eq_ignore_case("YEARS")
1988            | #literal_string_eq_ignore_case("YRS")
1989        },
1990    );
1991
1992    let quarter_str = value(
1993        IntervalKind::Quarter,
1994        rule! { #literal_string_eq_ignore_case("QUARTER")
1995            | #literal_string_eq_ignore_case("Q")
1996            | #literal_string_eq_ignore_case("QTR")
1997            | #literal_string_eq_ignore_case("QTRS")
1998            | #literal_string_eq_ignore_case("QUARTERS")
1999        },
2000    );
2001
2002    let month_str = value(
2003        IntervalKind::Month,
2004        rule! { #literal_string_eq_ignore_case("MONTH")
2005            | #literal_string_eq_ignore_case("MM")
2006            | #literal_string_eq_ignore_case("MON")
2007            | #literal_string_eq_ignore_case("MONS")
2008            | #literal_string_eq_ignore_case("MONTHS")
2009        },
2010    );
2011
2012    let day_str = value(
2013        IntervalKind::Day,
2014        rule! { #literal_string_eq_ignore_case("DAY")
2015            | #literal_string_eq_ignore_case("D")
2016            | #literal_string_eq_ignore_case("DD")
2017            | #literal_string_eq_ignore_case("DAYS")
2018            | #literal_string_eq_ignore_case("DAYOFMONTH")
2019        },
2020    );
2021
2022    let hour_str = value(
2023        IntervalKind::Hour,
2024        rule! { #literal_string_eq_ignore_case("HOUR")
2025            | #literal_string_eq_ignore_case("H")
2026            | #literal_string_eq_ignore_case("HH")
2027            | #literal_string_eq_ignore_case("HH24")
2028            | #literal_string_eq_ignore_case("HR")
2029            | #literal_string_eq_ignore_case("HOURS")
2030            | #literal_string_eq_ignore_case("HRS")
2031        },
2032    );
2033
2034    let minute_str = value(
2035        IntervalKind::Minute,
2036        rule! { #literal_string_eq_ignore_case("MINUTE")
2037            | #literal_string_eq_ignore_case("M")
2038            | #literal_string_eq_ignore_case("MI")
2039            | #literal_string_eq_ignore_case("MIN")
2040            | #literal_string_eq_ignore_case("MINUTES")
2041            | #literal_string_eq_ignore_case("MINS")
2042        },
2043    );
2044
2045    let second_str = value(
2046        IntervalKind::Second,
2047        rule! { #literal_string_eq_ignore_case("SECOND")
2048            | #literal_string_eq_ignore_case("S")
2049            | #literal_string_eq_ignore_case("SEC")
2050            | #literal_string_eq_ignore_case("SECONDS")
2051            | #literal_string_eq_ignore_case("SECS")
2052        },
2053    );
2054
2055    let doy_str = value(
2056        IntervalKind::Doy,
2057        rule! { #literal_string_eq_ignore_case("DOY")
2058            | #literal_string_eq_ignore_case("DAYOFYEAR")
2059            | #literal_string_eq_ignore_case("YEARDAY")
2060            | #literal_string_eq_ignore_case("DY")
2061        },
2062    );
2063
2064    let dow_str = value(
2065        IntervalKind::Dow,
2066        rule! { (#literal_string_eq_ignore_case("DOW")
2067            | #literal_string_eq_ignore_case("WEEKDAY")
2068            | #literal_string_eq_ignore_case("DW")
2069            | #literal_string_eq_ignore_case("DAYOFWEEK"))
2070        },
2071    );
2072
2073    let isodow_str = value(
2074        IntervalKind::ISODow,
2075        rule! { #literal_string_eq_ignore_case("ISODOW")
2076            | #literal_string_eq_ignore_case("DAYOFWEEK_ISO")
2077            | #literal_string_eq_ignore_case("DAYOFWEEKISO")
2078            | #literal_string_eq_ignore_case("WEEKDAY_ISO")
2079            | #literal_string_eq_ignore_case("DOW_ISO")
2080            | #literal_string_eq_ignore_case("DW_ISO")
2081        },
2082    );
2083
2084    let week_str = value(
2085        IntervalKind::Week,
2086        rule! { (#literal_string_eq_ignore_case("WEEK") | #literal_string_eq_ignore_case("WEEKS") | #literal_string_eq_ignore_case("W"))
2087            | #literal_string_eq_ignore_case("WK")
2088            | #literal_string_eq_ignore_case("WEEKOFYEAR")
2089            | #literal_string_eq_ignore_case("WOY")
2090            | #literal_string_eq_ignore_case("WY")
2091        },
2092    );
2093
2094    let isoweek_str = value(
2095        IntervalKind::ISOWeek,
2096        rule! { #literal_string_eq_ignore_case("IW") },
2097    );
2098
2099    let epoch_str = value(
2100        IntervalKind::Epoch,
2101        rule! { #literal_string_eq_ignore_case("EPOCH")
2102            | #literal_string_eq_ignore_case("EPOCH_SECOND")
2103            | #literal_string_eq_ignore_case("EPOCH")
2104            | #literal_string_eq_ignore_case("EPOCH_SECONDS")
2105        },
2106    );
2107
2108    let microsecond_str = value(
2109        IntervalKind::MicroSecond,
2110        rule! { #literal_string_eq_ignore_case("MICROSECOND")
2111            | #literal_string_eq_ignore_case("MICROSECONDS")
2112            | #literal_string_eq_ignore_case("US")
2113            | #literal_string_eq_ignore_case("USEC")
2114        },
2115    );
2116
2117    let yearweek_str = value(
2118        IntervalKind::YearWeek,
2119        rule! { #literal_string_eq_ignore_case("YEARWEEK")
2120            | #literal_string_eq_ignore_case("YEAROFWEEK")
2121        },
2122    );
2123
2124    let millennium_str = value(
2125        IntervalKind::Millennium,
2126        rule! { #literal_string_eq_ignore_case("MILLENNIUM") },
2127    );
2128
2129    alt((
2130        rule!(
2131            #year
2132            | #iso_year
2133            | #quarter
2134            | #month
2135            | #day
2136            | #hour
2137            | #minute
2138            | #second
2139            | #doy
2140            | #dow
2141            | #week
2142            | #epoch
2143            | #microsecond
2144            | #isodow
2145            | #isoweek
2146            | #millennium
2147            | #yearweek
2148        ),
2149        rule!(
2150            #year_str
2151            | #iso_year_str
2152            | #quarter_str
2153            | #month_str
2154            | #day_str
2155            | #hour_str
2156            | #minute_str
2157            | #second_str
2158            | #doy_str
2159            | #dow_str
2160            | #week_str
2161            | #epoch_str
2162            | #microsecond_str
2163            | #isodow_str
2164            | #isoweek_str
2165            | #yearweek_str
2166            | #millennium_str
2167        ),
2168    ))(i)
2169}
2170
2171pub fn map_access(i: Input) -> IResult<MapAccessor> {
2172    let bracket = map(
2173        rule! {
2174           "[" ~ #subexpr(0) ~ "]"
2175        },
2176        |(_, key, _)| MapAccessor::Bracket { key: Box::new(key) },
2177    );
2178    let dot_number = map_res(
2179        rule! {
2180           LiteralFloat
2181        },
2182        |key| {
2183            if key.text().starts_with('.') {
2184                if let Ok(key) = (key.text()[1..]).parse::<u64>() {
2185                    return Ok(MapAccessor::DotNumber { key });
2186                }
2187            }
2188            Err(nom::Err::Error(ErrorKind::ExpectText(".")))
2189        },
2190    );
2191    let colon = map(
2192        rule! {
2193         ":" ~ #ident
2194        },
2195        |(_, key)| MapAccessor::Colon { key },
2196    );
2197
2198    rule!(
2199        #bracket
2200        | #dot_number
2201        | #colon
2202    )(i)
2203}
2204
2205pub fn map_element(i: Input) -> IResult<(Literal, Expr)> {
2206    map(
2207        rule! {
2208            #literal ~ ":" ~ #subexpr(0)
2209        },
2210        |(key, _, value)| (key, value),
2211    )(i)
2212}
2213
2214pub fn function_call(i: Input) -> IResult<ExprElement> {
2215    enum FunctionCallSuffix {
2216        Simple {
2217            distinct: bool,
2218            args: Vec<Expr>,
2219        },
2220        Lambda {
2221            arg: Expr,
2222            params: Vec<Identifier>,
2223            expr: Box<Expr>,
2224        },
2225        Window {
2226            distinct: bool,
2227            args: Vec<Expr>,
2228            window: WindowDesc,
2229        },
2230        WithInGroupWindow {
2231            distinct: bool,
2232            args: Vec<Expr>,
2233            order_by: Vec<OrderByExpr>,
2234            window: Option<WindowDesc>,
2235        },
2236        ParamsWindow {
2237            distinct: bool,
2238            params: Vec<Expr>,
2239            args: Vec<Expr>,
2240            window: Option<WindowDesc>,
2241        },
2242    }
2243    let function_call_body = map_res(
2244        rule! {
2245            "(" ~ DISTINCT? ~ #subexpr(0)? ~ ","? ~ (#lambda_params ~ "->" ~ #subexpr(0))? ~ #comma_separated_list1(subexpr(0))? ~ ")"
2246            ~ ("(" ~ DISTINCT? ~ #comma_separated_list0(subexpr(0))? ~ ")")?
2247            ~ #within_group?
2248            ~ #window_function?
2249        },
2250        |(
2251            _,
2252            opt_distinct_0,
2253            first_param,
2254            _,
2255            opt_lambda,
2256            params_0,
2257            _,
2258            params_1,
2259            order_by,
2260            window,
2261        )| {
2262            match (
2263                first_param,
2264                opt_lambda,
2265                opt_distinct_0,
2266                params_0,
2267                params_1,
2268                order_by,
2269                window,
2270            ) {
2271                (
2272                    Some(first_param),
2273                    Some((lambda_params, _, arg_1)),
2274                    None,
2275                    None,
2276                    None,
2277                    None,
2278                    None,
2279                ) => Ok(FunctionCallSuffix::Lambda {
2280                    arg: first_param,
2281                    params: lambda_params,
2282                    expr: Box::new(arg_1),
2283                }),
2284                (
2285                    Some(first_param),
2286                    None,
2287                    None,
2288                    params_0,
2289                    Some((_, opt_distinct_1, params_1, _)),
2290                    None,
2291                    window,
2292                ) => {
2293                    let params = params_0
2294                        .map(|mut params| {
2295                            params.insert(0, first_param.clone());
2296                            params
2297                        })
2298                        .unwrap_or_else(|| vec![first_param]);
2299
2300                    Ok(FunctionCallSuffix::ParamsWindow {
2301                        distinct: opt_distinct_1.is_some(),
2302                        params,
2303                        args: params_1.unwrap_or_default(),
2304                        window,
2305                    })
2306                }
2307                (first_param, None, opt_distinct, params, None, Some(order_by), window) => {
2308                    let mut args = params.unwrap_or_default();
2309                    if let Some(first_param) = first_param {
2310                        args.insert(0, first_param)
2311                    }
2312
2313                    Ok(FunctionCallSuffix::WithInGroupWindow {
2314                        distinct: opt_distinct.is_some(),
2315                        args,
2316                        order_by,
2317                        window,
2318                    })
2319                }
2320                (first_param, None, opt_distinct, params, None, None, Some(window)) => {
2321                    let mut args = params.unwrap_or_default();
2322                    if let Some(first_param) = first_param {
2323                        args.insert(0, first_param)
2324                    }
2325
2326                    Ok(FunctionCallSuffix::Window {
2327                        distinct: opt_distinct.is_some(),
2328                        args,
2329                        window,
2330                    })
2331                }
2332                (first_param, None, opt_distinct, params, None, None, None) => {
2333                    let mut args = params.unwrap_or_default();
2334                    if let Some(first_param) = first_param {
2335                        args.insert(0, first_param)
2336                    }
2337
2338                    Ok(FunctionCallSuffix::Simple {
2339                        distinct: opt_distinct.is_some(),
2340                        args,
2341                    })
2342                }
2343                _ => Err(nom::Err::Error(ErrorKind::Other(
2344                    "Unsupported function format",
2345                ))),
2346            }
2347        },
2348    );
2349
2350    map(
2351        rule!(
2352            #function_name
2353            ~ #function_call_body : "`function(... [ , x -> ... ] ) [ (...) ] [ WITHIN GROUP ( ORDER BY <expr>, ... ) ] [ OVER ([ PARTITION BY <expr>, ... ] [ ORDER BY <expr>, ... ] [ <window frame> ]) ]`"
2354        ),
2355        |(name, suffix)| match suffix {
2356            FunctionCallSuffix::Simple { distinct, args } => ExprElement::FunctionCall {
2357                func: FunctionCall {
2358                    distinct,
2359                    name,
2360                    args,
2361                    params: vec![],
2362                    order_by: vec![],
2363                    window: None,
2364                    lambda: None,
2365                },
2366            },
2367            FunctionCallSuffix::Lambda { arg, params, expr } => ExprElement::FunctionCall {
2368                func: FunctionCall {
2369                    distinct: false,
2370                    name,
2371                    args: vec![arg],
2372                    params: vec![],
2373                    order_by: vec![],
2374                    window: None,
2375                    lambda: Some(Lambda { params, expr }),
2376                },
2377            },
2378            FunctionCallSuffix::Window {
2379                distinct,
2380                args,
2381                window,
2382            } => ExprElement::FunctionCall {
2383                func: FunctionCall {
2384                    distinct,
2385                    name,
2386                    args,
2387                    params: vec![],
2388                    order_by: vec![],
2389                    window: Some(window),
2390                    lambda: None,
2391                },
2392            },
2393            FunctionCallSuffix::WithInGroupWindow {
2394                distinct,
2395                args,
2396                order_by,
2397                window,
2398            } => ExprElement::FunctionCall {
2399                func: FunctionCall {
2400                    distinct,
2401                    name,
2402                    args,
2403                    params: vec![],
2404                    order_by,
2405                    window,
2406                    lambda: None,
2407                },
2408            },
2409            FunctionCallSuffix::ParamsWindow {
2410                distinct,
2411                params,
2412                args,
2413                window,
2414            } => ExprElement::FunctionCall {
2415                func: FunctionCall {
2416                    distinct,
2417                    name,
2418                    args,
2419                    params,
2420                    order_by: vec![],
2421                    window,
2422                    lambda: None,
2423                },
2424            },
2425        },
2426    )(i)
2427}
2428
2429pub fn parse_float(text: &str) -> Result<Literal, ErrorKind> {
2430    let text = text.trim_start_matches('0');
2431    let point_pos = text.find('.');
2432    let e_pos = text.find(['e', 'E']);
2433    let (i_part, f_part, e_part) = match (point_pos, e_pos) {
2434        (Some(p1), Some(p2)) => (&text[..p1], &text[(p1 + 1)..p2], Some(&text[(p2 + 1)..])),
2435        (Some(p), None) => (&text[..p], &text[(p + 1)..], None),
2436        (None, Some(p)) => (&text[..p], "", Some(&text[(p + 1)..])),
2437        _ => unreachable!(),
2438    };
2439    let exp = match e_part {
2440        Some(s) => match s.parse::<i32>() {
2441            Ok(i) => i,
2442            Err(_) => return Ok(Literal::Float64(fast_float2::parse(text)?)),
2443        },
2444        None => 0,
2445    };
2446
2447    let p = i_part.len() as i32 + exp - f_part.len() as i32;
2448    if !(-76..=76).contains(&p) {
2449        Ok(Literal::Float64(fast_float2::parse(text)?))
2450    } else {
2451        let mut digits = String::with_capacity(76);
2452        digits.push_str(i_part);
2453        digits.push_str(f_part);
2454        if digits.is_empty() {
2455            digits.push('0')
2456        }
2457        let mut scale = f_part.len() as i32 - exp;
2458        if scale < 0 {
2459            // e.g 123.1e3
2460            for _ in 0..(-scale) {
2461                digits.push('0')
2462            }
2463            scale = 0;
2464        };
2465
2466        // truncate
2467        if digits.len() > 76 {
2468            scale -= digits.len() as i32 - 76;
2469            digits.truncate(76);
2470        }
2471
2472        Ok(Literal::Decimal256 {
2473            value: i256::from_str_radix(&digits, 10)?,
2474            precision: 76,
2475            scale: scale as u8,
2476        })
2477    }
2478}
2479
2480pub fn parse_uint(text: &str, radix: u32) -> Result<Literal, ErrorKind> {
2481    let text = text.trim_start_matches('0');
2482    let contains_underscore = text.contains('_');
2483    if contains_underscore {
2484        let text = text.replace('_', "");
2485        return parse_uint(&text, radix);
2486    }
2487
2488    if text.is_empty() {
2489        return Ok(Literal::UInt64(0));
2490    } else if text.len() > 76 {
2491        return Ok(Literal::Float64(fast_float2::parse(text)?));
2492    }
2493
2494    let value = i256::from_str_radix(text, radix)?;
2495    if value <= i256::from(u64::MAX) {
2496        Ok(Literal::UInt64(value.as_u64()))
2497    } else {
2498        Ok(Literal::Decimal256 {
2499            value,
2500            precision: 76,
2501            scale: 0,
2502        })
2503    }
2504}
2505
2506pub(crate) fn make_func_get_variable(span: Span, name: String) -> Expr {
2507    Expr::FunctionCall {
2508        span,
2509        func: FunctionCall {
2510            distinct: false,
2511            name: Identifier::from_name(span, "getvariable"),
2512            args: vec![Expr::Literal {
2513                span,
2514                value: Literal::String(name),
2515            }],
2516            params: vec![],
2517            order_by: vec![],
2518            window: None,
2519            lambda: None,
2520        },
2521    }
2522}