@@ -1282,6 +1282,122 @@ class DatabaseMigratorTests : GRDBTestCase {
12821282 }
12831283 }
12841284
1285+ func test_merged_migrations_named_like_the_last_that_includes_itself_in_the_list_of_merged_migrations( ) throws {
1286+ // Original migrator
1287+ var oldMigrator = DatabaseMigrator ( )
1288+ oldMigrator. registerMigration ( " v1 " ) { db in
1289+ try db. execute ( sql: " CREATE TABLE t1(a) " )
1290+ }
1291+ oldMigrator. registerMigration ( " v2 " ) { db in
1292+ try db. execute ( sql: " CREATE TABLE t2(a) " )
1293+ }
1294+ oldMigrator. registerMigration ( " v3 " ) { db in
1295+ try db. execute ( sql: " CREATE TABLE t3(a) " )
1296+ }
1297+ oldMigrator. registerMigration ( " v4 " ) { db in
1298+ try db. execute ( sql: " CREATE TABLE t4(a) " )
1299+ }
1300+ oldMigrator. registerMigration ( " v5 " ) { db in
1301+ try db. execute ( sql: " CREATE TABLE t5(a) " )
1302+ }
1303+
1304+ // New migrator merges v2, v3, and v4 into v4
1305+ var newMigrator = DatabaseMigrator ( )
1306+ newMigrator. registerMigration ( " v1 " ) { db in
1307+ try db. execute ( sql: " CREATE TABLE t1(a) " )
1308+ }
1309+ // SUT: the migration identifier is included in the list of merged identifiers.
1310+ newMigrator. registerMigration ( " v4 " , merging: [ " v2 " , " v3 " , " v4 " ] ) { db, appliedIDs in
1311+ if !appliedIDs. contains ( " v2 " ) {
1312+ try db. execute ( sql: " CREATE TABLE t2(a) " )
1313+ }
1314+ if !appliedIDs. contains ( " v3 " ) {
1315+ try db. execute ( sql: " CREATE TABLE t3(a) " )
1316+ }
1317+ try db. execute ( sql: " CREATE TABLE t4(a) " )
1318+ }
1319+ newMigrator. registerMigration ( " v5 " ) { db in
1320+ try db. execute ( sql: " CREATE TABLE t5(a) " )
1321+ }
1322+
1323+ do {
1324+ let dbQueue = try makeDatabaseQueue ( )
1325+
1326+ try newMigrator. migrate ( dbQueue)
1327+ try dbQueue. read { db in
1328+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1329+ try XCTAssertTrue ( String
1330+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1331+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1332+ }
1333+ }
1334+
1335+ do {
1336+ let dbQueue = try makeDatabaseQueue ( )
1337+ try oldMigrator. migrate ( dbQueue, upTo: " v1 " )
1338+
1339+ try newMigrator. migrate ( dbQueue)
1340+ try dbQueue. read { db in
1341+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1342+ try XCTAssertTrue ( String
1343+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1344+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1345+ }
1346+ }
1347+
1348+ do {
1349+ let dbQueue = try makeDatabaseQueue ( )
1350+ try oldMigrator. migrate ( dbQueue, upTo: " v2 " )
1351+
1352+ try newMigrator. migrate ( dbQueue)
1353+ try dbQueue. read { db in
1354+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1355+ try XCTAssertTrue ( String
1356+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1357+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1358+ }
1359+ }
1360+
1361+ do {
1362+ let dbQueue = try makeDatabaseQueue ( )
1363+ try oldMigrator. migrate ( dbQueue, upTo: " v3 " )
1364+
1365+ try newMigrator. migrate ( dbQueue)
1366+ try dbQueue. read { db in
1367+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1368+ try XCTAssertTrue ( String
1369+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1370+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1371+ }
1372+ }
1373+
1374+ do {
1375+ let dbQueue = try makeDatabaseQueue ( )
1376+ try oldMigrator. migrate ( dbQueue, upTo: " v4 " )
1377+
1378+ try newMigrator. migrate ( dbQueue)
1379+ try dbQueue. read { db in
1380+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1381+ try XCTAssertTrue ( String
1382+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1383+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1384+ }
1385+ }
1386+
1387+ do {
1388+ let dbQueue = try makeDatabaseQueue ( )
1389+ try oldMigrator. migrate ( dbQueue, upTo: " v5 " )
1390+
1391+ try newMigrator. migrate ( dbQueue)
1392+ try dbQueue. read { db in
1393+ try XCTAssertEqual ( newMigrator. appliedIdentifiers ( db) , [ " v1 " , " v4 " , " v5 " ] )
1394+ try XCTAssertTrue ( String
1395+ . fetchSet ( db, sql: " SELECT name FROM sqlite_master " )
1396+ . isSuperset ( of: [ " t1 " , " t2 " , " t3 " , " t4 " , " t5 " ] ) )
1397+ }
1398+ }
1399+ }
1400+
12851401 func test_merged_migrations_with_a_new_name( ) throws {
12861402 // Original migrator
12871403 var oldMigrator = DatabaseMigrator ( )
0 commit comments