diff --git a/superset/sql_lab.py b/superset/sql_lab.py index 527be41773a..259b464b128 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -495,7 +495,7 @@ def execute_sql_statements( # noqa: C901 # `False` here) would never fire. Mutate each statement here, before # joining them into the single block this engine requires, so # `MUTATE_AFTER_SPLIT=True` still applies the mutator per statement. - blocks = [ + blocks: list[str] = [ ";\n".join( database.mutate_sql_based_on_config( statement.format(comments=db_engine_spec.allows_sql_comments), diff --git a/tests/unit_tests/sql/execution/conftest.py b/tests/unit_tests/sql/execution/conftest.py index f8aed71ae1a..22a0bbff22d 100644 --- a/tests/unit_tests/sql/execution/conftest.py +++ b/tests/unit_tests/sql/execution/conftest.py @@ -77,6 +77,11 @@ def mock_query() -> MagicMock: return query +def _passthrough_mutate_sql_based_on_config(sql: str, **kwargs: Any) -> str: + """Mirror the real `Database.mutate_sql_based_on_config` no-op default.""" + return sql + + @pytest.fixture def mock_database() -> MagicMock: """Create a mock Database.""" @@ -97,7 +102,9 @@ def mock_database() -> MagicMock: # Mirrors the real `Database.mutate_sql_based_on_config` default (no-op # when no `SQL_QUERY_MUTATOR` is configured), so SQL parsed from its # return value stays valid instead of an un-parseable `MagicMock`. - database.mutate_sql_based_on_config = MagicMock(side_effect=lambda sql, **kw: sql) + database.mutate_sql_based_on_config = MagicMock( + side_effect=_passthrough_mutate_sql_based_on_config + ) return database diff --git a/tests/unit_tests/sql/execution/test_executor.py b/tests/unit_tests/sql/execution/test_executor.py index 12e234710be..910b843856d 100644 --- a/tests/unit_tests/sql/execution/test_executor.py +++ b/tests/unit_tests/sql/execution/test_executor.py @@ -47,7 +47,11 @@ from superset.models.core import Database # Note: database, database_with_dml, mock_db_session fixtures and # mock_query_execution helper are imported from conftest.py -from .conftest import create_mock_cursor, mock_query_execution +from .conftest import ( + _passthrough_mutate_sql_based_on_config, + create_mock_cursor, + mock_query_execution, +) # ============================================================================= # Basic Execution Tests @@ -889,14 +893,16 @@ def test_execute_sql_with_cursor_forwards_is_split( """ from superset.sql.execution.executor import execute_sql_with_cursor - mutate_mock = mocker.patch.object( - database, "mutate_sql_based_on_config", side_effect=lambda sql, **kw: sql + mutate_mock: MagicMock = mocker.patch.object( + database, + "mutate_sql_based_on_config", + side_effect=_passthrough_mutate_sql_based_on_config, ) mocker.patch.object(database.db_engine_spec, "execute") mocker.patch.object(database.db_engine_spec, "fetch_data", return_value=[(1,)]) mocker.patch("superset.result_set.SupersetResultSet", return_value=MagicMock()) - cursor = create_mock_cursor(["id"], data=[(1,)]) + cursor: MagicMock = create_mock_cursor(["id"], data=[(1,)]) execute_sql_with_cursor( database=database,