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]

Reply via email to