fix: DROP INDEX/TABLE clean up FTS/HNSW indexes and their schema keys

This commit is contained in:
2026-07-30 16:20:23 +03:00
parent ce6e7aa707
commit 214b9cf346
2 changed files with 149 additions and 0 deletions
+103
View File
@@ -193,6 +193,109 @@ suite "Schema persistence":
db2.close()
removeDir(dir)
test "DROP INDEX removes FTS index and its schema key (custom name)":
let dir = "/tmp/baradb_schema_persist_dropfts"
removeDir(dir)
block:
var db = newLSMTree(dir)
var ctx = newExecutionContext(db)
check execSql(ctx, "CREATE TABLE docs (id INTEGER PRIMARY KEY, content TEXT)").success
check execSql(ctx, "INSERT INTO docs (id, content) VALUES (1, 'quick brown fox')").success
check execSql(ctx, "CREATE INDEX docs_fts ON docs (content) USING FTS").success
check ctx.ftsIndexes.hasKey("docs.content")
# Drop by the custom index name — the in-memory key is table.col
let d = execSql(ctx, "DROP INDEX docs_fts")
check d.success
check "docs.content" notin ctx.ftsIndexes
let (found, _) = db.get(SchemaFtsIndexPrefix & "docs.content")
check not found
db.close()
block:
var db2 = newLSMTree(dir)
var ctx2 = newExecutionContext(db2)
check "docs.content" notin ctx2.ftsIndexes # no ghost rebuild
db2.close()
removeDir(dir)
test "DROP INDEX removes FTS index by column key":
let dir = "/tmp/baradb_schema_persist_dropfts_col"
removeDir(dir)
block:
var db = newLSMTree(dir)
var ctx = newExecutionContext(db)
check execSql(ctx, "CREATE TABLE docs (id INTEGER PRIMARY KEY, content TEXT)").success
check execSql(ctx, "INSERT INTO docs (id, content) VALUES (1, 'quick brown fox')").success
# No custom name — idxName defaults to colKey (docs.content)
check execSql(ctx, "CREATE INDEX ON docs (content) USING FTS").success
check ctx.ftsIndexes.hasKey("docs.content")
# Drop by column name — matches endsWith(".content")
let d = execSql(ctx, "DROP INDEX content")
check d.success
check "docs.content" notin ctx.ftsIndexes
let (found, _) = db.get(SchemaFtsIndexPrefix & "docs.content")
check not found
db.close()
block:
var db2 = newLSMTree(dir)
var ctx2 = newExecutionContext(db2)
check "docs.content" notin ctx2.ftsIndexes # no ghost rebuild
db2.close()
removeDir(dir)
test "DROP INDEX removes HNSW index and its schema key":
let dir = "/tmp/baradb_schema_persist_drophnsw"
removeDir(dir)
block:
var db = newLSMTree(dir)
var ctx = newExecutionContext(db)
check execSql(ctx, "CREATE TABLE vecs (id INTEGER PRIMARY KEY, embedding TEXT)").success
check execSql(ctx, "INSERT INTO vecs (id, embedding) VALUES (1, '[1.0, 0.0, 0.0]')").success
check execSql(ctx, "CREATE INDEX vecs_hnsw ON vecs (embedding) USING HNSW").success
check ctx.vectorIndexes.hasKey("vecs.embedding")
let d = execSql(ctx, "DROP INDEX vecs_hnsw")
check d.success
check "vecs.embedding" notin ctx.vectorIndexes
let (found, _) = db.get(SchemaVecIndexPrefix & "vecs.embedding")
check not found
db.close()
block:
var db2 = newLSMTree(dir)
var ctx2 = newExecutionContext(db2)
check "vecs.embedding" notin ctx2.vectorIndexes # no ghost rebuild
db2.close()
removeDir(dir)
test "DROP TABLE removes engine indexes for that table":
let dir = "/tmp/baradb_schema_persist_droptbl"
removeDir(dir)
block:
var db = newLSMTree(dir)
var ctx = newExecutionContext(db)
check execSql(ctx, "CREATE TABLE docs (id INTEGER PRIMARY KEY, content TEXT)").success
check execSql(ctx, "INSERT INTO docs (id, content) VALUES (1, 'quick brown fox')").success
check execSql(ctx, "CREATE INDEX docs_fts ON docs (content) USING FTS").success
check execSql(ctx, "CREATE TABLE vecs (id INTEGER PRIMARY KEY, embedding TEXT)").success
check execSql(ctx, "INSERT INTO vecs (id, embedding) VALUES (1, '[1.0, 0.0, 0.0]')").success
check execSql(ctx, "CREATE INDEX vecs_hnsw ON vecs (embedding) USING HNSW").success
check ctx.ftsIndexes.hasKey("docs.content")
check ctx.vectorIndexes.hasKey("vecs.embedding")
check execSql(ctx, "DROP TABLE docs").success
check "docs.content" notin ctx.ftsIndexes
check execSql(ctx, "DROP TABLE vecs").success
check "vecs.embedding" notin ctx.vectorIndexes
let (ftsFound, _) = db.get(SchemaFtsIndexPrefix & "docs.content")
check not ftsFound
let (vecFound, _) = db.get(SchemaVecIndexPrefix & "vecs.embedding")
check not vecFound
db.close()
block:
var db2 = newLSMTree(dir)
var ctx2 = newExecutionContext(db2)
check "docs.content" notin ctx2.ftsIndexes # no ghost rebuild
check "vecs.embedding" notin ctx2.vectorIndexes
db2.close()
removeDir(dir)
test "Stable schema key format":
check tableSchemaKey("users") == "_schema:tables:users"
check serializeTableDdl(TableDef(