Conversation
There was a problem hiding this comment.
✅ Gate recommendation: approve.
The dependency and API adaptations match Lance 12: namespace responses are unwrapped, position deltas state RewriteRows, and unversioned legacy blob requests pin to 2.1 while stable/next select blob v2. Keeping those unversioned tables on 2.1 is preferable to silently migrating them to blob v2 because it preserves the existing table contract while explicit table or catalog versions remain authoritative. The changed paths are documented and covered by real-dataset tests across representative Spark/Scala seams.
This was referenced Sep 13, 2026
lance-core 12.x is built against lance-namespace 0.11.1, so the two move together. Both bumps carry behavior changes that the connector has to absorb: - `LanceNamespace.queryTable` now returns `QueryTableResponse` instead of `byte[]`, and `namespaceExists`/`tableExists` return responses too. - `Update.updateMode` is now mandatory. Lance previously inferred `RewriteRows` from an absent mode but the transaction protobuf cannot persist "absent" distinctly, so the JNI rejects it. Position-delta writes state `RewriteRows` explicitly, which is what they always meant. - Lance's default file format version is now 2.2, which rejects legacy (v1) blob columns outright. A table that asks for `<col>.lance.encoding = 'blob'` without pinning `file_format_version` is now created at 2.1 so it keeps the documented v1 behavior instead of failing the write. - `stable` and `next` resolve to 2.2 or newer, so they now select blob v2 rather than falling through to v1 and being rejected at write time. - Lance rejects null struct values at file format version 2.0 instead of silently reading them back as non-null structs with null children. `testNullStructV2_0ReadsAsEmptyStruct` becomes a rejection test. Verified: full test suites green on lance-spark-3.5_2.12 (1400), lance-spark-3.4_2.12 (1253) and lance-spark-4.2_2.13 (1456); the whole reactor test-compiles. Claude-Session: https://claude.ai/code/session_011gFXXNur56ZyJhu3qdRMcr
FANNG1
force-pushed
the
chore/upgrade-lance-12
branch
from
September 14, 2026 23:32
a92fc01 to
0b50255
Compare
The Spark 4.2 / Scala 2.13 integration job failed on TestDDLIndex::test_create_btree_index_on_int with a Lance external-sort memory exhaustion. That test also failed this way on lance-format#825, which only touched docker files on lance-core 11, and passed on its next run, so it is a resource-dependent flake rather than anything this branch changes. Re-running to confirm. Claude-Session: https://claude.ai/code/session_011gFXXNur56ZyJhu3qdRMcr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Upgrades
lance-corefrom11.0.0-beta.21to12.0.0-beta.18.lance-core12.x is built againstlance-namespace0.11.1, solance-namespacemoves from0.8.6to0.11.1in the same change — keeping 0.8.6 fails to compile the tests, becauseDirectoryNamespace(shipped insidelance-core) references response types that do not exist in 0.8.6.This is a dependency upgrade only; no new connector features.
Behavior changes absorbed
LanceNamespace.queryTablereturnsQueryTableResponseinstead ofbyte[];namespaceExists/tableExistsreturn responses.getData(); update the two test fakesUpdate.updateModeis now mandatory — the transaction protobuf cannot persist "absent" distinctly fromRewriteRows, so the JNI rejects an empty modeSparkPositionDeltaWrite, 3.4 and 3.5) stateRewriteRowsexplicitly, which is what an absent mode always meant<col>.lance.encoding = 'blob'without pinningfile_format_versionis now created at2.1, so it keeps the documented v1 behavior instead of failing the writestable/nextresolve to 2.2 or newerBlobUtils.fileFormatSupportsBlobV2recognizes them, so those tables get blob v2 instead of falling through to v1 and being rejected at write timetestNullStructV2_0ReadsAsEmptyStructbecomestestNullStructV2_0IsRejectedSTABLEresolves to 2.2STABLEassertions inBaseSparkConnectorWriteTestno longer hard-code2.0/2.1The blob-encoding rule is the only user-visible change, and it was chosen to keep existing pipelines byte-identical: without it, every
CREATE TABLE ... TBLPROPERTIES ('x.lance.encoding' = 'blob')that does not pin a version would start failing. Users who want blob v2 already have to setfile_format_versionexplicitly, per the docs.docs/src/config.mdanddocs/src/operations/ddl/create-table.mdare updated.Testing
Full module test suites, all green:
lance-spark-3.5_2.12— 1400 tests, 0 failures, 0 errorslance-spark-3.4_2.12— 1253 tests, 0 failures, 0 errorslance-spark-4.2_2.13— 1456 tests, 0 failures, 0 errorstest-compilepasses;spotless:checkcleanhttps://claude.ai/code/session_011gFXXNur56ZyJhu3qdRMcr