ipaddicting opened a new issue, #36068: URL: https://github.com/apache/superset/issues/36068
### Bug description 1. Add any connection (e.g. TDengine) that is not included in `SQLGLOT_DIALECTS` of `superset/sql/parse.py` 2. Create a dataset and a chart from it 3. Drag the timestamp field to the "X-axis", and drag any value to "Metrics" with any aggregate function like AVG 4. Click "Update chart" will get the error message as screenshot below. ### Screenshots/recordings <img width="1432" height="679" alt="Image" src="https://github.com/user-attachments/assets/b840c66e-80d9-41c7-a18f-f692580d0eb3" /> ### Superset version master / latest-dev ### Python version 3.11 ### Node version 16 ### Browser Chrome ### Additional context Error messages from superset-light: ``` uperset-light-1 | 2025-11-11 08:09:09,800:WARNING:superset.views.error_handling:SupersetErrorException superset-light-1 | Traceback (most recent call last): superset-light-1 | File "/app/superset/sql/parse.py", line 553, in _parse superset-light-1 | statements = sqlglot.parse(script, dialect=dialect) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/__init__.py", line 102, in parse superset-light-1 | return Dialect.get_or_raise(read or dialect).parse(sql, **opts) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/dialects/dialect.py", line 1083, in parse superset-light-1 | return self.parser(**opts).parse(self.tokenize(sql), sql) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 1623, in parse superset-light-1 | return self._parse( superset-light-1 | ^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 1692, in _parse superset-light-1 | expressions.append(parse_method(self)) superset-light-1 | ^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 1933, in _parse_statement superset-light-1 | expression = self._parse_set_operations(expression) if expression else self._parse_select() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 3246, in _parse_select superset-light-1 | query = self._parse_select_query( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 3324, in _parse_select_query superset-light-1 | projections = self._parse_projections() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 3203, in _parse_projections superset-light-1 | return self._parse_expressions() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7375, in _parse_expressions superset-light-1 | return self._parse_csv(self._parse_expression) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7329, in _parse_csv superset-light-1 | parse_result = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4941, in _parse_expression superset-light-1 | return self._parse_alias(self._parse_assignment()) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4944, in _parse_assignment superset-light-1 | this = self._parse_disjunction() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4965, in _parse_disjunction superset-light-1 | return self._parse_tokens(self._parse_conjunction, self.DISJUNCTION) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7343, in _parse_tokens superset-light-1 | this = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4968, in _parse_conjunction superset-light-1 | return self._parse_tokens(self._parse_equality, self.CONJUNCTION) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7343, in _parse_tokens superset-light-1 | this = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4971, in _parse_equality superset-light-1 | return self._parse_tokens(self._parse_comparison, self.EQUALITY) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7343, in _parse_tokens superset-light-1 | this = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4974, in _parse_comparison superset-light-1 | return self._parse_tokens(self._parse_range, self.COMPARISON) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 7343, in _parse_tokens superset-light-1 | this = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 4977, in _parse_range superset-light-1 | this = this or self._parse_bitwise() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5146, in _parse_bitwise superset-light-1 | this = self._parse_term() superset-light-1 | ^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5180, in _parse_term superset-light-1 | this = self._parse_factor() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5203, in _parse_factor superset-light-1 | this = parse_method() superset-light-1 | ^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5228, in _parse_unary superset-light-1 | return self._parse_at_time_zone(self._parse_type()) superset-light-1 | ^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5290, in _parse_type superset-light-1 | this = self._parse_column() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5594, in _parse_column superset-light-1 | this = self._parse_column_reference() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5603, in _parse_column_reference superset-light-1 | this = self._parse_field() superset-light-1 | ^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5796, in _parse_field superset-light-1 | field = self._parse_primary() or self._parse_function( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5819, in _parse_function superset-light-1 | func = self._parse_function_call( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 5936, in _parse_function_call superset-light-1 | self._match_r_paren(this) superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 8200, in _match_r_paren superset-light-1 | self.raise_error("Expecting )") superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/sqlglot/parser.py", line 1736, in raise_error superset-light-1 | raise error superset-light-1 | sqlglot.errors.ParseError: Expecting ). Line 1, Col: 26. superset-light-1 | SELECT TIMETRUNCATE(ts, 1d, 0) AS ts, AVG(si_nox_raw_ppm) AS `AVG(si_nox_raw_ppm)` superset-light-1 | FROM signals.si_snv_v108 GROUP BY TIMETRUN superset-light-1 | superset-light-1 | The above exception was the direct cause of the following exception: superset-light-1 | superset-light-1 | Traceback (most recent call last): superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request superset-light-1 | rv = self.dispatch_request() superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request superset-light-1 | return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/.venv/lib/python3.11/site-packages/flask_appbuilder/security/decorators.py", line 109, in wraps superset-light-1 | return f(self, *args, **kwargs) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/views/base_api.py", line 120, in wraps superset-light-1 | duration, response = time_function(f, self, *args, **kwargs) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/utils/core.py", line 1500, in time_function superset-light-1 | response = func(*args, **kwargs) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/utils/log.py", line 302, in wrapper superset-light-1 | value = f(*args, add_extra_log_payload=log, **kwargs) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/charts/data/api.py", line 271, in data superset-light-1 | return self._get_data_response( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/utils/log.py", line 304, in wrapper superset-light-1 | value = f(*args, **kwargs) superset-light-1 | ^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/charts/data/api.py", line 438, in _get_data_response superset-light-1 | result = command.run(force_cached=force_cached) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/commands/chart/data/get_data_command.py", line 45, in run superset-light-1 | payload = self._query_context.get_payload( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_context.py", line 102, in get_payload superset-light-1 | return self._processor.get_payload(cache_query_context, force_cached) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_context_processor.py", line 1062, in get_payload superset-light-1 | query_results = [ superset-light-1 | ^ superset-light-1 | File "/app/superset/common/query_context_processor.py", line 1063, in <listcomp> superset-light-1 | get_query_results( superset-light-1 | File "/app/superset/common/query_actions.py", line 224, in get_query_results superset-light-1 | return result_func(query_context, query_obj, force_cached) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_actions.py", line 100, in _get_full superset-light-1 | payload = query_context.get_df_payload(query_obj, force_cached=force_cached) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_context.py", line 123, in get_df_payload superset-light-1 | return self._processor.get_df_payload( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_context_processor.py", line 165, in get_df_payload superset-light-1 | query_result = self.get_query_result(query_obj) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/common/query_context_processor.py", line 280, in get_query_result superset-light-1 | result = query_context.datasource.query(query_object.to_dict()) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/connectors/sqla/models.py", line 1645, in query superset-light-1 | df = self.database.get_df( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/models/core.py", line 770, in get_df superset-light-1 | cursor, rows, description = self._execute_sql_with_mutation_and_logging( superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/models/core.py", line 689, in _execute_sql_with_mutation_and_logging superset-light-1 | script = SQLScript(sql, self.db_engine_spec.engine) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/sql/parse.py", line 1233, in __init__ superset-light-1 | self.statements = statement_class.split_script(script, engine) superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/sql/parse.py", line 593, in split_script superset-light-1 | cls(ast=ast, engine=engine) for ast in cls._parse(script, engine) if ast superset-light-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ superset-light-1 | File "/app/superset/sql/parse.py", line 564, in _parse superset-light-1 | raise SupersetParseError(script, engine, **kwargs) from ex superset-light-1 | superset.exceptions.SupersetParseError: Error parsing near 'd' at line 1:26 ``` ### 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]
