@@ -91,7 +91,8 @@ final class DatabaseTests: XCTestCase {
9191 let sql = try sqliteMasterSQL ( name: " idx_chunks_brainbar_queue_id " , path: tempDBPath)
9292
9393 XCTAssertTrue ( sql. contains ( " json_extract(metadata, '$.brainbar_queue_id') " ) )
94- XCTAssertTrue ( sql. contains ( " WHERE json_extract(metadata, '$.brainbar_queue_id') IS NOT NULL " ) )
94+ XCTAssertTrue ( sql. contains ( " json_valid(metadata) " ) )
95+ XCTAssertTrue ( sql. contains ( " json_extract(metadata, '$.brainbar_queue_id') IS NOT NULL " ) )
9596 }
9697
9798 func testQueueIDExpressionIndexMigratesExistingSchema( ) throws {
@@ -119,6 +120,34 @@ final class DatabaseTests: XCTestCase {
119120 XCTAssertTrue ( sql. contains ( " json_extract(metadata, '$.brainbar_queue_id') " ) )
120121 }
121122
123+ func testQueueIDExpressionIndexMigratesExistingSchemaWithMalformedMetadata( ) throws {
124+ let legacyPath = NSTemporaryDirectory ( ) + " brainbar-legacy-malformed- \( UUID ( ) . uuidString) .db "
125+ try sqliteExecWrite (
126+ path: legacyPath,
127+ sql: """
128+ CREATE TABLE chunks (
129+ id TEXT PRIMARY KEY,
130+ content TEXT NOT NULL,
131+ metadata TEXT NOT NULL DEFAULT '{}'
132+ );
133+ INSERT INTO chunks (id, content, metadata)
134+ VALUES ('legacy-bad-metadata', 'Legacy malformed metadata row', '{not json');
135+ """
136+ )
137+ defer {
138+ try ? FileManager . default. removeItem ( atPath: legacyPath)
139+ try ? FileManager . default. removeItem ( atPath: legacyPath + " -wal " )
140+ try ? FileManager . default. removeItem ( atPath: legacyPath + " -shm " )
141+ }
142+
143+ let legacyDB = BrainDatabase ( path: legacyPath)
144+ defer { legacyDB. close ( ) }
145+
146+ XCTAssertTrue ( legacyDB. isOpen)
147+ let sql = try sqliteMasterSQL ( name: " idx_chunks_brainbar_queue_id " , path: legacyPath)
148+ XCTAssertTrue ( sql. contains ( " json_valid(metadata) " ) )
149+ }
150+
122151 func testQueueIDLookupUsesExpressionIndex( ) throws {
123152 db. exec ( """
124153 INSERT INTO chunks (
@@ -144,7 +173,8 @@ final class DatabaseTests: XCTestCase {
144173 EXPLAIN QUERY PLAN
145174 SELECT 1
146175 FROM chunks
147- WHERE json_extract(metadata, '$.brainbar_queue_id') = ?
176+ WHERE json_valid(metadata)
177+ AND json_extract(metadata, '$.brainbar_queue_id') = ?
148178 LIMIT 1
149179 """ ,
150180 binds: [ " brainbar-pending-lookup " ]
0 commit comments