diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 8db57e96c..36ac21961 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -1096,4 +1096,8 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods @classmethod def is_readonly_query(cls, parsed_query: ParsedQuery) -> bool: """Pessimistic readonly, 100% sure statement won't mutate anything""" - return parsed_query.is_select() or parsed_query.is_explain() + return ( + parsed_query.is_select() + or parsed_query.is_explain() + or parsed_query.is_show() + ) diff --git a/tests/db_engine_specs/base_engine_spec_tests.py b/tests/db_engine_specs/base_engine_spec_tests.py index 57dd3cb2f..960a8d1c4 100644 --- a/tests/db_engine_specs/base_engine_spec_tests.py +++ b/tests/db_engine_specs/base_engine_spec_tests.py @@ -263,9 +263,11 @@ def test_is_readonly(): def is_readonly(sql: str) -> bool: return BaseEngineSpec.is_readonly_query(ParsedQuery(sql)) - assert not is_readonly("SHOW LOCKS test EXTENDED") + 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")