@@ -5110,7 +5110,9 @@ impl<'a> Parser<'a> {
51105110 let persistent = dialect_of!(self is DuckDbDialect)
51115111 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
51125112 let create_view_params = self.parse_create_view_params()?;
5113- if self.parse_keyword(Keyword::TABLE) {
5113+ if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5114+ self.parse_create_snapshot_table().map(Into::into)
5115+ } else if self.parse_keyword(Keyword::TABLE) {
51145116 self.parse_create_table(or_replace, temporary, global, transient)
51155117 .map(Into::into)
51165118 } else if self.peek_keyword(Keyword::MATERIALIZED)
@@ -6327,6 +6329,40 @@ impl<'a> Parser<'a> {
63276329 .build())
63286330 }
63296331
6332+ /// Parse `CREATE SNAPSHOT TABLE` statement.
6333+ ///
6334+ /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6335+ pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6336+ self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6337+ let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6338+ let table_name = self.parse_object_name(true)?;
6339+
6340+ self.expect_keyword_is(Keyword::CLONE)?;
6341+ let clone = Some(self.parse_object_name(true)?);
6342+
6343+ let version =
6344+ if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6345+ {
6346+ Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6347+ } else {
6348+ None
6349+ };
6350+
6351+ let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6352+ CreateTableOptions::Options(options)
6353+ } else {
6354+ CreateTableOptions::None
6355+ };
6356+
6357+ Ok(CreateTableBuilder::new(table_name)
6358+ .snapshot(true)
6359+ .if_not_exists(if_not_exists)
6360+ .clone_clause(clone)
6361+ .version(version)
6362+ .table_options(table_options)
6363+ .build())
6364+ }
6365+
63306366 /// Parse a file format for external tables.
63316367 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
63326368 let next_token = self.next_token();
0 commit comments