dbt-sqlserver 1.9.1rc1__tar.gz → 1.10.0__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.
Files changed (76) hide show
  1. {dbt_sqlserver-1.9.1rc1/dbt_sqlserver.egg-info → dbt_sqlserver-1.10.0}/PKG-INFO +15 -17
  2. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/README.md +4 -2
  3. dbt_sqlserver-1.10.0/dbt/__init__.py +3 -0
  4. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/__init__.py +0 -1
  5. dbt_sqlserver-1.10.0/dbt/adapters/sqlserver/__version__.py +1 -0
  6. dbt_sqlserver-1.10.0/dbt/adapters/sqlserver/py.typed +0 -0
  7. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/relation_configs/policies.py +2 -1
  8. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_adapter.py +37 -9
  9. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_column.py +19 -1
  10. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_relation.py +16 -9
  11. dbt_sqlserver-1.10.0/dbt/include/sqlserver/macros/adapters/catalog.sql +277 -0
  12. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/columns.sql +17 -27
  13. dbt_sqlserver-1.10.0/dbt/include/sqlserver/macros/adapters/metadata.sql +208 -0
  14. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/relation.sql +1 -1
  15. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/schema.sql +7 -4
  16. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql +7 -3
  17. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/table/table.sql +34 -15
  18. dbt_sqlserver-1.10.0/dbt/include/sqlserver/macros/materializations/models/table/table_dml_refresh.sql +95 -0
  19. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/unit_test/unit_test_create_table_as.sql +1 -1
  20. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/view/view.sql +48 -10
  21. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot.sql +9 -1
  22. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot_merge.sql +2 -2
  23. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/relations/table/create.sql +3 -3
  24. dbt_sqlserver-1.10.0/dbt/include/sqlserver/macros/relations/views/create.sql +25 -0
  25. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0/dbt_sqlserver.egg-info}/PKG-INFO +15 -17
  26. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt_sqlserver.egg-info/SOURCES.txt +4 -2
  27. dbt_sqlserver-1.10.0/dbt_sqlserver.egg-info/requires.txt +10 -0
  28. dbt_sqlserver-1.10.0/pyproject.toml +85 -0
  29. dbt_sqlserver-1.9.1rc1/MANIFEST.in +0 -1
  30. dbt_sqlserver-1.9.1rc1/dbt/adapters/sqlserver/__version__.py +0 -1
  31. dbt_sqlserver-1.9.1rc1/dbt/include/sqlserver/macros/adapters/catalog.sql +0 -269
  32. dbt_sqlserver-1.9.1rc1/dbt/include/sqlserver/macros/adapters/metadata.sql +0 -112
  33. dbt_sqlserver-1.9.1rc1/dbt/include/sqlserver/macros/relations/views/create.sql +0 -19
  34. dbt_sqlserver-1.9.1rc1/dbt_sqlserver.egg-info/requires.txt +0 -3
  35. dbt_sqlserver-1.9.1rc1/setup.py +0 -94
  36. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/LICENSE +0 -0
  37. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/relation_configs/__init__.py +0 -0
  38. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_configs.py +0 -0
  39. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_connections.py +4 -4
  40. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/adapters/sqlserver/sqlserver_credentials.py +0 -0
  41. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/__init__.py +0 -0
  42. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/dbt_project.yml +0 -0
  43. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/apply_grants.sql +0 -0
  44. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/indexes.sql +0 -0
  45. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/show.sql +0 -0
  46. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/adapters/validate_sql.sql +0 -0
  47. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental.sql +0 -0
  48. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental_strategies.sql +0 -0
  49. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/table/clone.sql +0 -0
  50. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/table/columns_spec_ddl.sql +0 -0
  51. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/models/view/create_view_as.sql +0 -0
  52. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/snapshots/helpers.sql +0 -0
  53. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/snapshots/strategies.sql +0 -0
  54. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/tests.sql +0 -0
  55. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/materializations/unit_tests.sql +0 -0
  56. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/relations/seeds/helpers.sql +0 -0
  57. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/relations/table/clone.sql +0 -0
  58. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/any_value.sql +0 -0
  59. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/array_construct.sql +0 -0
  60. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/cast_bool_to_text.sql +0 -0
  61. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/concat.sql +0 -0
  62. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/date_trunc.sql +0 -0
  63. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/dateadd.sql +0 -0
  64. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/get_tables_by_pattern.sql +0 -0
  65. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/hash.sql +0 -0
  66. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/last_day.sql +0 -0
  67. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/length.sql +0 -0
  68. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/listagg.sql +0 -0
  69. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/position.sql +0 -0
  70. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/safe_cast.sql +0 -0
  71. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/split_part.sql +0 -0
  72. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/macros/utils/timestamps.sql +0 -0
  73. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt/include/sqlserver/profile_template.yml +0 -0
  74. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt_sqlserver.egg-info/dependency_links.txt +0 -0
  75. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/dbt_sqlserver.egg-info/top_level.txt +0 -0
  76. {dbt_sqlserver-1.9.1rc1 → dbt_sqlserver-1.10.0}/setup.cfg +0 -0
