Merge pull request #456 from antonio-mello-ai/fix/insert-embedding-vec0-replace

fix(embed): handle vec0 OR REPLACE limitation in insertEmbedding
This commit is contained in:
Tobias Lütke 2026-03-28 19:58:06 -04:00 committed by GitHub
commit 6a45150f5a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2960,6 +2960,12 @@ export function clearAllEmbeddings(db: Database): void {
/**
* Insert a single embedding into both content_vectors and vectors_vec tables.
* The hash_seq key is formatted as "hash_seq" for the vectors_vec table.
*
* content_vectors is inserted first so that getHashesForEmbedding (which checks
* only content_vectors) won't re-select the hash on a crash between the two inserts.
*
* vectors_vec uses DELETE + INSERT instead of INSERT OR REPLACE because sqlite-vec's
* vec0 virtual tables silently ignore the OR REPLACE conflict clause.
*/
export function insertEmbedding(
db: Database,
@ -2971,11 +2977,16 @@ export function insertEmbedding(
embeddedAt: string
): void {
const hashSeq = `${hash}_${seq}`;
const insertVecStmt = db.prepare(`INSERT OR REPLACE INTO vectors_vec (hash_seq, embedding) VALUES (?, ?)`);
const insertContentVectorStmt = db.prepare(`INSERT OR REPLACE INTO content_vectors (hash, seq, pos, model, embedded_at) VALUES (?, ?, ?, ?, ?)`);
insertVecStmt.run(hashSeq, embedding);
// Insert content_vectors first — crash-safe ordering (see getHashesForEmbedding)
const insertContentVectorStmt = db.prepare(`INSERT OR REPLACE INTO content_vectors (hash, seq, pos, model, embedded_at) VALUES (?, ?, ?, ?, ?)`);
insertContentVectorStmt.run(hash, seq, pos, model, embeddedAt);
// vec0 virtual tables don't support OR REPLACE — use DELETE + INSERT
const deleteVecStmt = db.prepare(`DELETE FROM vectors_vec WHERE hash_seq = ?`);
const insertVecStmt = db.prepare(`INSERT INTO vectors_vec (hash_seq, embedding) VALUES (?, ?)`);
deleteVecStmt.run(hashSeq);
insertVecStmt.run(hashSeq, embedding);
}
// =============================================================================