This is an automated email from the ASF dual-hosted git repository.
eschutho pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 44be9b819dd fix(bigquery): return empty extra metadata instead of 500
when table is not found (#45634)
44be9b819dd is described below
commit 44be9b819ddee9cbe15645ebb5fe61a26fb24a9e
Author: Elizabeth Thompson <[email protected]>
AuthorDate: Thu Oct 22 15:01:30 2026 -0700
fix(bigquery): return empty extra metadata instead of 500 when table is not
found (#45634)
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
---
superset/db_engine_specs/bigquery.py | 15 ++++-
tests/unit_tests/db_engine_specs/test_bigquery.py | 70 +++++++++++++++++++++++
2 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/superset/db_engine_specs/bigquery.py
b/superset/db_engine_specs/bigquery.py
index c31c4f6fbd0..153df579528 100644
--- a/superset/db_engine_specs/bigquery.py
+++ b/superset/db_engine_specs/bigquery.py
@@ -639,8 +639,19 @@ class BigQueryEngineSpec(BaseEngineSpec): # pylint:
disable=too-many-public-met
database: Database,
table: Table,
) -> dict[str, Any]:
- payload = {}
- partition_column = cls.get_time_partition_column(database, table)
+ from google.api_core.exceptions import NotFound
+
+ payload: dict[str, Any] = {}
+ try:
+ partition_column = cls.get_time_partition_column(database, table)
+ except NotFound:
+ # The table was dropped/renamed (or is otherwise not resolvable);
+ # partition metadata is optional enrichment, so degrade gracefully.
+ logger.warning(
+ "BigQuery table %s not found while fetching extra metadata",
+ table,
+ )
+ return payload
with cls.get_engine(
database, catalog=table.catalog, schema=table.schema
) as engine:
diff --git a/tests/unit_tests/db_engine_specs/test_bigquery.py
b/tests/unit_tests/db_engine_specs/test_bigquery.py
index 0ae44ab09c7..610c38bec24 100644
--- a/tests/unit_tests/db_engine_specs/test_bigquery.py
+++ b/tests/unit_tests/db_engine_specs/test_bigquery.py
@@ -530,6 +530,76 @@ def
test_get_time_partition_column_uses_catalog_in_table_reference(
client.get_table.assert_called_once_with("other_project.my_dataset.my_table")
+def test_get_extra_table_metadata_table_not_found(mocker: MockerFixture) ->
None:
+ """
+ Test that a missing table yields empty extra metadata instead of raising.
+ """
+ from google.api_core.exceptions import NotFound
+
+ from superset.db_engine_specs.bigquery import BigQueryEngineSpec
+
+ mocker.patch.object(
+ BigQueryEngineSpec,
+ "get_time_partition_column",
+ side_effect=NotFound("table gone"),
+ )
+
+ result = BigQueryEngineSpec.get_extra_table_metadata(
+ mock.Mock(), Table("my_table", "my_dataset", "my_project")
+ )
+
+ assert result == {}
+
+
+def test_get_extra_table_metadata_other_errors_propagate(
+ mocker: MockerFixture,
+) -> None:
+ """
+ Test that errors other than NotFound (e.g. 403) are not swallowed.
+ """
+ from google.api_core.exceptions import Forbidden
+
+ from superset.db_engine_specs.bigquery import BigQueryEngineSpec
+
+ mocker.patch.object(
+ BigQueryEngineSpec,
+ "get_time_partition_column",
+ side_effect=Forbidden("denied"),
+ )
+
+ with pytest.raises(Forbidden):
+ BigQueryEngineSpec.get_extra_table_metadata(
+ mock.Mock(), Table("my_table", "my_dataset", "my_project")
+ )
+
+
+def test_get_extra_table_metadata_partitioned(mocker: MockerFixture) -> None:
+ """
+ Test that partitioned tables still return partition metadata.
+ """
+ from superset.db_engine_specs.bigquery import BigQueryEngineSpec
+
+ mocker.patch.object(
+ BigQueryEngineSpec, "get_time_partition_column", return_value="ds"
+ )
+ mocker.patch.object(
+ BigQueryEngineSpec, "get_max_partition_id", return_value="20240101"
+ )
+ mocker.patch.object(BigQueryEngineSpec, "select_star",
return_value="SELECT 1")
+ mocker.patch.object(BigQueryEngineSpec, "get_engine")
+
+ result = BigQueryEngineSpec.get_extra_table_metadata(
+ mock.Mock(), Table("my_table", "my_dataset", "my_project")
+ )
+
+ assert result["partitions"] == {
+ "cols": ["ds"],
+ "latest": {"ds": "20240101"},
+ "partitionQuery": "SELECT 1",
+ }
+ assert result["indexes"][0]["cols"] == ["ds"]
+
+
def test_adjust_engine_params_catalog_as_host() -> None:
"""
Test passing a custom catalog.