This is an automated email from the ASF dual-hosted git repository. hugh pushed a commit to branch fix-logs-sqllab in repository https://gitbox.apache.org/repos/asf/superset.git
commit 1699d6e0f99e752d87a876e85025e2bd4ea27003 Author: hughhhh <[email protected]> AuthorDate: Thu Oct 6 14:26:47 2022 -0400 yerp --- superset/sql_lab.py | 8 ++++---- tests/unit_tests/sql_lab_test.py | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/superset/sql_lab.py b/superset/sql_lab.py index ed78673c23..3aa0d88fdb 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -209,7 +209,6 @@ def execute_sql_statement( # pylint: disable=too-many-arguments,too-many-statem database: Database = query.database db_engine_spec = database.db_engine_spec - print('in 1') parsed_query = ParsedQuery(sql_statement) if is_feature_enabled("RLS_IN_SQLLAB"): # Insert any applicable RLS predicates @@ -312,7 +311,8 @@ def execute_sql_statement( # pylint: disable=too-many-arguments,too-many-statem level=ErrorLevel.ERROR, ) ) from ex - except SqlUserError as ex: + # todo(hughhhh): cleaner way to group all user exceptions here + except SyntaxError as ex: raise SupersetErrorException( SupersetError( message=ex, @@ -508,7 +508,7 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca query.set_extra_json_key("progress", msg) session.commit() try: - print('calling execute_sql_statement') + print("calling execute_sql_statement") result_set = execute_sql_statement( statement, query, @@ -521,7 +521,7 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca payload.update({"status": QueryStatus.STOPPED}) return payload except Exception as ex: # pylint: disable=broad-except - print('in exc') + print("in exc") print(ex) raise ex msg = str(ex) diff --git a/tests/unit_tests/sql_lab_test.py b/tests/unit_tests/sql_lab_test.py index 29f45eab68..0bb785d3d5 100644 --- a/tests/unit_tests/sql_lab_test.py +++ b/tests/unit_tests/sql_lab_test.py @@ -16,10 +16,13 @@ # under the License. # pylint: disable=import-outside-toplevel, invalid-name, unused-argument, too-many-locals +import pytest import sqlparse from pytest_mock import MockerFixture from sqlalchemy.orm.session import Session +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SupersetErrorException from superset.utils.core import override_user @@ -216,3 +219,44 @@ def test_sql_lab_insert_rls( | 3 | 9 |""".strip() ) assert query.executed_sql == "SELECT c FROM t WHERE (t.c > 5)\nLIMIT 6" + + +def test_execute_sql_statement_sql_user_error(mocker: MockerFixture, app: None) -> None: + """ + Simple test for `execute_sql_statement`. + """ + from superset.sql_lab import execute_sql_statement + + sql_statement = "SELECT 42 AS answer" + + query = mocker.MagicMock() + query.limit = 1 + query.select_as_cta_used = False + database = query.database + database.allow_dml = False + database.apply_limit_to_sql.return_value = "SELECT 42 AS answer LIMIT 2" + db_engine_spec = database.db_engine_spec + + from psycopg2.errors import SyntaxError + + db_engine_spec.is_select_query.return_value = True + db_engine_spec.fetch_data.side_effect = SyntaxError("foo") + + session = mocker.MagicMock() + cursor = mocker.MagicMock() + SupersetResultSet = mocker.patch("superset.sql_lab.SupersetResultSet") + + with pytest.raises(SupersetErrorException) as excinfo: + execute_sql_statement( + sql_statement, + query, + session=session, + cursor=cursor, + log_params={}, + apply_ctas=False, + ) + assert excinfo.value.error == SupersetError( + message="foo", + error_type=SupersetErrorType.SYNTAX_ERROR, + level=ErrorLevel.ERROR, + )
