Skip to content

Commit 79cd09a

Browse files
committed
Foreign keys clauses don't have parens or comms
Fixes #25146
1 parent 8ea8755 commit 79cd09a

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

lib/pure/parsesql.nim

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -876,21 +876,40 @@ proc parseIfNotExists(p: var SqlParser, k: SqlNodeKind): SqlNode =
876876
else:
877877
result = newNode(k)
878878

879+
880+
proc parseForeignKey(p: var SqlParser): SqlNode =
881+
getTok(p)
882+
eat(p, "key")
883+
result = newNode(nkForeignKey)
884+
885+
var n = newNode(nkColumnList)
886+
parseParIdentList(p, n)
887+
result.add(n)
888+
889+
890+
eat(p, "references")
891+
var m = newNode(nkReferences)
892+
893+
expectIdent(p)
894+
m.add(newNode(nkIdent, p.tok.literal))
895+
getTok(p)
896+
897+
var l = newNode(nkColumnList)
898+
parseParIdentList(p, l)
899+
900+
m.add(l)
901+
902+
result.add(m)
903+
904+
879905
proc parseTableConstraint(p: var SqlParser): SqlNode =
880906
if isKeyw(p, "primary"):
881907
getTok(p)
882908
eat(p, "key")
883909
result = newNode(nkPrimaryKey)
884910
parseParIdentList(p, result)
885911
elif isKeyw(p, "foreign"):
886-
getTok(p)
887-
eat(p, "key")
888-
result = newNode(nkForeignKey)
889-
parseParIdentList(p, result)
890-
eat(p, "references")
891-
var m = newNode(nkReferences)
892-
m.add(parseColumnReference(p))
893-
result.add(m)
912+
result = parseForeignKey(p)
894913
elif isKeyw(p, "unique"):
895914
getTok(p)
896915
eat(p, "key")
@@ -1324,7 +1343,7 @@ proc ra(n: SqlNode, s: var SqlWriter) =
13241343
rs(n, s)
13251344
of nkForeignKey:
13261345
s.addKeyw("foreign key")
1327-
rs(n, s)
1346+
rs(n, s, "", "", "")
13281347
of nkNotNull:
13291348
s.addKeyw("not null")
13301349
of nkNull:
@@ -1360,7 +1379,7 @@ proc ra(n: SqlNode, s: var SqlWriter) =
13601379
s.add(')')
13611380
of nkReferences:
13621381
s.addKeyw("references")
1363-
ra(n.sons[0], s)
1382+
rs(n, s, "", "", "")
13641383
of nkDefault:
13651384
s.addKeyw("default")
13661385
ra(n.sons[0], s)

tests/stdlib/tparsesql.nim

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,10 @@ SELECT `SELECT`, `FROM` as `GROUP` FROM `WHERE`;
302302
doAssert $parseSql("""
303303
SELECT "SELECT", "FROM" as "GROUP" FROM "WHERE";
304304
""") == """select "SELECT", "FROM" as "GROUP" from "WHERE";"""
305+
306+
# foreign key should parse
307+
308+
doAssert $parseSql("""
309+
CREATE TABLE content(artist_id_artist integer, FOREIGN KEY (artist_id_artist) REFERENCES artist(artist_id))
310+
""") == "CREATE TABLE content(artist_id_artist integer, FOREIGN KEY (artist_id_artist) REFERENCES artist(artist_id))"
311+
)

0 commit comments

Comments
 (0)