Skip to content

Conversation

@yoshiokatsuneo
Copy link
Contributor

@yoshiokatsuneo yoshiokatsuneo commented May 2, 2025

What type of PR is this?

  • Bug Fix

Description

If we save a empty SQL query(like BigQuery, MySQL, postgreSQL) with auto limit(LIMIT 1000) enabled, redash crashes.
This also prevent from running fix_hash (re-creating query_hash) migration.

Redash crashes when saving empty query with auto limit (LIMIT 1000).
This PR fixes the crashing issue.

スクリーンショット 2025-05-02 22 57 59
[2025-05-02 12:58:31,554][PID:22][INFO][werkzeug] 192.168.65.1 - - [02/May/2025 12:58:31] "POST /api/queries/2 HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 2213, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.10/site-packages/werkzeug/middleware/proxy_fix.py", line 182, in __call__
    return self.app(environ, start_response)
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 2193, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.10/site-packages/flask_restful/__init__.py", line 298, in error_router
    return original_handler(e)
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.10/site-packages/flask_restful/__init__.py", line 298, in error_router
    return original_handler(e)
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/usr/local/lib/python3.10/site-packages/flask_restful/__init__.py", line 489, in wrapper
    resp = resource(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/flask_login/utils.py", line 277, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/flask/views.py", line 109, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)
  File "/app/redash/handlers/base.py", line 31, in dispatch_request
    return super(BaseResource, self).dispatch_request(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/flask_restful/__init__.py", line 604, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/app/redash/permissions.py", line 71, in decorated
    return fn(*args, **kwargs)
  File "/app/redash/handlers/queries.py", line 364, in post
    models.db.session.commit()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/scoping.py", line 163, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1046, in commit
    self.transaction.commit()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 504, in commit
    self._prepare_impl()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 483, in _prepare_impl
    self.session.flush()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2540, in flush
    self._flush(objects)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2681, in _flush
    with util.safe_reraise():
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
    compat.raise_(
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2642, in _flush
    flush_context.execute()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 586, in execute
    persistence.save_obj(
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 205, in save_obj
    for (
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 387, in _organize_states_for_save
    mapper.dispatch.before_update(mapper, connection, state)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/event/attr.py", line 322, in __call__
    fn(*args, **kw)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/events.py", line 731, in wrap
    fn(*arg, **kw)
  File "/app/redash/models/__init__.py", line 847, in receive_before_insert_update
    target.update_query_hash()
  File "/app/redash/models/__init__.py", line 841, in update_query_hash
    self.query_hash = query_runner.gen_query_hash(query_text, should_apply_auto_limit)
  File "/app/redash/query_runner/__init__.py", line 265, in gen_query_hash
    query_text = self.apply_auto_limit(query_text, set_auto_limit)
  File "/app/redash/query_runner/__init__.py", line 325, in apply_auto_limit
    if self.query_is_select_no_limit(last_query):
  File "/app/redash/query_runner/__init__.py", line 291, in query_is_select_no_limit
    parsed_query = sqlparse.parse(query)[0]
IndexError: tuple index out of range

How is this tested?

  • Manually

I confirmed that I can just save empty query successfully.

スクリーンショット 2025-05-02 22 56 11

Copy link
Collaborator

@eradman eradman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a minor edge case, but simple enough!

@eradman
Copy link
Collaborator

eradman commented May 20, 2025

The other way to

@eradman eradman enabled auto-merge (squash) May 20, 2025 13:55
@eradman eradman merged commit 14550a9 into getredash:master May 20, 2025
11 checks passed
@yoshiokatsuneo
Copy link
Contributor Author

@eradman Thanks a lot for your review, and marging !!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants