-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Given the following CREATE TABLE statement:
CREATE TABLE t (
col1 INTEGER,
col2 INTEGER,
col3 INTEGER,
PRIMARY KEY (col1, col2)
);A call to db.schema.columnDefinitions(table: "t") should return three ColumnDefinitions where the column definitions for col1 and col2 are marked as being part of the primary key.
Instead, only the first column is marked as being part of the primary key.
Example test case (e.g. in SchemaReaderTests):
func test_columnDefinitions_composite_primary_keys() throws {
try db.run("""
CREATE TABLE t (
col1 INTEGER,
col2 INTEGER,
col3 INTEGER,
PRIMARY KEY (col1, col2)
);
""")
XCTAssertEqual(
try schemaReader.columnDefinitions(table: "t"), [
ColumnDefinition(
name: "col1",
primaryKey: .init(autoIncrement: false),
type: .INTEGER,
nullable: true,
defaultValue: .NULL,
references: nil),
ColumnDefinition(
name: "col2",
primaryKey: .init(autoIncrement: false),
type: .INTEGER,
nullable: true,
defaultValue: .NULL,
references: nil),
ColumnDefinition(
name: "col3",
primaryKey: nil,
type: .INTEGER,
nullable: true,
defaultValue: .NULL,
references: nil)
]
)
}The test fails, as the second column is not detected as being part of the composite primary key.
This is due to the following line:
| primaryKey: row[TableInfoTable.primaryKeyColumn] == 1 ? |
The PRAGMA table_info that is used to return the column definitions, returns one row for each defined column. The pk column contains:
... either zero for columns that are not part of the primary key, or the 1-based index of the column within the primary key).
See https://www.sqlite.org/pragma.html#pragma_table_info
A possible fix could be to change that line to:
primaryKey: (row[TableInfoTable.primaryKeyColumn] ?? 0) > 0 ?Build Information
- Include the SQLite.swift version:
0.14.1 - Mention Xcode and OS X versions affected: Xcode
14.3and macOS Ventura13.4 - How do do you integrate SQLite.swift in your project: Swift Package manager