diff --git a/src/parser.rs b/src/parser.rs index beb7394ba..abc142908 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2574,6 +2574,7 @@ impl<'a> Parser<'a> { pub fn parse_number_value(&mut self) -> Result { match self.parse_value()? { v @ Value::Number(_, _) => Ok(v), + v @ Value::Placeholder(_) => Ok(v), _ => { self.prev_token(); self.expected("literal number", self.peek_token()) @@ -4315,7 +4316,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() { @@ -4337,4 +4338,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()); + }); + } }