Skip to content

Commit 012e542

Browse files
authored
fix: lowercase column names snowflake (#5425)
1 parent 6d00e35 commit 012e542

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

sqlmesh/core/engine_adapter/snowflake.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,8 @@ def _get_data_objects(
526526
type=DataObjectType.from_str(row.type), # type: ignore
527527
clustering_key=row.clustering_key, # type: ignore
528528
)
529-
for row in df.itertuples()
529+
# lowercase the column names for cases where Snowflake might return uppercase column names for certain catalogs
530+
for row in df.rename(columns={col: col.lower() for col in df.columns}).itertuples()
530531
]
531532

532533
def set_current_catalog(self, catalog: str) -> None:

tests/core/engine_adapter/test_snowflake.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88
import sqlmesh.core.dialect as d
99
from sqlmesh.core.dialect import normalize_model_name
10+
from sqlmesh.core.engine_adapter import SnowflakeEngineAdapter
1011
from sqlmesh.core.engine_adapter.base import EngineAdapter
12+
from sqlmesh.core.engine_adapter.shared import DataObjectType
1113
from sqlmesh.core.model import load_sql_based_model
12-
from sqlmesh.core.engine_adapter import SnowflakeEngineAdapter
1314
from sqlmesh.core.model.definition import SqlModel
1415
from sqlmesh.core.node import IntervalUnit
1516
from sqlmesh.utils.errors import SQLMeshError
@@ -39,6 +40,38 @@ def test_get_temp_table(mocker: MockerFixture, make_mocked_engine_adapter: t.Cal
3940
assert value.sql(dialect=adapter.dialect) == '"CATALOG"."DB"."__temp_TEST_TABLE_abcdefgh"'
4041

4142

43+
def test_get_data_objects_lowercases_columns(
44+
make_mocked_engine_adapter: t.Callable, mocker: MockerFixture
45+
) -> None:
46+
adapter = make_mocked_engine_adapter(SnowflakeEngineAdapter, patch_get_data_objects=False)
47+
48+
adapter.get_current_catalog = mocker.Mock(return_value="TEST_CATALOG")
49+
50+
adapter.fetchdf = mocker.Mock(
51+
return_value=pd.DataFrame( # type: ignore[assignment]
52+
[
53+
{
54+
"CATALOG": "TEST_CATALOG",
55+
"NAME": "MY_TABLE",
56+
"SCHEMA_NAME": "PUBLIC",
57+
"TYPE": "TABLE",
58+
"CLUSTERING_KEY": "ID",
59+
}
60+
]
61+
)
62+
)
63+
64+
data_objects = adapter._get_data_objects("TEST_CATALOG.PUBLIC")
65+
66+
assert len(data_objects) == 1
67+
data_object = data_objects[0]
68+
assert data_object.catalog == "TEST_CATALOG"
69+
assert data_object.schema_name == "PUBLIC"
70+
assert data_object.name == "MY_TABLE"
71+
assert data_object.type == DataObjectType.TABLE
72+
assert data_object.clustering_key == "ID"
73+
74+
4275
@pytest.mark.parametrize(
4376
"current_warehouse, current_warehouse_exp, configured_warehouse, configured_warehouse_exp, should_change",
4477
[

0 commit comments

Comments
 (0)