mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-17 17:27:23 +00:00
Support for INTERVAL inside window frames (#655)
* Add support to for INTERVAL inside window queries * Remove the unnecessary ancillary struct Interval * Convert Window Frame Bound to Expr * remove unnecessary changes * remove unnecessary changes Co-authored-by: Mehmet Ozan Kabak <ozankabak@gmail.com>
This commit is contained in:
parent
cacdf3305f
commit
427bec4ccc
3 changed files with 11 additions and 5 deletions
|
@ -906,9 +906,9 @@ pub enum WindowFrameBound {
|
||||||
/// `CURRENT ROW`
|
/// `CURRENT ROW`
|
||||||
CurrentRow,
|
CurrentRow,
|
||||||
/// `<N> PRECEDING` or `UNBOUNDED PRECEDING`
|
/// `<N> PRECEDING` or `UNBOUNDED PRECEDING`
|
||||||
Preceding(Option<u64>),
|
Preceding(Option<Box<Expr>>),
|
||||||
/// `<N> FOLLOWING` or `UNBOUNDED FOLLOWING`.
|
/// `<N> FOLLOWING` or `UNBOUNDED FOLLOWING`.
|
||||||
Following(Option<u64>),
|
Following(Option<Box<Expr>>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for WindowFrameBound {
|
impl fmt::Display for WindowFrameBound {
|
||||||
|
|
|
@ -623,7 +623,6 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Expr::Function(Function {
|
Ok(Expr::Function(Function {
|
||||||
name,
|
name,
|
||||||
args,
|
args,
|
||||||
|
@ -685,7 +684,10 @@ impl<'a> Parser<'a> {
|
||||||
let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
|
let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
|
||||||
None
|
None
|
||||||
} else {
|
} 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) {
|
if self.parse_keyword(Keyword::PRECEDING) {
|
||||||
Ok(WindowFrameBound::Preceding(rows))
|
Ok(WindowFrameBound::Preceding(rows))
|
||||||
|
|
|
@ -2940,13 +2940,17 @@ fn parse_window_functions() {
|
||||||
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), \
|
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), \
|
||||||
avg(bar) OVER (ORDER BY a \
|
avg(bar) OVER (ORDER BY a \
|
||||||
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING), \
|
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 \
|
max(baz) OVER (ORDER BY a \
|
||||||
ROWS UNBOUNDED PRECEDING), \
|
ROWS UNBOUNDED PRECEDING), \
|
||||||
sum(qux) OVER (ORDER BY a \
|
sum(qux) OVER (ORDER BY a \
|
||||||
GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) \
|
GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) \
|
||||||
FROM foo";
|
FROM foo";
|
||||||
let select = verified_only_select(sql);
|
let select = verified_only_select(sql);
|
||||||
assert_eq!(5, select.projection.len());
|
assert_eq!(7, select.projection.len());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&Expr::Function(Function {
|
&Expr::Function(Function {
|
||||||
name: ObjectName(vec![Ident::new("row_number")]),
|
name: ObjectName(vec![Ident::new("row_number")]),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue