dbt-adapters 1.3.3__py3-none-any.whl → 1.4.0__py3-none-any.whl

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.

Potentially problematic release.


This version of dbt-adapters might be problematic. Click here for more details.

dbt/adapters/__about__.py CHANGED
@@ -1 +1 @@
1
- version = "1.3.3"
1
+ version = "1.4.0"
@@ -123,9 +123,6 @@ class Column:
123
123
  else:
124
124
  return "{}({},{})".format(dtype, precision, scale)
125
125
 
126
- def __repr__(self) -> str:
127
- return "<Column {} ({})>".format(self.name, self.data_type)
128
-
129
126
  @classmethod
130
127
  def from_description(cls, name: str, raw_data_type: str) -> "Column":
131
128
  match = re.match(r"([^(]+)(\([^)]+\))?", raw_data_type)
dbt/adapters/base/impl.py CHANGED
@@ -1602,8 +1602,13 @@ class BaseAdapter(metaclass=AdapterMeta):
1602
1602
  rendered_column_constraint = f"unique {constraint_expression}"
1603
1603
  elif constraint.type == ConstraintType.primary_key:
1604
1604
  rendered_column_constraint = f"primary key {constraint_expression}"
1605
- elif constraint.type == ConstraintType.foreign_key and constraint_expression:
1606
- rendered_column_constraint = f"references {constraint_expression}"
1605
+ elif constraint.type == ConstraintType.foreign_key:
1606
+ if constraint.to and constraint.to_columns:
1607
+ rendered_column_constraint = (
1608
+ f"references {constraint.to} ({', '.join(constraint.to_columns)})"
1609
+ )
1610
+ elif constraint_expression:
1611
+ rendered_column_constraint = f"references {constraint_expression}"
1607
1612
  elif constraint.type == ConstraintType.custom and constraint_expression:
1608
1613
  rendered_column_constraint = constraint_expression
1609
1614
 
