mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-07-07 17:04:59 +00:00
fix: parse snowflake fetch clause (#1894)
This commit is contained in:
parent
5d63663bc6
commit
44f3be38e5
2 changed files with 25 additions and 5 deletions
|
@ -15023,7 +15023,8 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
/// Parse a FETCH clause
|
/// Parse a FETCH clause
|
||||||
pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
|
pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
|
||||||
self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
|
let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
|
||||||
|
|
||||||
let (quantity, percent) = if self
|
let (quantity, percent) = if self
|
||||||
.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
|
.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
|
||||||
.is_some()
|
.is_some()
|
||||||
|
@ -15032,16 +15033,16 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
let quantity = Expr::Value(self.parse_value()?);
|
let quantity = Expr::Value(self.parse_value()?);
|
||||||
let percent = self.parse_keyword(Keyword::PERCENT);
|
let percent = self.parse_keyword(Keyword::PERCENT);
|
||||||
self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
|
let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
|
||||||
(Some(quantity), percent)
|
(Some(quantity), percent)
|
||||||
};
|
};
|
||||||
|
|
||||||
let with_ties = if self.parse_keyword(Keyword::ONLY) {
|
let with_ties = if self.parse_keyword(Keyword::ONLY) {
|
||||||
false
|
false
|
||||||
} else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
|
|
||||||
true
|
|
||||||
} else {
|
} else {
|
||||||
return self.expected("one of ONLY or WITH TIES", self.peek_token());
|
self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Fetch {
|
Ok(Fetch {
|
||||||
with_ties,
|
with_ties,
|
||||||
percent,
|
percent,
|
||||||
|
|
|
@ -4146,3 +4146,22 @@ END
|
||||||
assert_eq!(2, exception[1].idents.len());
|
assert_eq!(2, exception[1].idents.len());
|
||||||
assert_eq!(2, exception[1].statements.len());
|
assert_eq!(2, exception[1].statements.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_snowflake_fetch_clause_syntax() {
|
||||||
|
let canonical = "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS ONLY";
|
||||||
|
snowflake().verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2", canonical);
|
||||||
|
|
||||||
|
snowflake()
|
||||||
|
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH FIRST 2", canonical);
|
||||||
|
snowflake()
|
||||||
|
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH NEXT 2", canonical);
|
||||||
|
|
||||||
|
snowflake()
|
||||||
|
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2 ROW", canonical);
|
||||||
|
|
||||||
|
snowflake().verified_only_select_with_canonical(
|
||||||
|
"SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS",
|
||||||
|
canonical,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue