Skip to content

Skip _vector_chunks rename for non-FLAT vec0 columns#294

Merged
asg017 merged 1 commit into
asg017:mainfrom
rolf-moz:fix-rename-non-flat-vector-chunks
May 18, 2026
Merged

Skip _vector_chunks rename for non-FLAT vec0 columns#294
asg017 merged 1 commit into
asg017:mainfrom
rolf-moz:fix-rename-non-flat-vector-chunks

Conversation

@rolf-moz
Copy link
Copy Markdown
Contributor

@rolf-moz rolf-moz commented May 5, 2026

@asg017 I was using table renaming in order to force a flush in the DiskANN and this bug popped up with alter tables. I should note that don't know the sqlite-vec code very well and relied on Claude to identify this, so take with a grain of salt.

vec0Rename emits an unconditional ALTER TABLE on <name>_vector_chunks%02d for every vector column, but non-FLAT columns (rescore, IVF, DiskANN) don't create that shadow table — so ALTER TABLE RENAME on a DiskANN-indexed (or rescore/IVF) vec0 table fails with no such table and leaves any cached prepared statements still referencing the old name.

Mirror the guard already used at create time in vec0_init around VEC0_SHADOW_VECTOR_N_CREATE: only rename _vector_chunks when the column's index_type is VEC0_INDEX_TYPE_FLAT.

Adds a regression test exercising rename on a DiskANN-indexed table.

vec0Rename emits an unconditional ALTER TABLE on `<name>_vector_chunks%02d`
for every vector column, but non-FLAT columns (rescore, IVF, DiskANN) don't
create that shadow table — so ALTER TABLE RENAME on a DiskANN-indexed (or
rescore/IVF) vec0 table fails with `no such table` and leaves any cached
prepared statements still referencing the old name.

Mirror the guard already used at create time in vec0_init around
VEC0_SHADOW_VECTOR_N_CREATE: only rename `_vector_chunks` when the column's
index_type is VEC0_INDEX_TYPE_FLAT.

Adds a regression test exercising rename on a DiskANN-indexed table.
@asg017
Copy link
Copy Markdown
Owner

asg017 commented May 18, 2026

Thank you @rolf-moz !

@asg017 asg017 merged commit 8105eee into asg017:main May 18, 2026
asg017 added a commit that referenced this pull request May 18, 2026
vec0Rename only emitted ALTER TABLE on `<name>_ivf_cells%02d`, so renaming
an IVF-indexed vec0 table left `_ivf_centroids`, `_ivf_rowid_map`, and
`_ivf_vectors` (when quantizer != none) with the old prefix. Subsequent
queries against the renamed table broke, and DROP TABLE left those three
shadows orphaned in the schema. Same shape as the DiskANN/rescore bug fixed
in #294, just for the IVF branch.

Mirror ivf_create_shadow_tables: emit ALTER for all four IVF shadows,
gating `_ivf_vectors` on quantizer != VEC0_IVF_QUANTIZER_NONE.

Adds test-ivf-rename.py (auto-skipped on default builds via conftest's
test-ivf prefix rule) covering quantizer=none, quantizer=binary, and
DROP-after-rename. Also adds a rescore rename regression test to
test-rename.py to lock down the (already-correct) rescore path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants