fix: parse snowflake fetch clause (#1894)

This commit is contained in:
Denys Tsomenko 2025-06-24 09:29:44 +03:00 committed by GitHub
parent 5d63663bc6
commit 44f3be38e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 5 deletions

View file

@ -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,

View file

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