diff --git a/superset/exceptions.py b/superset/exceptions.py index 07bedfa2db56..153d7439eb79 100644 --- a/superset/exceptions.py +++ b/superset/exceptions.py @@ -115,6 +115,14 @@ def __init__( self.status = status +class SupersetSyntaxErrorException(SupersetErrorsException): + status = 422 + error_type = SupersetErrorType.SYNTAX_ERROR + + def __init__(self, errors: List[SupersetError]) -> None: + super().__init__(errors) + + class SupersetTimeoutException(SupersetErrorFromParamsException): status = 408 diff --git a/superset/sqllab/command.py b/superset/sqllab/command.py index ce41eb6de230..0aeab754ca54 100644 --- a/superset/sqllab/command.py +++ b/superset/sqllab/command.py @@ -25,8 +25,13 @@ from superset.commands.base import BaseCommand from superset.common.db_query_status import QueryStatus from superset.dao.exceptions import DAOCreateFailedError -from superset.errors import SupersetErrorType -from superset.exceptions import SupersetErrorsException, SupersetGenericErrorException +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import ( + SupersetErrorsException, + SupersetException, + SupersetGenericErrorException, + SupersetSyntaxErrorException, +) from superset.models.core import Database from superset.models.sql_lab import Query from superset.sqllab.command_status import SqlJsonExecutionStatus @@ -110,7 +115,21 @@ def run( # pylint: disable=too-many-statements,useless-suppression "status": status, "payload": self._execution_context_convertor.serialize_payload(), } - except (SqlLabException, SupersetErrorsException) as ex: + except SupersetErrorsException as ex: + if all(ex.error_type == SupersetErrorType.SYNTAX_ERROR for ex in ex.errors): + raise SupersetSyntaxErrorException(ex.errors) from ex + raise ex + except SupersetException as ex: + if ex.error_type == SupersetErrorType.SYNTAX_ERROR: + raise SupersetSyntaxErrorException( + [ + SupersetError( + message=ex.message, + error_type=ex.error_type, + level=ErrorLevel.ERROR, + ) + ] + ) from ex raise ex except Exception as ex: raise SqlLabException(self._execution_context, exception=ex) from ex