Skip to content

Commit c9b68de

Browse files
Vedinayman-sigma
authored andcommitted
fix: parse snowflake fetch clause (apache#1894)
1 parent 27df88f commit c9b68de

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

src/parser/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15055,7 +15055,8 @@ impl<'a> Parser<'a> {
1505515055

1505615056
/// Parse a FETCH clause
1505715057
pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
15058-
self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
15058+
let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
15059+
1505915060
let (quantity, percent) = if self
1506015061
.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
1506115062
.is_some()
@@ -15064,16 +15065,16 @@ impl<'a> Parser<'a> {
1506415065
} else {
1506515066
let quantity = Expr::Value(self.parse_value()?);
1506615067
let percent = self.parse_keyword(Keyword::PERCENT);
15067-
self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
15068+
let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
1506815069
(Some(quantity), percent)
1506915070
};
15071+
1507015072
let with_ties = if self.parse_keyword(Keyword::ONLY) {
1507115073
false
15072-
} else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
15073-
true
1507415074
} else {
15075-
return self.expected("one of ONLY or WITH TIES", self.peek_token());
15075+
self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
1507615076
};
15077+
1507715078
Ok(Fetch {
1507815079
with_ties,
1507915080
percent,

tests/sqlparser_snowflake.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4165,3 +4165,22 @@ END
41654165
assert_eq!(2, exception[1].idents.len());
41664166
assert_eq!(2, exception[1].statements.len());
41674167
}
4168+
4169+
#[test]
4170+
fn test_snowflake_fetch_clause_syntax() {
4171+
let canonical = "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS ONLY";
4172+
snowflake().verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2", canonical);
4173+
4174+
snowflake()
4175+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH FIRST 2", canonical);
4176+
snowflake()
4177+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH NEXT 2", canonical);
4178+
4179+
snowflake()
4180+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2 ROW", canonical);
4181+
4182+
snowflake().verified_only_select_with_canonical(
4183+
"SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS",
4184+
canonical,
4185+
);
4186+
}

0 commit comments

Comments
 (0)