Skip to content

Commit 97c03c0

Browse files
committed
fix: parse snowflake fetch clause (apache#1894)
1 parent ae675e8 commit 97c03c0

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/parser/mod.rs

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

1379913799
/// Parse a FETCH clause
1380013800
pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
13801-
self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
13801+
let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
13802+
1380213803
let (quantity, percent) = if self
1380313804
.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
1380413805
.is_some()
@@ -13807,16 +13808,16 @@ impl<'a> Parser<'a> {
1380713808
} else {
1380813809
let quantity = Expr::Value(self.parse_value()?);
1380913810
let percent = self.parse_keyword(Keyword::PERCENT);
13810-
self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
13811+
let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
1381113812
(Some(quantity), percent)
1381213813
};
13814+
1381313815
let with_ties = if self.parse_keyword(Keyword::ONLY) {
1381413816
false
13815-
} else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
13816-
true
1381713817
} else {
13818-
return self.expected("one of ONLY or WITH TIES", self.peek_token());
13818+
self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
1381913819
};
13820+
1382013821
Ok(Fetch {
1382113822
with_ties,
1382213823
percent,

tests/sqlparser_snowflake.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,12 @@ fn test_snowflake_create_table_cluster_by() {
465465
}
466466
_ => unreachable!(),
467467
}
468-
match snowflake().verified_stmt("CREATE TABLE my_table (ts DATE, a TEXT) CLUSTER BY (to_date(ts), a)") {
468+
match snowflake()
469+
.verified_stmt("CREATE TABLE my_table (ts DATE, a TEXT) CLUSTER BY (to_date(ts), a)")
470+
{
469471
Statement::CreateTable(CreateTable {
470-
name, cluster_by, ..
471-
}) => {
472+
name, cluster_by, ..
473+
}) => {
472474
assert_eq!("my_table", name.to_string());
473475
assert_eq!(
474476
Some(WrappedCollection::Parentheses(vec![
@@ -3527,3 +3529,22 @@ fn test_alter_session() {
35273529
);
35283530
snowflake().one_statement_parses_to("ALTER SESSION UNSET a\nB", "ALTER SESSION UNSET a, B");
35293531
}
3532+
3533+
#[test]
3534+
fn test_snowflake_fetch_clause_syntax() {
3535+
let canonical = "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS ONLY";
3536+
snowflake().verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2", canonical);
3537+
3538+
snowflake()
3539+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH FIRST 2", canonical);
3540+
snowflake()
3541+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH NEXT 2", canonical);
3542+
3543+
snowflake()
3544+
.verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2 ROW", canonical);
3545+
3546+
snowflake().verified_only_select_with_canonical(
3547+
"SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS",
3548+
canonical,
3549+
);
3550+
}

0 commit comments

Comments
 (0)