diff --git a/Cargo.lock b/Cargo.lock index e0f3bb579b583..3942f2866e18e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2930,7 +2930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5374,7 +5374,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "sqlparser" version = "0.62.0" -source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=7fdc000a3309ef6ef79dc3c863aca0951ae93edb#7fdc000a3309ef6ef79dc3c863aca0951ae93edb" +source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=874cfbb81d2a34e6ee101d3a7ecd1ae6b60000c6#874cfbb81d2a34e6ee101d3a7ecd1ae6b60000c6" dependencies = [ "log", "recursive", @@ -5887,7 +5887,7 @@ dependencies = [ [[package]] name = "sqlparser_derive" version = "0.5.0" -source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=7fdc000a3309ef6ef79dc3c863aca0951ae93edb#7fdc000a3309ef6ef79dc3c863aca0951ae93edb" +source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=874cfbb81d2a34e6ee101d3a7ecd1ae6b60000c6#874cfbb81d2a34e6ee101d3a7ecd1ae6b60000c6" dependencies = [ "proc-macro2", "quote", @@ -6124,7 +6124,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -7065,7 +7065,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c09919498cbdc..e5a8026a3c4da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -196,7 +196,7 @@ regex = "1.12" rstest = "0.26.1" serde_json = "1" sha2 = "^0.11.0" -sqlparser = { git = "https://github.com/Embucket/datafusion-sqlparser-rs.git", rev = "7fdc000a3309ef6ef79dc3c863aca0951ae93edb", default-features = false, features = [ +sqlparser = { git = "https://github.com/Embucket/datafusion-sqlparser-rs.git", rev = "874cfbb81d2a34e6ee101d3a7ecd1ae6b60000c6", default-features = false, features = [ "std", "visitor", ] } diff --git a/datafusion/sql/src/statement.rs b/datafusion/sql/src/statement.rs index 56384ee8fab82..b259e57f19747 100644 --- a/datafusion/sql/src/statement.rs +++ b/datafusion/sql/src/statement.rs @@ -779,14 +779,24 @@ impl SqlToRel<'_, S> { Statement::CreateSchema { schema_name, if_not_exists, + or_replace, + transient, + with_managed_access, .. - } => Ok(LogicalPlan::Ddl(DdlStatement::CreateCatalogSchema( - CreateCatalogSchema { - schema_name: get_schema_name(&schema_name, self.ident_normalizer), - if_not_exists, - schema: Arc::new(DFSchema::empty()), - }, - ))), + } => { + if or_replace || transient || with_managed_access { + return not_impl_err!( + "CREATE SCHEMA OR REPLACE, TRANSIENT and WITH MANAGED ACCESS are not supported" + ); + } + Ok(LogicalPlan::Ddl(DdlStatement::CreateCatalogSchema( + CreateCatalogSchema { + schema_name: get_schema_name(&schema_name, self.ident_normalizer), + if_not_exists, + schema: Arc::new(DFSchema::empty()), + }, + ))) + } Statement::CreateDatabase { db_name, if_not_exists, diff --git a/datafusion/sql/tests/sql_integration.rs b/datafusion/sql/tests/sql_integration.rs index 38b7133e57f45..beaf606cd42b7 100644 --- a/datafusion/sql/tests/sql_integration.rs +++ b/datafusion/sql/tests/sql_integration.rs @@ -3933,6 +3933,31 @@ fn create_schema_with_quoted_name() { ); } +#[test] +fn create_schema_modifiers_are_not_silently_discarded() { + for sql in [ + "CREATE OR REPLACE SCHEMA s", + "CREATE TRANSIENT SCHEMA s", + "CREATE SCHEMA s WITH MANAGED ACCESS", + "CREATE OR REPLACE TRANSIENT SCHEMA s WITH MANAGED ACCESS", + "CREATE TRANSIENT SCHEMA IF NOT EXISTS s", + ] { + let error = logical_plan_with_dialect(sql, &SnowflakeDialect {}) + .expect_err("unsupported schema modifiers must not become plain CREATE"); + assert_contains!( + error.to_string(), + "CREATE SCHEMA OR REPLACE, TRANSIENT and WITH MANAGED ACCESS are not supported" + ); + } + let plan = + logical_plan_with_dialect("CREATE SCHEMA IF NOT EXISTS s", &SnowflakeDialect {}) + .expect("ordinary conditional CREATE remains supported"); + let LogicalPlan::Ddl(DdlStatement::CreateCatalogSchema(create)) = plan else { + panic!("expected catalog schema plan"); + }; + assert!(create.if_not_exists); +} + #[test] fn create_schema_with_quoted_unnormalized_name() { let sql = "CREATE SCHEMA \"Foo\"";