Skip to content

Commit 57e8808

Browse files
authored
Merge pull request #678 from Benjamin-Knight/fix/#640-tablock-on-contract-inserts
Add TABLOCK hint to contract-enforced INSERT INTO (#640).
2 parents 24af1ca + 097f5be commit 57e8808

3 files changed

Lines changed: 53 additions & 3 deletions

File tree

dbt/include/sqlserver/macros/relations/table/create.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
{{ "["~column~"]" }}{{ ", " if not loop.last }}
2323
{% endfor %}
2424
{%endset%}
25-
INSERT INTO {{relation}} ({{listColumns}})
25+
INSERT INTO {{relation}} WITH (TABLOCK) ({{listColumns}})
2626
SELECT {{listColumns}} FROM {{tmp_relation}} {{ query_label }}
2727

2828
{% else %}

tests/functional/adapter/dbt/test_constraints.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def models(self):
472472
@pytest.fixture(scope="class")
473473
def expected_sql(self):
474474
return """
475-
EXEC(' create view <model_identifier> as -- depends_on: <foreign_key_model_identifier> select ''blue'' as color, 1 as id, ''2019-01-01'' as date_day; ') EXEC(' CREATE TABLE <model_identifier> ( id int not null , color varchar(100), date_day varchar(100) ) INSERT INTO <model_identifier> ( [id], [color], [date_day] ) SELECT [id], [color], [date_day] FROM <model_identifier> ') EXEC('DROP VIEW IF EXISTS <model_identifier>
475+
EXEC(' create view <model_identifier> as -- depends_on: <foreign_key_model_identifier> select ''blue'' as color, 1 as id, ''2019-01-01'' as date_day; ') EXEC(' CREATE TABLE <model_identifier> ( id int not null , color varchar(100), date_day varchar(100) ) INSERT INTO <model_identifier> WITH (TABLOCK) ( [id], [color], [date_day] ) SELECT [id], [color], [date_day] FROM <model_identifier> ') EXEC('DROP VIEW IF EXISTS <model_identifier>
476476
"""
477477

478478
# EXEC('DROP view IF EXISTS <model_identifier>
@@ -592,7 +592,7 @@ def models(self):
592592
@pytest.fixture(scope="class")
593593
def expected_sql(self):
594594
return """
595-
EXEC(' create view <model_identifier> as -- depends_on: <foreign_key_model_identifier> select ''blue'' as color, 1 as id, ''2019-01-01'' as date_day; ') EXEC(' CREATE TABLE <model_identifier> ( id int not null , color varchar(100), date_day varchar(100) ) INSERT INTO <model_identifier> ( [id], [color], [date_day] ) SELECT [id], [color], [date_day] FROM <model_identifier> ') EXEC('DROP VIEW IF EXISTS <model_identifier>
595+
EXEC(' create view <model_identifier> as -- depends_on: <foreign_key_model_identifier> select ''blue'' as color, 1 as id, ''2019-01-01'' as date_day; ') EXEC(' CREATE TABLE <model_identifier> ( id int not null , color varchar(100), date_day varchar(100) ) INSERT INTO <model_identifier> WITH (TABLOCK) ( [id], [color], [date_day] ) SELECT [id], [color], [date_day] FROM <model_identifier> ') EXEC('DROP VIEW IF EXISTS <model_identifier>
596596
"""
597597

598598
def test__model_constraints_ddl(self, project, expected_sql):
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import os
2+
3+
import pytest
4+
5+
from dbt.tests.util import run_dbt
6+
7+
model_sql = """
8+
{{ config(materialized="table") }}
9+
select 1 as id
10+
"""
11+
12+
model_yml = """
13+
version: 2
14+
models:
15+
- name: contract_model
16+
config:
17+
contract:
18+
enforced: true
19+
columns:
20+
- name: id
21+
data_type: int
22+
"""
23+
24+
25+
class TestTablockHint:
26+
@pytest.fixture(scope="class")
27+
def models(self):
28+
return {
29+
"contract_model.sql": model_sql,
30+
"schema.yml": model_yml,
31+
}
32+
33+
def test_contract_table_uses_tablock(self, project):
34+
results = run_dbt(["run"])
35+
assert len(results) == 1
36+
assert results[0].status == "success"
37+
38+
target_dir = os.path.join(project.project_root, "target", "run")
39+
path = None
40+
for root, dirs, files in os.walk(target_dir):
41+
if "contract_model.sql" in files:
42+
path = os.path.join(root, "contract_model.sql")
43+
break
44+
45+
assert path is not None, "Could not find compiled contract_model.sql"
46+
with open(path, "r") as f:
47+
sql = f.read()
48+
49+
assert "WITH (TABLOCK)" in sql
50+
assert "INSERT INTO" in sql

0 commit comments

Comments
 (0)