mirror of
https://github.com/lancedb/lancedb.git
synced 2026-11-03 17:26:53 +00:00
Asking `get_lsm_write_spec` up front to decide how to fuse taxed every hybrid query, on every table, to learn something almost no table needs -- and that endpoint is not cheap: it opens the table and does a `checkout_latest()` manifest reload so a just-set spec is visible. Ask for `_rowid` optimistically instead and fall back to the primary key when the server refuses. Only a MemWAL table refuses; the refusal is raised before the query is planned, so it costs nothing server-side; and it had to be handled regardless, because a write spec installed elsewhere can arrive between any two queries. The proactive probe was belt and braces over a mechanism that already had to exist. A base table now sends nothing beyond its two legs, covered by a test that counts request paths. A MemWAL table pays one refused attempt, then remembers -- `BaseTable::hybrid_pk_fusion_learned` / `note_hybrid_pk_fusion`, seeded by the refusal and never fetched, so reading it is free. Deletes the `lsm_enabled` accessor from `BaseTable`, `Table`, the PyO3 and Python tables, and the type stubs, along with the cache that backed it. A caller who explicitly asked for `_rowid` still gets the reason rather than a bare 400: the refusal is translated into the same message the anticipated path raises. `return_score="all"` turns row ids on for the reranker rather than the caller, so it falls back like any other query -- an e2e run caught both of these. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>