mirror of
https://github.com/lancedb/lancedb.git
synced 2026-05-21 05:50:41 +00:00
Fixes #3136. ## Summary - `WithEmbeddingsScannable::scan_as_stream` matched columns positionally against the table schema, so a `CastError` was raised whenever the computed batch order differed from the table schema order. - The mismatch surfaced when `add_columns` added a new physical column **after** an embedding column: the table schema became `[..., embedding, extra]`, but `compute_embeddings_for_batch` always appends embeddings at the end, producing `[..., extra, embedding]`. Position 2 then tried to cast e.g. `score: Float64` → `embedding: FixedSizeList` and failed. - Now we look each output column up by name in the result batch, which is order-independent. If a non-embedding column required by the table schema is missing from the input, we return a clear `InvalidInput` error instead of a confusing cast error. ## Reproduction (from the issue) ```text Table created with: [id, text, text_vec(embedding)] add_columns("score") → schema: [id, text, text_vec, score] table.add([id, text, score]) → BEFORE: CastError on position 2 AFTER: succeeds, embedding is computed ``` ## Tests - `data::scannable.rs::test_with_embeddings_scannable_column_added_after_embedding` — unit test exercising the exact column-order mismatch via `WithEmbeddingsScannable::with_schema`. - `data::scannable.rs::test_with_embeddings_scannable_missing_required_column` — covers the new "missing column" error path. - `table::add_data.rs::test_add_with_embeddings_after_add_columns` — end-to-end regression test mirroring the reproduction in the issue (create table with embedding → `add_columns` → `table.add`). ## Test plan - [x] `cargo check --quiet --features remote --tests --examples` - [x] `cargo clippy --quiet --features remote --tests --examples` - [x] `cargo fmt --all` - [x] `cargo test --quiet --features remote -p lancedb embedding` — 18 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>