diff --git a/superset/db_engine_specs/postgres.py b/superset/db_engine_specs/postgres.py index e52e69d7e8727..352c9f466b817 100644 --- a/superset/db_engine_specs/postgres.py +++ b/superset/db_engine_specs/postgres.py @@ -310,7 +310,7 @@ def get_catalog_names( SELECT datname FROM pg_database WHERE datistemplate = false; """ - ).fetchall() + ) ) @classmethod diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py index c0b4f2c6dd881..a9b4f7aa60d61 100644 --- a/superset/db_engine_specs/presto.py +++ b/superset/db_engine_specs/presto.py @@ -785,6 +785,17 @@ def get_view_names( results = cursor.fetchall() return {row[0] for row in results} + @classmethod + def get_catalog_names( + cls, + database: Database, + inspector: Inspector, + ) -> List[str]: + """ + Get all catalogs. + """ + return [catalog for (catalog,) in inspector.bind.execute("SHOW CATALOGS")] + @classmethod def _create_column_info( cls, name: str, data_type: types.TypeEngine diff --git a/tests/integration_tests/db_engine_specs/presto_tests.py b/tests/integration_tests/db_engine_specs/presto_tests.py index 78b552ecb8635..4fe74c0ca32f4 100644 --- a/tests/integration_tests/db_engine_specs/presto_tests.py +++ b/tests/integration_tests/db_engine_specs/presto_tests.py @@ -19,12 +19,14 @@ from unittest import mock, skipUnless import pandas as pd +from flask.ctx import AppContext from sqlalchemy import types from sqlalchemy.sql import select from superset.db_engine_specs.presto import PrestoEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.sql_parse import ParsedQuery +from superset.utils.database import get_example_database from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec @@ -1032,3 +1034,22 @@ def is_readonly(sql: str) -> bool: assert is_readonly("EXPLAIN SELECT 1") assert is_readonly("SELECT 1") assert is_readonly("WITH (SELECT 1) bla SELECT * from bla") + + +def test_get_catalog_names(app_context: AppContext) -> None: + """ + Test the ``get_catalog_names`` method. + """ + database = get_example_database() + + if database.backend != "presto": + return + + with database.get_inspector_with_context() as inspector: + assert PrestoEngineSpec.get_catalog_names(database, inspector) == [ + "jmx", + "memory", + "system", + "tpcds", + "tpch", + ]