Skip to content

Commit fd14c44

Browse files
authored
Merge pull request #1210 from stephencelis/fix-null-fk-column
Handle FK definitions w/o key references
2 parents 5ba48d0 + ff93ebc commit fd14c44

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

SQLite.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,9 @@
218218
DB7C5DA728D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
219219
DB7C5DA828D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
220220
DB7C5DA928D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
221+
DBB93D5A2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
222+
DBB93D5B2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
223+
DBB93D5C2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
221224
EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
222225
EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; };
223226
EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
@@ -349,6 +352,7 @@
349352
DB58B21028FB864300F8EEA4 /* SchemaReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaReader.swift; sourceTree = "<group>"; };
350353
DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteFeature.swift; sourceTree = "<group>"; };
351354
DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteVersion.swift; sourceTree = "<group>"; };
355+
DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaReaderTests.swift; sourceTree = "<group>"; };
352356
EE247AD31C3F04ED00AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
353357
EE247AD61C3F04ED00AE3E12 /* SQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQLite.h; sourceTree = "<group>"; };
354358
EE247AD81C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -493,6 +497,7 @@
493497
19A17B56FBA20E7245BC8AC0 /* Schema */ = {
494498
isa = PBXGroup;
495499
children = (
500+
DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */,
496501
19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */,
497502
19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */,
498503
19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */,
@@ -1010,6 +1015,7 @@
10101015
19A17FACE8E4D54A50BA934E /* FTS5Tests.swift in Sources */,
10111016
19A177909023B7B940C5805E /* FTSIntegrationTests.swift in Sources */,
10121017
19A17E1DD976D5CE80018749 /* FTS4Tests.swift in Sources */,
1018+
DBB93D5C2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
10131019
19A17411403D60640467209E /* ExpressionTests.swift in Sources */,
10141020
19A17CA4D7B63D845428A9C5 /* StatementTests.swift in Sources */,
10151021
19A17885B646CB0201BE4BD5 /* QueryTests.swift in Sources */,
@@ -1134,6 +1140,7 @@
11341140
19A178DA2BB5970778CCAF13 /* FTS5Tests.swift in Sources */,
11351141
19A1755C49154C87304C9146 /* FTSIntegrationTests.swift in Sources */,
11361142
19A17444861E1443143DEB44 /* FTS4Tests.swift in Sources */,
1143+
DBB93D5A2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
11371144
19A17DD33C2E43DD6EE05A60 /* ExpressionTests.swift in Sources */,
11381145
19A17D6EC40BC35A5DC81BA8 /* StatementTests.swift in Sources */,
11391146
19A17E3F47DA087E2B76D087 /* QueryTests.swift in Sources */,
@@ -1216,6 +1223,7 @@
12161223
19A1776BD5127DFDF847FF1F /* FTS5Tests.swift in Sources */,
12171224
19A173088B85A7E18E8582A7 /* FTSIntegrationTests.swift in Sources */,
12181225
19A178767223229E61C5066F /* FTS4Tests.swift in Sources */,
1226+
DBB93D5B2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
12191227
19A1781CBA8968ABD3E00877 /* ExpressionTests.swift in Sources */,
12201228
19A17923494236793893BF72 /* StatementTests.swift in Sources */,
12211229
19A17A52BF29D27C9AA229E7 /* QueryTests.swift in Sources */,

Sources/SQLite/Schema/SchemaDefinitions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public struct ColumnDefinition: Equatable {
119119
public struct ForeignKey: Equatable {
120120
let table: String
121121
let column: String
122-
let primaryKey: String
122+
let primaryKey: String?
123123
let onUpdate: String?
124124
let onDelete: String?
125125
}
@@ -377,7 +377,7 @@ extension ColumnDefinition.ForeignKey {
377377
([
378378
"REFERENCES",
379379
table.quote(),
380-
"(\(primaryKey.quote()))",
380+
primaryKey.map { "(\($0.quote()))" },
381381
onUpdate.map { "ON UPDATE \($0)" },
382382
onDelete.map { "ON DELETE \($0)" }
383383
] as [String?]).compactMap { $0 }

Sources/SQLite/Schema/SchemaReader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private enum ForeignKeyListTable {
187187
static let seqColumn = Expression<Int64>("seq")
188188
static let tableColumn = Expression<String>("table")
189189
static let fromColumn = Expression<String>("from")
190-
static let toColumn = Expression<String>("to")
190+
static let toColumn = Expression<String?>("to") // when null, use primary key
191191
static let onUpdateColumn = Expression<String>("on_update")
192192
static let onDeleteColumn = Expression<String>("on_delete")
193193
static let matchColumn = Expression<String>("match")

Tests/SQLiteTests/Schema/SchemaReaderTests.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,44 @@ class SchemaReaderTests: SQLiteTestCase {
172172
])
173173
}
174174

175+
func test_foreignKeys_references_column() throws {
176+
let sql = """
177+
CREATE TABLE artist(
178+
artistid INTEGER PRIMARY KEY,
179+
artistname TEXT
180+
);
181+
CREATE TABLE track(
182+
trackid INTEGER,
183+
trackname TEXT,
184+
trackartist INTEGER REFERENCES artist(artistid)
185+
);
186+
"""
187+
try db.execute(sql)
188+
let trackColumns = try db.schema.foreignKeys(table: "track")
189+
XCTAssertEqual(trackColumns.map { $0.toSQL() }.joined(separator: "\n"), """
190+
REFERENCES "artist" ("artistid")
191+
""")
192+
}
193+
194+
func test_foreignKeys_references_null_column() throws {
195+
let sql = """
196+
CREATE TABLE artist(
197+
artistid INTEGER PRIMARY KEY,
198+
artistname TEXT
199+
);
200+
CREATE TABLE track(
201+
trackid INTEGER,
202+
trackname TEXT,
203+
trackartist INTEGER REFERENCES artist
204+
);
205+
"""
206+
try db.execute(sql)
207+
let trackColumns = try db.schema.foreignKeys(table: "track")
208+
XCTAssertEqual(trackColumns.map { $0.toSQL() }.joined(separator: "\n"), """
209+
REFERENCES "artist"
210+
""")
211+
}
212+
175213
func test_tableDefinitions() throws {
176214
let tables = try schemaReader.tableDefinitions()
177215
XCTAssertEqual(tables.count, 1)

0 commit comments

Comments
 (0)