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.

Reply via email to