Skip to content

Commit f13e3de

Browse files
committed
Fix multiple foreign key constraints bug
1 parent 901ecf0 commit f13e3de

3 files changed

Lines changed: 40 additions & 6 deletions

File tree

dbt/include/databricks/macros/relations/components/constraints.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
WHERE kcu.table_catalog = '{{ relation.database|lower }}'
7272
AND kcu.table_schema = '{{ relation.schema|lower }}'
7373
AND kcu.table_name = '{{ relation.identifier|lower }}'
74-
AND kcu.constraint_name = (
74+
AND kcu.constraint_name IN (
7575
SELECT constraint_name
7676
FROM `{{ relation.database|lower }}`.information_schema.table_constraints
7777
WHERE table_catalog = '{{ relation.database|lower }}'

tests/functional/adapter/incremental/fixtures.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,16 @@ def model(dbt, spark):
791791
'parent' as type
792792
"""
793793

794+
fk_referenced_to_table_2 = """
795+
{{ config(
796+
materialized = 'incremental',
797+
) }}
798+
799+
select
800+
cast(1 as bigint) as id,
801+
'hello' as name
802+
"""
803+
794804
constraint_schema_without_fk_constraint = """
795805
version: 2
796806
@@ -814,7 +824,7 @@ def model(dbt, spark):
814824
data_type: string
815825
"""
816826

817-
constraint_schema_with_fk_constraint = """
827+
constraint_schema_with_fk_constraints = """
818828
version: 2
819829
820830
models:
@@ -835,6 +845,19 @@ def model(dbt, spark):
835845
- name: type
836846
data_type: string
837847
848+
- name: fk_referenced_to_table_2
849+
constraints:
850+
- type: primary_key
851+
columns: [id]
852+
name: pk_parent_2
853+
columns:
854+
- name: id
855+
data_type: bigint
856+
constraints:
857+
- type: not_null
858+
- name: name
859+
data_type: string
860+
838861
- name: fk_referenced_from_table
839862
columns:
840863
- name: id
@@ -849,4 +872,9 @@ def model(dbt, spark):
849872
columns: [id, version]
850873
to: ref('fk_referenced_to_table')
851874
to_columns: [id, version]
875+
- type: foreign_key
876+
name: fk_to_parent_2
877+
columns: [id]
878+
to: ref('fk_referenced_to_table_2')
879+
to_columns: [id]
852880
"""

tests/functional/adapter/incremental/test_incremental_constraints.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ def project_config_update(self):
194194
def models(self):
195195
return {
196196
"fk_referenced_to_table.sql": fixtures.fk_referenced_to_table,
197+
"fk_referenced_to_table_2.sql": fixtures.fk_referenced_to_table_2,
197198
"fk_referenced_from_table.sql": fixtures.fk_referenced_from_table,
198199
"schema.yml": fixtures.constraint_schema_without_fk_constraint,
199200
}
@@ -205,12 +206,14 @@ def test_add_foreign_key_constraint(self, project):
205206

206207
# Foreign key constraint is informational only, so we cannot verify enforcement.
207208
# Instead, check that the metadata is updated correctly.
208-
util.write_file(fixtures.constraint_schema_with_fk_constraint, "models", "schema.yml")
209+
util.write_file(fixtures.constraint_schema_with_fk_constraints, "models", "schema.yml")
209210
util.run_dbt(["run"])
210211
referential_constraints = project.run_sql(referential_constraint_sql, fetch="all")
211-
assert len(referential_constraints) == 1
212+
assert len(referential_constraints) == 2
212213
assert referential_constraints[0][0] == "fk_to_parent"
213214
assert referential_constraints[0][1] == "pk_parent"
215+
assert referential_constraints[1][0] == "fk_to_parent_2"
216+
assert referential_constraints[1][1] == "pk_parent_2"
214217

215218

216219
@pytest.mark.skip_profile("databricks_cluster")
@@ -225,8 +228,9 @@ def project_config_update(self):
225228
def models(self):
226229
return {
227230
"fk_referenced_to_table.sql": fixtures.fk_referenced_to_table,
231+
"fk_referenced_to_table_2.sql": fixtures.fk_referenced_to_table_2,
228232
"fk_referenced_from_table.sql": fixtures.fk_referenced_from_table,
229-
"schema.yml": fixtures.constraint_schema_with_fk_constraint,
233+
"schema.yml": fixtures.constraint_schema_with_fk_constraints,
230234
}
231235

232236
def test_remove_foreign_key_constraint(self, project):
@@ -235,9 +239,11 @@ def test_remove_foreign_key_constraint(self, project):
235239

236240
# Verify the constraint exists
237241
referential_constraints = project.run_sql(referential_constraint_sql, fetch="all")
238-
assert len(referential_constraints) == 1
242+
assert len(referential_constraints) == 2
239243
assert referential_constraints[0][0] == "fk_to_parent"
240244
assert referential_constraints[0][1] == "pk_parent"
245+
assert referential_constraints[1][0] == "fk_to_parent_2"
246+
assert referential_constraints[1][1] == "pk_parent_2"
241247

242248
# Remove foreign key constraint and verify
243249
util.write_file(fixtures.constraint_schema_without_fk_constraint, "models", "schema.yml")

0 commit comments

Comments
 (0)