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 2024/03/26 19:37:55 UTC
(superset) 02/02: fix: Provide more inclusive error handling for saved queries (#27644)
This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch 4.0
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 5c567895cce0a0e4e9640bd5ffa198040435d045
Author: John Bodley <45...@users.noreply.github.com>
AuthorDate: Wed Mar 27 08:22:14 2024 +1300
fix: Provide more inclusive error handling for saved queries (#27644)
(cherry picked from commit 3ae74d1f2daf0399434e16145ba585045bff779f)
---
superset/models/sql_lab.py | 3 +-
superset/sql_parse.py | 1 +
tests/unit_tests/models/sql_lab_test.py | 59 +++++++++++++++++++++++++++++++++
3 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py
index f22d774e88..25c21cdfc8 100644
--- a/superset/models/sql_lab.py
+++ b/superset/models/sql_lab.py
@@ -30,6 +30,7 @@ from flask_appbuilder import Model
from flask_appbuilder.models.decorators import renders
from flask_babel import gettext as __
from humanize import naturaltime
+from jinja2.exceptions import TemplateError
from sqlalchemy import (
Boolean,
Column,
@@ -76,7 +77,7 @@ class SqlTablesMixin: # pylint: disable=too-few-public-methods
self.database, # type: ignore
)
)
- except SupersetSecurityException:
+ except (SupersetSecurityException, TemplateError):
return []
diff --git a/superset/sql_parse.py b/superset/sql_parse.py
index 6df5dbc089..62a2457171 100644
--- a/superset/sql_parse.py
+++ b/superset/sql_parse.py
@@ -1072,6 +1072,7 @@ def extract_tables_from_jinja_sql(sql: str, database: Database) -> set[Table]:
:param database: The database associated with the SQL statement
:returns: The set of tables referenced in the SQL statement
:raises SupersetSecurityException: If SQLGlot is unable to parse the SQL statement
+ :raises jinja2.exceptions.TemplateError: If the Jinjafied SQL could not be rendered
"""
from superset.jinja_context import ( # pylint: disable=import-outside-toplevel
diff --git a/tests/unit_tests/models/sql_lab_test.py b/tests/unit_tests/models/sql_lab_test.py
new file mode 100644
index 0000000000..fb5db97474
--- /dev/null
+++ b/tests/unit_tests/models/sql_lab_test.py
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from unittest.mock import MagicMock
+
+import pytest
+from flask_appbuilder import Model
+from jinja2.exceptions import TemplateError
+from pytest_mock import MockFixture
+
+from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
+from superset.exceptions import SupersetSecurityException
+from superset.models.sql_lab import Query, SavedQuery, SqlTablesMixin
+
+
+@pytest.mark.parametrize(
+ "klass",
+ [
+ Query,
+ SavedQuery,
+ ],
+)
+@pytest.mark.parametrize(
+ "exception",
+ [
+ SupersetSecurityException(
+ SupersetError(
+ error_type=SupersetErrorType.QUERY_SECURITY_ACCESS_ERROR,
+ message="",
+ level=ErrorLevel.ERROR,
+ )
+ ),
+ TemplateError,
+ ],
+)
+def test_sql_tables_mixin_sql_tables_exception(
+ klass: type[Model],
+ exception: Exception,
+ mocker: MockFixture,
+) -> None:
+ mocker.patch(
+ "superset.models.sql_lab.extract_tables_from_jinja_sql",
+ side_effect=exception,
+ )
+
+ assert klass(sql="SELECT 1", database=MagicMock()).sql_tables == []