@@ -1682,20 +1687,29 @@ class BaseAdapter(metaclass=AdapterMeta):
1682
1687
  rendering."""
1683
1688
  constraint_prefix = f"constraint {constraint.name} " if constraint.name else ""
1684
1689
  column_list = ", ".join(constraint.columns)
1690
+ rendered_model_constraint = None
1691
+
1685
1692
  if constraint.type == ConstraintType.check and constraint.expression:
1686
- return f"{constraint_prefix}check ({constraint.expression})"
1693
+ rendered_model_constraint = f"{constraint_prefix}check ({constraint.expression})"
1687
1694
  elif constraint.type == ConstraintType.unique:
1688
1695
  constraint_expression = f" {constraint.expression}" if constraint.expression else ""
1689
- return f"{constraint_prefix}unique{constraint_expression} ({column_list})"
1696
+ rendered_model_constraint = (
1697
+ f"{constraint_prefix}unique{constraint_expression} ({column_list})"
1698
+ )
1690
1699
  elif constraint.type == ConstraintType.primary_key:
1691
1700
  constraint_expression = f" {constraint.expression}" if constraint.expression else ""
1692
- return f"{constraint_prefix}primary key{constraint_expression} ({column_list})"
1693
- elif constraint.type == ConstraintType.foreign_key and constraint.expression:
1694
- return f"{constraint_prefix}foreign key ({column_list}) references {constraint.expression}"
1701
+ rendered_model_constraint = (
1702
+ f"{constraint_prefix}primary key{constraint_expression} ({column_list})"
1703
+ )
1704
+ elif constraint.type == ConstraintType.foreign_key:
1705
+ if constraint.to and constraint.to_columns:
1706
+ rendered_model_constraint = f"{constraint_prefix}foreign key ({column_list}) references {constraint.to} ({', '.join(constraint.to_columns)})"
1707
+ elif constraint.expression:
1708
+ rendered_model_constraint = f"{constraint_prefix}foreign key ({column_list}) references {constraint.expression}"
1695
1709
  elif constraint.type == ConstraintType.custom and constraint.expression:
1696
- return f"{constraint_prefix}{constraint.expression}"
1697
- else:
1698
- return None
1710
+ rendered_model_constraint = f"{constraint_prefix}{constraint.expression}"
1711
+
1712
+ return rendered_model_constraint
1699
1713
 
1700
1714
  @classmethod
1701
1715
  def capabilities(cls) -> CapabilityDict:
@@ -0,0 +1,2 @@
1
+ from dbt.adapters.record.handle import RecordReplayHandle
2
+ from dbt.adapters.record.cursor.cursor import RecordReplayCursor
@@ -0,0 +1,54 @@
1
+ from typing import Any, Optional
2
+
3
+ from dbt_common.record import record_function
4
+
5
+ from dbt.adapters.contracts.connection import Connection
6
+ from dbt.adapters.record.cursor.description import CursorGetDescriptionRecord
7
+ from dbt.adapters.record.cursor.execute import CursorExecuteRecord
8
+ from dbt.adapters.record.cursor.fetchone import CursorFetchOneRecord
9
+ from dbt.adapters.record.cursor.fetchmany import CursorFetchManyRecord
10
+ from dbt.adapters.record.cursor.fetchall import CursorFetchAllRecord
11
+ from dbt.adapters.record.cursor.rowcount import CursorGetRowCountRecord
12
+
13
+
14
+ class RecordReplayCursor:
15
+ """A proxy object used to wrap native database cursors under record/replay
16
+ modes. In record mode, this proxy notes the parameters and return values
17
+ of the methods and properties it implements, which closely match the Python
18
+ DB API 2.0 cursor methods used by many dbt adapters to interact with the
19
+ database or DWH. In replay mode, it mocks out those calls using previously
20
+ recorded calls, so that no interaction with a database actually occurs."""
21
+
22
+ def __init__(self, native_cursor: Any, connection: Connection) -> None:
23
+ self.native_cursor = native_cursor
24
+ self.connection = connection
25
+
26
+ @record_function(CursorExecuteRecord, method=True, id_field_name="connection_name")
27
+ def execute(self, operation, parameters=None) -> None:
28
+ self.native_cursor.execute(operation, parameters)
29
+
30
+ @record_function(CursorFetchOneRecord, method=True, id_field_name="connection_name")
31
+ def fetchone(self) -> Any:
32
+ return self.native_cursor.fetchone()
33
+
34
+ @record_function(CursorFetchManyRecord, method=True, id_field_name="connection_name")
35
+ def fetchmany(self, size: int) -> Any:
36
+ return self.native_cursor.fetchmany(size)
37
+
38
+ @record_function(CursorFetchAllRecord, method=True, id_field_name="connection_name")
39
+ def fetchall(self) -> Any:
40
+ return self.native_cursor.fetchall()
41
+
42
+ @property
43
+ def connection_name(self) -> Optional[str]:
44
+ return self.connection.name
45
+
46
+ @property
47
+ @record_function(CursorGetRowCountRecord, method=True, id_field_name="connection_name")
48
+ def rowcount(self) -> int:
49
+ return self.native_cursor.rowcount
50
+
51
+ @property
52
+ @record_function(CursorGetDescriptionRecord, method=True, id_field_name="connection_name")
53
+ def description(self) -> str:
54
+ return self.native_cursor.description
@@ -0,0 +1,37 @@
1
+ import dataclasses
2
+ from typing import Any, Iterable, Mapping
3
+
4
+ from dbt_common.record import Record, Recorder
5
+
6
+
7
+ @dataclasses.dataclass
8
+ class CursorGetDescriptionParams:
9
+ connection_name: str
10
+
11
+
12
+ @dataclasses.dataclass
13
+ class CursorGetDescriptionResult:
14
+ columns: Iterable[Any]
15
+
16
+ def _to_dict(self) -> Any:
17
+ column_dicts = []
18
+ for c in self.columns:
19
+ # This captures the mandatory column information, but we might need
20
+ # more for some adapters.
21
+ # See https://peps.python.org/pep-0249/#description
22
+ column_dicts.append((c[0], c[1]))
23
+
24
+ return {"columns": column_dicts}
25
+
26
+ @classmethod
27
+ def _from_dict(cls, dct: Mapping) -> "CursorGetDescriptionResult":
28
+ return CursorGetDescriptionResult(columns=dct["columns"])
29
+
30
+
31
+ @Recorder.register_record_type
32
+ class CursorGetDescriptionRecord(Record):
33
+ """Implements record/replay support for the cursor.description property."""
34
+
35
+ params_cls = CursorGetDescriptionParams
36
+ result_cls = CursorGetDescriptionResult
37
+ group = "Database"
@@ -0,0 +1,20 @@
1
+ import dataclasses
2
+ from typing import Any, Iterable, Union, Mapping
3
+
4
+ from dbt_common.record import Record, Recorder
5
+
6
+
7
+ @dataclasses.dataclass
8
+ class CursorExecuteParams:
9
+ connection_name: str
10
+ operation: str
11
+ parameters: Union[Iterable[Any], Mapping[str, Any]]
12
+
13
+
14
+ @Recorder.register_record_type
15
+ class CursorExecuteRecord(Record):
16
+ """Implements record/replay support for the cursor.execute() method."""
17
+
18
+ params_cls = CursorExecuteParams
19
+ result_cls = None
20
+ group = "Database"
@@ -0,0 +1,66 @@
1
+ import dataclasses
2
+ import datetime
3
+ from typing import Any, Dict, List, Mapping
4
+
5
+ from dbt_common.record import Record, Recorder
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class CursorFetchAllParams:
10
+ connection_name: str
11
+
12
+
13
+ @dataclasses.dataclass
14
+ class CursorFetchAllResult:
15
+ results: List[Any]
16
+
17
+ def _to_dict(self) -> Dict[str, Any]:
18
+ processed_results = []
19
+ for result in self.results:
20
+ result = tuple(map(self._process_value, result))
21
+ processed_results.append(result)
22
+
23
+ return {"results": processed_results}
24
+
25
+ @classmethod
26
+ def _from_dict(cls, dct: Mapping) -> "CursorFetchAllResult":
27
+ unprocessed_results = []
28
+ for result in dct["results"]:
29
+ result = tuple(map(cls._unprocess_value, result))
30
+ unprocessed_results.append(result)
31
+
32
+ return CursorFetchAllResult(unprocessed_results)
33
+
34
+ @classmethod
35
+ def _process_value(cls, value: Any) -> Any:
36
+ if type(value) is datetime.date:
37
+ return {"type": "date", "value": value.isoformat()}
38
+ elif type(value) is datetime.datetime:
39
+ return {"type": "datetime", "value": value.isoformat()}
40
+ else:
41
+ return value
42
+
43
+ @classmethod
44
+ def _unprocess_value(cls, value: Any) -> Any:
45
+ if type(value) is dict:
46
+ value_type = value.get("type")
47
+ if value_type == "date":
48
+ date_string = value.get("value")
49
+ assert isinstance(date_string, str)
50
+ return datetime.date.fromisoformat(date_string)
51
+ elif value_type == "datetime":
52
+ date_string = value.get("value")
53
+ assert isinstance(date_string, str)
54
+ return datetime.datetime.fromisoformat(date_string)
55
+ return value
56
+ else:
57
+ return value
58
+
59
+
60
+ @Recorder.register_record_type
61
+ class CursorFetchAllRecord(Record):
62
+ """Implements record/replay support for the cursor.fetchall() method."""
63
+
64
+ params_cls = CursorFetchAllParams
65
+ result_cls = CursorFetchAllResult
66
+ group = "Database"
@@ -0,0 +1,23 @@
1
+ import dataclasses
2
+ from typing import Any, List
3
+
4
+ from dbt_common.record import Record, Recorder
5
+
6
+
7
+ @dataclasses.dataclass
8
+ class CursorFetchManyParams:
9
+ connection_name: str
10
+
11
+
12
+ @dataclasses.dataclass
13
+ class CursorFetchManyResult:
14
+ results: List[Any]
15
+
16
+
17
+ @Recorder.register_record_type
18
+ class CursorFetchManyRecord(Record):
19
+ """Implements record/replay support for the cursor.fetchmany() method."""
20
+
21
+ params_cls = CursorFetchManyParams
22
+ result_cls = CursorFetchManyResult
23
+ group = "Database"
@@ -0,0 +1,23 @@
1
+ import dataclasses
2
+ from typing import Any
3
+
4
+ from dbt_common.record import Record, Recorder
5
+
6
+
7
+ @dataclasses.dataclass
8
+ class CursorFetchOneParams:
9
+ connection_name: str
10
+
11
+
12
+ @dataclasses.dataclass
13
+ class CursorFetchOneResult:
14
+ result: Any
15
+
16
+
17
+ @Recorder.register_record_type
18
+ class CursorFetchOneRecord(Record):
19
+ """Implements record/replay support for the cursor.fetchone() method."""
20
+
21
+ params_cls = CursorFetchOneParams
22
+ result_cls = CursorFetchOneResult
23
+ group = "Database"
@@ -0,0 +1,23 @@
1
+ import dataclasses
2
+ from typing import Optional
3
+
4
+ from dbt_common.record import Record, Recorder
5
+
6
+
7
+ @dataclasses.dataclass
8
+ class CursorGetRowCountParams:
9
+ connection_name: str
10
+
11
+
12
+ @dataclasses.dataclass
13
+ class CursorGetRowCountResult:
14
+ rowcount: Optional[int]
15
+
16
+
17
+ @Recorder.register_record_type
18
+ class CursorGetRowCountRecord(Record):
19
+ """Implements record/replay support for the cursor.rowcount property."""
20
+
21
+ params_cls = CursorGetRowCountParams
22
+ result_cls = CursorGetRowCountResult
23
+ group = "Database"
@@ -0,0 +1,24 @@
1
+ from typing import Any
2
+
3
+ from dbt.adapters.contracts.connection import Connection
4
+
5
+ from dbt.adapters.record.cursor.cursor import RecordReplayCursor
6
+
7
+
8
+ class RecordReplayHandle:
9
+ """A proxy object used for record/replay modes. What adapters call a
10
+ 'handle' is typically a native database connection, but should not be
11
+ confused with the Connection protocol, which is a dbt-adapters concept.
12
+
13
+ Currently, the only function of the handle proxy is to provide a record/replay
14
+ aware cursor object when cursor() is called."""
15
+
16
+ def __init__(self, native_handle: Any, connection: Connection) -> None:
17
+ self.native_handle = native_handle
18
+ self.connection = connection
19
+
20
+ def cursor(self) -> Any:
21
+ # The native handle could be None if we are in replay mode, because no
22
+ # actual database access should be performed in that mode.
23
+ cursor = None if self.native_handle is None else self.native_handle.cursor()
24
+ return RecordReplayCursor(cursor, self.connection)
@@ -5,7 +5,6 @@ from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, TYPE_CH
5
5
  from dbt_common.events.contextvars import get_node_info
6
6
  from dbt_common.events.functions import fire_event
7
7
  from dbt_common.exceptions import DbtInternalError, NotImplementedError
8
- from dbt_common.record import record_function
9
8
  from dbt_common.utils import cast_to_str
10
9
 
11
10
  from dbt.adapters.base import BaseConnectionManager
@@ -20,7 +19,6 @@ from dbt.adapters.events.types import (
20
19
  SQLQuery,
21
20
  SQLQueryStatus,
22
21
  )
23
- from dbt.adapters.record import QueryRecord
24
22
 
25
23
  if TYPE_CHECKING:
26
24
  import agate
@@ -143,7 +141,6 @@ class SQLConnectionManager(BaseConnectionManager):
143
141
 
144
142
  return table_from_data_flat(data, column_names)
145
143
 
146
- @record_function(QueryRecord, method=True, tuple_result=True)
147
144
  def execute(
148
145
  self,
149
146
  sql: str,
@@ -39,9 +39,12 @@
39
39
  {% set need_swap = true %}
40
40
  {% else %}
41
41
  {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}
42
- {% do adapter.expand_target_column_types(
43
- from_relation=temp_relation,
44
- to_relation=target_relation) %}
42
+ {% set contract_config = config.get('contract') %}
43
+ {% if not contract_config or not contract_config.enforced %}
44
+ {% do adapter.expand_target_column_types(
45
+ from_relation=temp_relation,
46
+ to_relation=target_relation) %}
47
+ {% endif %}
45
48
  {#-- Process schema changes. Returns dict of changes if successful. Use source columns for upserting/merging --#}
46
49
  {% set dest_columns = process_schema_changes(on_schema_change, temp_relation, existing_relation) %}
47
50
  {% if not dest_columns %}
@@ -22,6 +22,7 @@
22
22
  {%- do default_row.update({column_name: (safe_cast("null", column_type) | trim )}) -%}
23
23
  {%- endfor -%}
24
24
 
25
+ {{ validate_fixture_rows(rows, row_number) }}
25
26
 
26
27
  {%- for row in rows -%}
27
28
  {%- set formatted_row = format_row(row, column_name_to_data_types) -%}
@@ -93,3 +94,11 @@ union all
93
94
  {%- endfor -%}
94
95
  {{ return(formatted_row) }}
95
96
  {%- endmacro -%}
97
+
98
+ {%- macro validate_fixture_rows(rows, row_number) -%}
99
+ {{ return(adapter.dispatch('validate_fixture_rows', 'dbt')(rows, row_number)) }}
100
+ {%- endmacro -%}
101
+
102
+ {%- macro default__validate_fixture_rows(rows, row_number) -%}
103
+ {# This is an abstract method for adapter overrides as needed #}
104
+ {%- endmacro -%}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dbt-adapters
3
- Version: 1.3.3
3
+ Version: 1.4.0
4
4
  Summary: The set of adapter protocols and base functionality that supports integration with dbt-core
5
5
  Project-URL: Homepage, https://github.com/dbt-labs/dbt-adapters
6
6
  Project-URL: Documentation, https://docs.getdbt.com
@@ -11,7 +11,7 @@ Author-email: dbt Labs <info@dbtlabs.com>
11
11
  Maintainer-email: dbt Labs <info@dbtlabs.com>
12
12
  License-File: LICENSE
13
13
  Keywords: adapter,adapters,database,dbt,dbt Cloud,dbt Core,dbt Labs,dbt-core,elt
14
- Classifier: Development Status :: 2 - Pre-Alpha
14
+ Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: License :: OSI Approved :: Apache Software License
16
16
  Classifier: Operating System :: MacOS :: MacOS X
17
17
  Classifier: Operating System :: Microsoft :: Windows
@@ -23,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Requires-Python: >=3.8.0
25
25
  Requires-Dist: agate<2.0,>=1.0
26
- Requires-Dist: dbt-common<2.0,>=1.3
26
+ Requires-Dist: dbt-common<2.0,>=1.6
27
27
  Requires-Dist: mashumaro[msgpack]<4.0,>=3.0
28
28
  Requires-Dist: protobuf<5.0,>=3.0
29
29
  Requires-Dist: pytz>=2015.7
@@ -1,19 +1,18 @@
1
1
  dbt/__init__.py,sha256=iY4jdvOxcDhkdr5FiyOTZPHadKtMZDQ-qC6Fw6_EHPM,277
2
- dbt/adapters/__about__.py,sha256=fsTqYPBJfBiPtA85HQlmYkU8lw1Bsz_S4ltmpXp8LxE,18
2
+ dbt/adapters/__about__.py,sha256=0kccNYBMuNA3PIhlESWmh8xP1TWpNtIEzS0d-x80SC0,18
3
3
  dbt/adapters/__init__.py,sha256=3noHsg-64qI0_Pw6OR9F7l1vU2_qrJvinq8POTtuaZM,252
4
4
  dbt/adapters/cache.py,sha256=WGy4ewnz-J13LverTACBW2iFhGswrWLgm-wiBrQnMzo,20084
5
5
  dbt/adapters/capability.py,sha256=-Mbej2AL_bjQatHpFWUgsQ8z0zwnotyE9Y5DYHnX7NE,2364
6
6
  dbt/adapters/factory.py,sha256=JxNxhMqemZ6ARWbROQZhkhJehiIenuR9ZQYS8gvzbDg,9368
7
7
  dbt/adapters/protocol.py,sha256=qRsEFAKjUMVnoBspAiCUTICez1ckson-dFS04dTXSco,3818
8
8
  dbt/adapters/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- dbt/adapters/record.py,sha256=D7fa0wh2QSM4Xp3uhiM6fpsLN6F0mIQHwDaT7D22pfo,1972
10
9
  dbt/adapters/reference_keys.py,sha256=lRN3gPdQD6Qciy-BAGx_rz3CFlbS7zMSZ43pZ_9ondE,1046
11
10
  dbt/adapters/utils.py,sha256=OtakbxPgxwrxN5Yd2vAO-cvLETSgzBwMWebhgegAVyA,2414
12
11
  dbt/adapters/base/README.md,sha256=muHQntC07Lh6L1XfVgwKhV5RltOPBLYPdQqd8_7l34c,516
13
12
  dbt/adapters/base/__init__.py,sha256=KGGGbj8jGMjAFJdQ5YHcOpApMMVZ_6Xuni1swhpkqRY,423
14
- dbt/adapters/base/column.py,sha256=M3iotEY5yi4xikXyXzD9oshBF9-xcJrIeQVu1sB85DI,5450
13
+ dbt/adapters/base/column.py,sha256=Uj20UixoxCn2rlv4QDNONyys6CDkDFyG3anCXKf0T2c,5350
15
14
  dbt/adapters/base/connections.py,sha256=-C5dOwGgMKH8n_v6wjwOxV7chBdS0GjOGwNQCUbhhWc,16951
16
- dbt/adapters/base/impl.py,sha256=Z0rdtNs-XQC_fhnfqtTLOj2-mSFIa0m-6XiVb0S8VPg,68879
15
+ dbt/adapters/base/impl.py,sha256=oRkaEUjLWLlisyLpxpjddDj7j0mjh5OWXwVgT0h6y14,69552
17
16
  dbt/adapters/base/meta.py,sha256=MMqL2xBqdvoacNs9JcL0E38NZIhCP4RH4OD_z_jo7GQ,4644
18
17
  dbt/adapters/base/plugin.py,sha256=rm0GjNHnWM2mn0GJOjciZLwn-02xlzWCoMT9u-epwP0,1076
19
18
  dbt/adapters/base/query_headers.py,sha256=UluGd9IYCYkoMiDi5Yx_lnrCOSjWppjwRro4SIGgx8I,3496
@@ -37,13 +36,22 @@ dbt/adapters/exceptions/cache.py,sha256=u720DQQKm8pyf_9loD9HGA9WgaeZAlg0sBn0sGc-
37
36
  dbt/adapters/exceptions/compilation.py,sha256=KAiCwxyE1B3PrxU-aHvpJp4h6fgEcZf44h4iVz__jFY,8586
38
37
  dbt/adapters/exceptions/connection.py,sha256=x82j2Ix242Slm6Ima8Tol3GLOB9yZYH5lq6IV1WKq54,445
39
38
  dbt/adapters/exceptions/database.py,sha256=nIXJdQyPQOZaiKvCkQ3MoKlKOiaN58rtDZflw3CSkug,1618
39
+ dbt/adapters/record/__init__.py,sha256=u_0eJzN5RL90oL-RNoP2wWGMCGp0kG0lZ0uVWnnGdxs,123
40
+ dbt/adapters/record/handle.py,sha256=mDsaNHZkUZMaLSg6QHSE11dbTrSLtfg9GRMcw2c2KAI,1011
41
+ dbt/adapters/record/cursor/cursor.py,sha256=rhk50XhOAWa4r1POSrb4-TX6MjJ-mwZfDsADxI41NYk,2412
42
+ dbt/adapters/record/cursor/description.py,sha256=5LNebP2AF2aicPWfM9FsD5r7SAmdac8TX_4NZfJQgPk,1060
43
+ dbt/adapters/record/cursor/execute.py,sha256=Y9HUVteOFbDtJJjZPQLny8UgKSs2OgNa19FS7w1bGRE,495
44
+ dbt/adapters/record/cursor/fetchall.py,sha256=YeDTh4DU-Iqw9hCoJfqlrgHq2hhhwpIi1Zxx_KU0M6U,2057
45
+ dbt/adapters/record/cursor/fetchmany.py,sha256=6PTkVa6xZs1g3M4OdqFrnrF9x0vrNJyVNk6rLbhd_Mg,502
46
+ dbt/adapters/record/cursor/fetchone.py,sha256=IKtzTMQjSeK3g0svtWMXLx_7OGx6HpbPh1zicuOqARA,483
47
+ dbt/adapters/record/cursor/rowcount.py,sha256=BuiRd_JpQTPN3YaGACfsXe1vmsvO4c49kCpIBZoG6hE,515
40
48
  dbt/adapters/relation_configs/README.md,sha256=VVeqMLbBWsBVNXHa9GLKLBN25Ivc8y78GR-6OB2tf4U,1809
41
49
  dbt/adapters/relation_configs/__init__.py,sha256=Il1HHEI8HJGHEi2B8qsgv_CoNA2STO7SULDi78fQwZg,354
42
50
  dbt/adapters/relation_configs/config_base.py,sha256=IK9oKf9TuOTLIiKX8ms_X-p4yxZvPAlM7qg94mozvrA,1756
43
51
  dbt/adapters/relation_configs/config_change.py,sha256=hf6fDWbZpKvZdM6z-OtY-GveipzfLRR_dsUZmYmXkdk,713
44
52
  dbt/adapters/relation_configs/config_validation.py,sha256=wlJUMwOEPhYFch-LRtEWfLNJMq8jL1tRhOUHmNX8nFw,1978
45
53
  dbt/adapters/sql/__init__.py,sha256=WLWZJfqc8pr1N1BMVe9gM-KQ4URJIeKfLqTuJBD1VN0,107
46
- dbt/adapters/sql/connections.py,sha256=ASxZtpPoM_EtmD_nfG0z5F8pTO5YsWfUBV7QKqx4cec,6628
54
+ dbt/adapters/sql/connections.py,sha256=JYML3G9Ro2rTa0Q5IujKaNzpiPRGrUDuzQH0qej7SmE,6472
47
55
  dbt/adapters/sql/impl.py,sha256=HmH3eC-qVeCAAukjEOnUNZbH-UK32X-NL4kwb_EHzs0,10763
48
56
  dbt/include/__init__.py,sha256=qEFeq3yuf3lQKVseALmL8aPM8fpCS54B_5pry00M3hk,76
49
57
  dbt/include/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -79,7 +87,7 @@ dbt/include/global_project/macros/materializations/models/clone/can_clone_table.
79
87
  dbt/include/global_project/macros/materializations/models/clone/clone.sql,sha256=X85U0zwq_OINxeZ7JDer9i3BgQZvgGM-tKTvITrQx5s,2716
80
88
  dbt/include/global_project/macros/materializations/models/clone/create_or_replace_clone.sql,sha256=qr33DwFOpRG0wGVsGvr63-MexYMNZC9xKdGOPmICp_c,367
81
89
  dbt/include/global_project/macros/materializations/models/incremental/column_helpers.sql,sha256=hslQlGKW0oW97srfugsFVRR-L6RrzRcnwr3uLhzI0X4,2577
82
- dbt/include/global_project/macros/materializations/models/incremental/incremental.sql,sha256=rUgR9ibjgw8ZFgbnZOKPW0Vv-G1shQ1FelPc7GWmkuA,4235
90
+ dbt/include/global_project/macros/materializations/models/incremental/incremental.sql,sha256=sS8XtG-T_-Gn1tCjSTFSlmJqkgu08-upWEs_UJ_RfXI,4377
83
91
  dbt/include/global_project/macros/materializations/models/incremental/is_incremental.sql,sha256=Sm1TqOeqcCQofj3REFcA97yukPB1J_mClDd55r5GewE,478
84
92
  dbt/include/global_project/macros/materializations/models/incremental/merge.sql,sha256=Xg5-Gc9jHego-wpdfg6yEIQv7EClz6-xcJEeFXuZiwQ,5197
85
93
  dbt/include/global_project/macros/materializations/models/incremental/on_schema_change.sql,sha256=EOgcrYhwOGVPnyaBu7kIfe8LTOYVOu-AhxMtBs8ETpQ,4927
@@ -119,7 +127,7 @@ dbt/include/global_project/macros/relations/view/create.sql,sha256=VXIsJWo4OZ_8k
119
127
  dbt/include/global_project/macros/relations/view/drop.sql,sha256=iFjhEwzip00TGd8h6T5UsXo4dK440EvgdKwR_j4XX78,497
120
128
  dbt/include/global_project/macros/relations/view/rename.sql,sha256=P4hpxlrR0wiBTZFJ8N3GyUUbqgKgMfgzUUbIWw8fui0,348
121
129
  dbt/include/global_project/macros/relations/view/replace.sql,sha256=cLqNkmTxAxsJS8g-dj4K6IikpjDGKlyCECA3nerPMzg,2593
122
- dbt/include/global_project/macros/unit_test_sql/get_fixture_sql.sql,sha256=lV-dTZmQQSl3YePl3fWqUF1Ntw5bYEzuNtJFby1JrMc,3873
130
+ dbt/include/global_project/macros/unit_test_sql/get_fixture_sql.sql,sha256=cNZhMdNOFBGftr9ij_2TY_GCUaKGMU5YVTcIb5jHBpo,4222
123
131
  dbt/include/global_project/macros/utils/any_value.sql,sha256=leK-fCUhDNt6MFkGofafYjv-0LtL0fkb3sJXe-aIorU,213
124
132
  dbt/include/global_project/macros/utils/array_append.sql,sha256=XsC-kchlWxVwc-_1CoBs1RkGYt8qsOAVbq5JlsV2WIc,357
125
133
  dbt/include/global_project/macros/utils/array_concat.sql,sha256=0c4w5kP1N_9BY-wppx1OBCCIDOsC1HhimkSDghjjx2Y,248
@@ -149,7 +157,7 @@ dbt/include/global_project/macros/utils/right.sql,sha256=EwNG98CAFIwNDmarwopf7Rk
149
157
  dbt/include/global_project/macros/utils/safe_cast.sql,sha256=1mswwkDACmIi1I99JKb_-vq3kjMe4HhMRV70mW8Bt4Y,298
150
158
  dbt/include/global_project/macros/utils/split_part.sql,sha256=fXEIS0oIiYR7-4lYbb0QbZdG-q2TpV63AFd1ky4I5UM,714
151
159
  dbt/include/global_project/tests/generic/builtin.sql,sha256=p94xdyPwb2TlxgLBqCfrcRfJ1QNgsjPvBm8f0Q5eqZM,1022
152
- dbt_adapters-1.3.3.dist-info/METADATA,sha256=2ie0XNbrgtb0_XHZ5TjI02hS7fXMsqY4mi6-se8rd9U,2539
153
- dbt_adapters-1.3.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
154
- dbt_adapters-1.3.3.dist-info/licenses/LICENSE,sha256=9yjigiJhWcCZvQjdagGKDwrRph58QWc5P2bVSQwXo6s,11344
155
- dbt_adapters-1.3.3.dist-info/RECORD,,
160
+ dbt_adapters-1.4.0.dist-info/METADATA,sha256=vteZlPYemCmBasPM4IcdAuSjJwzOgc4AOBz1AkGJGGw,2547
161
+ dbt_adapters-1.4.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
162
+ dbt_adapters-1.4.0.dist-info/licenses/LICENSE,sha256=9yjigiJhWcCZvQjdagGKDwrRph58QWc5P2bVSQwXo6s,11344
163
+ dbt_adapters-1.4.0.dist-info/RECORD,,
dbt/adapters/record.py DELETED
@@ -1,67 +0,0 @@
1
- import dataclasses
2
- from io import StringIO
3
- import json
4
- import re
5
- from typing import Any, Optional, Mapping
6
-
7
- from agate import Table
8
-
9
- from dbt_common.events.contextvars import get_node_info
10
- from dbt_common.record import Record, Recorder
11
-
12
- from dbt.adapters.contracts.connection import AdapterResponse
13
-
14
-
15
- @dataclasses.dataclass
16
- class QueryRecordParams:
17
- sql: str
18
- auto_begin: bool = False
19
- fetch: bool = False
20
- limit: Optional[int] = None
21
- node_unique_id: Optional[str] = None
22
-
23
- def __post_init__(self) -> None:
24
- if self.node_unique_id is None:
25
- node_info = get_node_info()
26
- self.node_unique_id = node_info["unique_id"] if node_info else ""
27
-
28
- @staticmethod
29
- def _clean_up_sql(sql: str) -> str:
30
- sql = re.sub(r"--.*?\n", "", sql) # Remove single-line comments (--)
31
- sql = re.sub(r"/\*.*?\*/", "", sql, flags=re.DOTALL) # Remove multi-line comments (/* */)
32
- return sql.replace(" ", "").replace("\n", "")
33
-
34
- def _matches(self, other: "QueryRecordParams") -> bool:
35
- return self.node_unique_id == other.node_unique_id and self._clean_up_sql(
36
- self.sql
37
- ) == self._clean_up_sql(other.sql)
38
-
39
-
40
- @dataclasses.dataclass
41
- class QueryRecordResult:
42
- adapter_response: Optional["AdapterResponse"]
43
- table: Optional[Table]
44
-
45
- def _to_dict(self) -> Any:
46
- buf = StringIO()
47
- self.table.to_json(buf) # type: ignore
48
-
49
- return {
50
- "adapter_response": self.adapter_response.to_dict(), # type: ignore
51
- "table": buf.getvalue(),
52
- }
53
-
54
- @classmethod
55
- def _from_dict(cls, dct: Mapping) -> "QueryRecordResult":
56
- return QueryRecordResult(
57
- adapter_response=AdapterResponse.from_dict(dct["adapter_response"]),
58
- table=Table.from_object(json.loads(dct["table"])),
59
- )
60
-
61
-
62
- class QueryRecord(Record):
63
- params_cls = QueryRecordParams
64
- result_cls = QueryRecordResult
65
-
66
-
67
- Recorder.register_record_type(QueryRecord)