joshuaray opened a new issue, #27560:
URL: https://github.com/apache/superset/issues/27560
### Bug description
### Bug Description
This seems to be an issue with the latest master, presumably from the SQL
parsing changes that went through in PR #26767.
We're unable to get even the most basic queries to parse and run
successfully via the superset UI. The auto-generated SQL commands to list table
metadata are failing in the new parse code:
> superset_app | 2024-03-19
03:07:44,700:DEBUG:superset.stats_logger:[stats_logger] (incr)
DatabaseRestApi.table_metadata.error
superset_app | 2024-03-19
03:07:44,700:ERROR:flask_appbuilder.api:Expected table name but got <Token
token_type: TokenType.L_BRACKET, text: [, line: 2, col: 10, start: 48, end: 48,
comments: []>. Line 2, Col: 10.
superset_app | SELECT [Name], [PhoneNumber], [Email]
superset_app | FROM dbo.[Person]
superset_app | Traceback (most recent call last):
superset_app | File
"/usr/local/lib/python3.9/site-packages/flask_appbuilder/api/__init__.py", line
110, in wraps
superset_app | return f(self, *args, **kwargs)
superset_app | File "/app/superset/views/base_api.py", line 127,
in wraps
superset_app | raise ex
superset_app | File "/app/superset/views/base_api.py", line 121,
in wraps
superset_app | duration, response = time_function(f, self,
*args, **kwargs)
superset_app | File "/app/superset/utils/core.py", line 1476, in
time_function
superset_app | response = func(*args, **kwargs)
superset_app | File "/app/superset/utils/log.py", line 255, in
wrapper
superset_app | value = f(*args, **kwargs)
superset_app | File "/app/superset/databases/api.py", line 742,
in table_metadata
superset_app | table_info = get_table_metadata(database,
table_name, schema_name)
superset_app | File "/app/superset/databases/utils.py", line 92,
in get_table_metadata
superset_app | "selectStar": database.select_star(
superset_app | File "/app/superset/models/core.py", line 642, in
select_star
superset_app | return self.db_engine_spec.select_star(
superset_app | File "/app/superset/db_engine_specs/base.py",
line 1451, in select_star
superset_app | sql = SQLScript(sql, engine=cls.engine).format()
superset_app | File "/app/superset/sql_parse.py", line 349, in
__init__
superset_app | for statement in parse(query, dialect=dialect)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/__init__.py", line 86, in parse
superset_app | return Dialect.get_or_raise(read or
dialect).parse(sql, **opts)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/dialects/dialect.py", line 442,
in parse
superset_app | return
self.parser(**opts).parse(self.tokenize(sql), sql)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1026, in parse
superset_app | return self._parse(
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1092, in _parse
superset_app | expressions.append(parse_method(self))
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1287, in
_parse_statement
superset_app | expression =
self._parse_set_operations(expression) if expression else self._parse_select()
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2271, in
_parse_select
superset_app | from_ = self._parse_from()
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2432, in
_parse_from
superset_app | exp.From, comments=self._prev_comments,
this=self._parse_table(joins=joins)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2771, in
_parse_table
superset_app | exp.Expression, bracket or
self._parse_bracket(self._parse_table_parts(schema=schema))
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2737, in
_parse_table_parts
superset_app | self.raise_error(f"Expected table name but got
{self._curr}")
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1136, in
raise_error
superset_app | raise error
In the trace above you can see a valid SQL script throw a parse error:
`SELECT [Name], [PhoneNumber], [Email] FROM dbo.[Person]`
For whatever reason the parser doesn't support brackets around table or
schema names.
### How to reproduce the bug
- Create a table in SSMS
- Connect database to superset
- Query the table in SQL Lab
- Click "Create Chart"
### Screenshots/recordings
<img width="896" alt="image"
src="https://github.com/apache/superset/assets/26936493/8deb7262-abe9-4562-baa1-f92b6ba1fd84">
<img width="999" alt="image"
src="https://github.com/apache/superset/assets/26936493/1252fb19-cac8-4758-b392-e3717e2e65a9">
### Superset version
master / latest-dev
### Python version
3.9
### Node version
16
### Browser
Chrome
### Additional context
superset_app | 2024-03-19
03:07:44,700:DEBUG:superset.stats_logger:[stats_logger] (incr)
DatabaseRestApi.table_metadata.error
superset_app | 2024-03-19
03:07:44,700:ERROR:flask_appbuilder.api:Expected table name but got <Token
token_type: TokenType.L_BRACKET, text: [, line: 2, col: 10, start: 48, end: 48,
comments: []>. Line 2, Col: 10.
superset_app | SELECT [Name], [PhoneNumber], [Email]
superset_app | FROM dbo.[Person]
superset_app | Traceback (most recent call last):
superset_app | File
"/usr/local/lib/python3.9/site-packages/flask_appbuilder/api/__init__.py", line
110, in wraps
superset_app | return f(self, *args, **kwargs)
superset_app | File "/app/superset/views/base_api.py", line 127,
in wraps
superset_app | raise ex
superset_app | File "/app/superset/views/base_api.py", line 121,
in wraps
superset_app | duration, response = time_function(f, self,
*args, **kwargs)
superset_app | File "/app/superset/utils/core.py", line 1476, in
time_function
superset_app | response = func(*args, **kwargs)
superset_app | File "/app/superset/utils/log.py", line 255, in
wrapper
superset_app | value = f(*args, **kwargs)
superset_app | File "/app/superset/databases/api.py", line 742,
in table_metadata
superset_app | table_info = get_table_metadata(database,
table_name, schema_name)
superset_app | File "/app/superset/databases/utils.py", line 92,
in get_table_metadata
superset_app | "selectStar": database.select_star(
superset_app | File "/app/superset/models/core.py", line 642, in
select_star
superset_app | return self.db_engine_spec.select_star(
superset_app | File "/app/superset/db_engine_specs/base.py",
line 1451, in select_star
superset_app | sql = SQLScript(sql, engine=cls.engine).format()
superset_app | File "/app/superset/sql_parse.py", line 349, in
__init__
superset_app | for statement in parse(query, dialect=dialect)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/__init__.py", line 86, in parse
superset_app | return Dialect.get_or_raise(read or
dialect).parse(sql, **opts)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/dialects/dialect.py", line 442,
in parse
superset_app | return
self.parser(**opts).parse(self.tokenize(sql), sql)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1026, in parse
superset_app | return self._parse(
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1092, in _parse
superset_app | expressions.append(parse_method(self))
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1287, in
_parse_statement
superset_app | expression =
self._parse_set_operations(expression) if expression else self._parse_select()
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2271, in
_parse_select
superset_app | from_ = self._parse_from()
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2432, in
_parse_from
superset_app | exp.From, comments=self._prev_comments,
this=self._parse_table(joins=joins)
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2771, in
_parse_table
superset_app | exp.Expression, bracket or
self._parse_bracket(self._parse_table_parts(schema=schema))
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 2737, in
_parse_table_parts
superset_app | self.raise_error(f"Expected table name but got
{self._curr}")
superset_app | File
"/usr/local/lib/python3.9/site-packages/sqlglot/parser.py", line 1136, in
raise_error
superset_app | raise error
### Checklist
- [X] I have searched Superset docs and Slack and didn't find a solution to
my problem.
- [X] I have searched the GitHub issue tracker and didn't find a similar bug
report.
- [X] I have checked Superset's logs for errors and if I found a relevant
Python stacktrace, I included it here as text in the "additional context"
section.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]