From 5a77d5badb6834e900c5c41c47d019263f418a3f Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Wed, 15 Jul 2026 12:18:57 -0400 Subject: [PATCH 1/2] Implement default sorting behavior by adding ID sorting when no sort descriptors are provided --- Sources/CoreModelSQLite/Database.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/CoreModelSQLite/Database.swift b/Sources/CoreModelSQLite/Database.swift index 76b4771..01a0f39 100644 --- a/Sources/CoreModelSQLite/Database.swift +++ b/Sources/CoreModelSQLite/Database.swift @@ -359,6 +359,9 @@ internal extension FetchRequest { return sort.property.rawValue.quotedIdentifier + (sort.ascending ? " ASC" : " DESC") } sql += " ORDER BY " + terms.joined(separator: ", ") + } else { + // match CoreData's default behavior of sorting by object ID when no sort descriptors are provided + sql += " ORDER BY \(SQLiteDatabase.primaryKeyColumn.quotedIdentifier) ASC" } if fetchLimit > 0 { sql += " LIMIT \(fetchLimit)" From 851af0ee432664010f9b663b54c86a2b8fdd8e26 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Wed, 15 Jul 2026 12:19:49 -0400 Subject: [PATCH 2/2] Updated unit tests --- .../CoreModelSQLiteTests.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/CoreModelSQLiteTests/CoreModelSQLiteTests.swift b/Tests/CoreModelSQLiteTests/CoreModelSQLiteTests.swift index 2a37271..e7c276b 100644 --- a/Tests/CoreModelSQLiteTests/CoreModelSQLiteTests.swift +++ b/Tests/CoreModelSQLiteTests/CoreModelSQLiteTests.swift @@ -195,6 +195,24 @@ func makeDatabase() throws -> SQLiteDatabase { #expect(inCount == 2) } +@Test func defaultSortByID() async throws { + let database = try makeDatabase() + // insert out of ID order, to ensure the default sort isn't just insertion order + let ids: [ObjectID] = ["person5", "person1", "person9", "person3", "person7"] + let people = ids.map { id in + ModelData(entity: "Person", id: id, attributes: ["name": .string("Person \(id.rawValue)")]) + } + try await database.insert(people) + + // no sort descriptors provided, should default to sorting by id, like CoreData + let request = FetchRequest(entity: "Person") + let results = try await database.fetch(request) + #expect(results.map { $0.id } == ids.sorted { $0.rawValue < $1.rawValue }) + + let fetchedIDs = try await database.fetchID(request) + #expect(fetchedIDs == ids.sorted { $0.rawValue < $1.rawValue }) +} + @Test func toOneRelationship() async throws { let database = try makeDatabase() let team = ModelData(entity: "Team", id: "team1", attributes: ["name": .string("Red")])