mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-25 00:14:06 +00:00
Support expressions in LIMIT
/OFFSET
(#567)
This commit is contained in:
parent
a9db6ed139
commit
8176561100
2 changed files with 39 additions and 2 deletions
|
@ -4421,13 +4421,13 @@ impl<'a> Parser<'a> {
|
|||
if self.parse_keyword(Keyword::ALL) {
|
||||
Ok(None)
|
||||
} else {
|
||||
Ok(Some(Expr::Value(self.parse_number_value()?)))
|
||||
Ok(Some(self.parse_expr()?))
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse an OFFSET clause
|
||||
pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
|
||||
let value = Expr::Value(self.parse_number_value()?);
|
||||
let value = self.parse_expr()?;
|
||||
let rows = if self.parse_keyword(Keyword::ROW) {
|
||||
OffsetRows::Row
|
||||
} else if self.parse_keyword(Keyword::ROWS) {
|
||||
|
|
|
@ -5010,6 +5010,20 @@ fn test_placeholder() {
|
|||
right: Box::new(Expr::Value(Value::Placeholder("$Id1".into())))
|
||||
})
|
||||
);
|
||||
|
||||
let sql = "SELECT * FROM student LIMIT $1 OFFSET $2";
|
||||
let ast = dialects.verified_query(sql);
|
||||
assert_eq!(
|
||||
ast.limit,
|
||||
Some(Expr::Value(Value::Placeholder("$1".into())))
|
||||
);
|
||||
assert_eq!(
|
||||
ast.offset,
|
||||
Some(Offset {
|
||||
value: Expr::Value(Value::Placeholder("$2".into())),
|
||||
rows: OffsetRows::None,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -5058,6 +5072,29 @@ fn parse_offset_and_limit() {
|
|||
// different order is OK
|
||||
one_statement_parses_to("SELECT foo FROM bar OFFSET 2 LIMIT 2", sql);
|
||||
|
||||
// expressions are allowed
|
||||
let sql = "SELECT foo FROM bar LIMIT 1 + 2 OFFSET 3 * 4";
|
||||
let ast = verified_query(sql);
|
||||
assert_eq!(
|
||||
ast.limit,
|
||||
Some(Expr::BinaryOp {
|
||||
left: Box::new(Expr::Value(number("1"))),
|
||||
op: BinaryOperator::Plus,
|
||||
right: Box::new(Expr::Value(number("2"))),
|
||||
}),
|
||||
);
|
||||
assert_eq!(
|
||||
ast.offset,
|
||||
Some(Offset {
|
||||
value: Expr::BinaryOp {
|
||||
left: Box::new(Expr::Value(number("3"))),
|
||||
op: BinaryOperator::Multiply,
|
||||
right: Box::new(Expr::Value(number("4"))),
|
||||
},
|
||||
rows: OffsetRows::None,
|
||||
}),
|
||||
);
|
||||
|
||||
// Can't repeat OFFSET / LIMIT
|
||||
let res = parse_sql_statements("SELECT foo FROM bar OFFSET 2 OFFSET 2");
|
||||
assert_eq!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue