Skip to content

Commit

Permalink
Fix(parser): make kwarg parsing more robust (#2295)
Browse files Browse the repository at this point in the history
* Fix(parser): make kwarg parsing more robust

* Refactor: add parse_interval flag to avoid parsing interval in struct kwargs
  • Loading branch information
georgesittas authored Sep 22, 2023
1 parent f1b6546 commit 44f732d
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 5 deletions.
4 changes: 2 additions & 2 deletions sqlglot/dialects/mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ def _parse_set_item_names(self) -> exp.Expression:

return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES")

def _parse_type(self) -> t.Optional[exp.Expression]:
def _parse_type(self, parse_interval: bool = True) -> t.Optional[exp.Expression]:
# mysql binary is special and can work anywhere, even in order by operations
# it operates like a no paren func
if self._match(TokenType.BINARY, advance=False):
Expand All @@ -529,7 +529,7 @@ def _parse_type(self) -> t.Optional[exp.Expression]:
if isinstance(data_type, exp.DataType):
return self.expression(exp.Cast, this=self._parse_column(), to=data_type)

return super()._parse_type()
return super()._parse_type(parse_interval=parse_interval)

class Generator(generator.Generator):
LOCKING_READS_SUPPORTED = True
Expand Down
6 changes: 3 additions & 3 deletions sqlglot/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3249,8 +3249,8 @@ def _parse_unary(self) -> t.Optional[exp.Expression]:
return self.UNARY_PARSERS[self._prev.token_type](self)
return self._parse_at_time_zone(self._parse_type())

def _parse_type(self) -> t.Optional[exp.Expression]:
interval = self._parse_interval()
def _parse_type(self, parse_interval: bool = True) -> t.Optional[exp.Expression]:
interval = parse_interval and self._parse_interval()
if interval:
return interval

Expand Down Expand Up @@ -3426,7 +3426,7 @@ def _parse_types(
return this

def _parse_struct_types(self) -> t.Optional[exp.Expression]:
this = self._parse_type() or self._parse_id_var()
this = self._parse_type(parse_interval=False) or self._parse_id_var()
self._match(TokenType.COLON)
return self._parse_column_def(this)

Expand Down
1 change: 1 addition & 0 deletions tests/dialects/test_databricks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class TestDatabricks(Validator):
dialect = "databricks"

def test_databricks(self):
self.validate_identity("CREATE TABLE t (c STRUCT<interval: DOUBLE COMMENT 'aaa'>)")
self.validate_identity("SELECT CAST('11 23:4:0' AS INTERVAL DAY TO HOUR)")
self.validate_identity("SELECT CAST('11 23:4:0' AS INTERVAL DAY TO MINUTE)")
self.validate_identity("SELECT CAST('11 23:4:0' AS INTERVAL DAY TO SECOND)")
Expand Down

0 comments on commit 44f732d

Please sign in to comment.