You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2025/07/24 11:31:35 UTC
(superset) branch 5.0 updated: fix: Saved queries list break if one query can't be parsed (#34289)
This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch 5.0
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/5.0 by this push:
new 1926e90e12 fix: Saved queries list break if one query can't be parsed (#34289)
1926e90e12 is described below
commit 1926e90e12f5936d04b08de35cc69e7b68a4e90b
Author: Michael S. Molina <70...@users.noreply.github.com>
AuthorDate: Thu Jul 24 08:30:04 2025 -0300
fix: Saved queries list break if one query can't be parsed (#34289)
(cherry picked from commit 1e5a4e9bdc4468546d4f9a564ccbb5dbc14d0ac9)
---
superset/models/sql_lab.py | 4 +--
tests/unit_tests/models/sql_lab_test.py | 45 ++++++++++++++++++++++++++++++++-
2 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py
index 4d443423d1..7d803cb4c1 100644
--- a/superset/models/sql_lab.py
+++ b/superset/models/sql_lab.py
@@ -48,7 +48,7 @@ from sqlalchemy.orm import backref, relationship
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,
@@ -85,7 +85,7 @@ class SqlTablesMixin: # pylint: disable=too-few-public-methods
self.database, # type: ignore
)
)
- except (SupersetSecurityException, TemplateError):
+ except (SupersetSecurityException, SupersetParseError, TemplateError):
return []
diff --git a/tests/unit_tests/models/sql_lab_test.py b/tests/unit_tests/models/sql_lab_test.py
index a2ce2a6afa..e9fa773370 100644
--- a/tests/unit_tests/models/sql_lab_test.py
+++ b/tests/unit_tests/models/sql_lab_test.py
@@ -22,7 +22,7 @@ from jinja2.exceptions import TemplateError
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
@@ -43,6 +43,10 @@ from superset.models.sql_lab import Query, SavedQuery
level=ErrorLevel.ERROR,
)
),
+ SupersetParseError(
+ sql="INVALID SQL",
+ message="Invalid SQL syntax",
+ ),
TemplateError,
],
)
@@ -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 == []