@@ -16352,6 +16352,8 @@ impl<'a> Parser<'a> {
1635216352 {
1635316353 let expr = self.parse_expr()?;
1635416354 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
16355+ } else if self.peek_keyword(Keyword::CHANGES) {
16356+ return self.parse_table_version_changes().map(Some);
1635516357 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
1635616358 let func_name = self.parse_object_name(true)?;
1635716359 let func = self.parse_function(func_name)?;
@@ -16367,6 +16369,30 @@ impl<'a> Parser<'a> {
1636716369 Ok(None)
1636816370 }
1636916371
16372+ /// Parses the Snowflake `CHANGES` clause for change tracking queries.
16373+ ///
16374+ /// Syntax:
16375+ /// ```sql
16376+ /// CHANGES (INFORMATION => DEFAULT)
16377+ /// AT (TIMESTAMP => <expr>)
16378+ /// [END (TIMESTAMP => <expr>)]
16379+ /// ```
16380+ ///
16381+ /// <https://docs.snowflake.com/en/sql-reference/constructs/changes>
16382+ fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
16383+ let changes_name = self.parse_object_name(true)?;
16384+ let changes = self.parse_function(changes_name)?;
16385+ let at_name = self.parse_object_name(true)?;
16386+ let at = self.parse_function(at_name)?;
16387+ let end = if self.peek_keyword(Keyword::END) {
16388+ let end_name = self.parse_object_name(true)?;
16389+ Some(self.parse_function(end_name)?)
16390+ } else {
16391+ None
16392+ };
16393+ Ok(TableVersion::Changes { changes, at, end })
16394+ }
16395+
1637016396 /// Parses MySQL's JSON_TABLE column definition.
1637116397 /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
1637216398 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
0 commit comments