From 9f3f5a19c1e796d0a1ed68550ef16ddece5865e5 Mon Sep 17 00:00:00 2001 From: Alex Qyoun-ae <4062971+MazterQyou@users.noreply.github.com> Date: Fri, 10 Jun 2022 18:47:37 +0400 Subject: [PATCH 1/2] feat: Allow expressions in `LIMIT` --- src/parser.rs | 2 +- tests/sqlparser_common.rs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index 098692d35..9a5f7675e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4243,7 +4243,7 @@ impl<'a> Parser<'a> { if self.parse_keyword(Keyword::ALL) { Ok(None) } else { - Ok(Some(Expr::Value(self.parse_number_value()?))) + Ok(Some(self.parse_expr()?)) } } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 0f0dcab28..df4ae39d7 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4614,6 +4614,13 @@ fn test_placeholder() { right: Box::new(Expr::Value(Value::Placeholder("$Id1".into()))) }) ); + + let sql = "SELECT * FROM student LIMIT $1"; + let ast = dialects.verified_query(sql); + assert_eq!( + ast.limit, + Some(Expr::Value(Value::Placeholder("$1".into()))) + ); } #[test] From 8e00fadaeb94cb89cba643c5fd8a0d907b0b05e7 Mon Sep 17 00:00:00 2001 From: Alex Qyoun-ae <4062971+MazterQyou@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:32:56 +0400 Subject: [PATCH 2/2] chore: Box `Query` in `Cte` --- src/ast/query.rs | 2 +- src/parser.rs | 4 ++-- tests/sqlparser_common.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ast/query.rs b/src/ast/query.rs index 331857e78..f6db18e05 100644 --- a/src/ast/query.rs +++ b/src/ast/query.rs @@ -266,7 +266,7 @@ impl fmt::Display for With { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Cte { pub alias: TableAlias, - pub query: Query, + pub query: Box, pub from: Option, } diff --git a/src/parser.rs b/src/parser.rs index 9a5f7675e..03eee7070 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3172,7 +3172,7 @@ impl<'a> Parser<'a> { let mut cte = if self.parse_keyword(Keyword::AS) { self.expect_token(&Token::LParen)?; - let query = self.parse_query()?; + let query = Box::new(self.parse_query()?); self.expect_token(&Token::RParen)?; let alias = TableAlias { name, @@ -3187,7 +3187,7 @@ impl<'a> Parser<'a> { let columns = self.parse_parenthesized_column_list(Optional)?; self.expect_keyword(Keyword::AS)?; self.expect_token(&Token::LParen)?; - let query = self.parse_query()?; + let query = Box::new(self.parse_query()?); self.expect_token(&Token::RParen)?; let alias = TableAlias { name, columns }; Cte { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index df4ae39d7..3a473bd90 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3281,7 +3281,7 @@ fn parse_recursive_cte() { quote_style: None, }], }, - query: cte_query, + query: Box::new(cte_query), from: None, }; assert_eq!(with.cte_tables.first().unwrap(), &expected);