Skip to content

Commit

Permalink
Fix: presto offset limit order closes tobymao#1754
Browse files Browse the repository at this point in the history
  • Loading branch information
tobymao authored and adrianisk committed Jun 21, 2023
1 parent 770ac30 commit 379608f
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 6 deletions.
8 changes: 8 additions & 0 deletions sqlglot/dialects/presto.py
Original file line number Diff line number Diff line change
Expand Up @@ -372,3 +372,11 @@ def generateseries_sql(self, expression: exp.GenerateSeries) -> str:
start = exp.Cast(this=start, to=to)

return self.func("SEQUENCE", start, end, step)

def offset_limit_modifiers(
self, expression: exp.Expression, fetch: bool, limit: t.Optional[exp.Fetch | exp.Limit]
) -> t.List[str]:
return [
self.sql(expression, "offset"),
self.sql(limit),
]
13 changes: 10 additions & 3 deletions sqlglot/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1526,7 +1526,7 @@ def matchrecognize_sql(self, expression: exp.MatchRecognize) -> str:
return f"{self.seg('MATCH_RECOGNIZE')} {self.wrap(body)}{alias}"

def query_modifiers(self, expression: exp.Expression, *sqls: str) -> str:
limit = expression.args.get("limit")
limit: t.Optional[exp.Fetch | exp.Limit] = expression.args.get("limit")

if self.LIMIT_FETCH == "LIMIT" and isinstance(limit, exp.Fetch):
limit = exp.Limit(expression=limit.args.get("count"))
Expand All @@ -1545,12 +1545,19 @@ def query_modifiers(self, expression: exp.Expression, *sqls: str) -> str:
self.sql(expression, "having"),
*self.after_having_modifiers(expression),
self.sql(expression, "order"),
self.sql(expression, "offset") if fetch else self.sql(limit),
self.sql(limit) if fetch else self.sql(expression, "offset"),
*self.offset_limit_modifiers(expression, fetch, limit),
*self.after_limit_modifiers(expression),
sep="",
)

def offset_limit_modifiers(
self, expression: exp.Expression, fetch: bool, limit: t.Optional[exp.Fetch | exp.Limit]
) -> t.List[str]:
return [
self.sql(expression, "offset") if fetch else self.sql(limit),
self.sql(limit) if fetch else self.sql(expression, "offset"),
]

def after_having_modifiers(self, expression: exp.Expression) -> t.List[str]:
return [
self.sql(expression, "qualify"),
Expand Down
4 changes: 1 addition & 3 deletions sqlglot/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3539,9 +3539,7 @@ def _parse_bracket(self, this):
bracket_kind = self._prev.token_type

if self._match(TokenType.COLON):
expressions: t.List[t.Optional[exp.Expression]] = [
self.expression(exp.Slice, expression=self._parse_conjunction())
]
expressions = [self.expression(exp.Slice, expression=self._parse_conjunction())]
else:
expressions = self._parse_csv(lambda: self._parse_slice(self._parse_conjunction()))

Expand Down
2 changes: 2 additions & 0 deletions tests/dialects/test_presto.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,8 @@ def test_unnest(self):
)

def test_presto(self):
self.validate_identity("SELECT * FROM x OFFSET 1 LIMIT 1")
self.validate_identity("SELECT * FROM x OFFSET 1 FETCH FIRST 1 ROWS ONLY")
self.validate_identity("SELECT BOOL_OR(a > 10) FROM asd AS T(a)")
self.validate_identity("SELECT * FROM (VALUES (1))")
self.validate_identity("START TRANSACTION READ WRITE, ISOLATION LEVEL SERIALIZABLE")
Expand Down

0 comments on commit 379608f

Please sign in to comment.