Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions superset/models/sql_lab.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
from sqlalchemy.sql.elements import ColumnElement, literal_column

from superset import security_manager
from superset.exceptions import SupersetSecurityException
from superset.exceptions import SupersetParseError, SupersetSecurityException
from superset.jinja_context import BaseTemplateProcessor, get_template_processor
from superset.models.helpers import (
AuditMixinNullable,
Expand Down Expand Up @@ -85,7 +85,7 @@ def sql_tables(self) -> list[Table]:
self.database, # type: ignore
)
)
except (SupersetSecurityException, TemplateError):
except (SupersetSecurityException, SupersetParseError, TemplateError):
return []


Expand Down
45 changes: 44 additions & 1 deletion tests/unit_tests/models/sql_lab_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from pytest_mock import MockerFixture

from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
from superset.exceptions import SupersetSecurityException
from superset.exceptions import SupersetParseError, SupersetSecurityException
from superset.models.sql_lab import Query, SavedQuery


Expand All @@ -43,6 +43,10 @@
level=ErrorLevel.ERROR,
)
),
SupersetParseError(
sql="INVALID SQL",
message="Invalid SQL syntax",
),
TemplateError,
],
)
Expand All @@ -57,3 +61,42 @@ def test_sql_tables_mixin_sql_tables_exception(
)

assert klass(sql="SELECT 1", database=MagicMock()).sql_tables == []


@pytest.mark.parametrize(
"klass",
[
Query,
SavedQuery,
],
)
@pytest.mark.parametrize(
"invalid_sql",
[
"SELECT * FROM table WHERE invalid syntax",
"INVALID SQL STATEMENT",
"SELECT * FROM; DROP TABLE users;",
"",
None,
],
)
def test_sql_tables_mixin_invalid_sql_returns_empty_list(
klass: type[Model],
invalid_sql: str,
mocker: MockerFixture,
) -> None:
"""Test that SqlTablesMixin returns empty list when SQL parsing fails."""
mocker.patch(
"superset.models.sql_lab.extract_tables_from_jinja_sql",
side_effect=SupersetParseError(
sql=invalid_sql or "INVALID SQL",
message=f"Failed to parse SQL: {invalid_sql}",
),
)

instance = (
klass(sql=invalid_sql, database=MagicMock())
if invalid_sql is not None
else klass(database=MagicMock())
)
assert instance.sql_tables == []
Loading