@@ -1,39 +1,35 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbt-sqlserver
3
- Version: 1.9.1rc1
3
+ Version: 1.10.0
4
4
  Summary: A Microsoft SQL Server adapter plugin for dbt
5
- Home-page: https://github.com/dbt-msft/dbt-sqlserver
6
5
  Author: Mikael Ene, Anders Swanson, Sam Debruyn, Cor Zuurmond, Cody Scott
7
6
  License: MIT
8
7
  Project-URL: Setup & configuration, https://docs.getdbt.com/reference/warehouse-profiles/mssql-profile
9
8
  Project-URL: Documentation & usage, https://docs.getdbt.com/reference/resource-configs/mssql-configs
10
9
  Project-URL: Changelog, https://github.com/dbt-msft/dbt-sqlserver/blob/master/CHANGELOG.md
11
10
  Project-URL: Issue Tracker, https://github.com/dbt-msft/dbt-sqlserver/issues
11
+ Project-URL: Source, https://github.com/dbt-msft/dbt-sqlserver
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: License :: OSI Approved :: MIT License
14
14
  Classifier: Operating System :: Microsoft :: Windows
15
15
  Classifier: Operating System :: MacOS :: MacOS X
16
16
  Classifier: Operating System :: POSIX :: Linux
17
- Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Requires-Python: >=3.10
22
22
  Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
- Requires-Dist: dbt-core<2.0,>=1.9.0
25
- Requires-Dist: dbt-common<2.0,>=1.0
26
- Requires-Dist: dbt-adapters<2.0,>=1.11.0
27
- Dynamic: author
28
- Dynamic: classifier
29
- Dynamic: description
30
- Dynamic: description-content-type
31
- Dynamic: home-page
32
- Dynamic: license
24
+ Requires-Dist: dbt-core<2.0,>=1.10.0
25
+ Requires-Dist: dbt-common<2.0,>=1.22.0
26
+ Requires-Dist: dbt-adapters<2.0,>=1.15.2
27
+ Requires-Dist: pyodbc>=5.2.0
28
+ Provides-Extra: azure
29
+ Requires-Dist: azure-identity>=1.12.0; extra == "azure"
30
+ Provides-Extra: pyodbc
31
+ Requires-Dist: pyodbc>=5.2.0; extra == "pyodbc"
33
32
  Dynamic: license-file
34
- Dynamic: project-url
35
- Dynamic: requires-dist
36
- Dynamic: summary
37
33
 
38
34
  # dbt-sqlserver
39
35
 
@@ -105,11 +101,13 @@ See [the changelog](CHANGELOG.md)
105
101
  **Example usage in `dbt_project.yml`:**
106
102
 
107
103
  ```yaml
108
- vars:
104
+ flags:
109
105
  dbt_sqlserver_use_default_schema_concat: true # Enable standard schema concatenation
110
106
  ```
