Skip to content

Commit d026949

Browse files
committed
Do not parse quoted built-in types into UDTs
1 parent 164fec1 commit d026949

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

sqlglot/parser.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5303,22 +5303,30 @@ def _parse_types(
53035303
any_token=False, tokens=(TokenType.VAR,)
53045304
)
53055305
if isinstance(identifier, exp.Identifier):
5306-
tokens = self.dialect.tokenize(identifier.sql(dialect=self.dialect))
5306+
tokens = self.dialect.tokenize(identifier.name)
53075307

53085308
if len(tokens) != 1:
53095309
self.raise_error("Unexpected identifier", self._prev)
53105310

53115311
if tokens[0].token_type in self.TYPE_TOKENS:
5312-
self._prev = tokens[0]
5313-
elif self.dialect.SUPPORTS_USER_DEFINED_TYPES:
5314-
this = self._parse_user_defined_type(identifier)
5312+
type_token = tokens[0].token_type
53155313
else:
5316-
self._retreat(self._index - 1)
5317-
return None
5314+
# retain quotes
5315+
tokens = self.dialect.tokenize(identifier.sql(dialect=self.dialect))
5316+
5317+
if len(tokens) != 1:
5318+
self.raise_error("Unexpected identifier", self._prev)
5319+
5320+
if self.dialect.SUPPORTS_USER_DEFINED_TYPES:
5321+
type_token = None
5322+
this = self._parse_user_defined_type(identifier)
5323+
else:
5324+
self._retreat(self._index - 1)
5325+
return None
53185326
else:
53195327
return None
5320-
5321-
type_token = self._prev.token_type
5328+
else:
5329+
type_token = self._prev.token_type
53225330

53235331
if type_token == TokenType.PSEUDO_TYPE:
53245332
return self.expression(exp.PseudoType, this=self._prev.text.upper())

tests/dialects/test_postgres.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlglot import ParseError, UnsupportedError, exp, transpile
1+
from sqlglot import ParseError, UnsupportedError, exp, transpile, parse_one
22
from sqlglot.helper import logger as helper_logger
33
from tests.dialects.test_dialect import Validator
44

@@ -805,6 +805,12 @@ def test_postgres(self):
805805
)
806806
self.assertIsInstance(self.parse_one("id::UUID"), exp.Cast)
807807

808+
self.validate_identity('1::"int"', "CAST(1 AS INT)")
809+
assert parse_one('1::"int"', read="postgres").to.is_type(exp.DataType.Type.INT)
810+
811+
self.validate_identity('1::"udt"', 'CAST(1 AS "udt")')
812+
assert parse_one('1::"udt"', read="postgres").to.this == exp.DataType.Type.USERDEFINED
813+
808814
self.validate_identity(
809815
"COPY tbl (col1, col2) FROM 'file' WITH (FORMAT format, HEADER MATCH, FREEZE TRUE)"
810816
)

tests/dialects/test_redshift.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlglot import exp, parse_one, transpile
1+
from sqlglot import exp, ParseError, parse_one, transpile
22
from tests.dialects.test_dialect import Validator
33

44

@@ -698,3 +698,10 @@ def test_analyze(self):
698698
self.validate_identity("ANALYZE VERBOSE TBL")
699699
self.validate_identity("ANALYZE TBL PREDICATE COLUMNS")
700700
self.validate_identity("ANALYZE TBL ALL COLUMNS")
701+
702+
def test_cast(self):
703+
self.validate_identity('1::"int"', "CAST(1 AS INTEGER)")
704+
assert parse_one('1::"int"', read="redshift").to.is_type(exp.DataType.Type.INT)
705+
706+
with self.assertRaises(ParseError):
707+
parse_one('1::"udt"', read="redshift")

0 commit comments

Comments
 (0)