Skip to content

Commit 9882d7a

Browse files
authored
V 1.9.6 update (#315)
1 parent 772d896 commit 9882d7a

File tree

16 files changed

+254
-54
lines changed

16 files changed

+254
-54
lines changed

.pre-commit-config.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
default_language_version:
2-
python: python3.11.9
2+
python: python3.12.0
33

44
repos:
55
- repo: 'https://github.com/pre-commit/pre-commit-hooks'
@@ -32,12 +32,12 @@ repos:
3232
rev: v0.3.1
3333
hooks:
3434
- id: absolufy-imports
35-
- repo: 'https://github.com/hadialqattan/pycln'
36-
rev: v2.1.3
37-
hooks:
38-
- id: pycln
39-
args:
40-
- '--all'
35+
# - repo: 'https://github.com/hadialqattan/pycln'
36+
# rev: v2.1.3
37+
# hooks:
38+
# - id: pycln
39+
# args:
40+
# - '--all'
4141
- repo: 'https://github.com/pycqa/isort'
4242
rev: 5.12.0
4343
hooks:

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.12.0

dbt/adapters/fabric/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = "1.9.5"
1+
version = "1.9.6"

dbt/adapters/fabric/fabric_adapter.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from dbt.adapters.events.types import SchemaCreation
1212
from dbt.adapters.sql import SQLAdapter
1313
from dbt.adapters.sql.impl import CREATE_SCHEMA_MACRO_NAME
14+
from dbt_common.behavior_flags import BehaviorFlag
1415
from dbt_common.contracts.constraints import (
1516
ColumnLevelConstraint,
1617
ConstraintType,
@@ -44,6 +45,16 @@ class FabricAdapter(SQLAdapter):
4445
ConstraintType.foreign_key: ConstraintSupport.ENFORCED,
4546
}
4647

48+
@property
49+
def _behavior_flags(self) -> List[BehaviorFlag]:
50+
return [
51+
{
52+
"name": "empty",
53+
"default": False,
54+
"description": "When enabled, table and view materializations will be created as empty structures (no data).",
55+
},
56+
]
57+
4758
@available.parse(lambda *a, **k: [])
4859
def get_column_schema_from_query(self, sql: str) -> List[BaseColumn]:
4960
"""Get a list of the Columns with names and data types from the given sql."""

dbt/adapters/fabric/fabric_column.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,37 @@
11
from typing import Any, ClassVar, Dict
22

33
from dbt.adapters.base import Column
4+
from dbt_common.exceptions import DbtRuntimeError
45

56

67
class FabricColumn(Column):
78
TYPE_LABELS: ClassVar[Dict[str, str]] = {
89
"STRING": "VARCHAR(8000)",
10+
"VARCHAR": "VARCHAR(8000)",
11+
"CHAR": "CHAR(1)",
12+
"NCHAR": "CHAR(1)",
13+
"NVARCHAR": "VARCHAR(8000)",
914
"TIMESTAMP": "DATETIME2(6)",
15+
"DATETIME2": "DATETIME2(6)",
16+
"DATETIME2(6)": "DATETIME2(6)",
17+
"DATE": "DATE",
18+
"TIME": "TIME(6)",
1019
"FLOAT": "FLOAT",
20+
"REAL": "REAL",
21+
"INT": "INT",
1122
"INTEGER": "INT",
23+
"BIGINT": "BIGINT",
24+
"SMALLINT": "SMALLINT",
25+
"TINYINT": "SMALLINT",
26+
"BIT": "BIT",
1227
"BOOLEAN": "BIT",
28+
"DECIMAL": "DECIMAL",
29+
"NUMERIC": "NUMERIC",
30+
"MONEY": "DECIMAL",
31+
"SMALLMONEY": "DECIMAL",
32+
"UNIQUEIDENTIFIER": "UNIQUEIDENTIFIER",
33+
"VARBINARY": "VARBINARY(MAX)",
34+
"BINARY": "BINARY(1)",
1335
}
1436

1537
@classmethod
@@ -18,3 +40,43 @@ def string_type(cls, size: int) -> str:
1840

1941
def literal(self, value: Any) -> str:
2042
return "cast('{}' as {})".format(value, self.data_type)
43+
44+
@property
45+
def data_type(self) -> str:
46+
# Always enforce datetime2 precision
47+
if self.dtype.lower() == "datetime2":
48+
return "datetime2(6)"
49+
if self.is_string():
50+
return self.string_type(self.string_size())
51+
elif self.is_numeric():
52+
return self.numeric_type(self.dtype, self.numeric_precision, self.numeric_scale)
53+
else:
54+
return self.dtype
55+
56+
def is_string(self) -> bool:
57+
return self.dtype.lower() in ["varchar", "char"]
58+
59+
def is_number(self):
60+
return any([self.is_integer(), self.is_numeric(), self.is_float()])
61+
62+
def is_float(self):
63+
return self.dtype.lower() in ["float", "real"]
64+
65+
def is_integer(self) -> bool:
66+
return self.dtype.lower() in ["int", "integer", "bigint", "smallint", "tinyint"]
67+
68+
def is_numeric(self) -> bool:
69+
return self.dtype.lower() in ["numeric", "decimal", "money", "smallmoney"]
70+
71+
def string_size(self) -> int:
72+
if not self.is_string():
73+
raise DbtRuntimeError("Called string_size() on non-string field!")
74+
if self.char_size is None:
75+
return 8000
76+
else:
77+
return int(self.char_size)
78+
79+
def can_expand_to(self, other_column: "FabricColumn") -> bool:
80+
if not self.is_string() or not other_column.is_string():
81+
return False
82+
return other_column.string_size() > self.string_size()

dbt/adapters/fabric/fabric_connection_manager.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ def get_cli_access_token(credentials: FabricCredentials) -> AccessToken:
132132
Access token.
133133
"""
134134
_ = credentials
135-
token = AzureCliCredential().get_token(AZURE_CREDENTIAL_SCOPE)
135+
token = AzureCliCredential().get_token(
136+
AZURE_CREDENTIAL_SCOPE, timeout=getattr(credentials, "login_timeout", None)
137+
)
136138
return token
137139

138140

@@ -150,7 +152,9 @@ def get_auto_access_token(credentials: FabricCredentials) -> AccessToken:
150152
out : AccessToken
151153
The access token.
152154
"""
153-
token = DefaultAzureCredential().get_token(AZURE_CREDENTIAL_SCOPE)
155+
token = DefaultAzureCredential().get_token(
156+
AZURE_CREDENTIAL_SCOPE, timeout=getattr(credentials, "login_timeout", None)
157+
)
154158
return token
155159

156160

@@ -168,7 +172,9 @@ def get_environment_access_token(credentials: FabricCredentials) -> AccessToken:
168172
out : AccessToken
169173
The access token.
170174
"""
171-
token = EnvironmentCredential().get_token(AZURE_CREDENTIAL_SCOPE)
175+
token = EnvironmentCredential().get_token(
176+
AZURE_CREDENTIAL_SCOPE, timeout=getattr(credentials, "login_timeout", None)
177+
)
172178
return token
173179

174180

dbt/adapters/fabric/fabric_relation.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
from typing import Optional, Type
33

44
from dbt.adapters.base.relation import BaseRelation
5+
from dbt.adapters.events.logging import AdapterLogger
56
from dbt.adapters.utils import classproperty
67

78
from dbt.adapters.fabric.relation_configs import FabricQuotePolicy, FabricRelationType
89

10+
logger = AdapterLogger("fabric")
11+
912

1013
@dataclass(frozen=True, eq=False, repr=False)
1114
class FabricRelation(BaseRelation):
@@ -17,12 +20,16 @@ class FabricRelation(BaseRelation):
1720
def get_relation_type(cls) -> Type[FabricRelationType]:
1821
return FabricRelationType
1922

20-
@classmethod
2123
def render_limited(self) -> str:
2224
rendered = self.render()
2325
if self.limit is None:
2426
return rendered
2527
elif self.limit == 0:
26-
return f"(select * from {rendered} where 1=0) {self._render_limited_alias()}"
28+
return f"(select * from {rendered} where 1=0) AS {self._render_limited_alias()}"
2729
else:
28-
return f"(select TOP {self.limit} * from {rendered}) {self._render_limited_alias()}"
30+
return f"(select TOP {self.limit} * from {rendered}) AS {self._render_limited_alias()}"
31+
32+
def _render_limited_alias(
33+
self,
34+
) -> str:
35+
return "_dbt_limit_subq"

dbt/include/fabric/macros/adapters/columns.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
FROM
6767
(
6868
SELECT
69-
CAST(c.COLUMN_NAME AS VARCHAR(128)) AS ColumnName
69+
'"' + CAST(c.COLUMN_NAME AS VARCHAR(128)) + '"' AS ColumnName
7070
FROM INFORMATION_SCHEMA.TABLES t
7171
JOIN INFORMATION_SCHEMA.COLUMNS c
7272
ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
@@ -87,7 +87,7 @@
8787

8888
{% set tempTable %}
8989
CREATE TABLE {{tempTableName}}
90-
AS SELECT {{query_result_text}}, CAST({{ column_name }} AS {{new_column_type}}) AS {{column_name}} FROM {{ relation.schema }}.{{ relation.identifier }}
90+
AS SELECT {{query_result_text}}, CAST("{{ column_name }}" AS {{new_column_type}}) AS "{{column_name}}" FROM {{ relation.schema }}.{{ relation.identifier }}
9191
{{ apply_label() }}
9292
{% endset %}
9393

dbt/include/fabric/macros/materializations/models/incremental/incremental.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
-- Dropping temp view relation
3838
{{ adapter.drop_relation(tmp_vw_relation) }}
3939

40+
-- Add constraints including FK relation.
41+
{{ build_model_constraints(target_relation) }}
42+
4043
{% else %}
4144

4245
{%- set temp_relation = make_temp_relation(target_relation)-%}

dbt/include/fabric/macros/materializations/models/table/create_table_as.sql

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@
1616
{% endfor %}
1717
{%endset%}
1818

19-
INSERT INTO {{relation}} ({{listColumns}})
20-
SELECT {{listColumns}} FROM {{tmp_vw_relation}} {{ query_label }}
19+
{% if not adapter.behavior.empty.no_warn %}
20+
INSERT INTO {{relation}} ({{listColumns}})
21+
SELECT {{listColumns}} FROM {{tmp_vw_relation}} {{ query_label }}
22+
{% endif %}
23+
2124

2225
{%- else %}
2326
{%- set query_label_option = query_label.replace("'", "''") -%}
24-
EXEC('CREATE TABLE {{relation}} AS SELECT * FROM {{tmp_vw_relation}} {{ query_label_option }}');
27+
{% if adapter.behavior.empty.no_warn %}
28+
EXEC('CREATE TABLE {{relation}} AS SELECT * FROM {{tmp_vw_relation}} WHERE 0=1 {{ query_label_option }}');
29+
{% else %}
30+
EXEC('CREATE TABLE {{relation}} AS SELECT * FROM {{tmp_vw_relation}} {{ query_label_option }}');
31+
{% endif %}
32+
2533
{% endif %}
2634
{% endmacro %}

0 commit comments

Comments
 (0)