diff --git a/redash/utils/__init__.py b/redash/utils/__init__.py index d63efc001b..732295e11c 100644 --- a/redash/utils/__init__.py +++ b/redash/utils/__init__.py @@ -216,19 +216,23 @@ def render_template(path, context): def query_is_select_no_limit(query): parsed_query = sqlparse.parse(query)[0] - last_keyword_idx = find_last_keyword_idx(parsed_query) + last_keyword_idx = find_last_keyword_idx(parsed_query.tokens) + penultimate_keyword_idx = find_last_keyword_idx(parsed_query.tokens[:last_keyword_idx]) # Either invalid query or query that is not select if last_keyword_idx == -1 or parsed_query.tokens[0].value.upper() != "SELECT": return False no_limit = parsed_query.tokens[last_keyword_idx].value.upper() != "LIMIT" \ + and not (penultimate_keyword_idx != -1 \ + and parsed_query.tokens[penultimate_keyword_idx].value.upper() == "LIMIT" \ + and parsed_query.tokens[last_keyword_idx].value.upper() == "ALL") \ and parsed_query.tokens[last_keyword_idx].value.upper() != "OFFSET" return no_limit -def find_last_keyword_idx(parsed_query): - for i in reversed(range(len(parsed_query.tokens))): - if parsed_query.tokens[i].ttype in sqlparse.tokens.Keyword: +def find_last_keyword_idx(parsed_query_tokens): + for i in reversed(range(len(parsed_query_tokens))): + if parsed_query_tokens[i].ttype in sqlparse.tokens.Keyword: return i return -1