111
107
 
112
- > **Note:** If you want to permanently customise schema generation and avoid any future deprecation of this flag, override the `sqlserver__generate_schema_name` macro directly in your project.
108
+ This adapter also supports the same setting via `vars:` for backwards compatibility, so either method works in the current release.
109
+
110
+ > **Note:** If you want to permanently customise schema generation and avoid any future changes, override the `sqlserver__generate_schema_name` macro directly in your project instead.
113
111
 
114
112
 
115
113
 
@@ -68,11 +68,13 @@ See [the changelog](CHANGELOG.md)
68
68
  **Example usage in `dbt_project.yml`:**
69
69
 
70
70
  ```yaml
71
- vars:
71
+ flags:
72
72
  dbt_sqlserver_use_default_schema_concat: true # Enable standard schema concatenation
73
73
  ```
74
74
 
75
- > **Note:** If you want to permanently customise schema generation and avoid any future deprecation of this flag, override the `sqlserver__generate_schema_name` macro directly in your project.
75
+ This adapter also supports the same setting via `vars:` for backwards compatibility, so either method works in the current release.
76
+
77
+ > **Note:** If you want to permanently customise schema generation and avoid any future changes, override the `sqlserver__generate_schema_name` macro directly in your project instead.
76
78
 
77
79
 
78
80
 
@@ -0,0 +1,3 @@
1
+ from pkgutil import extend_path
2
+
3
+ __path__ = extend_path(__path__, __name__)
@@ -1,5 +1,4 @@
1
1
  from dbt.adapters.base import AdapterPlugin
2
-
3
2
  from dbt.adapters.sqlserver.sqlserver_adapter import SQLServerAdapter
4
3
  from dbt.adapters.sqlserver.sqlserver_column import SQLServerColumn
5
4
  from dbt.adapters.sqlserver.sqlserver_configs import SQLServerConfigs
@@ -0,0 +1 @@
1
+ version = "1.10.0"
File without changes
@@ -1,8 +1,9 @@
1
1
  from dataclasses import dataclass
2
2
 
3
- from dbt.adapters.contracts.relation import Policy
4
3
  from dbt_common.dataclass_schema import StrEnum
5
4
 
5
+ from dbt.adapters.contracts.relation import Policy
6
+
6
7
  MAX_CHARACTERS_IN_IDENTIFIER = 127
7
8
 
8
9
 
@@ -2,14 +2,6 @@ from typing import List, Optional
2
2
 
3
3
  import agate
4
4
  import dbt_common.exceptions
5
- from dbt.adapters.base.column import Column as BaseColumn
6
- from dbt.adapters.base.impl import ConstraintSupport
7
- from dbt.adapters.base.meta import available
8
- from dbt.adapters.base.relation import BaseRelation
9
- from dbt.adapters.capability import Capability, CapabilityDict, CapabilitySupport, Support
10
- from dbt.adapters.events.types import SchemaCreation
11
- from dbt.adapters.reference_keys import _make_ref_key_dict
12
- from dbt.adapters.sql.impl import CREATE_SCHEMA_MACRO_NAME, SQLAdapter
13
5
  from dbt_common.behavior_flags import BehaviorFlag
