diff --git a/crates/dbx-core/src/db_admin_sql.rs b/crates/dbx-core/src/db_admin_sql.rs index 390a8f78f9..515639eea0 100644 --- a/crates/dbx-core/src/db_admin_sql.rs +++ b/crates/dbx-core/src/db_admin_sql.rs @@ -136,7 +136,13 @@ pub fn build_drop_table_sql(options: TableAdminSqlOptions) -> String { } pub fn build_empty_table_sql(options: TableAdminSqlOptions) -> String { - format!("DELETE FROM {};", qualified_name(options.database_type, options.schema.as_deref(), &options.table_name)) + let table = qualified_name(options.database_type, options.schema.as_deref(), &options.table_name); + match options.database_type { + Some(DatabaseType::ClickHouse) => format!("ALTER TABLE {table} DELETE WHERE 1 = 1;"), + Some(DatabaseType::Bigquery) => format!("DELETE FROM {table} WHERE TRUE;"), + Some(DatabaseType::Cassandra | DatabaseType::Hive | DatabaseType::Kylin) => format!("TRUNCATE TABLE {table};"), + _ => format!("DELETE FROM {table};"), + } } pub fn build_truncate_table_sql(options: TableAdminSqlOptions) -> String { @@ -399,6 +405,38 @@ mod tests { assert_eq!(build_drop_table_sql(options.clone()), "DROP TABLE \"public\".\"events\";"); assert_eq!(build_empty_table_sql(options.clone()), "DELETE FROM \"public\".\"events\";"); assert_eq!(build_truncate_table_sql(options), "TRUNCATE TABLE \"public\".\"events\";"); + assert_eq!( + build_empty_table_sql(TableAdminSqlOptions { + database_type: Some(DatabaseType::ClickHouse), + schema: None, + table_name: "PresetSubjectInfo".to_string(), + }), + "ALTER TABLE \"PresetSubjectInfo\" DELETE WHERE 1 = 1;" + ); + assert_eq!( + build_truncate_table_sql(TableAdminSqlOptions { + database_type: Some(DatabaseType::ClickHouse), + schema: None, + table_name: "PresetSubjectInfo".to_string(), + }), + "TRUNCATE TABLE \"PresetSubjectInfo\";" + ); + assert_eq!( + build_empty_table_sql(TableAdminSqlOptions { + database_type: Some(DatabaseType::Bigquery), + schema: None, + table_name: "events".to_string(), + }), + "DELETE FROM `events` WHERE TRUE;" + ); + assert_eq!( + build_empty_table_sql(TableAdminSqlOptions { + database_type: Some(DatabaseType::Cassandra), + schema: None, + table_name: "events".to_string(), + }), + "TRUNCATE TABLE \"events\";" + ); assert_eq!( build_truncate_table_sql(TableAdminSqlOptions { database_type: Some(DatabaseType::DuckDb), diff --git a/crates/dbx-core/src/sql_dialect.rs b/crates/dbx-core/src/sql_dialect.rs index 4a12b9c97c..a0098b75ed 100644 --- a/crates/dbx-core/src/sql_dialect.rs +++ b/crates/dbx-core/src/sql_dialect.rs @@ -174,7 +174,13 @@ pub fn qualified_table_name(database_type: Option, schema: Option< pub fn quote_table_identifier(database_type: Option, name: &str) -> String { match database_type { - Some(DatabaseType::Mysql | DatabaseType::Hive | DatabaseType::Tdengine | DatabaseType::Access) => { + Some( + DatabaseType::Mysql + | DatabaseType::Hive + | DatabaseType::Tdengine + | DatabaseType::Access + | DatabaseType::Bigquery, + ) => { format!("`{}`", name.replace('`', "``")) } Some(DatabaseType::Informix) if is_simple_informix_identifier(name) => name.to_string(),