From 5cd881f207b17c6179924651a2a29611a3e4c278 Mon Sep 17 00:00:00 2001 From: Alex Clavel Date: Wed, 1 Feb 2023 20:58:32 +0000 Subject: [PATCH 1/2] Fix: Make cte_alias a property of db engine spec --- superset/connectors/sqla/models.py | 4 ++-- superset/db_engine_specs/base.py | 8 +++----- superset/models/helpers.py | 3 +-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index c5fd025f4ee2..c616f2177bb1 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -89,7 +89,7 @@ validate_adhoc_subquery, ) from superset.datasets.models import Dataset as NewDataset -from superset.db_engine_specs.base import BaseEngineSpec, CTE_ALIAS, TimestampExpression +from superset.db_engine_specs.base import BaseEngineSpec, TimestampExpression from superset.exceptions import ( AdvancedDataTypeResponseError, DatasetInvalidPermissionEvaluationException, @@ -904,7 +904,7 @@ def get_from_clause( cte = self.db_engine_spec.get_cte_query(from_sql) from_clause = ( - table(CTE_ALIAS) + table(self.db_engine_spec.cte_alias) if cte else TextAsFrom(self.text(from_sql), []).alias(VIRTUAL_TABLE_ALIAS) ) diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 1aab100c816b..3e065578ced0 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -85,10 +85,6 @@ logger = logging.getLogger() - -CTE_ALIAS = "__cte" - - class TimeGrain(NamedTuple): name: str # TODO: redundant field, remove label: str @@ -344,6 +340,8 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods # If True, then it will allow in subquery , # if False it will allow as regular CTE allows_cte_in_subquery = True + # Define alias for CTE + cte_alias = "__cte" # Whether allow LIMIT clause in the SQL # If True, then the database engine is allowed for LIMIT clause # If False, then the database engine is allowed for TOP clause @@ -887,7 +885,7 @@ def get_cte_query(cls, sql: str) -> Optional[str]: # extract rest of the SQLs after CTE remainder = "".join(str(token) for token in stmt.tokens[idx:]).strip() - return f"WITH {token.value},\n{CTE_ALIAS} AS (\n{remainder}\n)" + return f"WITH {token.value},\n{cls.cte_alias} AS (\n{remainder}\n)" return None diff --git a/superset/models/helpers.py b/superset/models/helpers.py index fd0a1eff5ca7..3827c572e74b 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -98,7 +98,6 @@ config = app.config logger = logging.getLogger(__name__) -CTE_ALIAS = "__cte" VIRTUAL_TABLE_ALIAS = "virtual_table" ADVANCED_DATA_TYPES = config["ADVANCED_DATA_TYPES"] @@ -1046,7 +1045,7 @@ def get_from_clause( cte = self.db_engine_spec.get_cte_query(from_sql) from_clause = ( - sa.table(CTE_ALIAS) + sa.table(self.db_engine_spec.cte_alias) if cte else TextAsFrom(self.text(from_sql), []).alias(VIRTUAL_TABLE_ALIAS) ) From 2776820df4d8b28d1989e948a3da176964063188 Mon Sep 17 00:00:00 2001 From: Alex Clavel Date: Wed, 1 Feb 2023 21:21:19 +0000 Subject: [PATCH 2/2] Reformatting --- superset/db_engine_specs/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 3e065578ced0..839c38eb3096 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -85,6 +85,7 @@ logger = logging.getLogger() + class TimeGrain(NamedTuple): name: str # TODO: redundant field, remove label: str