14
6
  from dbt_common.contracts.constraints import (
15
7
  ColumnLevelConstraint,
@@ -18,7 +10,15 @@ from dbt_common.contracts.constraints import (
18
10
  )
19
11
  from dbt_common.events.functions import fire_event
20
12
 
21
- from dbt.adapters.sqlserver.sqlserver_column import SQLServerColumn
13
+ from dbt.adapters.base.column import Column as BaseColumn
14
+ from dbt.adapters.base.impl import ConstraintSupport
15
+ from dbt.adapters.base.meta import available
16
+ from dbt.adapters.base.relation import BaseRelation
17
+ from dbt.adapters.capability import Capability, CapabilityDict, CapabilitySupport, Support
18
+ from dbt.adapters.events.types import SchemaCreation
19
+ from dbt.adapters.reference_keys import _make_ref_key_dict
20
+ from dbt.adapters.sql.impl import CREATE_SCHEMA_MACRO_NAME, SQLAdapter
21
+ from dbt.adapters.sqlserver.sqlserver_column import SQLServerColumn, SQLServerColumnNative
22
22
  from dbt.adapters.sqlserver.sqlserver_configs import SQLServerConfigs
23
23
  from dbt.adapters.sqlserver.sqlserver_connections import SQLServerConnectionManager
24
24
  from dbt.adapters.sqlserver.sqlserver_relation import SQLServerRelation
@@ -48,6 +48,14 @@ class SQLServerAdapter(SQLAdapter):
48
48
  ConstraintType.foreign_key: ConstraintSupport.ENFORCED,
49
49
  }
50
50
 
51
+ def __init__(self, config, mp_context=None):
52
+ super().__init__(config, mp_context)
53
+ SQLServerRelation.disable_empty_relation_aliases = (
54
+ self.behavior.dbt_sqlserver_disable_empty_relation_aliases
55
+ )
56
+ if self.behavior.dbt_sqlserver_use_native_string_types:
57
+ self.Column = SQLServerColumnNative
58
+
51
59
  @property
52
60
  def _behavior_flags(self) -> List[BehaviorFlag]:
53
61
  return [
@@ -71,6 +79,26 @@ class SQLServerAdapter(SQLAdapter):
71
79
  "macro in your project instead."
72
80
  ),
73
81
  },
82
+ {
83
+ "name": "dbt_sqlserver_disable_empty_relation_aliases",
84
+ "default": True,
85
+ "description": (
86
+ "When True, SQL Server limited relations used by --empty and sample mode "
87
+ "do not automatically receive dbt-generated aliases. Set this false to opt "
88
+ "out of alias generation temporarily for testing."
89
+ ),
90
+ },
91
+ {
92
+ "name": "dbt_sqlserver_use_native_string_types",
93
+ "default": False,
94
+ "description": (
95
+ "When True, uses SQL Server-native string type mappings: "
96
+ "STRING -> VARCHAR(MAX), NCHAR -> NCHAR(1), NVARCHAR -> NVARCHAR(4000). "
97
+ "When False (default), preserves legacy mappings: "
98
+ "STRING and NVARCHAR -> VARCHAR(8000), NCHAR -> CHAR(1). "
99
+ "The new behaviour is intended to become the default in a future release."
100
+ ),
101
+ },
74
102
  ]
75
103
 
76
104
  @available.parse(lambda *a, **k: [])
@@ -1,8 +1,9 @@
1
1
  from typing import Any, ClassVar, Dict
2
2
 
3
- from dbt.adapters.base.column import Column
4
3
  from dbt_common.exceptions import DbtRuntimeError
5
4
 
5
+ from dbt.adapters.base.column import Column
6
+
6
7
 
7
8
  class SQLServerColumn(Column):
