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 == []