Skip to content

SchemaReader column definitions are incomplete for composite primary keys #1216

Closed
@stefansaasen

Description

@stefansaasen

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.3 and macOS Ventura 13.4
  • How do do you integrate SQLite.swift in your project: Swift Package manager

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions