Support placeholders ($ or ?) in LIMIT clause (#494)

* fix: limit $1

* feat: test limit $1

* Update Cargo.toml

* cargo fmt

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
This commit is contained in:
mao 2022-05-26 03:40:30 +08:00 committed by GitHub
parent 2c0886d9fe
commit 09bdb6bb8a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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())
@ -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() {
@ -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());
});
}
}