8
9
  TYPE_LABELS: ClassVar[Dict[str, str]] = {
@@ -96,3 +97,20 @@ class SQLServerColumn(Column):
96
97
  if not self.is_string() or not other_column.is_string():
97
98
  return False
98
99
  return other_column.string_size() > self.string_size()
100
+
101
+
102
+ class SQLServerColumnNative(SQLServerColumn):
103
+ """STRING maps to VARCHAR(MAX) (matches dbt convention) and NCHAR / NVARCHAR
104
+ map to their unicode SQL Server types — fixing the legacy default where
105
+ they were silently aliased to non-unicode CHAR(1) / VARCHAR(8000).
106
+ NVARCHAR uses the maximum fixed-length form (4000 — the cap for fixed
107
+ NVARCHAR since unicode is two bytes per character), parallel to VARCHAR(8000).
108
+ Opt-in via the `dbt_sqlserver_use_native_string_types` behaviour flag;
109
+ intended to become the default in a future release."""
110
+
111
+ TYPE_LABELS: ClassVar[Dict[str, str]] = {
112
+ **SQLServerColumn.TYPE_LABELS,
113
+ "STRING": "VARCHAR(MAX)",
114
+ "NCHAR": "NCHAR(1)",
115
+ "NVARCHAR": "NVARCHAR(4000)",
116
+ }
@@ -1,16 +1,16 @@
1
1
  from dataclasses import dataclass, field
2
- from typing import Optional, Type
2
+ from typing import ClassVar, Optional, Type
3
3
 
4
- from dbt.adapters.base.relation import BaseRelation, EventTimeFilter
5
- from dbt.adapters.utils import classproperty
6
4
  from dbt_common.exceptions import DbtRuntimeError
7
5
 
6
+ from dbt.adapters.base.relation import BaseRelation, EventTimeFilter
8
7
  from dbt.adapters.sqlserver.relation_configs import (
9
8
  MAX_CHARACTERS_IN_IDENTIFIER,
10
9
  SQLServerIncludePolicy,
11
10
  SQLServerQuotePolicy,
12
11
  SQLServerRelationType,
13
12
  )
13
+ from dbt.adapters.utils import classproperty
14
14
 
15
15
 
16
16
  @dataclass(frozen=True, eq=False, repr=False)
@@ -20,19 +20,26 @@ class SQLServerRelation(BaseRelation):
20
20
  default_factory=lambda: SQLServerIncludePolicy()
21
21
  )
22
22
  quote_policy: SQLServerQuotePolicy = field(default_factory=lambda: SQLServerQuotePolicy())
23
+ disable_empty_relation_aliases: ClassVar[bool] = True
23
24
 
24
25
  @classproperty
25
26
  def get_relation_type(cls) -> Type[SQLServerRelationType]:
26
27
  return SQLServerRelationType
27
28
 
29
+ def _render_limited_alias(self) -> str:
30
+ if self.disable_empty_relation_aliases:
31
+ return ""
32
+
33
+ return super()._render_limited_alias()
34
+
28
35
  def render_limited(self) -> str:
29
36
  rendered = self.render()
30
37
  if self.limit is None:
31
38
  return rendered
32
39
  elif self.limit == 0:
33
- return f"(select * from {rendered} where 1=0) AS {self._render_limited_alias()}"
40
+ return f"(select * from {rendered} where 1=0){self._render_limited_alias()}"
34
41
  else:
35
- return f"(select TOP {self.limit} * from {rendered}) AS {self._render_limited_alias()}"
42
+ return f"(select TOP {self.limit} * from {rendered}){self._render_limited_alias()}"
36
43
 
37
44
  def __post_init__(self):
38
45
  # Check for length of Redshift table/view names.
@@ -58,19 +65,19 @@ class SQLServerRelation(BaseRelation):
58
65
  if event_time_filter.start and event_time_filter.end:
59
66
  filter = (
60
67
  f"{event_time_filter.field_name} >="
61
- f" cast('{event_time_filter.start}' as datetimeoffset)"
68
+ f" cast('{event_time_filter.start}' as datetime2)"
62
69
  f" and {event_time_filter.field_name} <"
63
- f" cast('{event_time_filter.end}' as datetimeoffset)"
70
+ f" cast('{event_time_filter.end}' as datetime2)"
64
71
  )
65
72
  elif event_time_filter.start:
66
73
  filter = (
67
74
  f"{event_time_filter.field_name} >="
68
- f" cast('{event_time_filter.start}' as datetimeoffset)"
75
+ f" cast('{event_time_filter.start}' as datetime2)"
69
76
  )
70
77
  elif event_time_filter.end:
71
78
  filter = (
72
79
  f"{event_time_filter.field_name} <"
73
- f" cast('{event_time_filter.end}' as datetimeoffset)"
80
+ f" cast('{event_time_filter.end}' as datetime2)"
74
81
  )
75
82
 
76
83
  return filter
