diff --git a/requirements/base.txt b/requirements/base.txt index 4538977c7..148be94e1 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -288,7 +288,7 @@ sqlalchemy-utils==0.38.3 # via # apache-superset # flask-appbuilder -sqlparse==0.4.3 +sqlparse==0.4.4 # via apache-superset sshtunnel==0.4.0 # via apache-superset diff --git a/setup.py b/setup.py index 09fde6b69..6bad485f2 100644 --- a/setup.py +++ b/setup.py @@ -122,7 +122,7 @@ setup( "slack_sdk>=3.19.0, <4", "sqlalchemy>=1.4, <2", "sqlalchemy-utils>=0.38.3, <0.39", - "sqlparse>=0.4.3, <0.5", + "sqlparse>=0.4.4, <0.5", "tabulate>=0.8.9, <0.9", "typing-extensions>=4, <5", "waitress; sys_platform == 'win32'", diff --git a/superset/sql_parse.py b/superset/sql_parse.py index 323fabb3d..034daeb7a 100644 --- a/superset/sql_parse.py +++ b/superset/sql_parse.py @@ -23,6 +23,8 @@ from urllib import parse import sqlparse from sqlalchemy import and_ +from sqlparse import keywords +from sqlparse.lexer import Lexer from sqlparse.sql import ( Identifier, IdentifierList, @@ -59,15 +61,13 @@ CTE_PREFIX = "CTE__" logger = logging.getLogger(__name__) - # TODO: Workaround for https://github.com/andialbrecht/sqlparse/issues/652. -sqlparse.keywords.SQL_REGEX.insert( - 0, - ( - re.compile(r"'(''|\\\\|\\|[^'])*'", sqlparse.keywords.FLAGS).match, - sqlparse.tokens.String.Single, - ), -) +# configure the Lexer to extend sqlparse +# reference: https://sqlparse.readthedocs.io/en/stable/extending/ +lex = Lexer.get_default_instance() +sqlparser_sql_regex = keywords.SQL_REGEX +sqlparser_sql_regex.insert(25, (r"'(''|\\\\|\\|[^'])*'", sqlparse.tokens.String.Single)) +lex.set_SQL_REGEX(sqlparser_sql_regex) class CtasMethod(str, Enum):