diff --git a/sqlmesh/core/engine_adapter/duckdb.py b/sqlmesh/core/engine_adapter/duckdb.py index 3b057219e0..7581d841c3 100644 --- a/sqlmesh/core/engine_adapter/duckdb.py +++ b/sqlmesh/core/engine_adapter/duckdb.py @@ -96,6 +96,31 @@ def _df_to_source_queries( ) ] + def drop_table( + self, + table_name: t.Any, + exists: bool = True, + **kwargs: t.Any, + ) -> None: + """ + DuckDB will raise an error if you try to DROP TABLE on a view. + We check the object type first to ensure we use the correct command. + """ + table = exp.to_table(table_name) + + # Ensure we have a schema name, default to 'main' for DuckDB + schema = table.db or "main" + objects = self._get_data_objects(schema, object_names={table.name}) + obj = objects[0] if objects else None + + # Safety: Remove 'exists' from kwargs so we don't pass it twice + kwargs.pop("exists", None) + + if obj and obj.type.is_view: + return self.drop_view(table_name, exists=exists, **kwargs) + + return super().drop_table(table_name, exists=exists, **kwargs) + def _get_data_objects( self, schema_name: SchemaName, object_names: t.Optional[t.Set[str]] = None ) -> t.List[DataObject]: