Skip to content

Commit 44f3be3

Browse files
authored
fix: parse snowflake fetch clause (#1894)
1 parent 5d63663 commit 44f3be3

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
@@ -15023,7 +15023,8 @@ impl<'a> Parser<'a> {
1502315023

1502415024
/// Parse a FETCH clause
1502515025
pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
15026-
self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
15026+
let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
15027+
1502715028
let (quantity, percent) = if self
1502815029
.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
1502915030
.is_some()
@@ -15032,16 +15033,16 @@ impl<'a> Parser<'a> {
1503215033
} else {
1503315034
let quantity = Expr::Value(self.parse_value()?);
1503415035
let percent = self.parse_keyword(Keyword::PERCENT);
15035-
self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
15036+
let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
1503615037
(Some(quantity), percent)
1503715038
};
15039+
1503815040
let with_ties = if self.parse_keyword(Keyword::ONLY) {
1503915041
false
15040-
} else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
15041-
true
1504215042
} else {
15043-
return self.expected("one of ONLY or WITH TIES", self.peek_token());
15043+
self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
1504415044
};
15045+
1504515046
Ok(Fetch {
1504615047
with_ties,
1504715048
percent,

tests/sqlparser_snowflake.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4146,3 +4146,22 @@ END
41464146
assert_eq!(2, exception[1].idents.len());
41474147
assert_eq!(2, exception[1].statements.len());
41484148
}
4149+
4150+
#[test]
4151+
fn test_snowflake_fetch_clause_syntax() {
4152+
let canonical = "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS ONLY";
4153+
snowflake().verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2", canonical);
4154+
4155+
snowflake()
4156+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH FIRST 2", canonical);
4157+
snowflake()
4158+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH NEXT 2", canonical);
4159+
4160+
snowflake()
4161+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2 ROW", canonical);
4162+
4163+
snowflake().verified_only_select_with_canonical(
4164+
"SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS",
4165+
canonical,
4166+
);
4167+
}

0 commit comments

Comments
 (0)