Skip to content

Commit 91a6530

Browse files
committed
CTAS if not exists
instead of doing "select 1" do a "create table if not exists ..."
1 parent 5b324a7 commit 91a6530

File tree

3 files changed

+18
-28
lines changed

3 files changed

+18
-28
lines changed

dbt/include/trino/macros/adapters.sql

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,20 @@
145145
{%- endif -%}
146146
{%- endmacro -%}
147147
148-
{% macro trino__create_table_as(temporary, relation, sql, replace=False) -%}
148+
{% macro trino__create_table_as(temporary, relation, sql, on_exists=None) -%}
149149
150-
{%- if replace -%}
150+
{%- set or_replace = '' -%}
151+
{%- set if_not_exists = '' -%}
152+
{%- if on_exists == 'replace' -%}
151153
{%- set or_replace = ' or replace' -%}
152-
{%- else -%}
153-
{%- set or_replace = '' -%}
154+
{%- elif on_exists == 'skip' -%}
155+
{%- set if_not_exists = ' if not exists' -%}
154156
{%- endif -%}
155157
156158
{%- set contract_config = config.get('contract') -%}
157159
{%- if contract_config.enforced -%}
158160
159-
create{{ or_replace }} table
161+
create{{ or_replace }} table{{ if_not_exists }}
160162
{{ relation }}
161163
{{ get_table_columns_and_constraints() }}
162164
{{ get_assert_columns_equivalent(sql) }}
@@ -173,14 +175,14 @@
173175
174176
{%- else %}
175177
176-
create{{ or_replace }} table {{ relation }}
178+
create{{ or_replace }} table{{ if_not_exists }} {{ relation }}
177179
{{ comment(model.get('description')) }}
178180
{{ properties(temporary) }}
179181
as (
180182
{{ sql }}
181183
);
182184
183-
{%- endif %}
185+
{%- endif %}
184186
{% endmacro %}
185187
186188

dbt/include/trino/macros/materializations/table.sql

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -84,28 +84,14 @@
8484
{% elif on_table_exists == 'replace' %}
8585
{#-- build model #}
8686
{% call statement('main') -%}
87-
{{ create_table_as(False, target_relation, sql, True) }}
87+
{{ create_table_as(False, target_relation, sql, 'replace') }}
8888
{%- endcall %}
8989

9090
{% elif on_table_exists == 'skip' %}
91-
92-
{#-- table does not exists #}
93-
{% if existing_relation is none %}
94-
{#-- build model #}
95-
{% call statement('main') -%}
96-
{{ create_table_as(False, target_relation, sql) }}
97-
{%- endcall %}
98-
99-
{#-- table does exists #}
100-
{% else %}
101-
{#-- do nothing #}
102-
{%- set log_message = 'table %s already exists. skipping.' % (existing_relation) -%}
103-
{% do log(log_message) %}
104-
{% call statement('main') -%}
105-
select 1
106-
{%- endcall %}
107-
108-
{% endif %}
91+
{#-- build model #}
92+
{% call statement('main') -%}
93+
{{ create_table_as(False, target_relation, sql, 'skip') }}
94+
{%- endcall %}
10995

11096
{% endif %}
11197
{% endmacro %}

tests/functional/adapter/materialization/test_on_table_exists.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,15 @@ def test_run_seed_test(self, project):
106106
results, logs = run_dbt_and_capture(["--debug", "run"], expect_pass=True)
107107
assert len(results) == 1
108108
assert (
109-
f'create table "{project.database}"."{project.test_schema}"."materialization"' in logs
109+
f'create table if not exists "{project.database}"."{project.test_schema}"."materialization"' in logs
110110
)
111111
assert "alter table" not in logs
112112
results, logs = run_dbt_and_capture(["--debug", "run"], expect_pass=True)
113113
assert len(results) == 1
114114
assert "drop table" not in logs
115-
assert "create table" not in logs
115+
assert (
116+
f'create table if not exists "{project.database}"."{project.test_schema}"."materialization"' in logs
117+
)
116118
# test tests
117119
results = run_dbt(["test"], expect_pass=True)
118120
assert len(results) == 3

0 commit comments

Comments
 (0)