Skip to content

Commit

Permalink
Support placeholders ($ or ?) in LIMIT clause (#494)
Browse files Browse the repository at this point in the history
* fix: limit $1

* feat: test limit $1

* Update Cargo.toml

* cargo fmt

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
  • Loading branch information
step-baby and alamb committed May 25, 2022
1 parent 2c0886d commit 09bdb6b
Showing 1 changed file with 36 additions and 1 deletion.
37 changes: 36 additions & 1 deletion src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2592,6 +2592,7 @@ impl<'a> Parser<'a> {
pub fn parse_number_value(&mut self) -> Result<Value, ParserError> {
match self.parse_value()? {
v @ Value::Number(_, _) => Ok(v),
v @ Value::Placeholder(_) => Ok(v),
_ => {
self.prev_token();
self.expected("literal number", self.peek_token())
Expand Down Expand Up @@ -4356,7 +4357,7 @@ impl Word {
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::all_dialects;
use crate::test_utils::{all_dialects, TestedDialects};

#[test]
fn test_prev_index() {
Expand All @@ -4378,4 +4379,38 @@ mod tests {
parser.prev_token();
});
}

#[test]
fn test_parse_limit() {
let sql = "SELECT * FROM user LIMIT 1";
all_dialects().run_parser_method(sql, |parser| {
let ast = parser.parse_query().unwrap();
assert_eq!(ast.to_string(), sql.to_string());
});

let sql = "SELECT * FROM user LIMIT $1 OFFSET $2";
let dialects = TestedDialects {
dialects: vec![
Box::new(PostgreSqlDialect {}),
Box::new(ClickHouseDialect {}),
Box::new(GenericDialect {}),
Box::new(MsSqlDialect {}),
Box::new(SnowflakeDialect {}),
],
};

dialects.run_parser_method(sql, |parser| {
let ast = parser.parse_query().unwrap();
assert_eq!(ast.to_string(), sql.to_string());
});

let sql = "SELECT * FROM user LIMIT ? OFFSET ?";
let dialects = TestedDialects {
dialects: vec![Box::new(MySqlDialect {})],
};
dialects.run_parser_method(sql, |parser| {
let ast = parser.parse_query().unwrap();
assert_eq!(ast.to_string(), sql.to_string());
});
}
}

0 comments on commit 09bdb6b

Please sign in to comment.