From aa8c4bea8f5aa18ccd94fefaa5ce17daf0ff1464 Mon Sep 17 00:00:00 2001 From: Dhruv Gupta Date: Mon, 9 Nov 2026 06:27:39 -0500 Subject: [PATCH] fix(snowflake): compare the bare database name when dropping a catalog `_drop_catalog` built the `DATABASE_NAME` literal for the existence check from the identifier object itself, so a catalog name that has to be quoted (for example `my-db__dev`) was compared as `'"my-db__dev"'`, including the double quotes. The check never matched, so expired environment catalogs with such names were never dropped and the janitor warned on every run that the database did not look managed. Use the identifier's name instead, which is what `CREATE DATABASE` stored. Signed-off-by: Dhruv Gupta --- sqlmesh/core/engine_adapter/snowflake.py | 2 +- tests/core/engine_adapter/test_snowflake.py | 24 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sqlmesh/core/engine_adapter/snowflake.py b/sqlmesh/core/engine_adapter/snowflake.py index 758e4847c1..dace876bc7 100644 --- a/sqlmesh/core/engine_adapter/snowflake.py +++ b/sqlmesh/core/engine_adapter/snowflake.py @@ -174,7 +174,7 @@ def _drop_catalog(self, catalog_name: exp.Identifier) -> None: .from_(exp.to_table("information_schema.databases")) .where( exp.and_( - exp.column("database_name").eq(exp.Literal.string(catalog_name)), + exp.column("database_name").eq(exp.Literal.string(catalog_name.name)), exp.column("comment").eq(exp.Literal.string(c.SQLMESH_MANAGED)), ) ) diff --git a/tests/core/engine_adapter/test_snowflake.py b/tests/core/engine_adapter/test_snowflake.py index 89f19fc588..ba416a84d7 100644 --- a/tests/core/engine_adapter/test_snowflake.py +++ b/tests/core/engine_adapter/test_snowflake.py @@ -1187,3 +1187,27 @@ def test_drop_catalog(snowflake_mocked_engine_adapter: SnowflakeEngineAdapter) - """SELECT 1 FROM "INFORMATION_SCHEMA"."DATABASES" WHERE "DATABASE_NAME" = 'foo' AND "COMMENT" = 'sqlmesh_managed'""", 'DROP DATABASE IF EXISTS "foo"', ] + + +@pytest.mark.parametrize( + "catalog_name, expected_name", + [ + # names that need quoting are parsed into quoted identifiers + ("my-db__dev", "my-db__dev"), + (exp.to_identifier("my db", quoted=True), "my db"), + (exp.to_identifier("MyDb", quoted=True), "MyDb"), + ], +) +def test_drop_catalog_quoted_name( + snowflake_mocked_engine_adapter: SnowflakeEngineAdapter, + catalog_name: t.Union[str, exp.Identifier], + expected_name: str, +) -> None: + adapter = snowflake_mocked_engine_adapter + adapter.drop_catalog(catalog_name) + + # the existence check must compare against the bare database name, without identifier quotes + assert to_sql_calls(adapter) == [ + f"""SELECT 1 FROM "INFORMATION_SCHEMA"."DATABASES" WHERE "DATABASE_NAME" = '{expected_name}' AND "COMMENT" = 'sqlmesh_managed'""", + f'DROP DATABASE IF EXISTS "{expected_name}"', + ]