Skip to content

Commit 09bdb6b

Browse files
step-babyalamb
andauthored
Support placeholders ($ or ?) in LIMIT clause (#494)
* fix: limit $1 * feat: test limit $1 * Update Cargo.toml * cargo fmt Co-authored-by: Andrew Lamb <[email protected]>
1 parent 2c0886d commit 09bdb6b

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

src/parser.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2592,6 +2592,7 @@ impl<'a> Parser<'a> {
25922592
pub fn parse_number_value(&mut self) -> Result<Value, ParserError> {
25932593
match self.parse_value()? {
25942594
v @ Value::Number(_, _) => Ok(v),
2595+
v @ Value::Placeholder(_) => Ok(v),
25952596
_ => {
25962597
self.prev_token();
25972598
self.expected("literal number", self.peek_token())
@@ -4356,7 +4357,7 @@ impl Word {
43564357
#[cfg(test)]
43574358
mod tests {
43584359
use super::*;
4359-
use crate::test_utils::all_dialects;
4360+
use crate::test_utils::{all_dialects, TestedDialects};
43604361

43614362
#[test]
43624363
fn test_prev_index() {
@@ -4378,4 +4379,38 @@ mod tests {
43784379
parser.prev_token();
43794380
});
43804381
}
4382+
4383+
#[test]
4384+
fn test_parse_limit() {
4385+
let sql = "SELECT * FROM user LIMIT 1";
4386+
all_dialects().run_parser_method(sql, |parser| {
4387+
let ast = parser.parse_query().unwrap();
4388+
assert_eq!(ast.to_string(), sql.to_string());
4389+
});
4390+
4391+
let sql = "SELECT * FROM user LIMIT $1 OFFSET $2";
4392+
let dialects = TestedDialects {
4393+
dialects: vec![
4394+
Box::new(PostgreSqlDialect {}),
4395+
Box::new(ClickHouseDialect {}),
4396+
Box::new(GenericDialect {}),
4397+
Box::new(MsSqlDialect {}),
4398+
Box::new(SnowflakeDialect {}),
4399+
],
4400+
};
4401+
4402+
dialects.run_parser_method(sql, |parser| {
4403+
let ast = parser.parse_query().unwrap();
4404+
assert_eq!(ast.to_string(), sql.to_string());
4405+
});
4406+
4407+
let sql = "SELECT * FROM user LIMIT ? OFFSET ?";
4408+
let dialects = TestedDialects {
4409+
dialects: vec![Box::new(MySqlDialect {})],
4410+
};
4411+
dialects.run_parser_method(sql, |parser| {
4412+
let ast = parser.parse_query().unwrap();
4413+
assert_eq!(ast.to_string(), sql.to_string());
4414+
});
4415+
}
43814416
}

0 commit comments

Comments
 (0)