You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2025/06/12 19:59:07 UTC
(superset) branch fix-select-star created (now fb4c605da7)
This is an automated email from the ASF dual-hosted git repository.
beto pushed a change to branch fix-select-star
in repository https://gitbox.apache.org/repos/asf/superset.git
at fb4c605da7 fix: select star
This branch includes the following new commits:
new fb4c605da7 fix: select star
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(superset) 01/01: fix: select star
Posted by be...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch fix-select-star
in repository https://gitbox.apache.org/repos/asf/superset.git
commit fb4c605da7ab219722984d7f7145c26f8fee54e3
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Thu Jun 12 15:58:55 2025 -0400
fix: select star
---
superset/db_engine_specs/base.py | 5 ++-
superset/db_engine_specs/hive.py | 3 ++
tests/unit_tests/db_engine_specs/test_base.py | 4 +--
tests/unit_tests/db_engine_specs/test_hive.py | 41 +++++++++++++++++++++++
tests/unit_tests/db_engine_specs/test_postgres.py | 38 +++++++++++++++++++++
5 files changed, 88 insertions(+), 3 deletions(-)
diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py
index 46786fdf65..e3ffdd335d 100644
--- a/superset/db_engine_specs/base.py
+++ b/superset/db_engine_specs/base.py
@@ -1546,7 +1546,7 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods
cols: list[ResultSetColumnType] | None = None,
) -> str:
"""
- Generate a "SELECT * from [schema.]table_name" query with appropriate limit.
+ Generate a "SELECT * from [catalog.][schema.]table_name" query with limit.
WARNING: expects only unquoted table and schema names.
@@ -1560,6 +1560,9 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods
:param cols: Columns to include in query
:return: SQL query
"""
+ if not cls.supports_cross_catalog_queries:
+ table = Table(table.table, table.schema, None)
+
# pylint: disable=redefined-outer-name
fields: str | list[Any] = "*"
cols = cols or []
diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py
index 2297e2572b..34ac2aa0ac 100644
--- a/superset/db_engine_specs/hive.py
+++ b/superset/db_engine_specs/hive.py
@@ -498,6 +498,9 @@ class HiveEngineSpec(PrestoEngineSpec):
latest_partition: bool = True,
cols: list[ResultSetColumnType] | None = None,
) -> str:
+ # remove catalog from table name if it exists
+ table = Table(table.table, table.schema, None)
+
return super(PrestoEngineSpec, cls).select_star(
database,
table,
diff --git a/tests/unit_tests/db_engine_specs/test_base.py b/tests/unit_tests/db_engine_specs/test_base.py
index 5ccbc7d627..95261ba046 100644
--- a/tests/unit_tests/db_engine_specs/test_base.py
+++ b/tests/unit_tests/db_engine_specs/test_base.py
@@ -206,7 +206,7 @@ def test_select_star(mocker: MockerFixture) -> None:
sql = BaseEngineSpec.select_star(
database=database,
- table=Table("my_table"),
+ table=Table("my_table", "my_schema", "my_catalog"),
engine=engine,
limit=100,
show_cols=True,
@@ -214,7 +214,7 @@ def test_select_star(mocker: MockerFixture) -> None:
latest_partition=False,
cols=cols,
)
- assert sql == "SELECT\n a\nFROM my_table\nLIMIT ?\nOFFSET ?"
+ assert sql == "SELECT\n a\nFROM my_schema.my_table\nLIMIT ?\nOFFSET ?"
def test_extra_table_metadata(mocker: MockerFixture) -> None:
diff --git a/tests/unit_tests/db_engine_specs/test_hive.py b/tests/unit_tests/db_engine_specs/test_hive.py
index e534259d2c..f491e097d6 100644
--- a/tests/unit_tests/db_engine_specs/test_hive.py
+++ b/tests/unit_tests/db_engine_specs/test_hive.py
@@ -20,8 +20,11 @@ from datetime import datetime
from typing import Optional
import pytest
+from pytest_mock import MockerFixture
+from sqlalchemy.engine.interfaces import Dialect
from sqlalchemy.engine.url import make_url
+from superset.sql.parse import Table
from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm
from tests.unit_tests.fixtures.common import dttm # noqa: F401
@@ -59,3 +62,41 @@ def test_get_schema_from_engine_params() -> None:
)
== "default"
)
+
+
+def test_select_star(mocker: MockerFixture) -> None:
+ """
+ Test the ``select_star`` method.
+ """
+ from superset.db_engine_specs.hive import HiveEngineSpec
+
+ database = mocker.MagicMock()
+ engine = mocker.MagicMock()
+
+ def quote_table(table: Table, dialect: Dialect) -> str:
+ return ".".join(
+ part for part in (table.catalog, table.schema, table.table) if part
+ )
+
+ mocker.patch.object(HiveEngineSpec, "quote_table", quote_table)
+
+ HiveEngineSpec.select_star(
+ database=database,
+ table=Table("my_table", "my_schema", "my_catalog"),
+ engine=engine,
+ limit=100,
+ show_cols=False,
+ indent=True,
+ latest_partition=False,
+ cols=None,
+ )
+
+ query = database.compile_sqla_query.mock_calls[0][1][0]
+ assert (
+ str(query)
+ == """
+SELECT *
+FROM my_schema.my_table
+ LIMIT :param_1
+ """.strip()
+ )
diff --git a/tests/unit_tests/db_engine_specs/test_postgres.py b/tests/unit_tests/db_engine_specs/test_postgres.py
index b93d70f5f7..06d71e8835 100644
--- a/tests/unit_tests/db_engine_specs/test_postgres.py
+++ b/tests/unit_tests/db_engine_specs/test_postgres.py
@@ -22,10 +22,12 @@ import pytest
from pytest_mock import MockerFixture
from sqlalchemy import column, types
from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION, ENUM, JSON
+from sqlalchemy.engine.interfaces import Dialect
from sqlalchemy.engine.url import make_url
from superset.db_engine_specs.postgres import PostgresEngineSpec as spec # noqa: N813
from superset.exceptions import SupersetSecurityException
+from superset.sql.parse import Table
from superset.utils.core import GenericDataType
from tests.unit_tests.db_engine_specs.utils import (
assert_column_spec,
@@ -243,3 +245,39 @@ def test_timegrain_expressions(time_grain: str, expected_result: str) -> None:
spec.get_timestamp_expr(col=column("col"), pdf=None, time_grain=time_grain)
)
assert actual == expected_result
+
+
+def test_select_star(mocker: MockerFixture) -> None:
+ """
+ Test the ``select_star`` method.
+ """
+ database = mocker.MagicMock()
+ engine = mocker.MagicMock()
+
+ def quote_table(table: Table, dialect: Dialect) -> str:
+ return ".".join(
+ part for part in (table.catalog, table.schema, table.table) if part
+ )
+
+ mocker.patch.object(spec, "quote_table", quote_table)
+
+ spec.select_star(
+ database=database,
+ table=Table("my_table", "my_schema", "my_catalog"),
+ engine=engine,
+ limit=100,
+ show_cols=False,
+ indent=True,
+ latest_partition=False,
+ cols=None,
+ )
+
+ query = database.compile_sqla_query.mock_calls[0][1][0]
+ assert (
+ str(query)
+ == """
+SELECT *
+FROM my_schema.my_table
+ LIMIT :param_1
+ """.strip()
+ )