diff --git a/dbt-bigquery/.changes/unreleased/Features-20250209-123750.yaml b/dbt-bigquery/.changes/unreleased/Features-20250209-123750.yaml new file mode 100644 index 000000000..386857699 --- /dev/null +++ b/dbt-bigquery/.changes/unreleased/Features-20250209-123750.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Make expiration of temp table dynamic, based on model timeout. +time: 2025-02-09T12:37:50.314467072+01:00 +custom: + Author: gjskibinski + Issue: "805" diff --git a/dbt-bigquery/src/dbt/adapters/bigquery/impl.py b/dbt-bigquery/src/dbt/adapters/bigquery/impl.py index 51c457129..073faa5a4 100644 --- a/dbt-bigquery/src/dbt/adapters/bigquery/impl.py +++ b/dbt-bigquery/src/dbt/adapters/bigquery/impl.py @@ -144,6 +144,9 @@ class BigQueryAdapter(BaseAdapter): def __init__(self, config, mp_context: SpawnContext) -> None: super().__init__(config, mp_context) self.connections: BigQueryConnectionManager = self.connections + self.job_execution_timeout_seconds: int = int( + self.config.credentials.job_execution_timeout_seconds or 60 * 60 * 12 + ) ### # Implementations of abstract methods @@ -774,7 +777,9 @@ def get_table_options( opts["kms_key_name"] = f"'{config.get('kms_key_name')}'" if temporary: - opts["expiration_timestamp"] = "TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 12 hour)" + opts["expiration_timestamp"] = ( + f"TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL {self.job_execution_timeout_seconds} second)" + ) else: # It doesn't apply the `require_partition_filter` option for a temporary table # so that we avoid the error by not specifying a partition with a temporary table diff --git a/dbt-bigquery/tests/unit/test_bigquery_adapter.py b/dbt-bigquery/tests/unit/test_bigquery_adapter.py index e57db9a62..3bc74e934 100644 --- a/dbt-bigquery/tests/unit/test_bigquery_adapter.py +++ b/dbt-bigquery/tests/unit/test_bigquery_adapter.py @@ -775,14 +775,14 @@ def test_hours_to_expiration(self): actual = adapter.get_table_options(mock_config, node={}, temporary=False) self.assertEqual(expected, actual) - def test_hours_to_expiration_temporary(self): + def test_seconds_to_expiration_temporary(self): adapter = self.get_adapter("oauth") mock_config = create_autospec(RuntimeConfigObject) config = {"hours_to_expiration": 4} mock_config.get.side_effect = lambda name: config.get(name) expected = { - "expiration_timestamp": ("TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 12 hour)"), + "expiration_timestamp": ("TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 43200 second)"), } actual = adapter.get_table_options(mock_config, node={}, temporary=True) self.assertEqual(expected, actual)