Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normalize is_iceberg Field for Consistency in Snowflake with QUOTED_IDENTIFIERS_IGNORE_CASE #1229

Merged
merged 9 commits into from
Nov 10, 2024
6 changes: 6 additions & 0 deletions .changes/unreleased/Fixes-20241104-172349.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Fixes
body: Iceberg quoting ignore fix.
time: 2024-11-04T17:23:49.706297-08:00
custom:
Author: versusfacit
Issue: "1227"
9 changes: 9 additions & 0 deletions dbt/adapters/snowflake/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,15 @@ def list_relations_without_caching(
# this can be collapsed once Snowflake adds is_iceberg to show objects
columns = ["database_name", "schema_name", "name", "kind", "is_dynamic"]
if self.behavior.enable_iceberg_materializations.no_warn:
# The QUOTED_IDENTIFIERS_IGNORE_CASE setting impacts column names like
# is_iceberg which is created by dbt, but it does not affect the case
# of column values in Snowflake's SHOW OBJECTS query! This normalization
# step ensures consistent scanning of the is_iceberg column as a
# lowercase name, treating it as if it were a system-provided field.
#
# This along with the behavior flag in general may be removed when
# is_iceberg comes on show objects.
schema_objects = schema_objects.rename(column_names={"IS_ICEBERG": "is_iceberg"})
mikealfare marked this conversation as resolved.
Show resolved Hide resolved
columns.append("is_iceberg")

return [self._parse_list_relations_result(obj) for obj in schema_objects.select(columns)]
Expand Down
7 changes: 5 additions & 2 deletions dbt/include/snowflake/macros/adapters.sql
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,12 @@
{% endif -%}

{# -- Gated for performance reason. If you don't want Iceberg, you shouldn't pay the
-- latency penalty. #}
-- latency penalty.
--
-- Note: The capitalization of is_iceberg is handled in Python due to
-- unpredictable quoting behavior based on QUOTED_IDENTIFIERS_IGNORE_CASE. #}
{% if adapter.behavior.enable_iceberg_materializations.no_warn %}
select all_objects.*, is_iceberg as "is_iceberg"
select all_objects.*, is_iceberg as {{ adapter.quote('is_iceberg') }}
VersusFacit marked this conversation as resolved.
Show resolved Hide resolved
from table(result_scan(last_query_id(-1))) all_objects
left join INFORMATION_SCHEMA.tables as all_tables
on all_tables.table_name = all_objects."name"
Expand Down
5 changes: 5 additions & 0 deletions tests/functional/iceberg/test_table_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ def test_iceberg_tables_build_and_can_be_referred(self, project):
run_results = run_dbt()
assert len(run_results) == 5

def test_iceberg_tables_handle_quoting_ignore_flag(self, project):
project.run_sql("ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;")
run_results = run_dbt()
assert len(run_results) == 5


class TestIcebergTableTypeBuildsOnExistingTable:
@pytest.fixture(scope="class")
Expand Down
Loading