import XCTest import GRDB // A -> B <- C // A -> D private struct A: TableRecord { static let databaseTableName = "a" static let b = belongsTo(B.self) static let d = belongsTo(D.self) } private struct B: TableRecord { static let a = hasOne(A.self) static let c = hasOne(C.self) static let databaseTableName = "b" } private struct C: TableRecord { static let databaseTableName = "c" static let b = belongsTo(B.self) } private struct D: TableRecord { static let a = hasOne(A.self) static let databaseTableName = "d" } /// Test SQL generation class AssociationParallelSQLTests: GRDBTestCase { override func setup(_ dbWriter: some DatabaseWriter) throws { try dbWriter.write { db in try db.create(table: "b") { t in t.primaryKey("id", .integer) } try db.create(table: "d") { t in t.primaryKey("id", .integer) } try db.create(table: "a") { t in t.primaryKey("id", .integer) t.column("bid", .integer).references("b") t.column("did", .integer).references("d") } try db.create(table: "c") { t in t.primaryKey("id", .integer) t.column("bid", .integer).references("b") } } } func testParallelTwoIncludingIncluding() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.including(required: A.b).including(required: A.d), """ SELECT "a".*, "b".*, "d".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(required: A.b).including(optional: A.d), """ SELECT "a".*, "b".*, "d".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(optional: A.b).including(required: A.d), """ SELECT "a".*, "b".*, "d".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(optional: A.b).including(optional: A.d), """ SELECT "a".*, "b".*, "d".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, B.including(required: B.a).including(required: B.c), """ SELECT "b".*, "a".*, "c".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(required: B.a).including(optional: B.c), """ SELECT "b".*, "a".*, "c".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(required: B.c), """ SELECT "b".*, "a".*, "c".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(optional: B.c), """ SELECT "b".*, "a".*, "c".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) } } func testParallelTwoIncludingIncludingOtherKey() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.including(required: A.b).including(required: A.b.forKey("customB")), """ SELECT "a".*, "b1".*, "b2".* \ FROM "a" \ JOIN "b" "b1" ON "b1"."id" = "a"."bid" \ JOIN "b" "b2" ON "b2"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(required: A.b).including(optional: A.b.forKey("customB")), """ SELECT "a".*, "b1".*, "b2".* \ FROM "a" \ JOIN "b" "b1" ON "b1"."id" = "a"."bid" \ LEFT JOIN "b" "b2" ON "b2"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).including(required: A.b.forKey("customB")), """ SELECT "a".*, "b1".*, "b2".* \ FROM "a" \ LEFT JOIN "b" "b1" ON "b1"."id" = "a"."bid" \ JOIN "b" "b2" ON "b2"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).including(optional: A.b.forKey("customB")), """ SELECT "a".*, "b1".*, "b2".* \ FROM "a" \ LEFT JOIN "b" "b1" ON "b1"."id" = "a"."bid" \ LEFT JOIN "b" "b2" ON "b2"."id" = "a"."bid" """) try assertEqualSQL(db, B.including(required: B.a).including(required: B.a.forKey("customA")), """ SELECT "b".*, "a1".*, "a2".* \ FROM "b" \ JOIN "a" "a1" ON "a1"."bid" = "b"."id" \ JOIN "a" "a2" ON "a2"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(required: B.a).including(optional: B.a.forKey("customA")), """ SELECT "b".*, "a1".*, "a2".* \ FROM "b" \ JOIN "a" "a1" ON "a1"."bid" = "b"."id" \ LEFT JOIN "a" "a2" ON "a2"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(required: B.a.forKey("customA")), """ SELECT "b".*, "a1".*, "a2".* \ FROM "b" \ LEFT JOIN "a" "a1" ON "a1"."bid" = "b"."id" \ JOIN "a" "a2" ON "a2"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(optional: B.a.forKey("customA")), """ SELECT "b".*, "a1".*, "a2".* \ FROM "b" \ LEFT JOIN "a" "a1" ON "a1"."bid" = "b"."id" \ LEFT JOIN "a" "a2" ON "a2"."bid" = "b"."id" """) } } func testParallelTwoIncludingIncludingSameAssociation() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.including(required: A.b).including(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(required: A.b).including(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).including(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).including(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, B.including(required: B.a).including(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(required: B.a).including(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).including(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" """) } } func testParallelTwoIncludingJoining() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.including(required: A.b).joining(required: A.d), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(required: A.b).joining(optional: A.d), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(optional: A.b).joining(required: A.d), """ SELECT "a".*, "b".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.including(optional: A.b).joining(optional: A.d), """ SELECT "a".*, "b".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, B.including(required: B.a).joining(required: B.c), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(required: B.a).joining(optional: B.c), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).joining(required: B.c), """ SELECT "b".*, "a".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).joining(optional: B.c), """ SELECT "b".*, "a".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) } } func testParallelTwoIncludingJoiningSameAssociation() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.including(required: A.b).joining(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(required: A.b).joining(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).joining(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.including(optional: A.b).joining(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, B.including(required: B.a).joining(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(required: B.a).joining(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).joining(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.including(optional: B.a).joining(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" """) } } func testParallelTwoJoiningIncluding() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.joining(required: A.b).including(required: A.d), """ SELECT "a".*, "d".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(required: A.b).including(optional: A.d), """ SELECT "a".*, "d".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(optional: A.b).including(required: A.d), """ SELECT "a".*, "d".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(optional: A.b).including(optional: A.d), """ SELECT "a".*, "d".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, B.joining(required: B.a).including(required: B.c), """ SELECT "b".*, "c".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(required: B.a).including(optional: B.c), """ SELECT "b".*, "c".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).including(required: B.c), """ SELECT "b".*, "c".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).including(optional: B.c), """ SELECT "b".*, "c".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) } } func testParallelTwoJoiningIncludingSameAssociation() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.joining(required: A.b).including(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(required: A.b).including(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(optional: A.b).including(required: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(optional: A.b).including(optional: A.b), """ SELECT "a".*, "b".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, B.joining(required: B.a).including(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(required: B.a).including(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).including(required: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).including(optional: B.a), """ SELECT "b".*, "a".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" """) } } func testParallelTwoJoiningJoining() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.joining(required: A.b).joining(required: A.d), """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(required: A.b).joining(optional: A.d), """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(optional: A.b).joining(required: A.d), """ SELECT "a".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, A.joining(optional: A.b).joining(optional: A.d), """ SELECT "a".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" \ LEFT JOIN "d" ON "d"."id" = "a"."did" """) try assertEqualSQL(db, B.joining(required: B.a).joining(required: B.c), """ SELECT "b".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(required: B.a).joining(optional: B.c), """ SELECT "b".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).joining(required: B.c), """ SELECT "b".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ JOIN "c" ON "c"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).joining(optional: B.c), """ SELECT "b".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" \ LEFT JOIN "c" ON "c"."bid" = "b"."id" """) } } func testParallelTwoJoiningJoiningSameAssociation() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in try assertEqualSQL(db, A.joining(required: A.b).joining(required: A.b), """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(required: A.b).joining(optional: A.b), """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(optional: A.b).joining(required: A.b), """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, A.joining(optional: A.b).joining(optional: A.b), """ SELECT "a".* \ FROM "a" \ LEFT JOIN "b" ON "b"."id" = "a"."bid" """) try assertEqualSQL(db, B.joining(required: B.a).joining(required: B.a), """ SELECT "b".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(required: B.a).joining(optional: B.a), """ SELECT "b".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).joining(required: B.a), """ SELECT "b".* \ FROM "b" \ JOIN "a" ON "a"."bid" = "b"."id" """) try assertEqualSQL(db, B.joining(optional: B.a).joining(optional: B.a), """ SELECT "b".* \ FROM "b" \ LEFT JOIN "a" ON "a"."bid" = "b"."id" """) } } func testRequestRefiningFilter() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in do { let request = A .joining(required: A.b.filter(Column("id") > 1)) .joining(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON ("b"."id" = "a"."bid") AND ("b"."id" > 1) """) } do { let request = A .joining(required: A.b) .joining(required: A.b.filter(Column("id") < 3)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON ("b"."id" = "a"."bid") AND ("b"."id" < 3) """) } do { let request = A .joining(required: A.b.filter(Column("id") > 1)) .joining(required: A.b.filter(Column("id") < 3)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON ("b"."id" = "a"."bid") AND ("b"."id" > 1) AND ("b"."id" < 3) """) } } } func testRequestRefiningOrder() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in do { let request = A .joining(required: A.b.order(Column("id"))) .joining(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ ORDER BY "b"."id" """) } do { let request = A .joining(required: A.b) .joining(required: A.b.order(Column("id").desc)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ ORDER BY "b"."id" DESC """) } do { let request = A .joining(required: A.b.order(Column("id"))) .joining(required: A.b.order(Column("id").desc)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" \ ORDER BY "b"."id" DESC """) } } } func testRequestRefiningSelection() throws { let dbQueue = try makeDatabaseQueue() try dbQueue.inDatabase { db in // joining + joining do { let request = A .joining(required: A.b.select(Column("id"), 1.databaseValue)) .joining(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .joining(required: A.b) .joining(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .joining(required: A.b.select(Column("id"), 1.databaseValue)) .joining(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } // joining + including do { let request = A .joining(required: A.b.select(Column("id"), 1.databaseValue)) .including(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .joining(required: A.b) .including(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 2 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .joining(required: A.b.select(Column("id"), 1.databaseValue)) .including(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 2 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } // including + joining do { let request = A .including(required: A.b.select(Column("id"), 1.databaseValue)) .joining(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 1 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .including(required: A.b) .joining(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .including(required: A.b.select(Column("id"), 1.databaseValue)) .joining(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 1 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } // including + including do { let request = A .including(required: A.b.select(Column("id"), 1.databaseValue)) .including(required: A.b) try assertEqualSQL(db, request, """ SELECT "a".*, "b".* \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .including(required: A.b) .including(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 2 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } do { let request = A .including(required: A.b.select(Column("id"), 1.databaseValue)) .including(required: A.b.select(Column("id"), 2.databaseValue)) try assertEqualSQL(db, request, """ SELECT "a".*, "b"."id", 2 \ FROM "a" \ JOIN "b" ON "b"."id" = "a"."bid" """) } } } }