@@ -5099,7 +5099,9 @@ impl<'a> Parser<'a> {
50995099 let persistent = dialect_of!(self is DuckDbDialect)
51005100 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
51015101 let create_view_params = self.parse_create_view_params()?;
5102- if self.parse_keyword(Keyword::TABLE) {
5102+ if self.parse_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5103+ self.parse_create_snapshot_table().map(Into::into)
5104+ } else if self.parse_keyword(Keyword::TABLE) {
51035105 self.parse_create_table(or_replace, temporary, global, transient)
51045106 .map(Into::into)
51055107 } else if self.peek_keyword(Keyword::MATERIALIZED)
@@ -6314,6 +6316,39 @@ impl<'a> Parser<'a> {
63146316 .build())
63156317 }
63166318
6319+ /// Parse BigQuery `CREATE SNAPSHOT TABLE` statement.
6320+ ///
6321+ /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6322+ pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6323+ let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6324+ let table_name = self.parse_object_name(true)?;
6325+
6326+ self.expect_keyword_is(Keyword::CLONE)?;
6327+ let clone = Some(self.parse_object_name(true)?);
6328+
6329+ let version =
6330+ if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6331+ {
6332+ Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6333+ } else {
6334+ None
6335+ };
6336+
6337+ let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6338+ CreateTableOptions::Options(options)
6339+ } else {
6340+ CreateTableOptions::None
6341+ };
6342+
6343+ Ok(CreateTableBuilder::new(table_name)
6344+ .snapshot(true)
6345+ .if_not_exists(if_not_exists)
6346+ .clone_clause(clone)
6347+ .version(version)
6348+ .table_options(table_options)
6349+ .build())
6350+ }
6351+
63176352 /// Parse a file format for external tables.
63186353 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
63196354 let next_token = self.next_token();
0 commit comments