1use 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 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 ExprElement::MapAccess {
79 accessor: MapAccessor::Bracket { key },
80 } => {
81 *elem = ExprElement::Array {
82 exprs: vec![(**key).clone()],
83 };
84 }
85 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 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 ExprElement::MapAccess {
112 accessor: MapAccessor::DotNumber { .. },
113 } => {
114 *elem = ExprElement::Literal {
115 value: literal(span)?.1,
116 };
117 }
118 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#[derive(Debug, Clone, PartialEq)]
143#[allow(clippy::large_enum_variant)]
144pub enum ExprElement {
145 ColumnRef {
147 column: ColumnRef,
148 },
149 DotAccess {
151 key: ColumnID,
152 },
153 IsNull {
155 not: bool,
156 },
157 IsDistinctFrom {
159 not: bool,
160 },
161 InList {
163 list: Vec<Expr>,
164 not: bool,
165 },
166 InSubquery {
168 subquery: Box<Query>,
169 not: bool,
170 },
171 LikeSubquery {
173 modifier: SubqueryModifier,
174 subquery: Box<Query>,
175 escape: Option<String>,
176 },
177 Escape {
179 escape: String,
180 },
181 Between {
183 low: Box<Expr>,
184 high: Box<Expr>,
185 not: bool,
186 },
187 BinaryOp {
189 op: BinaryOperator,
190 },
191 JsonOp {
193 op: JsonOperator,
194 },
195 UnaryOp {
197 op: UnaryOperator,
198 },
199 VariableAccess(String),
200 Cast {
202 expr: Box<Expr>,
203 target_type: TypeName,
204 },
205 TryCast {
207 expr: Box<Expr>,
208 target_type: TypeName,
209 },
210 PgCast {
212 target_type: TypeName,
213 },
214 Extract {
216 field: IntervalKind,
217 expr: Box<Expr>,
218 },
219 DatePart {
221 field: IntervalKind,
222 expr: Box<Expr>,
223 },
224 Position {
226 substr_expr: Box<Expr>,
227 str_expr: Box<Expr>,
228 },
229 SubString {
231 expr: Box<Expr>,
232 substring_from: Box<Expr>,
233 substring_for: Option<Box<Expr>>,
234 },
235 Trim {
239 expr: Box<Expr>,
240 trim_where: Option<(TrimWhere, Box<Expr>)>,
242 },
243 Literal {
245 value: Literal,
246 },
247 CountAll {
249 qualified: QualifiedName,
250 window: Option<Window>,
251 },
252 Tuple {
254 exprs: Vec<Expr>,
255 },
256 FunctionCall {
258 func: FunctionCall,
259 },
260 Case {
262 operand: Option<Box<Expr>>,
263 conditions: Vec<Expr>,
264 results: Vec<Expr>,
265 else_result: Option<Box<Expr>>,
266 },
267 Exists {
269 subquery: Query,
270 not: bool,
271 },
272 Subquery {
274 modifier: Option<SubqueryModifier>,
275 subquery: Query,
276 },
277 MapAccess {
279 accessor: MapAccessor,
280 },
281 ChainFunctionCall {
283 name: Identifier,
284 args: Vec<Expr>,
285 lambda: Option<Lambda>,
286 },
287 ListComprehension {
289 source: Expr,
290 param: Identifier,
291 filter: Option<Expr>,
292 result: Expr,
293 },
294 Group(Expr),
296 Array {
298 exprs: Vec<Expr>,
299 },
300 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 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 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 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 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 let literal = map(literal, |value| ExprElement::Literal { value });
1254 let array = map(
1255 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 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 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 let mysql_hex = map(
1613 rule! {
1614 MySQLLiteralHex
1615 },
1616 |token| &token.text()[2..],
1617 );
1618 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 for _ in 0..(-scale) {
2461 digits.push('0')
2462 }
2463 scale = 0;
2464 };
2465
2466 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}