@@ -0,0 +1,277 @@
1
+ {% macro sqlserver__get_catalog(information_schemas, schemas) -%}
2
+ {% set query_label = get_query_options() %}
3
+ {%- call statement('catalog', fetch_result=True) -%}
4
+ {{ get_use_database_sql(information_schemas.database) }}
5
+ with
6
+ principals as (
7
+ select
8
+ name as principal_name,
9
+ principal_id as principal_id
10
+ from
11
+ sys.database_principals {{ information_schema_hints() }}
12
+ ),
13
+
14
+ schemas as (
15
+ select
16
+ name as schema_name,
17
+ schema_id as schema_id,
18
+ principal_id as principal_id
19
+ from
20
+ sys.schemas {{ information_schema_hints() }}
21
+ ),
22
+
23
+ tables as (
24
+ select
25
+ object_id,
26
+ name as table_name,
27
+ schema_id as schema_id,
28
+ principal_id as principal_id,
29
+ 'BASE TABLE' as table_type
30
+ from
31
+ sys.tables {{ information_schema_hints() }}
32
+ ),
33
+
34
+ tables_with_metadata as (
35
+ select
36
+ object_id,
37
+ table_name,
38
+ schema_name,
39
+ coalesce(tables.principal_id, schemas.principal_id) as owner_principal_id,
40
+ table_type
41
+ from
42
+ tables
43
+ join schemas on tables.schema_id = schemas.schema_id
44
+ ),
45
+
46
+ views as (
47
+ select
48
+ object_id,
49
+ name as table_name,
50
+ schema_id as schema_id,
51
+ principal_id as principal_id,
52
+ 'VIEW' as table_type
53
+ from
54
+ sys.views {{ information_schema_hints() }}
55
+ ),
56
+
57
+ views_with_metadata as (
58
+ select
59
+ object_id,
60
+ table_name,
61
+ schema_name,
62
+ coalesce(views.principal_id, schemas.principal_id) as owner_principal_id,
63
+ table_type
64
+ from
65
+ views
66
+ join schemas on views.schema_id = schemas.schema_id
67
+ ),
68
+
69
+ tables_and_views as (
70
+ select
71
+ object_id,
72
+ table_name,
73
+ schema_name,
74
+ principal_name,
75
+ table_type
76
+ from
77
+ tables_with_metadata
78
+ join principals on tables_with_metadata.owner_principal_id = principals.principal_id
79
+ union all
80
+ select
81
+ object_id,
82
+ table_name,
83
+ schema_name,
84
+ principal_name,
85
+ table_type
86
+ from
87
+ views_with_metadata
88
+ join principals on views_with_metadata.owner_principal_id = principals.principal_id
89
+ ),
90
+
91
+ cols as (
92
+
93
+ select
94
+ c.object_id,
95
+ c.name as column_name,
96
+ c.column_id as column_index,
97
+ t.name as column_type
98
+ from sys.columns as c {{ information_schema_hints() }}
99
+ left join sys.types as t {{ information_schema_hints() }} on c.system_type_id = t.system_type_id
100
+ )
101
+
102
+ select
103
+ DB_NAME() as table_database,
104
+ tv.schema_name as table_schema,
105
+ tv.table_name,
106
+ tv.table_type,
107
+ null as table_comment,
108
+ tv.principal_name as table_owner,
109
+ cols.column_name,
110
+ cols.column_index,
111
+ cols.column_type,
112
+ null as column_comment
113
+ from tables_and_views tv
114
+ join cols on tv.object_id = cols.object_id
115
+ where ({%- for schema in schemas -%}
116
+ upper(tv.schema_name) = upper('{{ schema }}'){%- if not loop.last %} or {% endif -%}
117
+ {%- endfor -%})
118
+
119
+ order by column_index
120
+ {{ query_label }}
121
+
122
+ {%- endcall -%}
123
+
124
+ {{ return(load_result('catalog').table) }}
125
+
126
+ {%- endmacro %}
127
+
128
+ {% macro sqlserver__get_catalog_relations(information_schema, relations) -%}
129
+ {% set query_label = get_query_options() %}
130
+ {%- set distinct_databases = relations | map(attribute='database') | unique | list -%}
131
+
132
+ {%- if distinct_databases | length == 1 -%}
133
+ {%- call statement('catalog', fetch_result=True) -%}
134
+ {{ get_use_database_sql(distinct_databases[0]) }}
135
+ with
136
+ principals as (
137
+ select
138
+ name as principal_name,
139
+ principal_id as principal_id
140
+ from
141
+ sys.database_principals {{ information_schema_hints() }}
142
+ ),
143
+
144
+ schemas as (
145
+ select
146
+ name as schema_name,
147
+ schema_id as schema_id,
148
+ principal_id as principal_id
149
+ from
150
+ sys.schemas {{ information_schema_hints() }}
151
+ ),
152
+
153
+ tables as (
154
+ select
155
+ object_id,
156
+ name as table_name,
157
+ schema_id as schema_id,
158
+ principal_id as principal_id,
159
+ 'BASE TABLE' as table_type
160
+ from
161
+ sys.tables {{ information_schema_hints() }}
162
+ ),
163
+
164
+ tables_with_metadata as (
165
+ select
166
+ object_id,
167
+ table_name,
168
+ schema_name,
169
+ coalesce(tables.principal_id, schemas.principal_id) as owner_principal_id,
170
+ table_type
171
+ from
172
+ tables
173
+ join schemas on tables.schema_id = schemas.schema_id
174
+ ),
175
+
176
+ views as (
177
+ select
178
+ object_id,
179
+ name as table_name,
180
+ schema_id as schema_id,
181
+ principal_id as principal_id,
182
+ 'VIEW' as table_type
183
+ from
184
+ sys.views {{ information_schema_hints() }}
185
+ ),
186
+
187
+ views_with_metadata as (
188
+ select
189
+ object_id,
190
+ table_name,
191
+ schema_name,
192
+ coalesce(views.principal_id, schemas.principal_id) as owner_principal_id,
193
+ table_type
194
+ from
195
+ views
196
+ join schemas on views.schema_id = schemas.schema_id
197
+ ),
198
+
199
+ tables_and_views as (
200
+ select
201
+ object_id,
202
+ table_name,
203
+ schema_name,
204
+ principal_name,
205
+ table_type
206
+ from
207
+ tables_with_metadata
208
+ join principals on tables_with_metadata.owner_principal_id = principals.principal_id
209
+ union all
210
+ select
211
+ object_id,
212
+ table_name,
213
+ schema_name,
214
+ principal_name,
215
+ table_type
216
+ from
217
+ views_with_metadata
218
+ join principals on views_with_metadata.owner_principal_id = principals.principal_id
219
+ ),
220
+
221
+ cols as (
222
+
223
+ select
224
+ c.object_id,
225
+ c.name as column_name,
226
+ c.column_id as column_index,
227
+ t.name as column_type
228
+ from sys.columns as c {{ information_schema_hints() }}
229
+ left join sys.types as t on c.system_type_id = t.system_type_id
230
+ )
231
+
232
+ select
233
+ DB_NAME() as table_database,
234
+ tv.schema_name as table_schema,
235
+ tv.table_name,
236
+ tv.table_type,
237
+ null as table_comment,
238
+ tv.principal_name as table_owner,
239
+ cols.column_name,
240
+ cols.column_index,
241
+ cols.column_type,
242
+ null as column_comment
243
+ from tables_and_views tv
244
+ join cols on tv.object_id = cols.object_id
245
+ where (
246
+ {%- for relation in relations -%}
247
+ {% if relation.schema and relation.identifier %}
248
+ (
249
+ upper(tv.schema_name) = upper('{{ relation.schema }}')
250
+ and upper(tv.table_name) = upper('{{ relation.identifier }}')
251
+ )
252
+ {% elif relation.schema %}
253
+ (
254
+ upper(tv.schema_name) = upper('{{ relation.schema }}')
255
+ )
256
+ {% else %}
257
+ {% do exceptions.raise_compiler_error(
258
+ '`get_catalog_relations` requires a list of relations, each with a schema'
259
+ ) %}
260
+ {% endif %}
261
+
262
+ {%- if not loop.last %} or {% endif -%}
263
+ {%- endfor -%}
264
+ )
265
+
266
+ order by column_index
267
+ {{ query_label }}
268
+
269
+ {%- endcall -%}
270
+ {{ return(load_result('catalog').table) }}
271
+ {% else %}
272
+ {% do exceptions.raise_compiler_error(
273
+ '`get_catalog_relations` can catalog one database at a time'
274
+ ) %}
275
+ {% endif %}
276
+
277
+ {%- endmacro %}
@@ -1,5 +1,6 @@
1
1
  {% macro sqlserver__get_empty_subquery_sql(select_sql, select_sql_header=none) %}
