Skip to content

Commit 49f18c2

Browse files
authored
Fix virtual table joining (#161)
Small thing noticed after merging #160.
1 parent cf644e3 commit 49f18c2

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

Sources/StructuredQueriesCore/Statements/Select.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ public struct _JoinClause: QueryExpression, Sendable {
17961796
let `operator`: QueryFragment?
17971797
let tableAlias: String?
17981798
let tableColumns: QueryFragment
1799-
let tableName: String
1799+
let tableName: QueryFragment
18001800

18011801
init(
18021802
operator: Operator?,
@@ -1807,15 +1807,15 @@ public struct _JoinClause: QueryExpression, Sendable {
18071807
self.operator = `operator`?.queryFragment
18081808
tableAlias = table.tableAlias
18091809
tableColumns = table.columns.queryFragment
1810-
tableName = table.tableName
1810+
tableName = table.tableFragment
18111811
}
18121812

18131813
public var queryFragment: QueryFragment {
18141814
var query: QueryFragment = ""
18151815
if let `operator` {
18161816
query.append("\(`operator`) ")
18171817
}
1818-
query.append("JOIN \(quote: tableName) ")
1818+
query.append("JOIN \(tableName) ")
18191819
if let tableAlias = tableAlias {
18201820
query.append("AS \(quote: tableAlias) ")
18211821
}

Tests/StructuredQueriesTests/SelectTests.swift

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,32 @@ extension SnapshotTests {
15411541
└─────────────────────────────────────────┘
15421542
"""#
15431543
}
1544+
1545+
assertQuery(
1546+
PragmaForeignKeyList<Reminder>
1547+
.join(PragmaTableInfo<Reminder>.all) { $0.from.eq($1.name) }
1548+
) {
1549+
"""
1550+
SELECT "remindersForeignKeys"."id", "remindersForeignKeys"."seq", "remindersForeignKeys"."table", "remindersForeignKeys"."from", "remindersForeignKeys"."to", "remindersForeignKeys"."on_update", "remindersForeignKeys"."on_delete", "remindersForeignKeys"."match", "remindersTableInfo"."cid", "remindersTableInfo"."name", "remindersTableInfo"."type", "remindersTableInfo"."notnull", "remindersTableInfo"."dflt_value", "remindersTableInfo"."pk"
1551+
FROM pragma_foreign_key_list('reminders') AS "remindersForeignKeys"
1552+
JOIN pragma_table_info('reminders') AS "remindersTableInfo" ON ("remindersForeignKeys"."from" = "remindersTableInfo"."name")
1553+
"""
1554+
} results: {
1555+
"""
1556+
┌────────────────────────────┬────────────────────────────┐
1557+
│ PragmaForeignKeyList( │ PragmaTableInfo( │
1558+
│ id: 0, │ columnID: 5, │
1559+
│ sequence: 0, │ name: "remindersListID", │
1560+
│ table: "remindersLists", │ type: "INTEGER", │
1561+
│ from: "remindersListID", │ isNotNull: true, │
1562+
│ to: "id", │ defaultValue: nil, │
1563+
│ onUpdate: .noAction, │ isPrimaryKey: false │
1564+
│ onDelete: .cascade, │ ) │
1565+
│ match: "NONE" │ │
1566+
│ ) │ │
1567+
└────────────────────────────┴────────────────────────────┘
1568+
"""
1569+
}
15441570
}
15451571
}
15461572
}
@@ -1567,3 +1593,28 @@ struct PragmaTableInfo<Base: Table> {
15671593
@Column("dflt_value") let defaultValue: String?
15681594
@Column("pk") let isPrimaryKey: Bool
15691595
}
1596+
1597+
@Table
1598+
struct PragmaForeignKeyList<Base: Table> {
1599+
static var tableAlias: String? { "\(Base.tableName)ForeignKeys" }
1600+
static var tableFragment: QueryFragment {
1601+
"pragma_foreign_key_list(\(quote: Base.tableName, delimiter: .text))"
1602+
}
1603+
1604+
let id: Int
1605+
@Column("seq") let sequence: Int
1606+
let table: String
1607+
let from: String
1608+
let to: String
1609+
@Column("on_update") let onUpdate: ForeignKeyAction
1610+
@Column("on_delete") let onDelete: ForeignKeyAction
1611+
let match: String
1612+
}
1613+
1614+
enum ForeignKeyAction: String, QueryBindable {
1615+
case cascade = "CASCADE"
1616+
case restrict = "RESTRICT"
1617+
case setDefault = "SET DEFAULT"
1618+
case setNull = "SET NULL"
1619+
case noAction = "NO ACTION"
1620+
}

0 commit comments

Comments
 (0)