fix(sqlite): match reserved object names literally

This commit is contained in:
Hypatia May
2026-07-24 11:11:45 +08:00
parent 352934b9ec
commit e54a4ad986
4 changed files with 39 additions and 2 deletions
@@ -345,6 +345,23 @@ describe('SessionPersistenceSqlite: durability and crash semantics', () => {
unchanged.close()
})
it('counts a sqliteX table as user-owned instead of mistaking it for SQLite metadata', async () => {
const path = await freshDbPath()
const unrelated = new DatabaseSync(path)
unrelated.exec('CREATE TABLE sqliteX (value TEXT)')
unrelated.exec("INSERT INTO sqliteX VALUES ('safe')")
unrelated.close()
expect(() => openDatabase(path, 'wal')).toThrow(/unversioned schema or application identity/)
const unchanged = new DatabaseSync(path)
expect(unchanged.prepare('SELECT value FROM sqliteX').get()).toEqual({ value: 'safe' })
expect(unchanged.prepare('PRAGMA application_id').get()).toEqual({ application_id: 0 })
expect(unchanged.prepare('PRAGMA user_version').get()).toEqual({ user_version: 0 })
expect(unchanged.prepare('PRAGMA journal_mode').get()).toEqual({ journal_mode: 'delete' })
unchanged.close()
})
it('rejects view-only and foreign-application unversioned databases without mutation', async () => {
const viewPath = await freshDbPath()
const viewOnly = new DatabaseSync(viewPath)