BigQuery: Add support for CREATE SCHEMA options (#1742)

This commit is contained in:
Ifeanyi Ubah 2025-03-14 08:00:19 +01:00 committed by GitHub
parent 862e887a66
commit f81aed6359
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 57 additions and 6 deletions

View file

@ -3450,6 +3450,22 @@ pub enum Statement {
/// `<schema name> | AUTHORIZATION <schema authorization identifier> | <schema name> AUTHORIZATION <schema authorization identifier>`
schema_name: SchemaName,
if_not_exists: bool,
/// Schema options.
///
/// ```sql
/// CREATE SCHEMA myschema OPTIONS(key1='value1');
/// ```
///
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_schema_statement)
options: Option<Vec<SqlOption>>,
/// Default collation specification for the schema.
///
/// ```sql
/// CREATE SCHEMA myschema DEFAULT COLLATE 'und:ci';
/// ```
///
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_schema_statement)
default_collate_spec: Option<Expr>,
},
/// ```sql
/// CREATE DATABASE
@ -5177,12 +5193,26 @@ impl fmt::Display for Statement {
Statement::CreateSchema {
schema_name,
if_not_exists,
} => write!(
f,
"CREATE SCHEMA {if_not_exists}{name}",
if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
name = schema_name
),
options,
default_collate_spec,
} => {
write!(
f,
"CREATE SCHEMA {if_not_exists}{name}",
if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
name = schema_name
)?;
if let Some(collate) = default_collate_spec {
write!(f, " DEFAULT COLLATE {collate}")?;
}
if let Some(options) = options {
write!(f, " OPTIONS({})", display_comma_separated(options))?;
}
Ok(())
}
Statement::Assert { condition, message } => {
write!(f, "ASSERT {condition}")?;
if let Some(m) = message {

View file

@ -4731,9 +4731,23 @@ impl<'a> Parser<'a> {
let schema_name = self.parse_schema_name()?;
let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
Some(self.parse_expr()?)
} else {
None
};
let options = if self.peek_keyword(Keyword::OPTIONS) {
Some(self.parse_options(Keyword::OPTIONS)?)
} else {
None
};
Ok(Statement::CreateSchema {
schema_name,
if_not_exists,
options,
default_collate_spec,
})
}

View file

@ -4208,6 +4208,11 @@ fn parse_create_schema() {
}
_ => unreachable!(),
}
verified_stmt(r#"CREATE SCHEMA a.b.c OPTIONS(key1 = 'value1', key2 = 'value2')"#);
verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a OPTIONS(key1 = 'value1')"#);
verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a OPTIONS()"#);
verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a DEFAULT COLLATE 'und:ci' OPTIONS()"#);
}
#[test]

View file

@ -988,6 +988,8 @@ fn parse_create_schema_if_not_exists() {
Statement::CreateSchema {
if_not_exists: true,
schema_name,
options: _,
default_collate_spec: _,
} => assert_eq!("schema_name", schema_name.to_string()),
_ => unreachable!(),
}