diff --git a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py index 5147cf20dc1..916de39cd6a 100644 --- a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py +++ b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py @@ -30,7 +30,6 @@ from superset.db_engine_specs.base import ( from superset.db_engine_specs.mysql import MySQLEngineSpec from superset.db_engine_specs.sqlite import SqliteEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType -from superset.sql.parse import SQLScript from superset.sql_parse import Table from superset.utils.database import get_example_database from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec @@ -311,20 +310,6 @@ class TestDbEngineSpecs(TestDbEngineSpec): ) -def test_is_readonly(): - def is_readonly(sql: str) -> bool: - return not SQLScript(sql, engine=BaseEngineSpec.engine).has_mutation() - - assert is_readonly("SHOW LOCKS test EXTENDED") - assert not is_readonly("SET hivevar:desc='Legislators'") - assert not is_readonly("UPDATE t1 SET col1 = NULL") - assert is_readonly("EXPLAIN SELECT 1") - assert is_readonly("SELECT 1") - assert is_readonly("WITH (SELECT 1) bla SELECT * from bla") - assert is_readonly("SHOW CATALOGS") - assert is_readonly("SHOW TABLES") - - def test_time_grain_denylist(): config = app.config.copy() app.config["TIME_GRAIN_DENYLIST"] = ["PT1M", "SQLITE_NONEXISTENT_GRAIN"] diff --git a/tests/integration_tests/db_engine_specs/hive_tests.py b/tests/integration_tests/db_engine_specs/hive_tests.py index ba8341f82e4..7e1d382f3f8 100644 --- a/tests/integration_tests/db_engine_specs/hive_tests.py +++ b/tests/integration_tests/db_engine_specs/hive_tests.py @@ -23,7 +23,6 @@ from sqlalchemy.sql import select from superset.db_engine_specs.hive import HiveEngineSpec, upload_to_s3 from superset.exceptions import SupersetException -from superset.sql.parse import SQLScript from superset.sql_parse import Table from tests.integration_tests.test_app import app @@ -223,19 +222,6 @@ def test_df_to_sql_if_exists_replace_with_schema(mock_upload_to_s3, mock_g): app.config = config -def test_is_readonly(): - def is_readonly(sql: str) -> bool: - return not SQLScript(sql, engine=HiveEngineSpec.engine).has_mutation() - - assert not is_readonly("UPDATE t1 SET col1 = NULL") - assert not is_readonly("INSERT OVERWRITE TABLE tabB SELECT a.Age FROM TableA") - assert is_readonly("SHOW LOCKS test EXTENDED") - assert is_readonly("SET hivevar:desc='Legislators'") - assert is_readonly("EXPLAIN SELECT 1") - assert is_readonly("SELECT 1") - assert is_readonly("WITH (SELECT 1) bla SELECT * from bla") - - @pytest.mark.parametrize( "schema,upload_prefix", [("foo", "EXTERNAL_HIVE_TABLES/1/foo/"), (None, "EXTERNAL_HIVE_TABLES/1/")], diff --git a/tests/integration_tests/db_engine_specs/presto_tests.py b/tests/integration_tests/db_engine_specs/presto_tests.py index 9fddf985aae..9d83bb5bbd7 100644 --- a/tests/integration_tests/db_engine_specs/presto_tests.py +++ b/tests/integration_tests/db_engine_specs/presto_tests.py @@ -25,7 +25,6 @@ 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 SQLScript from superset.sql_parse import Table from superset.utils.database import get_example_database from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec @@ -1173,19 +1172,6 @@ class TestPrestoDbEngineSpec(TestDbEngineSpec): ] -def test_is_readonly(): - def is_readonly(sql: str) -> bool: - return not SQLScript(sql, engine=PrestoEngineSpec.engine).has_mutation() - - assert not is_readonly("SET hivevar:desc='Legislators'") - assert not is_readonly("UPDATE t1 SET col1 = NULL") - assert not is_readonly("INSERT OVERWRITE TABLE tabB SELECT a.Age FROM TableA") - assert is_readonly("SHOW LOCKS test EXTENDED") - 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. diff --git a/tests/unit_tests/sql/parse_tests.py b/tests/unit_tests/sql/parse_tests.py index 726e2294e29..4911d4c0e6c 100644 --- a/tests/unit_tests/sql/parse_tests.py +++ b/tests/unit_tests/sql/parse_tests.py @@ -945,6 +945,28 @@ on $left.Day1 == $right.Day ("kustokql", "set querytrace; Events | take 100", False), ("kustokql", ".drop table foo", True), ("kustokql", ".set-or-append table foo <| bar", True), + ("base", "SHOW LOCKS test EXTENDED", False), + ("base", "SET hivevar:desc='Legislators'", False), + ("base", "UPDATE t1 SET col1 = NULL", True), + ("base", "EXPLAIN SELECT 1", False), + ("base", "SELECT 1", False), + ("base", "WITH bla AS (SELECT 1) SELECT * FROM bla", False), + ("base", "SHOW CATALOGS", False), + ("base", "SHOW TABLES", False), + ("hive", "UPDATE t1 SET col1 = NULL", True), + ("hive", "INSERT OVERWRITE TABLE tabB SELECT a.Age FROM TableA", True), + ("hive", "SHOW LOCKS test EXTENDED", False), + ("hive", "SET hivevar:desc='Legislators'", False), + ("hive", "EXPLAIN SELECT 1", False), + ("hive", "SELECT 1", False), + ("hive", "WITH bla AS (SELECT 1) SELECT * FROM bla", False), + ("presto", "SET hivevar:desc='Legislators'", False), + ("presto", "UPDATE t1 SET col1 = NULL", True), + ("presto", "INSERT OVERWRITE TABLE tabB SELECT a.Age FROM TableA", True), + ("presto", "SHOW LOCKS test EXTENDED", False), + ("presto", "EXPLAIN SELECT 1", False), + ("presto", "SELECT 1", False), + ("presto", "WITH bla AS (SELECT 1) SELECT * FROM bla", False), ], ) def test_has_mutation(engine: str, sql: str, expected: bool) -> None: @@ -1042,7 +1064,7 @@ def test_custom_dialect(app: None) -> None: ) def test_is_mutating(engine: str) -> None: """ - Tests for `is_mutating`. + Global tests for `is_mutating`, covering all supported engines. """ assert not SQLStatement( "with source as ( select 1 as one ) select * from source",