dbt-sqlserver 1.12.0rc1__tar.gz → 1.12.0rc2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dbt_sqlserver-1.12.0rc1/dbt_sqlserver.egg-info → dbt_sqlserver-1.12.0rc2}/PKG-INFO +1 -1
- dbt_sqlserver-1.12.0rc2/dbt/adapters/sqlserver/__version__.py +1 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_adapter.py +16 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_relation.py +9 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/apply_grants.sql +3 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/apply_masks.sql +3 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/columns.sql +1 -1
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/indexes.sql +63 -42
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/metadata.sql +3 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/relation.sql +12 -5
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/schema.sql +3 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/hooks.sql +5 -1
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental.sql +36 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/unit_test/unit_test_create_table_as.sql +1 -1
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/tests.sql +4 -3
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/unit_tests.sql +6 -4
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/table/create.sql +22 -5
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/views/create.sql +1 -1
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2/dbt_sqlserver.egg-info}/PKG-INFO +1 -1
- dbt_sqlserver-1.12.0rc1/dbt/adapters/sqlserver/__version__.py +0 -1
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/LICENSE +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/README.md +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/__init__.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/__init__.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/py.typed +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/__init__.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/index.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/policies.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_auth.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_backend.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_column.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_configs.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_connections.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_constants.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_credentials.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_helpers.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_mask.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_runtime.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/__init__.py +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/dbt_project.yml +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/catalog.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/persist_docs.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/show.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/validate_sql.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/functions/helpers.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/functions/scalar.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental_strategies.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/columns_spec_ddl.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/table.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/table_dml_refresh.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/unit_test/get_fixture_sql.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/view/create_view_as.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/view/view.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/helpers.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot_merge.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/strategies.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/seeds/helpers.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/table/clone.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/any_value.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/array_construct.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/cast_bool_to_text.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/concat.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/date_trunc.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/dateadd.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/get_tables_by_pattern.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/hash.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/last_day.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/length.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/listagg.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/position.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/safe_cast.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/split_part.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/timestamps.sql +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/profile_template.yml +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/SOURCES.txt +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/dependency_links.txt +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/requires.txt +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/top_level.txt +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/pyproject.toml +0 -0
- {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "1.12.0rc2"
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_adapter.py
RENAMED
|
@@ -188,6 +188,22 @@ class SQLServerAdapter(SQLAdapter):
|
|
|
188
188
|
]
|
|
189
189
|
return columns
|
|
190
190
|
|
|
191
|
+
@classmethod
|
|
192
|
+
def quote(cls, identifier: str) -> str:
|
|
193
|
+
"""Double-quote an identifier, doubling any embedded double quote.
|
|
194
|
+
|
|
195
|
+
``SQLAdapter.quote`` interpolates the identifier verbatim, so a name
|
|
196
|
+
containing a ``"`` would close the quoted identifier early and the
|
|
197
|
+
remainder would parse as SQL. T-SQL escapes a delimiter by doubling
|
|
198
|
+
it -- the same rule ``QUOTENAME()`` applies to brackets -- so
|
|
199
|
+
``ab"cd`` must render as ``"ab""cd"``.
|
|
200
|
+
|
|
201
|
+
This is the quoting used by every macro that formats an identifier
|
|
202
|
+
(see #785). Relation rendering escapes nothing, since it goes through
|
|
203
|
+
``BaseRelation.quote_character`` upstream rather than this method.
|
|
204
|
+
"""
|
|
205
|
+
return '"{}"'.format(str(identifier).replace('"', '""'))
|
|
206
|
+
|
|
191
207
|
@classmethod
|
|
192
208
|
def convert_boolean_type(cls, agate_table, col_idx):
|
|
193
209
|
return "bit"
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_relation.py
RENAMED
|
@@ -26,6 +26,15 @@ class SQLServerRelation(BaseRelation):
|
|
|
26
26
|
def get_relation_type(cls) -> Type[SQLServerRelationType]:
|
|
27
27
|
return SQLServerRelationType
|
|
28
28
|
|
|
29
|
+
def quoted(self, identifier):
|
|
30
|
+
"""Quote a path part, doubling any embedded quote character (#785).
|
|
31
|
+
|
|
32
|
+
Not delegated to super(): that wraps verbatim, so pre-escaping the
|
|
33
|
+
input would double-escape if upstream ever starts escaping too.
|
|
34
|
+
"""
|
|
35
|
+
quote_char = self.quote_character
|
|
36
|
+
return f"{quote_char}{str(identifier).replace(quote_char, quote_char * 2)}{quote_char}"
|
|
37
|
+
|
|
29
38
|
def _render_limited_alias(self) -> str:
|
|
30
39
|
if self.disable_empty_relation_aliases:
|
|
31
40
|
return ""
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
{%- macro sqlserver__get_grant_sql(relation, privilege, grantees) -%}
|
|
49
49
|
{%- set grantees_safe = [] -%}
|
|
50
50
|
{%- for grantee in grantees -%}
|
|
51
|
-
{%- set grantee_safe =
|
|
51
|
+
{%- set grantee_safe = adapter.quote(grantee) -%}
|
|
52
52
|
{%- do grantees_safe.append(grantee_safe) -%}
|
|
53
53
|
{%- endfor -%}
|
|
54
54
|
grant {{ privilege }} on {{ relation }} to {{ grantees_safe | join(', ') }}
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
{%- macro sqlserver__get_revoke_sql(relation, privilege, grantees) -%}
|
|
58
58
|
{%- set grantees_safe = [] -%}
|
|
59
59
|
{%- for grantee in grantees -%}
|
|
60
|
-
{%- set grantee_safe =
|
|
60
|
+
{%- set grantee_safe = adapter.quote(grantee) -%}
|
|
61
61
|
{%- do grantees_safe.append(grantee_safe) -%}
|
|
62
62
|
{%- endfor -%}
|
|
63
63
|
revoke {{ privilege }} on {{ relation }} from {{ grantees_safe | join(', ') }}
|
|
@@ -66,6 +66,6 @@
|
|
|
66
66
|
{% macro get_provision_sql(relation, privilege, grantees) %}
|
|
67
67
|
{% for grantee in grantees %}
|
|
68
68
|
if not exists(select name from sys.database_principals where name = '{{ grantee }}')
|
|
69
|
-
create user
|
|
69
|
+
create user {{ adapter.quote(grantee) }} from external provider;
|
|
70
70
|
{% endfor %}
|
|
71
71
|
{% endmacro %}
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
c.name as name,
|
|
34
34
|
c.masking_function as masking_function
|
|
35
35
|
from sys.masked_columns c {{ information_schema_hints() }}
|
|
36
|
-
where c.object_id = OBJECT_ID('{{ relation.
|
|
36
|
+
where c.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
|
|
37
37
|
{% endmacro %}
|
|
38
38
|
|
|
39
39
|
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
from sys.index_columns ic {{ information_schema_hints() }}
|
|
48
48
|
inner join sys.columns col {{ information_schema_hints() }}
|
|
49
49
|
on col.object_id = ic.object_id and col.column_id = ic.column_id
|
|
50
|
-
where ic.object_id = OBJECT_ID('{{ relation.
|
|
50
|
+
where ic.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
|
|
51
51
|
and ic.is_included_column = 0
|
|
52
52
|
{% endcall %}
|
|
53
53
|
{% set result = [] %}
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
{% call statement('get_unmaskable_columns', fetch_result=True) %}
|
|
65
65
|
select col.name as name
|
|
66
66
|
from sys.columns col {{ information_schema_hints() }}
|
|
67
|
-
where col.object_id = OBJECT_ID('{{ relation.
|
|
67
|
+
where col.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
|
|
68
68
|
and (
|
|
69
69
|
col.is_computed = 1
|
|
70
70
|
or col.is_filestream = 1
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
drop column "{{ column_name }}";
|
|
63
63
|
{%- endset %}
|
|
64
64
|
{% set rename_column %}
|
|
65
|
-
exec sp_rename '{{ relation
|
|
65
|
+
exec sp_rename '{{ escape_single_quotes(relation.include(database=False)) }}.{{ escape_single_quotes(adapter.quote(tmp_column)) }}', '{{ escape_single_quotes(column_name) }}', 'column'
|
|
66
66
|
{%- endset %}
|
|
67
67
|
|
|
68
68
|
{% do run_query(add_column) %}
|
|
@@ -1,17 +1,28 @@
|
|
|
1
|
+
{#- Quoted, comma-separated column list for index DDL. -#}
|
|
2
|
+
{% macro quote_column_list(columns) -%}
|
|
3
|
+
{%- set quoted = [] -%}
|
|
4
|
+
{%- for column in columns -%}
|
|
5
|
+
{%- do quoted.append(adapter.quote(column)) -%}
|
|
6
|
+
{%- endfor -%}
|
|
7
|
+
{{- quoted | join(', ') -}}
|
|
8
|
+
{%- endmacro %}
|
|
9
|
+
|
|
10
|
+
|
|
1
11
|
{% macro sqlserver__create_clustered_columnstore_index(relation) -%}
|
|
12
|
+
{#- cci_name embeds the schema, so it must be quoted as an identifier
|
|
13
|
+
(raw only in the string comparison below) -- issue #409 -#}
|
|
2
14
|
{%- set cci_name = (relation.schema ~ '_' ~ relation.identifier ~ '_cci') | replace(".", "") | replace(" ", "") -%}
|
|
3
15
|
{%- set relation_name = relation.include(database=False) -%}
|
|
4
|
-
{
|
|
5
|
-
use [{{ relation.database }}];
|
|
16
|
+
{{ get_use_database_sql(relation.database) }}
|
|
6
17
|
if EXISTS (
|
|
7
18
|
SELECT *
|
|
8
19
|
FROM sys.indexes {{ information_schema_hints() }}
|
|
9
|
-
WHERE name = '{{cci_name}}'
|
|
10
|
-
AND object_id=object_id('{{relation_name}}')
|
|
20
|
+
WHERE name = '{{ escape_single_quotes(cci_name) }}'
|
|
21
|
+
AND object_id=object_id('{{ escape_single_quotes(relation_name) }}')
|
|
11
22
|
)
|
|
12
|
-
DROP index {{
|
|
13
|
-
CREATE CLUSTERED COLUMNSTORE INDEX {{cci_name}}
|
|
14
|
-
ON {{
|
|
23
|
+
DROP index {{ relation_name }}.{{ adapter.quote(cci_name) }}
|
|
24
|
+
CREATE CLUSTERED COLUMNSTORE INDEX {{ adapter.quote(cci_name) }}
|
|
25
|
+
ON {{ relation_name }}
|
|
15
26
|
{% endmacro %}
|
|
16
27
|
|
|
17
28
|
{% macro drop_xml_indexes() -%}
|
|
@@ -58,15 +69,25 @@
|
|
|
58
69
|
|
|
59
70
|
{{ log("Running drop_fk_constraints() macro...") }}
|
|
60
71
|
|
|
61
|
-
{#
|
|
62
|
-
|
|
63
|
-
|
|
72
|
+
{# Both directions are dropped (issue #632): the inbound keys of other
|
|
73
|
+
tables that reference this model, and this model's own outbound keys.
|
|
74
|
+
An inbound key blocks dropping this table or its primary key; an
|
|
75
|
+
outbound one blocks a truncate/rebuild of the table it points at and
|
|
76
|
+
would otherwise survive a rebuild of this one.
|
|
77
|
+
|
|
78
|
+
The schema filter applies to this model's table only, so same-named
|
|
79
|
+
tables in other schemas keep their constraints. The counterparty of
|
|
80
|
+
either key may legitimately live in another schema and is not filtered.
|
|
81
|
+
ALTER TABLE always targets the constraint's own schema and parent table,
|
|
82
|
+
which is correct in both directions. #}
|
|
64
83
|
|
|
65
84
|
declare @drop_fk_constraints nvarchar(max);
|
|
66
85
|
select @drop_fk_constraints = (
|
|
67
86
|
select 'IF OBJECT_ID(''' + REPLACE(QUOTENAME(SCHEMA_NAME(sys.foreign_keys.[schema_id])) + '.' + QUOTENAME(sys.foreign_keys.[name]), '''', '''''') + ''', ''F'') IS NOT NULL ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(sys.foreign_keys.[schema_id])) + '.' + QUOTENAME(OBJECT_NAME(sys.foreign_keys.[parent_object_id])) + ' DROP CONSTRAINT ' + QUOTENAME(sys.foreign_keys.[name]) + ';'
|
|
68
|
-
from sys.foreign_keys
|
|
69
|
-
inner join sys.tables
|
|
87
|
+
from sys.foreign_keys {{ information_schema_hints() }}
|
|
88
|
+
inner join sys.tables {{ information_schema_hints() }}
|
|
89
|
+
on sys.foreign_keys.[referenced_object_id] = sys.tables.[object_id]
|
|
90
|
+
or sys.foreign_keys.[parent_object_id] = sys.tables.[object_id]
|
|
70
91
|
where SCHEMA_NAME(sys.tables.[schema_id]) = '{{ this.schema }}'
|
|
71
92
|
and sys.tables.[name] = '{{ this.table }}'
|
|
72
93
|
for xml path('')
|
|
@@ -90,8 +111,8 @@
|
|
|
90
111
|
declare @drop_pk_constraints nvarchar(max);
|
|
91
112
|
select @drop_pk_constraints = (
|
|
92
113
|
select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ' + QUOTENAME(sys.indexes.[name], '''') + ', ''IndexId'') IS NOT NULL ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(sys.tables.[schema_id])) + '.' + QUOTENAME(sys.tables.[name]) + ' DROP CONSTRAINT ' + QUOTENAME(sys.indexes.[name]) + ';'
|
|
93
|
-
from sys.indexes
|
|
94
|
-
inner join sys.tables on sys.indexes.[object_id] = sys.tables.[object_id]
|
|
114
|
+
from sys.indexes {{ information_schema_hints() }}
|
|
115
|
+
inner join sys.tables {{ information_schema_hints() }} on sys.indexes.[object_id] = sys.tables.[object_id]
|
|
95
116
|
where sys.indexes.is_primary_key = 1
|
|
96
117
|
and SCHEMA_NAME(sys.tables.[schema_id]) = '{{ this.schema }}'
|
|
97
118
|
and sys.tables.[name] = '{{ this.table }}'
|
|
@@ -142,7 +163,7 @@
|
|
|
142
163
|
{% endif %}
|
|
143
164
|
clustered index
|
|
144
165
|
{{ idx_name }}
|
|
145
|
-
on {{ this }} ({{
|
|
166
|
+
on {{ this }} ({{ quote_column_list(columns) }})
|
|
146
167
|
end
|
|
147
168
|
{%- endmacro %}
|
|
148
169
|
|
|
@@ -170,9 +191,9 @@
|
|
|
170
191
|
begin
|
|
171
192
|
create nonclustered index
|
|
172
193
|
{{ idx_name }}
|
|
173
|
-
on {{ this }} ({{
|
|
194
|
+
on {{ this }} ({{ quote_column_list(columns) }})
|
|
174
195
|
{% if includes -%}
|
|
175
|
-
include ({{
|
|
196
|
+
include ({{ quote_column_list(includes) }})
|
|
176
197
|
{% endif %}
|
|
177
198
|
end
|
|
178
199
|
{% endmacro %}
|
|
@@ -180,32 +201,32 @@
|
|
|
180
201
|
|
|
181
202
|
{% macro drop_fk_indexes_on_table(relation) -%}
|
|
182
203
|
{% call statement('find_references', fetch_result=true) %}
|
|
183
|
-
|
|
204
|
+
{{ get_use_database_sql(relation.database) }}
|
|
184
205
|
SELECT obj.name AS FK_NAME,
|
|
185
206
|
sch.name AS [schema_name],
|
|
186
207
|
tab1.name AS [table],
|
|
187
208
|
col1.name AS [column],
|
|
188
209
|
tab2.name AS [referenced_table],
|
|
189
210
|
col2.name AS [referenced_column]
|
|
190
|
-
FROM sys.foreign_key_columns fkc
|
|
191
|
-
INNER JOIN sys.objects obj
|
|
211
|
+
FROM sys.foreign_key_columns fkc {{ information_schema_hints() }}
|
|
212
|
+
INNER JOIN sys.objects obj {{ information_schema_hints() }}
|
|
192
213
|
ON obj.object_id = fkc.constraint_object_id
|
|
193
|
-
INNER JOIN sys.tables tab1
|
|
214
|
+
INNER JOIN sys.tables tab1 {{ information_schema_hints() }}
|
|
194
215
|
ON tab1.object_id = fkc.parent_object_id
|
|
195
|
-
INNER JOIN sys.schemas sch
|
|
216
|
+
INNER JOIN sys.schemas sch {{ information_schema_hints() }}
|
|
196
217
|
ON tab1.schema_id = sch.schema_id
|
|
197
|
-
INNER JOIN sys.columns col1
|
|
218
|
+
INNER JOIN sys.columns col1 {{ information_schema_hints() }}
|
|
198
219
|
ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
|
|
199
|
-
INNER JOIN sys.tables tab2
|
|
220
|
+
INNER JOIN sys.tables tab2 {{ information_schema_hints() }}
|
|
200
221
|
ON tab2.object_id = fkc.referenced_object_id
|
|
201
|
-
INNER JOIN sys.columns col2
|
|
222
|
+
INNER JOIN sys.columns col2 {{ information_schema_hints() }}
|
|
202
223
|
ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
|
|
203
224
|
WHERE sch.name = '{{ relation.schema }}' and tab2.name = '{{ relation.identifier }}'
|
|
204
225
|
{% endcall %}
|
|
205
226
|
{% set references = load_result('find_references')['data'] %}
|
|
206
227
|
{% for reference in references -%}
|
|
207
228
|
{% call statement('main') -%}
|
|
208
|
-
alter table
|
|
229
|
+
alter table {{ adapter.quote(reference[1]) }}.{{ adapter.quote(reference[2]) }} drop constraint {{ adapter.quote(reference[0]) }}
|
|
209
230
|
{%- endcall %}
|
|
210
231
|
{% endfor %}
|
|
211
232
|
{% endmacro %}
|
|
@@ -216,28 +237,28 @@
|
|
|
216
237
|
SELECT i.name AS index_name
|
|
217
238
|
, i.name + '__dbt_backup' as index_new_name
|
|
218
239
|
, COL_NAME(ic.object_id,ic.column_id) AS column_name
|
|
219
|
-
FROM sys.indexes AS i
|
|
220
|
-
INNER JOIN sys.index_columns AS ic
|
|
240
|
+
FROM sys.indexes AS i {{ information_schema_hints() }}
|
|
241
|
+
INNER JOIN sys.index_columns AS ic {{ information_schema_hints() }}
|
|
221
242
|
ON i.object_id = ic.object_id AND i.index_id = ic.index_id and i.type <> 5
|
|
222
|
-
WHERE i.object_id = OBJECT_ID('{{ relation.
|
|
243
|
+
WHERE i.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
|
|
223
244
|
|
|
224
245
|
UNION ALL
|
|
225
246
|
|
|
226
247
|
SELECT obj.name AS index_name
|
|
227
248
|
, obj.name + '__dbt_backup' as index_new_name
|
|
228
249
|
, col1.name AS column_name
|
|
229
|
-
FROM sys.foreign_key_columns fkc
|
|
230
|
-
INNER JOIN sys.objects obj
|
|
250
|
+
FROM sys.foreign_key_columns fkc {{ information_schema_hints() }}
|
|
251
|
+
INNER JOIN sys.objects obj {{ information_schema_hints() }}
|
|
231
252
|
ON obj.object_id = fkc.constraint_object_id
|
|
232
|
-
INNER JOIN sys.tables tab1
|
|
253
|
+
INNER JOIN sys.tables tab1 {{ information_schema_hints() }}
|
|
233
254
|
ON tab1.object_id = fkc.parent_object_id
|
|
234
|
-
INNER JOIN sys.schemas sch
|
|
255
|
+
INNER JOIN sys.schemas sch {{ information_schema_hints() }}
|
|
235
256
|
ON tab1.schema_id = sch.schema_id
|
|
236
|
-
INNER JOIN sys.columns col1
|
|
257
|
+
INNER JOIN sys.columns col1 {{ information_schema_hints() }}
|
|
237
258
|
ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
|
|
238
|
-
INNER JOIN sys.tables tab2
|
|
259
|
+
INNER JOIN sys.tables tab2 {{ information_schema_hints() }}
|
|
239
260
|
ON tab2.object_id = fkc.referenced_object_id
|
|
240
|
-
INNER JOIN sys.columns col2
|
|
261
|
+
INNER JOIN sys.columns col2 {{ information_schema_hints() }}
|
|
241
262
|
ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
|
|
242
263
|
WHERE sch.name = '{{ relation.schema }}' and tab1.name = '{{ relation.identifier }}'
|
|
243
264
|
|
|
@@ -273,21 +294,21 @@
|
|
|
273
294
|
and object_id = OBJECT_ID('{{ relation }}')
|
|
274
295
|
)
|
|
275
296
|
begin
|
|
276
|
-
{# key columns:
|
|
297
|
+
{# key columns: quoted (adapter.quote escapes embedded quotes) plus per-column direction #}
|
|
277
298
|
{%- set key_columns = [] -%}
|
|
278
299
|
{%- for column in index_config.columns -%}
|
|
279
300
|
{%- do key_columns.append(
|
|
280
|
-
|
|
301
|
+
adapter.quote(column)
|
|
281
302
|
~ (' desc' if column in index_config.descending_columns else '')
|
|
282
303
|
) -%}
|
|
283
304
|
{%- endfor -%}
|
|
284
305
|
{%- set include_columns = [] -%}
|
|
285
306
|
{%- for column in index_config.included_columns -%}
|
|
286
|
-
{%- do include_columns.append(
|
|
307
|
+
{%- do include_columns.append(adapter.quote(column)) -%}
|
|
287
308
|
{%- endfor %}
|
|
288
309
|
create
|
|
289
310
|
{% if index_config.unique -%} unique {% endif %}{{ index_config.type }}
|
|
290
|
-
index
|
|
311
|
+
index {{ adapter.quote(index_name) }}
|
|
291
312
|
on {{ relation }}
|
|
292
313
|
({{ key_columns | join(', ') }})
|
|
293
314
|
{% if include_columns -%}
|
|
@@ -426,7 +447,7 @@
|
|
|
426
447
|
from sys.partitions p {{ information_schema_hints() }}
|
|
427
448
|
where p.object_id = i.object_id and p.index_id = i.index_id
|
|
428
449
|
) part
|
|
429
|
-
where i.object_id = OBJECT_ID('{{ relation.
|
|
450
|
+
where i.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
|
|
430
451
|
and i.index_id > 0
|
|
431
452
|
and i.[type] not in (3, 4, 7) /* xml, spatial, memory-optimized hash */
|
|
432
453
|
{%- endcall %}
|
|
@@ -435,7 +456,7 @@
|
|
|
435
456
|
|
|
436
457
|
|
|
437
458
|
{% macro sqlserver__get_drop_index_sql(relation, index_name) -%}
|
|
438
|
-
drop index
|
|
459
|
+
drop index {{ adapter.quote(index_name) }} on {{ relation }}
|
|
439
460
|
{%- endmacro %}
|
|
440
461
|
|
|
441
462
|
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
{% endmacro %}
|
|
110
110
|
|
|
111
111
|
{%- macro sqlserver__get_use_database_sql(database) -%}
|
|
112
|
-
USE
|
|
112
|
+
USE {{ adapter.quote(database | replace('"', '')) }};
|
|
113
113
|
{%- endmacro -%}
|
|
114
114
|
|
|
115
115
|
{% macro sqlserver__list_schemas(database) %}
|
|
@@ -194,8 +194,8 @@
|
|
|
194
194
|
, s.name as [schema]
|
|
195
195
|
, o.modify_date as last_modified
|
|
196
196
|
, current_timestamp as snapshotted_at
|
|
197
|
-
from sys.objects o
|
|
198
|
-
inner join sys.schemas s on o.schema_id = s.schema_id and [type] = 'U'
|
|
197
|
+
from sys.objects o {{ information_schema_hints() }}
|
|
198
|
+
inner join sys.schemas s {{ information_schema_hints() }} on o.schema_id = s.schema_id and [type] = 'U'
|
|
199
199
|
where (
|
|
200
200
|
{%- for relation in relations -%}
|
|
201
201
|
(upper(s.name) = upper('{{ relation.schema }}') and
|
|
@@ -8,15 +8,21 @@
|
|
|
8
8
|
|
|
9
9
|
{% macro sqlserver__get_drop_sql(relation) -%}
|
|
10
10
|
{% if relation.type == 'view' -%}
|
|
11
|
-
{
|
|
11
|
+
{#- auto_begin=false, matching dbt-adapters' own relations/drop.sql: a
|
|
12
|
+
read-only lookup must not open the ambient transaction. This is the
|
|
13
|
+
first statement of the temp-relation build (create.sql ->
|
|
14
|
+
adapter.drop_relation), so with the default auto_begin=True it held
|
|
15
|
+
that build's sys.sysschobjs X locks until the materialization
|
|
16
|
+
committed, deadlocking a concurrent worker (error 1205). -#}
|
|
17
|
+
{% call statement('find_references', fetch_result=true, auto_begin=false) %}
|
|
12
18
|
{{ get_use_database_sql(relation.database) }}
|
|
13
19
|
select
|
|
14
20
|
sch.name as schema_name,
|
|
15
21
|
obj.name as view_name
|
|
16
|
-
from sys.sql_expression_dependencies refs
|
|
17
|
-
inner join sys.objects obj
|
|
22
|
+
from sys.sql_expression_dependencies refs {{ information_schema_hints() }}
|
|
23
|
+
inner join sys.objects obj {{ information_schema_hints() }}
|
|
18
24
|
on refs.referencing_id = obj.object_id
|
|
19
|
-
inner join sys.schemas sch
|
|
25
|
+
inner join sys.schemas sch {{ information_schema_hints() }}
|
|
20
26
|
on obj.schema_id = sch.schema_id
|
|
21
27
|
where refs.referenced_database_name = '{{ relation.database }}'
|
|
22
28
|
and refs.referenced_schema_name = '{{ relation.schema }}'
|
|
@@ -44,7 +50,8 @@
|
|
|
44
50
|
{% macro sqlserver__rename_relation(from_relation, to_relation) -%}
|
|
45
51
|
{% call statement('rename_relation') -%}
|
|
46
52
|
{{ get_use_database_sql(from_relation.database) }}
|
|
47
|
-
|
|
53
|
+
{#- @objname takes a quoted, qualified name; @newname must stay bare -#}
|
|
54
|
+
EXEC sp_rename '{{ escape_single_quotes(from_relation.include(database=False)) }}', '{{ escape_single_quotes(to_relation.identifier) }}'
|
|
48
55
|
{%- endcall %}
|
|
49
56
|
{% endmacro %}
|
|
50
57
|
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/schema.sql
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{% macro sqlserver__create_schema(relation) -%}
|
|
2
2
|
{% call statement('create_schema') -%}
|
|
3
|
-
|
|
3
|
+
{{ get_use_database_sql(relation.database) }}
|
|
4
4
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ relation.schema }}')
|
|
5
5
|
BEGIN
|
|
6
|
-
EXEC('CREATE SCHEMA
|
|
6
|
+
EXEC('CREATE SCHEMA {{ adapter.quote(relation.schema) }}')
|
|
7
7
|
END
|
|
8
8
|
{% endcall %}
|
|
9
9
|
{% endmacro %}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{{ get_use_database_sql(relation.database) }}
|
|
14
14
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ relation.schema }}')
|
|
15
15
|
BEGIN
|
|
16
|
-
EXEC('CREATE SCHEMA
|
|
16
|
+
EXEC('CREATE SCHEMA {{ adapter.quote(relation.schema) }} AUTHORIZATION {{ adapter.quote(schema_authorization) }}')
|
|
17
17
|
END
|
|
18
18
|
{% endcall %}
|
|
19
19
|
{% endmacro %}
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
{% if not adapter.behavior.dbt_sqlserver_use_dbt_transactions %}
|
|
6
6
|
if @@trancount > 0 commit; -- post hooks after fictitious transaction work as expected
|
|
7
7
|
{% else %}
|
|
8
|
-
|
|
8
|
+
{#- guarded, not a bare COMMIT: nothing guarantees a transaction is
|
|
9
|
+
open here. A bare one appeared safe only because some earlier
|
|
10
|
+
statement had auto-begun one (find_references, until relation.sql
|
|
11
|
+
stopped doing that); with @@TRANCOUNT = 0 it raises Msg 3902. -#}
|
|
12
|
+
if @@trancount > 0 commit; -- align transaction=False hook behavior with dbt-core transaction semantics.
|
|
9
13
|
{% endif %}
|
|
10
14
|
{% endcall %}
|
|
11
15
|
{% endif %}
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
|
|
32
32
|
{% set to_drop = [] %}
|
|
33
33
|
{% set prebuilt_handled = false %}
|
|
34
|
+
{#- true only where the statement('main') batch below carries create_table_as
|
|
35
|
+
DDL, i.e. the fresh-create / full-refresh branches. The incremental
|
|
36
|
+
branch's strategy DML stays transactional, so it leaves this false. -#}
|
|
37
|
+
{% set build_sql_is_create_table_as = false %}
|
|
34
38
|
|
|
35
39
|
{% if existing_relation is none %}
|
|
36
40
|
{% if config.get('full_refresh_build', 'heap_then_index') == 'prebuilt' %}
|
|
@@ -43,6 +47,7 @@
|
|
|
43
47
|
{% set prebuilt_handled = true %}
|
|
44
48
|
{% else %}
|
|
45
49
|
{% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}
|
|
50
|
+
{% set build_sql_is_create_table_as = true %}
|
|
46
51
|
{% endif %}
|
|
47
52
|
{% elif full_refresh_mode %}
|
|
48
53
|
{#- the target is marked as having a full refresh in flight (blocking
|
|
@@ -69,6 +74,7 @@
|
|
|
69
74
|
{% set prebuilt_handled = true %}
|
|
70
75
|
{% else %}
|
|
71
76
|
{% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}
|
|
77
|
+
{% set build_sql_is_create_table_as = true %}
|
|
72
78
|
{% if existing_relation.type == 'table' %}
|
|
73
79
|
{% do sqlserver__mark_full_refresh_incomplete(existing_relation) %}
|
|
74
80
|
{% endif %}
|
|
@@ -82,6 +88,14 @@
|
|
|
82
88
|
{% do sqlserver__assert_no_incomplete_full_refresh(existing_relation) %}
|
|
83
89
|
{% endif %}
|
|
84
90
|
|
|
91
|
+
{#- The temp build is all catalog DDL (CREATE OR ALTER VIEW / SELECT *
|
|
92
|
+
INTO / DROP VIEW) and must not share the ambient transaction with the
|
|
93
|
+
strategy DML: held to commit, its sysschobjs X keylocks deadlock a
|
|
94
|
+
second worker. Nothing opens a transaction here - run_query never
|
|
95
|
+
auto-begins, and find_references (relation.sql) no longer does either -
|
|
96
|
+
so each statement autocommits and drops its catalog locks as it
|
|
97
|
+
finishes. The strategy DML below still runs transactionally, via
|
|
98
|
+
statement('main')'s default auto_begin through to adapter.commit(). -#}
|
|
85
99
|
{% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}
|
|
86
100
|
|
|
87
101
|
{% set contract_config = config.get('contract') %}
|
|
@@ -109,9 +123,28 @@
|
|
|
109
123
|
{% endif %}
|
|
110
124
|
|
|
111
125
|
{% if not prebuilt_handled %}
|
|
112
|
-
{%
|
|
113
|
-
|
|
114
|
-
|
|
126
|
+
{% if build_sql_is_create_table_as %}
|
|
127
|
+
{#- Same reason as the temp build above: this batch is create_table_as
|
|
128
|
+
catalog DDL, so letting statement() open the ambient transaction
|
|
129
|
+
would hold its sysschobjs X keylocks until adapter.commit() and
|
|
130
|
+
deadlock a second worker. -#}
|
|
131
|
+
{% call statement("main", auto_begin=False) %}
|
|
132
|
+
{{ build_sql }}
|
|
133
|
+
{% endcall %}
|
|
134
|
+
{% else %}
|
|
135
|
+
{% call statement("main") %}
|
|
136
|
+
{{ build_sql }}
|
|
137
|
+
{% endcall %}
|
|
138
|
+
{% endif %}
|
|
139
|
+
{% if build_sql_is_create_table_as %}
|
|
140
|
+
{#- Reopen the ambient transaction the batch above declined to start,
|
|
141
|
+
so the swap and the tail (grants/persist_docs/masks/indexes/
|
|
142
|
+
post-hooks) keep their semantics and adapter.commit() below has a
|
|
143
|
+
matching BEGIN rather than raising Msg 3902. No-op when the flag is
|
|
144
|
+
off. -#}
|
|
145
|
+
{% do adapter.commit_if_open() %}
|
|
146
|
+
{% do adapter.begin_if_closed() %}
|
|
147
|
+
{% endif %}
|
|
115
148
|
{% endif %}
|
|
116
149
|
|
|
117
150
|
{% if need_swap %}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{% macro sqlserver__get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}
|
|
2
2
|
|
|
3
3
|
-- Create target schema if it does not
|
|
4
|
-
|
|
4
|
+
{{ get_use_database_sql(target.database) }}
|
|
5
5
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ target.schema }}')
|
|
6
6
|
BEGIN
|
|
7
|
-
EXEC('CREATE SCHEMA
|
|
7
|
+
EXEC('CREATE SCHEMA {{ adapter.quote(target.schema) }}')
|
|
8
8
|
END
|
|
9
9
|
|
|
10
|
+
{% set testview_name = "testview_" ~ local_md5(main_sql) ~ "_" ~ (range(1300, 19000) | random) %}
|
|
10
11
|
{% set testview %}
|
|
11
|
-
|
|
12
|
+
{{ adapter.quote(target.schema) }}.{{ adapter.quote(testview_name) }}
|
|
12
13
|
{% endset %}
|
|
13
14
|
|
|
14
15
|
{% set sql = main_sql.replace("'", "''")%}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
{% macro sqlserver__get_unit_test_sql(main_sql, expected_fixture_sql, expected_column_names) -%}
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
{{ get_use_database_sql(target.database) }}
|
|
4
4
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ target.schema }}')
|
|
5
5
|
BEGIN
|
|
6
|
-
EXEC('CREATE SCHEMA
|
|
6
|
+
EXEC('CREATE SCHEMA {{ adapter.quote(target.schema) }}')
|
|
7
7
|
END
|
|
8
8
|
|
|
9
|
+
{% set test_view_name = "testview_" ~ local_md5(main_sql) ~ "_" ~ (range(1300, 19000) | random) %}
|
|
9
10
|
{% set test_view %}
|
|
10
|
-
|
|
11
|
+
{{ adapter.quote(target.schema) }}.{{ adapter.quote(test_view_name) }}
|
|
11
12
|
{% endset %}
|
|
12
13
|
{% set test_sql = main_sql.replace("'", "''")%}
|
|
13
14
|
EXEC('create view {{test_view}} as {{ test_sql }};')
|
|
14
15
|
|
|
16
|
+
{% set expected_view_name = "expectedview_" ~ local_md5(expected_fixture_sql) ~ "_" ~ (range(1300, 19000) | random) %}
|
|
15
17
|
{% set expected_view %}
|
|
16
|
-
|
|
18
|
+
{{ adapter.quote(target.schema) }}.{{ adapter.quote(expected_view_name) }}
|
|
17
19
|
{% endset %}
|
|
18
20
|
{% set expected_sql = expected_fixture_sql.replace("'", "''")%}
|
|
19
21
|
EXEC('create view {{expected_view}} as {{ expected_sql }};')
|
|
@@ -9,8 +9,21 @@
|
|
|
9
9
|
{%- endif -%}
|
|
10
10
|
{%- set tmp_relation = relation.incorporate(path={"identifier": relation.identifier ~ '__dbt_tmp_vw'}, type='view') -%}
|
|
11
11
|
|
|
12
|
+
{#- Now that the incremental temp build commits standalone (see
|
|
13
|
+
incremental.sql), a crash can leave a throwaway table behind and the
|
|
14
|
+
SELECT * INTO below would hit Msg 2714. Drop it first, but only for
|
|
15
|
+
adapter-generated throwaways: `temporary` covers the incremental
|
|
16
|
+
__dbt_temp build, the suffix covers the full-refresh / table-refresh
|
|
17
|
+
__dbt_tmp intermediate. Suffix match is exact, never substring, so a
|
|
18
|
+
user model named stg__dbt_tmp_x is untouched.
|
|
19
|
+
Never guard a fresh-create of the real target: dbt has decided that
|
|
20
|
+
table does not exist, so 2714 must still surface rather than silently
|
|
21
|
+
destroying an object dbt does not know about. -#}
|
|
22
|
+
{%- set _ident = relation.identifier -%}
|
|
23
|
+
{%- set build_into_temp = temporary or _ident.endswith('__dbt_tmp') or _ident.endswith('__dbt_tmp_vw') -%}
|
|
24
|
+
|
|
12
25
|
{%- do adapter.drop_relation(tmp_relation) -%}
|
|
13
|
-
|
|
26
|
+
{{ get_use_database_sql(relation.database) }}
|
|
14
27
|
{{ get_create_view_as_sql(tmp_relation, sql) }}
|
|
15
28
|
|
|
16
29
|
{%- set table_name -%}
|
|
@@ -26,13 +39,17 @@
|
|
|
26
39
|
{{ build_columns_constraints(relation) }}
|
|
27
40
|
{% set listColumns %}
|
|
28
41
|
{% for column in model['columns'] %}
|
|
29
|
-
{{
|
|
42
|
+
{{ adapter.quote(column) }}{{ ", " if not loop.last }}
|
|
30
43
|
{% endfor %}
|
|
31
44
|
{%endset%}
|
|
32
45
|
INSERT INTO {{relation}} WITH (TABLOCK) ({{listColumns}})
|
|
33
46
|
SELECT {{listColumns}} FROM {{tmp_relation}} {{ query_label }}
|
|
34
47
|
|
|
35
48
|
{% else %}
|
|
49
|
+
{%- if build_into_temp -%}
|
|
50
|
+
IF OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}', 'U') IS NOT NULL
|
|
51
|
+
EXEC('DROP TABLE {{ relation }}');
|
|
52
|
+
{%- endif -%}
|
|
36
53
|
SELECT * INTO {{ table_name }} FROM {{ tmp_relation }} {{ query_label }}
|
|
37
54
|
{% endif %}
|
|
38
55
|
{%- endset -%}
|
|
@@ -103,7 +120,7 @@
|
|
|
103
120
|
later failure during the load would roll the marker back right along
|
|
104
121
|
with it, defeating the point. -#}
|
|
105
122
|
{%- set setup_sql -%}
|
|
106
|
-
|
|
123
|
+
{{ get_use_database_sql(relation.database) }}
|
|
107
124
|
{{ get_create_view_as_sql(tmp_relation, sql) }}
|
|
108
125
|
|
|
109
126
|
{#- drop any physical target before the bare CREATE / SELECT ... INTO
|
|
@@ -111,7 +128,7 @@
|
|
|
111
128
|
dbt's relation cache being stale (reporting none while the table
|
|
112
129
|
exists) - which would otherwise collide with Msg 2714 (object
|
|
113
130
|
already exists) -#}
|
|
114
|
-
IF OBJECT_ID('{{ escape_single_quotes(relation.
|
|
131
|
+
IF OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}', 'U') IS NOT NULL
|
|
115
132
|
EXEC('DROP TABLE {{ relation }}');
|
|
116
133
|
|
|
117
134
|
{% if contract_enforced %}
|
|
@@ -152,7 +169,7 @@
|
|
|
152
169
|
{%- if contract_enforced -%}
|
|
153
170
|
{%- set listColumns -%}
|
|
154
171
|
{%- for column in model['columns'] -%}
|
|
155
|
-
{{
|
|
172
|
+
{{ adapter.quote(column) }}{{ ", " if not loop.last }}
|
|
156
173
|
{%- endfor -%}
|
|
157
174
|
{%- endset -%}
|
|
158
175
|
{%- set insert_statement -%}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "1.12.0rc1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/index.py
RENAMED
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_auth.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_backend.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_column.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_configs.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_connections.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_constants.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_credentials.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_helpers.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_mask.py
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_runtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/show.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/any_value.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/concat.sql
RENAMED
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/dateadd.sql
RENAMED
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/hash.sql
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/last_day.sql
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/length.sql
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/listagg.sql
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/position.sql
RENAMED
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/safe_cast.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/profile_template.yml
RENAMED
|
File without changes
|
|
File without changes
|
{dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|