diff --git a/superset/sql_parse.py b/superset/sql_parse.py index f52c80f65be82..d68ac5ea4cfd2 100644 --- a/superset/sql_parse.py +++ b/superset/sql_parse.py @@ -182,7 +182,10 @@ def _extract_limit_from_query(self, statement): _, token = statement.token_next(idx=idx) if token: if isinstance(token, IdentifierList): - _, token = token.token_next(idx=-1) + # In case of "LIMIT , ", find comma and extract + # first succeeding non-whitespace token + idx, _ = token.token_next_by(m=(sqlparse.tokens.Punctuation, ",")) + _, token = token.token_next(idx=idx) if token and token.ttype == sqlparse.tokens.Literal.Number.Integer: return int(token.value) diff --git a/tests/db_engine_specs_test.py b/tests/db_engine_specs_test.py index 733b9bea12723..c9c398f8de304 100644 --- a/tests/db_engine_specs_test.py +++ b/tests/db_engine_specs_test.py @@ -175,12 +175,12 @@ def test_extract_limit_from_query(self, engine_spec_class=MySQLEngineSpec): q2 = "select * from (select * from my_subquery limit 10) where col=1 limit 20" q3 = "select * from (select * from my_subquery limit 10);" q4 = "select * from (select * from my_subquery limit 10) where col=1 limit 20;" - q5 = "select * from mytable limit 10, 20" + q5 = "select * from mytable limit 20, 10" q6 = "select * from mytable limit 10 offset 20" q7 = "select * from mytable limit" q8 = "select * from mytable limit 10.0" q9 = "select * from mytable limit x" - q10 = "select * from mytable limit x, 20" + q10 = "select * from mytable limit 20, x" q11 = "select * from mytable limit x offset 20" self.assertEqual(engine_spec_class.get_limit_from_sql(q0), None)