From f5434614d2674d443994366577780969c5070036 Mon Sep 17 00:00:00 2001 From: Ben Knight Date: Wed, 20 May 2026 10:05:27 +0000 Subject: [PATCH 1/2] Update adapter to dbt 1.10. Bump package and dbt-core constraints to the 1.10 line, align dbt-common/dbt-adapters/dbt-tests-adapter floors with dbt-core 1.10's own pins, switch the event_time_filter cast from datetimeoffset to datetime2 (the literal dbt emits is not a valid datetimeoffset on SQL Server), and add the BaseSampleModeTest functional test. Iceberg / catalog integration is intentionally not implemented. --- dbt/adapters/sqlserver/__version__.py | 2 +- dbt/adapters/sqlserver/sqlserver_relation.py | 8 ++-- pyproject.toml | 8 ++-- .../adapter/dbt/test_sample_mode.py | 43 +++++++++++++++++++ 4 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 tests/functional/adapter/dbt/test_sample_mode.py diff --git a/dbt/adapters/sqlserver/__version__.py b/dbt/adapters/sqlserver/__version__.py index 702279763..bd1378f42 100644 --- a/dbt/adapters/sqlserver/__version__.py +++ b/dbt/adapters/sqlserver/__version__.py @@ -1 +1 @@ -version = "1.9.1" +version = "1.10.0" diff --git a/dbt/adapters/sqlserver/sqlserver_relation.py b/dbt/adapters/sqlserver/sqlserver_relation.py index fcea00703..62eadbec6 100644 --- a/dbt/adapters/sqlserver/sqlserver_relation.py +++ b/dbt/adapters/sqlserver/sqlserver_relation.py @@ -58,19 +58,19 @@ def _render_event_time_filtered(self, event_time_filter: EventTimeFilter) -> str if event_time_filter.start and event_time_filter.end: filter = ( f"{event_time_filter.field_name} >=" - f" cast('{event_time_filter.start}' as datetimeoffset)" + f" cast('{event_time_filter.start}' as datetime2)" f" and {event_time_filter.field_name} <" - f" cast('{event_time_filter.end}' as datetimeoffset)" + f" cast('{event_time_filter.end}' as datetime2)" ) elif event_time_filter.start: filter = ( f"{event_time_filter.field_name} >=" - f" cast('{event_time_filter.start}' as datetimeoffset)" + f" cast('{event_time_filter.start}' as datetime2)" ) elif event_time_filter.end: filter = ( f"{event_time_filter.field_name} <" - f" cast('{event_time_filter.end}' as datetimeoffset)" + f" cast('{event_time_filter.end}' as datetime2)" ) return filter diff --git a/pyproject.toml b/pyproject.toml index 069a684c8..15ea5b629 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,9 +27,9 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "dbt-core>=1.9.0,<2.0", - "dbt-common>=1.0,<2.0", - "dbt-adapters>=1.11.0,<2.0", + "dbt-core>=1.10.0,<1.11.0", + "dbt-common>=1.22.0,<2.0", + "dbt-adapters>=1.15.2,<2.0", ] dynamic = ["version"] @@ -43,7 +43,7 @@ pyodbc = [ [dependency-groups] dev = [ - "dbt-tests-adapter>=1.9.0,<2.0", + "dbt-tests-adapter>=1.15.0,<2.0", "azure-identity>=1.12.0", "build", "bumpversion", diff --git a/tests/functional/adapter/dbt/test_sample_mode.py b/tests/functional/adapter/dbt/test_sample_mode.py new file mode 100644 index 000000000..6800c1e34 --- /dev/null +++ b/tests/functional/adapter/dbt/test_sample_mode.py @@ -0,0 +1,43 @@ +import os +from unittest import mock + +import freezegun +import pytest + +from dbt.tests.adapter.sample_mode.test_sample_mode import BaseSampleModeTest +from dbt.tests.util import run_dbt + +# BaseSampleModeTest.test_sample_mode uses @freezegun.freeze_time("2025-01-03T02:03:0Z"). +# Align static dates so the "1 day" sample window +# [2025-01-02 02:03:00, 2025-01-03 02:03:00) selects exactly two rows. +_input_model_sql = """ +{{ config(materialized='table', event_time='event_time') }} +select 1 as id, cast('2025-01-01 02:03:00' as datetime2) as event_time +UNION ALL +select 2 as id, cast('2025-01-02 14:03:00' as datetime2) as event_time +UNION ALL +select 3 as id, cast('2025-01-03 02:02:59' as datetime2) as event_time +""" + + +class TestSQLServerSampleMode(BaseSampleModeTest): + @pytest.fixture(scope="class") + def input_model_sql(self) -> str: + return _input_model_sql + + @mock.patch.dict(os.environ, {"DBT_EXPERIMENTAL_SAMPLE_MODE": "True"}) + @freezegun.freeze_time("2025-01-03T02:03:0Z") + def test_sample_mode(self, project) -> None: + _ = run_dbt(["run"]) + self.assert_row_count( + project=project, + relation_name="model_that_samples_input_sql", + expected_row_count=3, + ) + + _ = run_dbt(["run", "--sample=1 day"]) + self.assert_row_count( + project=project, + relation_name="model_that_samples_input_sql", + expected_row_count=2, + ) From 3332827d11b4434b4786ad70388ad8806b140ec4 Mon Sep 17 00:00:00 2001 From: Ben Knight Date: Wed, 20 May 2026 10:23:36 +0000 Subject: [PATCH 2/2] Bump freezegun to >=1.5.0 for Python 3.13 compatibility. freezegun 1.4.0 monkey-patches uuid._uuid_generate_time and uuid._load_system_functions at import. Python 3.13 removed those internals, so `import freezegun` raises AttributeError during test collection. CI runs on Python 3.13 and was failing to collect test_sample_mode.py; 1.5.0 dropped the dependency on those internals. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 15ea5b629..81b075117 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dev = [ "build", "bumpversion", "flaky", - "freezegun==1.4.0", + "freezegun>=1.5.0,<2.0", "ipdb", "mypy==1.11.2", "pre-commit",