Skip to content

Commit 822aea0

Browse files
feat(snowflake): Support for inline FOREIGN KEY (#4493)
* feat(snowflake): Support for inline FOREIGN KEY * Update sqlglot/dialects/snowflake.py --------- Co-authored-by: Jo <[email protected]>
1 parent 1d3c9aa commit 822aea0

File tree

4 files changed

+14
-2
lines changed

4 files changed

+14
-2
lines changed

sqlglot/dialects/snowflake.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,14 @@ def _parse_lambda_arg(self) -> t.Optional[exp.Expression]:
799799

800800
return this
801801

802+
def _parse_foreign_key(self) -> exp.ForeignKey:
803+
# inlineFK, the REFERENCES columns are implied
804+
if self._match(TokenType.REFERENCES, advance=False):
805+
return self.expression(exp.ForeignKey)
806+
807+
# outoflineFK, explicitly names the columns
808+
return super()._parse_foreign_key()
809+
802810
class Tokenizer(tokens.Tokenizer):
803811
STRING_ESCAPES = ["\\", "'"]
804812
HEX_STRINGS = [("x'", "'"), ("X'", "'")]

sqlglot/expressions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ class Directory(Expression):
21132113

21142114
class ForeignKey(Expression):
21152115
arg_types = {
2116-
"expressions": True,
2116+
"expressions": False,
21172117
"reference": False,
21182118
"delete": False,
21192119
"update": False,

sqlglot/generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2829,13 +2829,14 @@ def check_sql(self, expression: exp.Check) -> str:
28292829

28302830
def foreignkey_sql(self, expression: exp.ForeignKey) -> str:
28312831
expressions = self.expressions(expression, flat=True)
2832+
expressions = f" ({expressions})" if expressions else ""
28322833
reference = self.sql(expression, "reference")
28332834
reference = f" {reference}" if reference else ""
28342835
delete = self.sql(expression, "delete")
28352836
delete = f" ON DELETE {delete}" if delete else ""
28362837
update = self.sql(expression, "update")
28372838
update = f" ON UPDATE {update}" if update else ""
2838-
return f"FOREIGN KEY ({expressions}){reference}{delete}{update}"
2839+
return f"FOREIGN KEY{expressions}{reference}{delete}{update}"
28392840

28402841
def primarykey_sql(self, expression: exp.ForeignKey) -> str:
28412842
expressions = self.expressions(expression, flat=True)

tests/dialects/test_snowflake.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,9 @@ def test_ddl(self):
14561456
self.validate_identity(
14571457
"""CREATE OR REPLACE FUNCTION ibis_udfs.public.object_values("obj" OBJECT) RETURNS ARRAY LANGUAGE JAVASCRIPT STRICT AS ' return Object.values(obj) '"""
14581458
)
1459+
self.validate_identity(
1460+
"CREATE OR REPLACE TABLE TEST (SOME_REF DECIMAL(38, 0) NOT NULL FOREIGN KEY REFERENCES SOME_OTHER_TABLE (ID))"
1461+
)
14591462
self.validate_identity(
14601463
"CREATE OR REPLACE FUNCTION my_udf(location OBJECT(city VARCHAR, zipcode DECIMAL(38, 0), val ARRAY(BOOLEAN))) RETURNS VARCHAR AS $$ SELECT 'foo' $$",
14611464
"CREATE OR REPLACE FUNCTION my_udf(location OBJECT(city VARCHAR, zipcode DECIMAL(38, 0), val ARRAY(BOOLEAN))) RETURNS VARCHAR AS ' SELECT \\'foo\\' '",

0 commit comments

Comments
 (0)