Skip to content

Commit 8176561

Browse files
authored
Support expressions in LIMIT/OFFSET (apache#567)
1 parent a9db6ed commit 8176561

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4421,13 +4421,13 @@ impl<'a> Parser<'a> {
44214421
if self.parse_keyword(Keyword::ALL) {
44224422
Ok(None)
44234423
} else {
4424-
Ok(Some(Expr::Value(self.parse_number_value()?)))
4424+
Ok(Some(self.parse_expr()?))
44254425
}
44264426
}
44274427

44284428
/// Parse an OFFSET clause
44294429
pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
4430-
let value = Expr::Value(self.parse_number_value()?);
4430+
let value = self.parse_expr()?;
44314431
let rows = if self.parse_keyword(Keyword::ROW) {
44324432
OffsetRows::Row
44334433
} else if self.parse_keyword(Keyword::ROWS) {

tests/sqlparser_common.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5010,6 +5010,20 @@ fn test_placeholder() {
50105010
right: Box::new(Expr::Value(Value::Placeholder("$Id1".into())))
50115011
})
50125012
);
5013+
5014+
let sql = "SELECT * FROM student LIMIT $1 OFFSET $2";
5015+
let ast = dialects.verified_query(sql);
5016+
assert_eq!(
5017+
ast.limit,
5018+
Some(Expr::Value(Value::Placeholder("$1".into())))
5019+
);
5020+
assert_eq!(
5021+
ast.offset,
5022+
Some(Offset {
5023+
value: Expr::Value(Value::Placeholder("$2".into())),
5024+
rows: OffsetRows::None,
5025+
}),
5026+
);
50135027
}
50145028

50155029
#[test]
@@ -5058,6 +5072,29 @@ fn parse_offset_and_limit() {
50585072
// different order is OK
50595073
one_statement_parses_to("SELECT foo FROM bar OFFSET 2 LIMIT 2", sql);
50605074

5075+
// expressions are allowed
5076+
let sql = "SELECT foo FROM bar LIMIT 1 + 2 OFFSET 3 * 4";
5077+
let ast = verified_query(sql);
5078+
assert_eq!(
5079+
ast.limit,
5080+
Some(Expr::BinaryOp {
5081+
left: Box::new(Expr::Value(number("1"))),
5082+
op: BinaryOperator::Plus,
5083+
right: Box::new(Expr::Value(number("2"))),
5084+
}),
5085+
);
5086+
assert_eq!(
5087+
ast.offset,
5088+
Some(Offset {
5089+
value: Expr::BinaryOp {
5090+
left: Box::new(Expr::Value(number("3"))),
5091+
op: BinaryOperator::Multiply,
5092+
right: Box::new(Expr::Value(number("4"))),
5093+
},
5094+
rows: OffsetRows::None,
5095+
}),
5096+
);
5097+
50615098
// Can't repeat OFFSET / LIMIT
50625099
let res = parse_sql_statements("SELECT foo FROM bar OFFSET 2 OFFSET 2");
50635100
assert_eq!(

0 commit comments

Comments
 (0)