diff --git a/crates/dbx-core/src/db_admin_sql.rs b/crates/dbx-core/src/db_admin_sql.rs index e211c2a904..73dd1da4f2 100644 --- a/crates/dbx-core/src/db_admin_sql.rs +++ b/crates/dbx-core/src/db_admin_sql.rs @@ -717,7 +717,10 @@ pub fn build_create_schema_sql(options: SchemaNameSqlOptions) -> Result String { let schema = quote_table_identifier(options.database_type, &options.name); - if matches!( + if options.database_type == Some(DatabaseType::OceanbaseOracle) { + // OceanBase Oracle mode models schemas as users, so dropping one drops the user. + format!("DROP USER {schema} CASCADE;") + } else if matches!( options.database_type, Some(DatabaseType::Postgres | DatabaseType::Gaussdb | DatabaseType::Kwdb | DatabaseType::Dameng) ) { @@ -1895,6 +1898,34 @@ mod tests { }), "DROP SCHEMA \"analytics\" CASCADE;" ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::Postgres), + name: "analytics".to_string(), + }), + "DROP SCHEMA \"analytics\" CASCADE;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::Mysql), + name: "analytics".to_string(), + }), + "DROP SCHEMA `analytics`;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::OceanbaseOracle), + name: "analytics".to_string(), + }), + "DROP USER \"analytics\" CASCADE;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::OceanbaseOracle), + name: "ana\"lytics".to_string(), + }), + "DROP USER \"ana\"\"lytics\" CASCADE;" + ); } #[test]