diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 36ae59339..75119bc3c 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -880,9 +880,9 @@ pub enum WindowFrameBound { /// `CURRENT ROW` CurrentRow, /// ` PRECEDING` or `UNBOUNDED PRECEDING` - Preceding(Option), + Preceding(Option>), /// ` FOLLOWING` or `UNBOUNDED FOLLOWING`. - Following(Option), + Following(Option>), } impl fmt::Display for WindowFrameBound { diff --git a/src/parser.rs b/src/parser.rs index 57ff4fe50..999c6395b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -620,7 +620,6 @@ impl<'a> Parser<'a> { } else { None }; - Ok(Expr::Function(Function { name, args, @@ -682,7 +681,10 @@ impl<'a> Parser<'a> { let rows = if self.parse_keyword(Keyword::UNBOUNDED) { None } else { - Some(self.parse_literal_uint()?) + Some(Box::new(match self.peek_token() { + Token::SingleQuotedString(_) => self.parse_interval()?, + _ => self.parse_expr()?, + })) }; if self.parse_keyword(Keyword::PRECEDING) { Ok(WindowFrameBound::Preceding(rows)) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 1cb466de3..3db8523f0 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -2865,13 +2865,17 @@ fn parse_window_functions() { ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), \ avg(bar) OVER (ORDER BY a \ RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING), \ + sum(bar) OVER (ORDER BY a \ + RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND INTERVAL '1 MONTH' FOLLOWING), \ + COUNT(*) OVER (ORDER BY a \ + RANGE BETWEEN INTERVAL '1 DAY' PRECEDING AND INTERVAL '1 DAY' FOLLOWING), \ max(baz) OVER (ORDER BY a \ ROWS UNBOUNDED PRECEDING), \ sum(qux) OVER (ORDER BY a \ GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) \ FROM foo"; let select = verified_only_select(sql); - assert_eq!(5, select.projection.len()); + assert_eq!(7, select.projection.len()); assert_eq!( &Expr::Function(Function { name: ObjectName(vec![Ident::new("row_number")]),