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