Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.

Commit 2c7220a

Browse files
case insensitive check on partition matching (#888)
* case insensitive check on partition matching * Review change --------- Co-authored-by: Christophe Oudar <[email protected]>
1 parent f2525cc commit 2c7220a

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Fixes
2+
body: case insensitive check on partition matching
3+
time: 2023-08-18T21:46:16.828488+02:00
4+
custom:
5+
Author: Kayrnt
6+
Issue: "886"

dbt/adapters/bigquery/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from dbt.adapters.bigquery.connections import BigQueryCredentials
33
from dbt.adapters.bigquery.relation import BigQueryRelation # noqa
44
from dbt.adapters.bigquery.column import BigQueryColumn # noqa
5-
from dbt.adapters.bigquery.impl import BigQueryAdapter, GrantTarget # noqa
5+
from dbt.adapters.bigquery.impl import BigQueryAdapter, GrantTarget, PartitionConfig # noqa
66

77
from dbt.adapters.base import AdapterPlugin
88
from dbt.include import bigquery

dbt/adapters/bigquery/impl.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,12 +620,13 @@ def _partitions_match(table, conf_partition: Optional[PartitionConfig]) -> bool:
620620
table_field = (
621621
table.time_partitioning.field.lower() if table.time_partitioning.field else None
622622
)
623+
623624
table_granularity = table.partitioning_type
624625
conf_table_field = conf_partition.field
625626
return (
626-
table_field == conf_table_field
627+
table_field == conf_table_field.lower()
627628
or (conf_partition.time_ingestion_partitioning and table_field is not None)
628-
) and table_granularity == conf_partition.granularity
629+
) and table_granularity.lower() == conf_partition.granularity.lower()
629630
elif conf_partition and table.range_partitioning is not None:
630631
dest_part = table.range_partitioning
631632
conf_part = conf_partition.range or {}

tests/unit/test_bigquery_adapter.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212

1313
import dbt.dataclass_schema
1414

15+
from dbt.adapters.bigquery import PartitionConfig
1516
from dbt.adapters.bigquery import BigQueryCredentials
1617
from dbt.adapters.bigquery import BigQueryAdapter
1718
from dbt.adapters.bigquery import BigQueryRelation
1819
from dbt.adapters.bigquery import Plugin as BigQueryPlugin
20+
from google.cloud.bigquery.table import Table
1921
from dbt.adapters.bigquery.connections import BigQueryConnectionManager
2022
from dbt.adapters.bigquery.connections import _sanitize_label, _VALIDATE_LABEL_LENGTH_LIMIT
2123
from dbt.adapters.base.query_headers import MacroQueryStringSetter
@@ -376,7 +378,10 @@ def test_location_user_agent(self, mock_bq, mock_auth_default):
376378
mock_client.assert_not_called()
377379
connection.handle
378380
mock_client.assert_called_once_with(
379-
"dbt-unit-000000", creds, location="Luna Station", client_info=HasUserAgent()
381+
"dbt-unit-000000",
382+
creds,
383+
location="Luna Station",
384+
client_info=HasUserAgent(),
380385
)
381386

382387

@@ -1023,6 +1028,30 @@ def test_convert_time_type(self):
10231028
for col_idx, expect in enumerate(expected):
10241029
assert BigQueryAdapter.convert_time_type(agate_table, col_idx) == expect
10251030

1031+
# The casing in this case can't be enforced on the API side,
1032+
# so we have to validate that we have a case-insensitive comparison
1033+
def test_partitions_match(self):
1034+
table = Table.from_api_repr(
1035+
{
1036+
"tableReference": {
1037+
"projectId": "test-project",
1038+
"datasetId": "test_dataset",
1039+
"tableId": "test_table",
1040+
},
1041+
"timePartitioning": {"type": "DAY", "field": "ts"},
1042+
}
1043+
)
1044+
partition_config = PartitionConfig.parse(
1045+
{
1046+
"field": "TS",
1047+
"data_type": "date",
1048+
"granularity": "day",
1049+
"time_ingestion_partitioning": False,
1050+
"copy_partitions": False,
1051+
}
1052+
)
1053+
assert BigQueryAdapter._partitions_match(table, partition_config) is True
1054+
10261055

10271056
class TestBigQueryGrantAccessTo(BaseTestBigQueryAdapter):
10281057
entity = BigQueryRelation.from_dict(

0 commit comments

Comments
 (0)