Skip to content

Commit 0fa3feb

Browse files
chore: remove parse_sql (#33474)
1 parent 1393f7d commit 0fa3feb

File tree

6 files changed

+35
-55
lines changed

6 files changed

+35
-55
lines changed

superset/db_engine_specs/base.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,10 +2070,6 @@ def cancel_query( # pylint: disable=unused-argument
20702070

20712071
return False
20722072

2073-
@classmethod
2074-
def parse_sql(cls, sql: str) -> list[str]:
2075-
return [str(s).strip(" ;") for s in sqlparse.parse(sql)]
2076-
20772073
@classmethod
20782074
def get_impersonation_key(cls, user: User | None) -> Any:
20792075
"""

superset/db_engine_specs/kusto.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,3 @@ def convert_dttm(
153153
return f"""datetime({dttm.isoformat(timespec="microseconds")})"""
154154

155155
return None
156-
157-
@classmethod
158-
def parse_sql(cls, sql: str) -> list[str]:
159-
"""
160-
Kusto supports a single query statement, but it could include sub queries
161-
and variables declared via let keyword.
162-
"""
163-
return [sql]

superset/models/core.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ def get_df(
659659
schema: str | None = None,
660660
mutator: Callable[[pd.DataFrame], None] | None = None,
661661
) -> pd.DataFrame:
662-
sqls = self.db_engine_spec.parse_sql(sql)
662+
script = SQLScript(sql, self.db_engine_spec.engine)
663663
with self.get_sqla_engine(catalog=catalog, schema=schema) as engine:
664664
engine_url = engine.url
665665

@@ -676,8 +676,11 @@ def _log_query(sql: str) -> None:
676676
with self.get_raw_connection(catalog=catalog, schema=schema) as conn:
677677
cursor = conn.cursor()
678678
df = None
679-
for i, sql_ in enumerate(sqls):
680-
sql_ = self.mutate_sql_based_on_config(sql_, is_split=True)
679+
for i, statement in enumerate(script.statements):
680+
sql_ = self.mutate_sql_based_on_config(
681+
statement.format(),
682+
is_split=True,
683+
)
681684
_log_query(sql_)
682685
with event_logger.log_context(
683686
action="execute_sql",
@@ -686,7 +689,7 @@ def _log_query(sql: str) -> None:
686689
):
687690
self.db_engine_spec.execute(cursor, sql_, self)
688691

689-
rows = self.fetch_rows(cursor, i == len(sqls) - 1)
692+
rows = self.fetch_rows(cursor, i == len(script.statements) - 1)
690693
if rows is not None:
691694
df = self.load_into_dataframe(cursor.description, rows)
692695

tests/unit_tests/db_engine_specs/test_base.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,6 @@ def test_get_text_clause_with_colon() -> None:
4949
assert text_clause.text == "SELECT foo FROM tbl WHERE foo = '123\\:456')"
5050

5151

52-
def test_parse_sql_single_statement() -> None:
53-
"""
54-
`parse_sql` should properly strip leading and trailing spaces and semicolons
55-
"""
56-
57-
from superset.db_engine_specs.base import BaseEngineSpec
58-
59-
queries = BaseEngineSpec.parse_sql(" SELECT foo FROM tbl ; ")
60-
assert queries == ["SELECT foo FROM tbl"]
61-
62-
63-
def test_parse_sql_multi_statement() -> None:
64-
"""
65-
For string with multiple SQL-statements `parse_sql` method should return list
66-
where each element represents the single SQL-statement
67-
"""
68-
69-
from superset.db_engine_specs.base import BaseEngineSpec
70-
71-
queries = BaseEngineSpec.parse_sql("SELECT foo FROM tbl1; SELECT bar FROM tbl2;")
72-
assert queries == [
73-
"SELECT foo FROM tbl1",
74-
"SELECT bar FROM tbl2",
75-
]
76-
77-
7852
def test_validate_db_uri(mocker: MockerFixture) -> None:
7953
"""
8054
Ensures that the `validate_database_uri` method invokes the validator correctly

tests/unit_tests/db_engine_specs/test_kusto.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,6 @@ def test_kql_has_mutation(kql: str, expected: bool) -> None:
8080
)
8181

8282

83-
def test_kql_parse_sql() -> None:
84-
"""
85-
parse_sql method should always return a list with a single element
86-
which is an original query
87-
"""
88-
89-
from superset.db_engine_specs.kusto import KustoKqlEngineSpec
90-
91-
queries = KustoKqlEngineSpec.parse_sql("let foo = 1; tbl | where bar == foo")
92-
93-
assert queries == ["let foo = 1; tbl | where bar == foo"]
94-
95-
9683
@pytest.mark.parametrize(
9784
"target_type,expected_result",
9885
[

tests/unit_tests/sql/parse_tests.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,34 @@ def test_sqlscript() -> None:
747747
assert query.get_settings() == {"querytrace": True}
748748

749749

750+
@pytest.mark.parametrize(
751+
"sql, engine, expected",
752+
[
753+
(
754+
" SELECT foo FROM tbl ; ",
755+
"postgresql",
756+
["SELECT\n foo\nFROM tbl"],
757+
),
758+
(
759+
"SELECT foo FROM tbl1; SELECT bar FROM tbl2;",
760+
"postgresql",
761+
["SELECT\n foo\nFROM tbl1", "SELECT\n bar\nFROM tbl2"],
762+
),
763+
(
764+
"let foo = 1; tbl | where bar == foo",
765+
"kustokql",
766+
["let foo = 1", "tbl | where bar == foo"],
767+
),
768+
],
769+
)
770+
def test_sqlscript_split(sql: str, engine: str, expected: list[str]) -> None:
771+
"""
772+
Test the `SQLScript` class with a script that has a single statement.
773+
"""
774+
script = SQLScript(sql, engine)
775+
assert [statement.format() for statement in script.statements] == expected
776+
777+
750778
def test_sqlstatement() -> None:
751779
"""
752780
Test the `SQLStatement` class.

0 commit comments

Comments
 (0)