@@ -15017,6 +15017,9 @@ impl<'a> Parser<'a> {
1501715017
1501815018 /// Parse a FETCH clause
1501915019 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
15020+ if dialect_of!(self is SnowflakeDialect) {
15021+ return self.parse_snowflake_fetch();
15022+ }
1502015023 self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
1502115024 let (quantity, percent) = if self
1502215025 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
@@ -15043,6 +15046,22 @@ impl<'a> Parser<'a> {
1504315046 })
1504415047 }
1504515048
15049+ /// Parse a FETCH clause with Snowflake-specific syntax
15050+ fn parse_snowflake_fetch(&mut self) -> Result<Fetch, ParserError> {
15051+ // Snowflake: All additional keywords are optional. WITH TIES is not allowed.
15052+ let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
15053+
15054+ let quantity = Expr::Value(self.parse_value()?);
15055+ let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
15056+ let _ = self.parse_keyword(Keyword::ONLY);
15057+
15058+ Ok(Fetch {
15059+ with_ties: false,
15060+ percent: false,
15061+ quantity: Some(quantity),
15062+ })
15063+ }
15064+
1504615065 /// Parse a FOR UPDATE/FOR SHARE clause
1504715066 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
1504815067 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
0 commit comments