2
- {% if select_sql.strip().lower().startswith('with') %}
2
+ {%- set select_sql_stripped = modules.re.sub('(?s)/\\*.*?\\*/|--[^\n]*\n', '', select_sql) -%}
3
+ {% if select_sql_stripped.strip().lower().startswith('with') %}
3
4
  {{ select_sql }}
4
5
  {% else -%}
5
6
  select * from (
@@ -11,7 +12,7 @@
11
12
  {% endmacro %}
12
13
 
13
14
  {% macro sqlserver__get_columns_in_query(select_sql) %}
14
- {% set query_label = apply_label() %}
15
+ {% set query_label = get_query_options() %}
15
16
  {% call statement('get_columns_in_query', fetch_result=True, auto_begin=False) -%}
16
17
  select TOP 0 * from (
17
18
  {{ select_sql }}
@@ -65,34 +66,23 @@
65
66
  {% endmacro %}
66
67
 
67
68
  {% macro sqlserver__get_columns_in_relation(relation) -%}
68
- {% set query_label = apply_label() %}
69
+ {% set query_label = get_query_options() %}
69
70
  {% call statement('get_columns_in_relation', fetch_result=True) %}
70
71
  {{ get_use_database_sql(relation.database) }}
71
- with mapping as (
72
- select
73
- row_number() over (partition by object_name(c.object_id) order by c.column_id) as ordinal_position,
74
- c.name collate database_default as column_name,
75
- t.name as data_type,
76
- case
77
- when (t.name in ('nchar', 'nvarchar', 'sysname') and c.max_length <> -1) then c.max_length / 2
78
- else c.max_length
79
- end as character_maximum_length,
80
- c.precision as numeric_precision,
81
- c.scale as numeric_scale
82
- from sys.columns c {{ information_schema_hints() }}
83
- inner join sys.types t {{ information_schema_hints() }}
84
- on c.user_type_id = t.user_type_id
85
- where c.object_id = object_id('{{ 'tempdb..' ~ relation.include(database=false, schema=false) if '#' in relation.identifier else relation }}')
86
- )
87
-
88
72
  select
89
- column_name,
90
- data_type,
91
- character_maximum_length,
92
- numeric_precision,
93
- numeric_scale
94
- from mapping
95
- order by ordinal_position
73
+ c.name collate database_default as column_name,
74
+ t.name as data_type,
75
+ case
76
+ when (t.name in ('nchar', 'nvarchar', 'sysname') and c.max_length <> -1) then c.max_length / 2
77
+ else c.max_length
78
+ end as character_maximum_length,
79
+ c.precision as numeric_precision,
80
+ c.scale as numeric_scale
81
+ from sys.columns c {{ information_schema_hints() }}
82
+ inner join sys.types t {{ information_schema_hints() }}
83
+ on c.user_type_id = t.user_type_id
84
+ where c.object_id = object_id('{{ 'tempdb..' ~ relation.include(database=false, schema=false) if '#' in relation.identifier else relation }}')
85
+ order by c.column_id
96
86
  {{ query_label }}
97
87
 
98
88
  {% endcall %}