From 4e387e7e46a2e05066204034dd1d57f3f04ef92a Mon Sep 17 00:00:00 2001 From: Raphael Etugbo Date: Mon, 9 Feb 2026 22:38:41 +0000 Subject: [PATCH 1/3] fix(duckdb): handle view deletion in drop_table to prevent catalog errors --- sqlmesh/core/engine_adapter/duckdb.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sqlmesh/core/engine_adapter/duckdb.py b/sqlmesh/core/engine_adapter/duckdb.py index 3b057219e0..63714182fa 100644 --- a/sqlmesh/core/engine_adapter/duckdb.py +++ b/sqlmesh/core/engine_adapter/duckdb.py @@ -96,6 +96,27 @@ def _df_to_source_queries( ) ] + def drop_table( + self, + table_name: TableName, + **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 + + if obj and obj.type.is_view: + return self.drop_view(table_name, **kwargs) + + return super().drop_table(table_name, **kwargs) + def _get_data_objects( self, schema_name: SchemaName, object_names: t.Optional[t.Set[str]] = None ) -> t.List[DataObject]: From e618cda1f5693cca431a9aa0c71b1ad19d5dfec2 Mon Sep 17 00:00:00 2001 From: Raphael Etugbo Date: Mon, 9 Feb 2026 23:13:53 +0000 Subject: [PATCH 2/3] fix(duckdb): ensure drop_table correctly identifies and drops views --- sqlmesh/core/engine_adapter/duckdb.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sqlmesh/core/engine_adapter/duckdb.py b/sqlmesh/core/engine_adapter/duckdb.py index 63714182fa..7581d841c3 100644 --- a/sqlmesh/core/engine_adapter/duckdb.py +++ b/sqlmesh/core/engine_adapter/duckdb.py @@ -98,7 +98,8 @@ def _df_to_source_queries( def drop_table( self, - table_name: TableName, + table_name: t.Any, + exists: bool = True, **kwargs: t.Any, ) -> None: """ @@ -106,16 +107,19 @@ def drop_table( 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, **kwargs) + return self.drop_view(table_name, exists=exists, **kwargs) - return super().drop_table(table_name, **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 From c93234128eab8828b99c9be7a0ace5c7858cba51 Mon Sep 17 00:00:00 2001 From: Raphael Etugbo Date: Mon, 9 Feb 2026 23:17:33 +0000 Subject: [PATCH 3/3] trigger ci