mirror of
https://github.com/lancedb/lancedb.git
synced 2026-08-18 03:58:26 +00:00
python-v0.36.0
2709 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
0749532c3c | Bump version: 0.31.0-beta.1 → 0.31.0-beta.2 | ||
|
|
26481a4b74 | Bump version: 0.34.0-beta.1 → 0.34.0-beta.2 python-v0.34.0-beta.2 | ||
|
|
08596f1644 |
chore(deps): bump the rust-minor-patch group with 2 updates (#3565)
Bumps the rust-minor-patch group with 2 updates: [bytes](https://github.com/tokio-rs/bytes) and [napi](https://github.com/napi-rs/napi-rs). Updates `bytes` from 1.11.1 to 1.12.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tokio-rs/bytes/releases">bytes's releases</a>.</em></p> <blockquote> <h2>Bytes v1.12.0</h2> <h1>1.12.0 (June 18th, 2026)</h1> <h3>Added</h3> <ul> <li>Add <code>BytesMut::extend_from_within()</code> (<a href="https://redirect.github.com/tokio-rs/bytes/issues/818">#818</a>)</li> <li>Add <code>BytesMut::try_unsplit()</code> (<a href="https://redirect.github.com/tokio-rs/bytes/issues/746">#746</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix panic in <code>get_int</code> if <code>nbytes</code> is zero (<a href="https://redirect.github.com/tokio-rs/bytes/issues/806">#806</a>)</li> </ul> <h3>Changed</h3> <ul> <li>Pass vtable data by value (<a href="https://redirect.github.com/tokio-rs/bytes/issues/826">#826</a>)</li> <li>Exclude development scripts from published package (<a href="https://redirect.github.com/tokio-rs/bytes/issues/810">#810</a>)</li> </ul> <h3>Documented</h3> <ul> <li>Document that <code>BytesMut::{reserve,try_reserve}</code> doesn't preserve unused capacity (<a href="https://redirect.github.com/tokio-rs/bytes/issues/808">#808</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md">bytes's changelog</a>.</em></p> <blockquote> <h1>1.12.0 (June 18th, 2026)</h1> <h3>Added</h3> <ul> <li>Add <code>BytesMut::extend_from_within()</code> (<a href="https://redirect.github.com/tokio-rs/bytes/issues/818">#818</a>)</li> <li>Add <code>BytesMut::try_unsplit()</code> (<a href="https://redirect.github.com/tokio-rs/bytes/issues/746">#746</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix panic in <code>get_int</code> if <code>nbytes</code> is zero (<a href="https://redirect.github.com/tokio-rs/bytes/issues/806">#806</a>)</li> </ul> <h3>Changed</h3> <ul> <li>Pass vtable data by value (<a href="https://redirect.github.com/tokio-rs/bytes/issues/826">#826</a>)</li> <li>Exclude development scripts from published package (<a href="https://redirect.github.com/tokio-rs/bytes/issues/810">#810</a>)</li> </ul> <h3>Documented</h3> <ul> <li>Document that <code>BytesMut::{reserve,try_reserve}</code> doesn't preserve unused capacity (<a href="https://redirect.github.com/tokio-rs/bytes/issues/808">#808</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tokio-rs/bytes/commit/91402cee605b21bf530ac07ede463599182b5d32"><code>91402ce</code></a> Release bytes v1.12.0 (<a href="https://redirect.github.com/tokio-rs/bytes/issues/831">#831</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/2256e6dc3e82fc87600f2161658572b62bfdd214"><code>2256e6d</code></a> chore: add safety comments on unsafe blocks (<a href="https://redirect.github.com/tokio-rs/bytes/issues/827">#827</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/245adff079eb0cb1a706d35bab5f68b2d51919f6"><code>245adff</code></a> Pass vtable data by value (<a href="https://redirect.github.com/tokio-rs/bytes/issues/826">#826</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/00cc5ff2bd861f7b62603a268ec477c3cead5f1e"><code>00cc5ff</code></a> Implement <code>BytesMut::extend_from_within</code> (<a href="https://redirect.github.com/tokio-rs/bytes/issues/818">#818</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/5b79d316c92b88b836449f8956dc8430c370108b"><code>5b79d31</code></a> Merge tag 'v1.11.1'</li> <li><a href="https://github.com/tokio-rs/bytes/commit/804ee6d039bdea017f0f3faf91806c9771d7e555"><code>804ee6d</code></a> Make try_unsplit method public (<a href="https://redirect.github.com/tokio-rs/bytes/issues/746">#746</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/fd426ca0842cf9688def31d9ee4e027692ac6477"><code>fd426ca</code></a> Exclude development scripts from published package (<a href="https://redirect.github.com/tokio-rs/bytes/issues/810">#810</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/b4ed70daee06013a35a13832807e8f244d5419aa"><code>b4ed70d</code></a> Add test for copy_to_bytes() -> BytesMut avoiding clone (<a href="https://redirect.github.com/tokio-rs/bytes/issues/809">#809</a>)</li> <li><a href="https://github.com/tokio-rs/bytes/commit/94e42915a9a4bac7c2fbaa3d94f27bf0eb4dfb14"><code>94e4291</code></a> Document that <code>BytesMut::{reserve,try_reserve}</code> doesn't preserve unused capac...</li> <li><a href="https://github.com/tokio-rs/bytes/commit/acd1e0ffb8f076225759b8005d04f65ef77cccca"><code>acd1e0f</code></a> Fix <code>get_int</code> if <code>nbytes</code> is zero (<a href="https://redirect.github.com/tokio-rs/bytes/issues/806">#806</a>)</li> <li>See full diff in <a href="https://github.com/tokio-rs/bytes/compare/v1.11.1...v1.12.0">compare view</a></li> </ul> </details> <br /> Updates `napi` from 3.9.1 to 3.9.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi's releases</a>.</em></p> <blockquote> <h2>napi-v3.9.3</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> sync referred flag when creating a weak ThreadsafeFunction (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3337">#3337</a>)</li> </ul> <h3>Other</h3> <ul> <li><em>(napi)</em> outline non-generic core of ThreadsafeFunction::create (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3334">#3334</a>)</li> </ul> <h2>napi-v3.9.2</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> ReadableStream Reader loses chunks and aborts on errored streams (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3328">#3328</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/ee58383da4d91950e95355dcd8b93885f78f20e5"><code>ee58383</code></a> chore(napi): release v3.9.3 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3335">#3335</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/c78727667b75807ece2e601ca3e1b2a3f87c7196"><code>c787276</code></a> fix(napi): sync referred flag when creating a weak ThreadsafeFunction (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3337">#3337</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/d4276ca315ef60558427178a53fe251b7de4cb38"><code>d4276ca</code></a> chore(deps): update dependency oxc-parser to ^0.137.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3336">#3336</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/a0b1831ce596fcca53536240ebe2afc355b8cfba"><code>a0b1831</code></a> perf(napi): outline non-generic core of ThreadsafeFunction::create (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3334">#3334</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/3759d7b485a4fb95ed4be77c3d383beab38c7b74"><code>3759d7b</code></a> chore(deps): update rust-lang/crates-io-auth-action action to v1.0.5 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3333">#3333</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/dd41eeb921517f58b26c21ccf8f13e086cf37cea"><code>dd41eeb</code></a> build(deps): bump protobufjs from 7.6.2 to 7.6.4 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3332">#3332</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/cdd48b3873d1379acc4cf5750a899dcd35e21399"><code>cdd48b3</code></a> chore(deps): update dependency oxc-parser to ^0.136.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3314">#3314</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/e98762de2c4f6d18d4fa8178916daf7779ca261a"><code>e98762d</code></a> chore(deps): update yarn monorepo to v4.17.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3330">#3330</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/529a78d15c0c7d6ca6d4a732c5e335f9de701879"><code>529a78d</code></a> chore(napi): release v3.9.2 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3329">#3329</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/88f4b97030d50e0cfa279d2fa7ad8345517200b3"><code>88f4b97</code></a> fix(napi): ReadableStream Reader loses chunks and aborts on errored streams (...</li> <li>Additional commits viewable in <a href="https://github.com/napi-rs/napi-rs/compare/napi-v3.9.1...napi-v3.9.3">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
f16da19b78 |
chore: update lance dependency to v9.0.0-beta.2 (#3569)
Updates LanceDB's Lance dependencies to v9.0.0-beta.2 across the Rust workspace and Java lance-core dependency.\n\nNo compatibility fixes were required; clippy and formatting pass after installing the missing toolchain components on the runner. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v9.0.0-beta.2 |
||
|
|
41ac32a344 |
feat(rust): add blob read and materialization APIs (#3562)
This PR is for the Read path against blob v2. #3528 handles declare + write, and this this adds materialization on local tables. - blob_columns() - fetch_blobs(column, row_ids) → bytes - fetch_blob_files(column, row_ids) → lazy handles - Pass _rowid from query().with_row_id(). Remote returns NotSupported. (for now) ### Use cases search, grab row ids, materialize images: ```rust let row_ids = /* _rowid from hits */; let images = table.fetch_blobs("image", &row_ids).await?; ``` Large blobs: open handles, read only what you need: ```rust let handles = table.fetch_blob_files("image", &row_ids).await?; let bytes = handles[0].as_ref().unwrap().read().await?; ``` Filter then batch fetch: collect ids from a filter, one call. Multiple blob columns: image and thumbnail independently. Row ids from before compact: still resolve. ### Alignment note Lance `read_blobs` drops null rows. We descriptor-take first, read non-null ids, re-expand to match input order. Null and zero-length blobs come back null/None. Bytes path sets `preserve_order(true)`. So I added: ``` TODO(lance): expose selection_index or an aligned execute so we can drop the pre-read. ``` ### Tests `cargo test -p lancedb --test blob_integration` - 30 tests covering nulls, reorder, dups, cross-fragment bytes + files, compact, delete, legacy v1 errors. --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
ba1ef34481 |
feat(rust): add blob v2 schema declaration and write path (#3528)
First Rust PR for #3231. Lance already stores blob v2. This adds the LanceDB write side. ```rust let schema = Schema::new(vec![ Field::new("id", DataType::Int64, false), lancedb::blob("image", true), ]); let table = db.create_table("photos", schema).execute().await?; table.add(batch_with_large_binary_image_column).execute().await?; ``` Read/materialize and Python are follow-up PRs. ### Testing - cargo test -p lancedb --test blob_integration - cargo test -p lancedb blob:: datafusion::blob_coerce - cargo test -p lancedb (591 passed) - cargo clippy --features remote --tests --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
85d870b397 |
fix: parse RFC 3339 created_at and improve IndexConfig repr (#3558)
The server now serializes an index's `created_at` as an RFC 3339 string
(e.g. `"2026-06-18T21:37:36.637Z"`), but the client deserializer only
accepted a unix timestamp in milliseconds. This caused `list_indices` to
fail with:
```
Failed to parse list_indices response: invalid type: string "2026-06-18T21:37:36.637Z", expected a unix timestamp in milliseconds
```
This PR replaces the fixed millisecond deserializer with a custom one
that accepts both an RFC 3339 string (current server) and a
unix-millisecond integer (legacy deployments), so the client works
against any server version.
It also improves the `IndexConfig` repr in the Python bindings.
Previously it printed only three fields (`Index(FTS, columns=["text"],
name="text_idx")`), hiding the metadata that `list_indices` returns. It
now renders every populated field, omitting any that are `None`. Each
value is valid Python — integer counts use `_` thousands separators and
`created_at` uses the `datetime` repr — so values round-trip. The real
repr is a single line; it's wrapped here for readability:
```python
>>> table.list_indices()
[IndexConfig(
name="text_idx",
index_type="FTS",
columns=["text"],
index_uuid="aefd3e00-2f95-4bdc-92ac-06de84442bf1",
type_url="/lance.table.InvertedIndexDetails",
created_at=datetime.datetime(2026, 6, 18, 21, 37, 36, 637000, tzinfo=datetime.timezone.utc),
num_indexed_rows=2,
size_bytes=3_669,
num_segments=1,
index_version=1,
index_details={
'lance_tokenizer': None,
'base_tokenizer': 'simple',
'language': 'English',
'with_position': False,
'max_token_length': 40,
'lower_case': True,
'stem': True,
'remove_stop_words': True,
'custom_stop_words': None,
'ascii_folding': True,
'min_ngram_length': 3,
'max_ngram_length': 3,
'prefix_only': False,
},
)]
```
Fixes #3556
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
c46d59d2ee |
chore: update lance dependency to v8.0.0-rc.1 (#3557)
Updates LanceDB Lance dependencies to Lance v8.0.0-rc.1. This includes the Rust workspace Lance crates, Cargo.lock, and Java lance-core version. Triggering tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-rc.1 |
||
|
|
113f187c2d | Bump version: 0.31.0-beta.0 → 0.31.0-beta.1 | ||
|
|
3b279f5705 | Bump version: 0.34.0-beta.0 → 0.34.0-beta.1 python-v0.34.0-beta.1 | ||
|
|
e1334954d7 | fix: overflow using sys.maxsize for k in query with namespace connection (#3561) | ||
|
|
2f65a233fe |
chore: update lance dependency to v8.0.0-beta.19 (#3555)
Updates LanceDB's Lance dependencies from v8.0.0-beta.17 to v8.0.0-beta.19. This includes the Rust workspace Lance crates, Cargo.lock refresh, and Java lance-core version bump. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.19 |
||
|
|
e81356089a | Bump version: 0.30.1-beta.2 → 0.31.0-beta.0 | ||
|
|
4f4cce3f64 | Bump version: 0.33.1-beta.2 → 0.34.0-beta.0 python-v0.34.0-beta.0 | ||
|
|
c1c19cd133 |
chore: update lance dependency to v8.0.0-beta.17 (#3552)
Updates the Lance Rust workspace dependencies and Java lance-core dependency to v8.0.0-beta.17. No LanceDB compatibility code changes were required; validation passed with cargo clippy and cargo fmt. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.17 |
||
|
|
ce5dadd386 |
fix(ci): allow shell pre-commit hooks in bumpversion configs (#3554)
The "Create release commit" workflow (`make-release-commit.yml`) has failed on its last two runs; no release tags have been created since June 4. Since this workflow creates the tag that the cargo/npm/pypi/java publish workflows trigger off of, all recent releases are effectively blocked. The workflow installs `bump-my-version` unpinned. Version `1.4.0` added a check that refuses to run `pre_commit_hooks` containing shell syntax (pipes, `&&`, `if`, variable expansion) unless `allow_shell_hooks = true` is set. Both bumpversion configs use such hooks: - `python/.bumpversion.toml` — updates `Cargo.lock` after the bump (fails first) - `.bumpversion.toml` — runs `mvn versions:set` for the Java packages The job dies at the version-bump step with: > Hook '…' contains shell syntax (pipes, redirects, or variable expansion). Set `allow_shell_hooks = true` in your configuration to enable shell execution… This sets `allow_shell_hooks = true` in both configs to restore the previous behavior. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
1f8ebef3cd |
fix(rust): return typed errors instead of panicking in Bedrock embedding path (#3512)
Closes #3506 ## Problem The Bedrock embedding compute path (`rust/lancedb/src/embeddings/bedrock.rs`) panics instead of returning a typed error in several places: - `serde_json::to_vec(&request_body).unwrap()`: request serialization. - `block_in_place(...).unwrap()`: the AWS `invoke_model` send result; any API error terminates the worker instead of propagating. - `v.as_f64().unwrap() as f32`: panics on non-numeric values in the returned embedding array. - `Handle::current()` + `block_in_place` assume a multi-threaded Tokio runtime and panic when that assumption does not hold (no runtime, or a current-thread runtime). Malformed payloads, non-numeric embedding values, or an incompatible runtime should surface as typed errors and never panic. ## Fix - Serialize the request body before the blocking section so a serialization failure returns `Error::Runtime` via `?`. - Map the `invoke_model` send error to `Error::Runtime` instead of `unwrap`. - Add a `json_array_to_f32` helper that converts the response array to `Vec<f32>`, returning `Error::Runtime` for a missing/non-array field or a non-numeric element (used by both the Titan and Cohere paths). - Add `current_multi_thread_handle()` (`Handle::try_current()` + a `RuntimeFlavor::CurrentThread` guard) so an absent or incompatible runtime returns a typed error rather than panicking in `block_in_place`. Scope note: the sibling `openai.rs` provider uses the same `block_in_place` + `block_on` bridge, so the bridge pattern itself is kept; this change only removes the panic paths that are specific to the Bedrock provider. ## Testing Added 6 unit tests (no AWS credentials required): - `json_array_to_f32`: valid numbers, non-array payload, and non-numeric element. - `current_multi_thread_handle`: errors with no runtime, errors on a current-thread runtime, and succeeds on a multi-threaded runtime. All pass; `cargo fmt` and `cargo clippy` clean. Build/test with `--features bedrock,lance/protoc`. |
||
|
|
217fd8491d |
fix(python): clarify single dictionary input error (#3537)
## Summary - clarify the Python error for passing a single dictionary to table creation/add paths - add a regression test for `create_table(..., data=dict)` so it points users to a list of dictionaries Fixes #409 ## Testing - `python -m pytest python/tests/test_table.py -q` - `python -m ruff format python/lancedb/table.py python/lancedb/scannable.py python/tests/test_table.py` - `python -m ruff check python/lancedb/table.py python/lancedb/scannable.py python/tests/test_table.py` |
||
|
|
9128dbcd7a |
fix(util): escape single quotes in struct field names in value_to_sql (#3548)
### Bug
`value_to_sql({...})` builds a DataFusion `named_struct(...)` literal
but interpolates the struct field names directly as `f"'{k}'"`. A field
name that contains a single quote therefore produces invalid SQL:
```python
>>> from lancedb.util import value_to_sql
>>> value_to_sql({"it's": 1})
"named_struct('it's', 1)" # invalid SQL — the quote terminates the literal
```
String *values* are already escaped (single quotes doubled) by the `str`
branch of `value_to_sql`, so keys and values were handled
inconsistently. This affects `Table.update(values={...})` /
`merge_insert` when a struct column has a field name containing `'`.
### Fix
Render the key through `value_to_sql(str(k))` so field names are escaped
exactly like string values:
```python
>>> value_to_sql({"it's": 1})
"named_struct('it''s', 1)"
```
Keys without special characters are unchanged (`'a'` stays `'a'`), so
existing behavior is preserved.
### Verification
```
$ pytest python/tests/test_util.py -k value_to_sql_dict
```
The new `test_value_to_sql_dict_key_escaping` covers quoted keys (incl.
nested structs) and fails on `main` (`named_struct('it's', 1)`), passes
with this change; the existing `test_value_to_sql_dict` still passes.
Co-authored-by: JSap0914 <JSap0914@users.noreply.github.com>
|
||
|
|
394bb34fa2 |
fix(rust): report local write progress bytes from Lance (#3422)
Fixes #3360. This updates native table writes so local write progress uses Lance writer byte stats instead of Arrow in-memory batch size once write bytes are available. The change wires the existing `WriteProgressTracker` into `InsertExec` for native `add` writes, installs a Lance `WriteProgressFn` only when no lower-level callback is already configured, and keeps the existing public `InsertExec::new` signature unchanged. Validation: - `cargo test -p lancedb --features remote table::write_progress::tests::test_progress_uses_lance_write_bytes_for_local_tables -- --nocapture` passed: 1 passed, 0 failed. - `cargo test -p lancedb --features remote table::write_progress::tests -- --nocapture` passed: 7 passed, 0 failed. - `cargo check --quiet --features remote --tests --examples` passed. - `cargo fmt --all --check` passed. - `git diff --check` passed. - `git diff | gitleaks stdin --no-banner --redact --timeout 30` passed: no leaks found. I did not run the full `cargo test --quiet --features remote --tests` suite. Co-authored-by: Ghxst <200635707+GHX5T-SOL@users.noreply.github.com> |
||
|
|
b2ae763254 |
fix(python): raise clear TypeError for bare List/Tuple in pydantic schema conversion (#3511)
Closes #3502 ## Problem A bare, unparameterised `typing.List` / `typing.Tuple` field crashes `to_arrow_schema` with an opaque `AttributeError: __args__`: ```python from typing import Tuple from lancedb.pydantic import LanceModel class Doc(LanceModel): items: Tuple Doc.to_arrow_schema() # AttributeError: __args__ ``` In `_py_type_to_arrow_type`, the branch `elif getattr(py_type, "__origin__", None) in (list, tuple)` is taken for a bare generic (its `__origin__` is `list / tuple`), but the next line reads `py_type.__args__[0]`, and a bare generic has no `__args__`. Other unsupported types (e.g. `Dict[str, int]`) correctly raise a clear `TypeError`, so this case is inconsistent. Fix Guard the element-type lookup with `getattr(py_type, "__args__", None)` and raise a clear `TypeError` when it is missing, matching the existing behavior for other unsupported types. Bare builtin list / tuple are unaffected (their `__origin__` is `None`, so they already fall through to the existing `TypeError`). Testing - Added `test_bare_generic_raises_type_error` covering both `List` and `Tuple`. - ruff format and ruff check clean. |
||
|
|
1bead6960c |
fix: pin mock clock in eventual consistency test (#3547)
This PR fixes a flaky test I hit on Windows test in #3528. Looks like `test_eventual_consistency_background_refresh` was failing with `v_cached` expected 1, got 2. There was a pr which swapped `tokio::time::sleep(300ms)` for `clock::advance_by(300ms)`, which is pretty much fine but the test necer pinned the clock so the first `get()` locks the `cached_at` on wall time. Therefore, if our CI is taking long enough the ttl expires before the value assertion in the test. So now we can add a `pin()` and call it first `get()`. After that we can advance the clock manually with no problems. Also, it's worth noting that I tried pinning in `BackgroundCache::new()` first. That broke another test `test_reload_resets_consistency_timer`, which uses real `tokio::time::sleep` and needs wall clock after `clear_mock()`. So the pin stays in this test only. And this should unblock us. Failing instances: - https://github.com/lancedb/lancedb/actions/runs/27567527236/job/81495265474?pr=3528 - https://github.com/lancedb/lancedb/actions/runs/27560366489/job/81470414928 |
||
|
|
0abf641733 |
feat: send read-freshness signal on the lance-namespace path (#3551)
### Description `db://`-style connections that use the lance-namespace path (`LanceNamespaceDatabase` → `NativeTable` + the lance-namespace REST client) never sent a read-freshness signal. Against a server configured to serve cached table metadata up to some staleness window, this allows stale-read-after-write across handles and processes. The remote table path already solved this (#3439). This brings the namespace path to parity. The namespace REST client doesn't let callers attach headers directly, but it forwards a `DynamicContextProvider`'s `headers.*` context entries as HTTP headers per request. So: - A shared per-table baseline map is created before the namespace client. I built and installed on the `ConnectBuilder` via a context provider. - On read operations the provider emits ·x-lancedb-min-timestamp = max(baseline, now − read_consistency_interval)` (RFC3339), keyed by the operation's `object_id`. - Each table handle bumps its baseline (monotonically) on `checkout_latest()`, `restore()`, and every data/schema write. `checkout_latest()` is the primary hook: consumers refresh a handle there after writing elsewhere, then poll. Read operations that carry the floor: `describe_table`, `list_table_versions`, `query_table`, `list_tables`. `list_table_versions` is what resolves "latest" for managed-versioning tables (`get_latest_version`), so it's the op that makes `checkout_latest()` actually observe a prior write. `describe_table_version` is excluded (pinned to an immutable version). This mirrors #3439 (timestamp baseline, `max(baseline, now − interval)`, monotonic); no `min_version` and no body channel, since the namespace path has no version-returning write responses. ### Testing - Unit tests for `compute_min_timestamp` / `next_freshness_baseline` and the provider (header at/after a bumped baseline; nothing for an empty baseline + no interval; interval floor applies; non-read ops emit nothing; `list_tables` uses only the interval floor). - Verified end-to-end against a local server that honors the header: reads carry `x-lancedb-min-timestamp`, writes don't, and read-your-write holds. |
||
|
|
976edeb2ff |
feat(query): add approx mode to vector queries (#3549)
## Feature
### What is the new feature?
Adds Rust core API support for configuring vector query approximation
mode with `ApproxMode::{Fast, Normal, Accurate}`.
### Why do we need this feature?
Lance already exposes `lance_index::vector::ApproxMode` and scanner
support for controlling the speed/accuracy tradeoff for approximate
vector search. LanceDB Rust queries need to expose and pass this setting
through for local/native and remote vector searches.
### How does it work?
- Adds public `ApproxMode` in `rust/lancedb`, with lowercase serde,
`Default::Normal`, parse/display, and conversions to/from Lance's
`ApproxMode`.
- Adds `approx_mode: Option<ApproxMode>` to `VectorQueryRequest` and a
`VectorQuery::approx_mode(...)` builder.
- Applies the mode to native/local Lance scanners after `nearest(...)`
when explicitly set.
- Sends `approx_mode` in remote query JSON only when explicitly set;
default requests omit it.
## Validation
- `cargo fmt --all`
- `cargo test --quiet --features remote approx_mode`
- `cargo test --quiet --features remote
test_query_vector_default_values`
- `cargo check --quiet --features remote --tests --examples`
- `git diff --check`
|
||
|
|
b46a44f873 |
feat(query): add approx mode to vector queries (#3549)
## Feature
### What is the new feature?
Adds Rust core API support for configuring vector query approximation
mode with `ApproxMode::{Fast, Normal, Accurate}`.
### Why do we need this feature?
Lance already exposes `lance_index::vector::ApproxMode` and scanner
support for controlling the speed/accuracy tradeoff for approximate
vector search. LanceDB Rust queries need to expose and pass this setting
through for local/native and remote vector searches.
### How does it work?
- Adds public `ApproxMode` in `rust/lancedb`, with lowercase serde,
`Default::Normal`, parse/display, and conversions to/from Lance's
`ApproxMode`.
- Adds `approx_mode: Option<ApproxMode>` to `VectorQueryRequest` and a
`VectorQuery::approx_mode(...)` builder.
- Applies the mode to native/local Lance scanners after `nearest(...)`
when explicitly set.
- Sends `approx_mode` in remote query JSON only when explicitly set;
default requests omit it.
## Validation
- `cargo fmt --all`
- `cargo test --quiet --features remote approx_mode`
- `cargo test --quiet --features remote
test_query_vector_default_values`
- `cargo check --quiet --features remote --tests --examples`
- `git diff --check`
|
||
|
|
f76b075d13 |
feat: add table branch support to remote tables and Python/TS bindings (#3540)
### Description Adding branch support for RemoteTable by threading a branch selector onto every operation the data plane accepts it on. Exposes the currentBranch to nodejs and python through the bindings. Matching the server handlers, the branch rides as: - a `?branch=` query parameter for Arrow-body and query-only ops (insert, merge_insert, multipart_*, version/list, drop_index) - a `branch` field in the JSON body for everything else (count_rows, query, update, delete, create_index, column ops, index list/stats, stats, restore, describe, tags create/update) A main-branch handle (`branch == None`) produces byte-identical requests to before: no `branch` field and no `?branch=` - Handle-per-branch: `create_branch` / `checkout_branch` return a new handle with fresh caches and reset version/freshness state, mirroring `NativeTable`. - `create_branch` maps 409 to already-exists, 400 to invalid, and 404 to not-found with source context, and sends without retry so the 409 stays observable. - `Ref` translation covers version, version-number (relative to the handle's branch), and tag (resolved via the tags endpoint); `"main"` and empty normalize to the main branch. - Python branch handles persist their branch (and pinned version) across pickle/fork, so a forked or pickled handle reopens on its branch rather than silently reverting to main. ### Tests - Rust mock tests per op category (query-param and body mechanisms, branch CRUD, error paths, backward-compat). - Python sync branch CRUD, `open_table(branch=)`, and a pickle round-trip regression test. |
||
|
|
393ec981bf |
chore: update lance dependency to v8.0.0-beta.14 (#3546)
Updates LanceDB's Lance dependencies to v8.0.0-beta.14.\n\nThis refreshes the Rust workspace lockfile and Java lance-core version; no compatibility code changes were required. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.14 |
||
|
|
6219975222 |
perf: drop N+1 in RemoteTable::list_indices (#3535)
`RemoteTable::list_indices` currently makes one `/index/list/` call plus
one `/index/{name}/stats/` call per index just to recover `index_type`.
When the server returns `index_type` directly in the `/index/list/`
response, all enriched fields are used and the per-index stats fan-out
is skipped entirely. When `index_type` is absent (legacy servers), the
existing stats fallback runs as before. This is content-based: no
version header required.
## Changes
- `RemoteTable::parse_index_list_response` replaces the old split
between enriched and legacy parsers. A single struct deserializes both
old and new response shapes, with all fields except `index_name` and
`columns` optional. `index_type` acts as the sentinel: present → use
enriched fields directly; absent → call `/index/{name}/stats/`.
## Tests
Added `test_list_indices_enriched` covering:
- All enriched fields populated correctly when `index_type` is in the
list response
- Optional fields absent from the response deserialize as `None`
- Stats endpoint is **not** called (panics if hit), verifying the
fan-out is eliminated
Existing `test_list_indices` and `test_list_indices_nested_field_paths`
exercise the legacy path unchanged.
## Depends on
- #3497 (expand `IndexConfig`) — already merged
- Server-side enriched response support
Closes #3494
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|
||
|
|
d9f9a51668 |
feat: skills to connect and update column metadata (#3541)
Two skills to help people connect and manage their column metadata using a server that implements the [REST API](https://lance.org/format/catalog/rest/) lancedb-column-metadata was built using the [Claude skill creator](https://claude.com/plugins/skill-creator); without the skill it was usually calling at least one method that didn't exist and usually not setting "replace": "false". So, while the base case is already pretty good, adding this skill improves things somewhat. lancedb-connect should help with most agentic workflows, because "finding all the things you need to connect to your server" can be the hardest part. |
||
|
|
c187ff7712 | chore: ignore pyo3 advisories RUSTSEC-2026-0176/0177 in cargo-deny (#3542) | ||
|
|
dfbe5becaa |
chore: update lance dependency to v8.0.0-beta.12 (#3538)
Updates Rust workspace Lance crates and Java lance-core to v8.0.0-beta.12. No compatibility fixes were required; validation passed with cargo clippy and cargo fmt. Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.12 |
||
|
|
49815da933 |
refactor: extract create_index module from table.rs (#3521)
## Summary - Extracts the `create_index` code cluster from `table.rs` into a new `rust/lancedb/src/table/create_index.rs` submodule, continuing the work from #2949. - Moves 8 `NativeTable` inherent methods (`load_indices`, `validate_index_type`, `build_ivf_params`, `get_num_sub_vectors`, `get_vector_dimension`, `resolve_index_field`, `make_index_params`, `get_index_type_for_field`) and 11 associated tests into the new module. - Reduces `table.rs` from ~5009 to ~3804 lines (-1205 lines) with no behavioral changes. ## Test plan UT |
||
|
|
f8caef3aca |
feat(bindings): expose new IndexConfig fields in Python and Node.js (#3534)
## Summary Surfaces the rich per-index metadata added in #3497 to the Python and Node.js language bindings. Closes #3495. New optional fields exposed on `IndexConfig` in both bindings: - `index_uuid` / `indexUuid` — UUID of the first index segment - `type_url` / `typeUrl` — protobuf type URL for the index - `created_at` / `createdAt` — creation timestamp (milliseconds since Unix epoch) - `num_indexed_rows` / `numIndexedRows` — rows covered by the index - `num_unindexed_rows` / `numUnindexedRows` — rows not yet indexed - `size_bytes` / `sizeBytes` — total index file size in bytes - `num_segments` / `numSegments` — number of index segments - `index_version` / `indexVersion` — on-disk format version - `index_details` / `indexDetails` — type-specific JSON details string All fields are `None`/`undefined` for remote tables (which don't yet surface this metadata through the server response). ## Changes - `python/src/index.rs`: extend `IndexConfig` pyclass; update `From` impl; update `__getitem__` - `python/python/lancedb/_lancedb.pyi`: add type hints for new fields - `python/python/tests/test_table.py`: new `test_index_config_fields` test - `nodejs/src/table.rs`: extend `IndexConfig` napi struct; update `From` impl - `nodejs/__test__/table.test.ts`: new test; update existing `toEqual` assertions to `expect.objectContaining` to accommodate new fields ## Test plan - [x] Python: `uv run --extra tests pytest python/tests/test_table.py::test_index_config_fields` - [x] Node.js: `pnpm test __test__/table.test.ts` 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
40f3e22600 |
feat: support rename_table on LanceNamespaceDatabase (#3520)
## Summary Closes #3412 Implements `rename_table` for `LanceNamespaceDatabase` (sync and async Python) and the Rust `NamespaceDatabase` backend. Previously these raised `NotImplementedError`; this PR delegates to the `LanceNamespace.rename_table` method which is part of the lance-namespace spec. ### Changes - **`rust/lancedb/src/database/namespace.rs`**: Remove the `NotImplementedError` stub for `rename_table`. Build a `RenameTableRequest` (with `id`, `new_table_name`, and optionally `new_namespace_id`) and call `self.namespace.rename_table(...)`, mirroring the existing `drop_table` pattern. - **`python/python/lancedb/namespace.py`**: Import `RenameTableRequest` from `lance_namespace`. Replace the `raise NotImplementedError` in both `LanceNamespaceDatabase.rename_table` (sync) and `AsyncLanceNamespaceDatabase.rename_table` (async) with a call to `self._namespace_client.rename_table(request)`. - **`python/python/tests/test_namespace.py`**: Replace the `test_rename_table_not_supported` test (which checked for `NotImplementedError`) with `test_rename_table`, which: 1. Creates a table in a namespace 2. Calls `rename_table` with `cur_namespace_path` and `new_namespace_path` 3. Asserts the old name is gone from `table_names()` 4. Asserts the new name appears in `table_names()` 5. Verifies the renamed table can be opened ## Test plan - [ ] Existing namespace tests pass in CI (all rely on `lance.namespace.DirectoryNamespace` which requires the full lance package) - [ ] `test_rename_table` exercises the full rename path: create → rename → verify old gone → verify new present → open - [ ] Rust build passes with the updated `namespace.rs` (requires Rust toolchain in CI) |
||
|
|
04480c274a |
test(python): add nested field regression matrix tests (#3518)
## Summary Closes #3406 Add a regression matrix in `python/python/tests/test_nested_fields.py` that exercises the full nested field index lifecycle for both the sync and async Python table APIs. The tests will fail if any implementation regresses to leaf-only field names in `list_indices`, `index_stats`, search, or filter results. ## Test scenarios covered **Index types:** BTree scalar, IvfPq vector, FTS **Field-name edge cases (per acceptance criteria):** - `rowId` — camelCase top-level field - `` `row-id` `` — hyphenated top-level field (escaped) - `parent.`\``leaf.name`\`` ` — struct leaf whose name contains a literal dot - `MetaData.userId` — mixed-case nested path - `` `meta-data`.`user-id` `` — hyphenated struct with hyphenated leaf **Lifecycle operations per index type:** - `create_index` / `create_scalar_index` / `create_fts_index` - `list_indices` → verify canonical full dotted path (not leaf name) - `index_stats` → verify row count and index type - Filtered scan (`WHERE nested.field = value`) - Vector search via nested embedding column - FTS search via nested text column - `add` (append) then re-check index listing - `optimize` then re-check index listing **Both sync and async APIs** are covered in parallel test classes. ## Notes Lance forbids top-level field names that contain a literal `.`, so the `` `a.b` `` acceptance-criterion variant is exercised as a *struct leaf* field (`parent.`\``leaf.name`\``) rather than a top-level column. |
||
|
|
ae7f2cbfe8 |
feat(python): accept Expr in Table.delete and merge when_not_matched_by_source_delete (#3524)
Another little pain point as I was working to integrate with paperless-ngx. The read path of table.search() or table.query() already accepted an Expr, but write paths Table.delete and merge_insert(...).when_not_matched_by_source_delete did not. This PR attempts to close that gap, so writes and reads can both use Expr, instead of one side needing to build a string. |
||
|
|
4fb7c92e86 |
chore: update lance dependency to v8.0.0-beta.11 (#3533)
Updates Lance dependencies to v8.0.0-beta.11 and refreshes the Rust and Java lock/config files. This also adapts namespace external manifest store call sites to the new table-root-aware constructor required by Lance. Triggering tag: https://github.com/lancedb/lance/releases/tag/v8.0.0-beta.11 |
||
|
|
f03abc27e3 |
feat: expand IndexConfig with rich per-index metadata (#3497)
`IndexConfig` (returned by `Table::list_indices`) previously exposed only `name`, `index_type`, and `columns`. Lance's `describe_indices` provides richer per-index info cheaply (reads manifest metadata, often cached), so this surfaces it. Adds these `Option<T>` fields to `lancedb::index::IndexConfig`, populated in `NativeTable::list_indices` from the `IndexDescription`: - `index_uuid`: uuid of the first segment - `type_url`: protobuf type URL (`IndexDescription::type_url`) - `created_at`: minimum creation time across segments - `num_indexed_rows`: approximate rows indexed across segments - `num_unindexed_rows`: table row count minus `num_indexed_rows` - `size_bytes`: total size of index files across segments - `num_segments`: number of segments making up the index - `index_version`: on-disk index format version (first segment) - `index_details`: index-type-specific details as JSON This field set mirrors the lance-namespace `IndexContent` contract (lance-format/lance-namespace#348) so client and server agree on the same shape. Note these are populated **locally** via `describe_indices` — `NativeTable::list_indices` reads the dataset directly and does not depend on the namespace spec change. `RemoteTable` leaves the new fields `None` until a follow-up wires them through the server response (#3494). Bindings exposure will also be a follow up: #3495 Existing `list_indices` tests in `rust/lancedb/src/table.rs` are extended to assert the new fields. Fixes #3492 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
85d9c1ce63 |
feat: adds isin support to the 'Expr' builder (#3523)
The `Expr` build already includes a lot of useful filtering options, `eq, ne, gt/gte, lt/lte, and_, or_, contains, cast`, but is was missing a membership like `isin`. This PR adds that support, as minimally as possible, allowing easy filtering for membership in a list, without needing to be a series of `where` expressions. I didn't see anything in CONTRIBUTING.md about needing a feature request or issue first, so I just made the change. My apologies if I missed that somewhere. Thanks for the vector store, we're using it now in paperless-ngx. |
||
|
|
d786e39fdc |
chore(deps): bump the rust-minor-patch group across 1 directory with 7 updates (#3531)
Bumps the rust-minor-patch group with 7 updates in the / directory: | Package | From | To | | --- | --- | --- | | [log](https://github.com/rust-lang/log) | `0.4.31` | `0.4.32` | | [regex](https://github.com/rust-lang/regex) | `1.12.3` | `1.12.4` | | [chrono](https://github.com/chronotope/chrono) | `0.4.44` | `0.4.45` | | [serde_with](https://github.com/jonasbb/serde_with) | `3.20.0` | `3.21.0` | | [http](https://github.com/hyperium/http) | `1.4.1` | `1.4.2` | | [uuid](https://github.com/uuid-rs/uuid) | `1.23.2` | `1.23.3` | | [napi](https://github.com/napi-rs/napi-rs) | `3.9.0` | `3.9.1` | Updates `log` from 0.4.31 to 0.4.32 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/log/releases">log's releases</a>.</em></p> <blockquote> <h2>0.4.32</h2> <h2>What's Changed</h2> <ul> <li>Support <code>Value</code> -> string conversions with <code>kv</code> + <code>std</code> features instead of <code>kv_std</code> by <a href="https://github.com/tisonkun"><code>@tisonkun</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/729">rust-lang/log#729</a></li> <li>Prepare for 0.4.32 release by <a href="https://github.com/KodrAus"><code>@KodrAus</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/730">rust-lang/log#730</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rust-lang/log/compare/0.4.31...0.4.32">https://github.com/rust-lang/log/compare/0.4.31...0.4.32</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/log/blob/master/CHANGELOG.md">log's changelog</a>.</em></p> <blockquote> <h2>[0.4.32] - 2026-06-04</h2> <h3>What's Changed</h3> <ul> <li>Support <code>Value</code> -> string conversions with <code>kv</code> + <code>std</code> features instead of <code>kv_std</code> by <a href="https://github.com/tisonkun"><code>@tisonkun</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/729">rust-lang/log#729</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rust-lang/log/compare/0.4.31...0.4.32">https://github.com/rust-lang/log/compare/0.4.31...0.4.32</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rust-lang/log/commit/a5b5b2113e2767801250af184d6c3971e689ae3b"><code>a5b5b21</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/730">#730</a> from rust-lang/cargo/0.4.32</li> <li><a href="https://github.com/rust-lang/log/commit/c8d3b125c6216b3667e05544591f4fb34f53ff78"><code>c8d3b12</code></a> prepare for 0.4.32 release</li> <li><a href="https://github.com/rust-lang/log/commit/ce6cd9fef14084207f2b6758999af062f89f9d87"><code>ce6cd9f</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/729">#729</a> from tisonkun/kv-std-support</li> <li><a href="https://github.com/rust-lang/log/commit/20b3b050469d6aab6c0f2e77acaab2313d5fc9a2"><code>20b3b05</code></a> drop cfg-feature=kv as it is already met</li> <li><a href="https://github.com/rust-lang/log/commit/7bc120062895aadd440ab015e62275841465a1a6"><code>7bc1200</code></a> kv::std_support may not need value-bag</li> <li>See full diff in <a href="https://github.com/rust-lang/log/compare/0.4.31...0.4.32">compare view</a></li> </ul> </details> <br /> Updates `regex` from 1.12.3 to 1.12.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/regex/blob/master/CHANGELOG.md">regex's changelog</a>.</em></p> <blockquote> <h1>1.12.4 (2025-06-09)</h1> <p>This release includes a performance optimization for compilation of regexes with very large character classes.</p> <p>Improvements:</p> <ul> <li><a href="https://redirect.github.com/rust-lang/regex/pull/1308">#1308</a>: Avoid re-canonicalizing the entire interval set when pushing new class ranges.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rust-lang/regex/commit/7b96fdc9d5fe6a0cb4efe30e6689b050493fc1e1"><code>7b96fdc</code></a> 1.12.4</li> <li><a href="https://github.com/rust-lang/regex/commit/7b89cf0534aa58ab8a4a6672e14a59b53f08eb2c"><code>7b89cf0</code></a> deps: update to regex-syntax 0.8.11</li> <li><a href="https://github.com/rust-lang/regex/commit/140167995737fa11dfe11b8af8b9aa143b790b4e"><code>1401679</code></a> regex-syntax-0.8.11</li> <li><a href="https://github.com/rust-lang/regex/commit/d7090000b3be51677d8e79c3b8bcc8a4d176bddc"><code>d709000</code></a> changelog: 1.12.4</li> <li><a href="https://github.com/rust-lang/regex/commit/9825c741c8ac1e61e8f78cebc12205cd35e4767f"><code>9825c74</code></a> syntax: avoid re-canonicalizing the entire IntervalSet on push (<a href="https://redirect.github.com/rust-lang/regex/issues/1308">#1308</a>)</li> <li><a href="https://github.com/rust-lang/regex/commit/a7f2ff6dbc43f40994d7c3d1d968ba4ac92329e1"><code>a7f2ff6</code></a> docs: clarify regex-lite word boundaries</li> <li><a href="https://github.com/rust-lang/regex/commit/2c7b17246da744bb2e1b911d3ddc1369fe3b472a"><code>2c7b172</code></a> docs: clarify unsupported Anchored::Pattern searches</li> <li><a href="https://github.com/rust-lang/regex/commit/839d16bc65b60e2006d3599d20bfa6efc14049d8"><code>839d16b</code></a> regex-syntax-0.8.10</li> <li><a href="https://github.com/rust-lang/regex/commit/c4865a0c8446a701e10b0fd987f19068f5dcc365"><code>c4865a0</code></a> syntax: fix negation handling in HIR translation</li> <li><a href="https://github.com/rust-lang/regex/commit/d8761c00ed25c5899e3dcfb0f17e827b8e41530a"><code>d8761c0</code></a> cargo: also include <code>benches</code></li> <li>Additional commits viewable in <a href="https://github.com/rust-lang/regex/compare/1.12.3...1.12.4">compare view</a></li> </ul> </details> <br /> Updates `chrono` from 0.4.44 to 0.4.45 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/chronotope/chrono/releases">chrono's releases</a>.</em></p> <blockquote> <h2>0.4.45</h2> <h2>What's Changed</h2> <ul> <li>fix(tz): reject TZ offset hour of 24 to avoid FixedOffset overflow by <a href="https://github.com/SAY-5"><code>@SAY-5</code></a> in <a href="https://redirect.github.com/chronotope/chrono/pull/1787">chronotope/chrono#1787</a></li> <li>tz_data: fix tzdata locations on Android by <a href="https://github.com/caruschalalamove"><code>@caruschalalamove</code></a> in <a href="https://redirect.github.com/chronotope/chrono/pull/1789">chronotope/chrono#1789</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/chronotope/chrono/commit/170338250e836976a211e64728ec956e45e78a39"><code>1703382</code></a> Prepare 0.4.45 release</li> <li><a href="https://github.com/chronotope/chrono/commit/881f9ab2f7068c98173cce86ce1a3642848ce98a"><code>881f9ab</code></a> tz_data: fix tzdata locations on Android</li> <li><a href="https://github.com/chronotope/chrono/commit/f14ead46c0feeed8d5b2471c7a55069fbc822d01"><code>f14ead4</code></a> fix(tz): reject TZ offset hour of 24 to avoid FixedOffset overflow</li> <li><a href="https://github.com/chronotope/chrono/commit/c6063e6f5a03a48c6feeac3eb5b51ab4cb902759"><code>c6063e6</code></a> Update similar-asserts requirement from 1.6.1 to 2.0.0</li> <li><a href="https://github.com/chronotope/chrono/commit/120686c82c5da90377e815edb82c9a80b6b4f2be"><code>120686c</code></a> Bump codecov/codecov-action from 5 to 6</li> <li>See full diff in <a href="https://github.com/chronotope/chrono/compare/v0.4.44...v0.4.45">compare view</a></li> </ul> </details> <br /> Updates `serde_with` from 3.20.0 to 3.21.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jonasbb/serde_with/releases">serde_with's releases</a>.</em></p> <blockquote> <h2>serde_with v3.21.0</h2> <h3>Security</h3> <ul> <li> <p><a href="https://github.com/jonasbb/serde_with/security/advisories/GHSA-7gcf-g7xr-8hxj">GHSA-7gcf-g7xr-8hxj</a>: KeyValueMap serialization panics on empty sequence or map entries Bad or attacker controlled values could cause a panic while allocating too large values. Fixed in <a href="https://redirect.github.com/jonasbb/serde_with/issues/966">#966</a> by setting a maximum allocation size during the creation of collections like <code>Vec</code> or sets.</p> <p>Thanks to <a href="https://github.com/7thParkk"><code>@7thParkk</code></a> for reporting the issue.</p> </li> </ul> <h3>Added</h3> <ul> <li>Add <code>NoneAsZero</code> adapter that maps <code>Option<NonZero*></code> to a plain integer, encoding <code>None</code> as <code>0</code> by <a href="https://github.com/SAY-5"><code>@SAY-5</code></a> (<a href="https://redirect.github.com/jonasbb/serde_with/issues/486">#486</a>)</li> </ul> <h3>Changed</h3> <ul> <li>Re-enable link-to-definition on docs.rs (<a href="https://redirect.github.com/jonasbb/serde_with/issues/964">#964</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix some doc links to point to the correct types (<a href="https://redirect.github.com/jonasbb/serde_with/issues/963">#963</a>)</li> <li>Re-enable <code>unused_qualifications</code> and fix the resulting findings by <a href="https://github.com/lms0806"><code>@lms0806</code></a> (<a href="https://redirect.github.com/jonasbb/serde_with/issues/962">#962</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jonasbb/serde_with/commit/0f4ca67e1f8fc4679e850f3a566d454fb30953c1"><code>0f4ca67</code></a> Update changelog for 3.21.0 (<a href="https://redirect.github.com/jonasbb/serde_with/issues/967">#967</a>)</li> <li><a href="https://github.com/jonasbb/serde_with/commit/7654841be1d1702a65afc0f839c67c36563c8188"><code>7654841</code></a> Update changelog for 3.21.0</li> <li><a href="https://github.com/jonasbb/serde_with/commit/c8a1d820ea25df01692b367058d587343e199389"><code>c8a1d82</code></a> Protect all collection creations against capacity overflow by using `size_hin...</li> <li><a href="https://github.com/jonasbb/serde_with/commit/6ad5fa5b474270f50016b4cc983e37f25f097ba4"><code>6ad5fa5</code></a> Properly feature gate the <code>vec_with_capacity_cautious</code> function</li> <li><a href="https://github.com/jonasbb/serde_with/commit/ef7d1417e3eacd0077f029763109368ee05c1c22"><code>ef7d141</code></a> Protect all collection creations against capacity overflow by using `size_hin...</li> <li><a href="https://github.com/jonasbb/serde_with/commit/a348da35fe808852a1b7e6fa890b425ad001d3f1"><code>a348da3</code></a> Add serde_as deserialize_as explain (<a href="https://redirect.github.com/jonasbb/serde_with/issues/958">#958</a>)</li> <li><a href="https://github.com/jonasbb/serde_with/commit/2e5bc20e29e1d42eb9c85ab503964130eb1ea62e"><code>2e5bc20</code></a> Bump the github-actions group with 3 updates (<a href="https://redirect.github.com/jonasbb/serde_with/issues/965">#965</a>)</li> <li><a href="https://github.com/jonasbb/serde_with/commit/927a3d69c3cecdf415f7d7662a0521894d313261"><code>927a3d6</code></a> Bump the github-actions group with 3 updates</li> <li><a href="https://github.com/jonasbb/serde_with/commit/62d14ec637834259e0fab59ea84b87ca329e81c1"><code>62d14ec</code></a> Enable link-to-definition on docs.rs again, after the upstream issue was reso...</li> <li><a href="https://github.com/jonasbb/serde_with/commit/4584d94f685b66b96bdcf07bffe76e5df0819ea2"><code>4584d94</code></a> Enable link-to-definition on docs.rs again, after the upstream issue was reso...</li> <li>Additional commits viewable in <a href="https://github.com/jonasbb/serde_with/compare/v3.20.0...v3.21.0">compare view</a></li> </ul> </details> <br /> Updates `http` from 1.4.1 to 1.4.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/hyperium/http/blob/master/CHANGELOG.md">http's changelog</a>.</em></p> <blockquote> <h1>1.4.2 (June 8, 2026)</h1> <ul> <li>Fix <code>uri::Builder</code> to allow <code>"*"</code> as the path when scheme and authority are also set, used in HTTP/2 requests.</li> <li>Fix <code>Uri</code> to properly reject <code>DEL</code> characters.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/hyperium/http/commit/82db5b8af1e3939678fee88f3c57b72fee7e3a7b"><code>82db5b8</code></a> v1.4.2</li> <li><a href="https://github.com/hyperium/http/commit/a9cdbf8aaf87198020389ba14f92d9784740c91c"><code>a9cdbf8</code></a> fix(uri): reject DEL character (<a href="https://redirect.github.com/hyperium/http/issues/842">#842</a>)</li> <li><a href="https://github.com/hyperium/http/commit/df75ca3ffe2821df665aa0962d62312691942b11"><code>df75ca3</code></a> fix(uri): allow STAR paths with scheme/auth (<a href="https://redirect.github.com/hyperium/http/issues/843">#843</a>)</li> <li><a href="https://github.com/hyperium/http/commit/ec3f8ce1bb571223d5e738c6dd7a749670f821dc"><code>ec3f8ce</code></a> feat(method): impl PartialOrd + Ord (<a href="https://redirect.github.com/hyperium/http/issues/840">#840</a>)</li> <li>See full diff in <a href="https://github.com/hyperium/http/compare/v1.4.1...v1.4.2">compare view</a></li> </ul> </details> <br /> Updates `uuid` from 1.23.2 to 1.23.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/uuid-rs/uuid/releases">uuid's releases</a>.</em></p> <blockquote> <h2>v1.23.3</h2> <h2>What's Changed</h2> <ul> <li>Fix up parser panic on empty input by <a href="https://github.com/KodrAus"><code>@KodrAus</code></a> in <a href="https://redirect.github.com/uuid-rs/uuid/pull/886">uuid-rs/uuid#886</a></li> <li>Prepare for 1.23.3 release by <a href="https://github.com/KodrAus"><code>@KodrAus</code></a> in <a href="https://redirect.github.com/uuid-rs/uuid/pull/887">uuid-rs/uuid#887</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/uuid-rs/uuid/compare/v1.23.2...v1.23.3">https://github.com/uuid-rs/uuid/compare/v1.23.2...v1.23.3</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/uuid-rs/uuid/commit/20da78b1813319c8017d107089caec1ff9d6b1a8"><code>20da78b</code></a> Merge pull request <a href="https://redirect.github.com/uuid-rs/uuid/issues/887">#887</a> from uuid-rs/cargo/v1.23.3</li> <li><a href="https://github.com/uuid-rs/uuid/commit/62232ca120b1b09eea5979ca966e9669705e8841"><code>62232ca</code></a> prepare for 1.23.3 release</li> <li><a href="https://github.com/uuid-rs/uuid/commit/2320c6a0335cfddaec4df58d1a7fe410070ab9e9"><code>2320c6a</code></a> Merge pull request <a href="https://redirect.github.com/uuid-rs/uuid/issues/886">#886</a> from uuid-rs/fix/parser-panics</li> <li><a href="https://github.com/uuid-rs/uuid/commit/2d034d41a518b0a103e96d47e04690f6644de487"><code>2d034d4</code></a> fix some invalid indexers on error reporting</li> <li><a href="https://github.com/uuid-rs/uuid/commit/a8b9f142678d9640ba6dc80c5e2d69635d4dd62f"><code>a8b9f14</code></a> update fuzz infra and run in CI</li> <li>See full diff in <a href="https://github.com/uuid-rs/uuid/compare/v1.23.2...v1.23.3">compare view</a></li> </ul> </details> <br /> Updates `napi` from 3.9.0 to 3.9.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi's releases</a>.</em></p> <blockquote> <h2>napi-v3.9.1</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> unify Reference finalize callbacks on Arc (Rc/Arc type confusion) (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3313">#3313</a>)</li> <li><em>(napi)</em> zero-copy external strings, fix WASI double-free (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3308">#3308</a>)</li> <li><em>(napi)</em> experimental node_api_create_object_with_properties (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3304">#3304</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/dea608eae7481a47d64aab563a2ab5cdd8eda03c"><code>dea608e</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3306">#3306</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/670e5d319506beb9b7f37683d75b9b4e0edba253"><code>670e5d3</code></a> chore(release): publish</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/a9abc6166c7206d0e700910428335a3316408dae"><code>a9abc61</code></a> fix(sys): restore napi_create_object_with_properties as compat alias (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3321">#3321</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/3e5a09f2497a2b35130f7d7acd3df719cd64820b"><code>3e5a09f</code></a> chore(deps): update release-plz/action action to v0.5.130 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3320">#3320</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/09c9d97ec14dd651b4628bdfa5952355ebf9e6f5"><code>09c9d97</code></a> ci: fix Electron install on Node 24.16+/26, add Node 26 to matrix (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3319">#3319</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/ed5b5ab8f1c073bbcf2c9ae7fc3240fbcf3feb30"><code>ed5b5ab</code></a> fix(napi): unify Reference finalize callbacks on Arc (Rc/Arc type confusion) ...</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/ad7b1c8fbfd6a56a7e28390ae9820fbd1b3ed70a"><code>ad7b1c8</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3318">#3318</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/718eb1fceb6c73419a99b703574300c23e30a24d"><code>718eb1f</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3310">#3310</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/2938a9e46d5fa2d7bcfeb3c63d0b6cf9f3f4ef31"><code>2938a9e</code></a> fix(deps): update dependency <code>@emnapi/core</code> to v1.11.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3316">#3316</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/31b38d45a6d829b62f683573d6f2af613bf3505b"><code>31b38d4</code></a> fix(deps): update dependency <code>@emnapi/runtime</code> to v1.11.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3317">#3317</a>)</li> <li>Additional commits viewable in <a href="https://github.com/napi-rs/napi-rs/compare/napi-v3.9.0...napi-v3.9.1">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
8373318e89 |
feat: support FM-Index scalar index for substring search (#3532)
Adds an FM-Index — a scalar index over string and binary columns that
accelerates substring search (`contains(col, 'needle')`), distinct from
the tokenized `FTS` index — across the Rust core and the Python and
TypeScript bindings.
## Rust
- `Index::Fm(FmIndexBuilder)` and `IndexType::Fm`.
- `make_index_params` maps `Index::Fm` to Lance's
`ScalarIndexParams::for_builtin(BuiltinIndexType::Fm)`.
- `supported_fm_data_type` validates
`Utf8`/`LargeUtf8`/`Binary`/`LargeBinary` columns.
- `list_indices` round-trips the type (`"Fm"` → `IndexType::Fm`); the
remote wire type is `"FM"`.
## Python
Adds `lancedb.index.Fm`, accepted by `create_index`:
```python
from lancedb.index import Fm
await tbl.create_index("text", config=Fm())
```
## TypeScript
Adds the `Index.fm()` factory:
```ts
await tbl.createIndex("text", { config: Index.fm() });
```
|
||
|
|
8308cca05e |
chore: update lance dependency to v8.0.0-beta.9 (#3527)
Updates Lance dependencies to v8.0.0-beta.9. Includes the required Rust compatibility fix for Lance's updated vector index UUID API. Triggering tag: https://github.com/lancedb/lance/releases/tag/v8.0.0-beta.9 |
||
|
|
566b67a634 |
fix: support LargeList label list indexes (#3529)
## Summary This PR extends nested-field regression coverage across Rust local/remote, Python sync/async, and Node so canonical escaped paths stay consistent across scalar, vector, and FTS index lifecycle behavior. It also aligns LanceDB's LabelList type gate with Lance by accepting `LargeList<primitive>` columns while keeping `List<Struct<...>>` unsupported until Lance defines stable membership semantics for struct labels. Part of #3406. |
||
|
|
9c12fb6437 |
fix(nodejs): treat NAPI_RS_FORCE_WASI as truthy only when set to 'true' (#3519)
## Summary Fixes the `NAPI_RS_FORCE_WASI=false` issue by upgrading `@napi-rs/cli` from `3.5.1` to `3.7.0`. Closes #3267 ## Root Cause In the `native.js` loader generated by `napi build`, the check was: ```js if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { ``` In JavaScript, any non-empty string is truthy, so `NAPI_RS_FORCE_WASI=false` (a non-empty string) inadvertently triggered the WASI fallback path. This caused an `ENOENT` error when `lancedb.wasi.cjs` was not present. ## Fix `@napi-rs/cli@3.7.0` ([napi-rs/napi-rs#3236](https://github.com/napi-rs/napi-rs/pull/3236)) introduced a tri-state check in the template that generates `native.js`: **Before (generated by @napi-rs/cli@3.5.1):** ```js if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { ``` **After (generated by @napi-rs/cli@3.7.0):** ```js const forceWasi = process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error' if (!nativeBinding || forceWasi) { ``` Only the literal string `'true'` (or `'error'` for strict mode) now activates the WASI path. All other values, including `'false'`, `'0'`, or an unset variable, behave as if WASI is not forced. ## Changes - `nodejs/package.json`: bump `@napi-rs/cli` from `3.5.1` to `3.7.0` - `nodejs/package-lock.json` / `nodejs/pnpm-lock.yaml`: update lock files to match The fix is in the upstream napi-rs tool; the generated `native.js` is not committed to this repository and is produced at build time by `napi build`. |
||
|
|
f260d3bf12 |
fix(util): convert numpy scalars in value_to_sql (#3522)
## What's broken
`Table.update(values={...})` raises `NotImplementedError: SQL conversion
is not implemented for this type` when a value is a numpy scalar such as
`np.int64`, `np.int32`, `np.float32`, or `np.bool_`. These arise
naturally from indexing an ndarray or a pandas int/bool column.
`np.float64` happens to work (it subclasses `float`), which makes the
failure inconsistent and surprising.
```python
df = pd.DataFrame({"id": np.array([10, 20], dtype="int32")})
t.update(where="id = 1", values={"id": df["id"].iloc[0]}) # np.int32
# -> NotImplementedError: SQL conversion is not implemented for this type
```
## Why it happens
`value_to_sql` is a `singledispatch` with handlers only for native
Python types and `np.ndarray`; numpy `integer`/`floating`/`bool_`
scalars aren't Python subclasses, so they fall through to the
`NotImplementedError` base.
## Fix
Register handlers for `np.bool_`, `np.integer`, and `np.floating` that
delegate to the existing native handlers.
## Test
`value_to_sql` on `np.int32/int64/float32/float64/bool_` all convert;
`np.int32` raised before.
Co-authored-by: Ishaan Samantray <ishaansamantray@Ishaans-MacBook-Pro.local>
|
||
|
|
d9018067b3 |
feat: support checking out a version on a branch (#3504)
### Description Stacked on #3490. Adds an optional version to branch checkout across the Rust core and the Python and TypeScript SDKs, so you can open a specific version on a branch ("version V of branch B"), not just the branch's latest version Rust ```rust // Open version 3 of branch "exp" (a read-only view): check out from an // existing table, or open it directly from the connection. let exp_v3 = table.checkout_branch("exp", Some(3)).await?; let exp_v3 = db.open_table("items").branch("exp").version(3).execute().await?; // checkout_latest re-attaches to the branch's writable HEAD. exp_v3.checkout_latest().await?; // With no branch, a version opens main at that version. let main_v3 = db.open_table("items").version(3).execute().await?; ``` Python ```python # Open version 3 of branch "exp" (a read-only view): check out from an # existing table, or open it directly from the connection. branch_v3 = await table.branches.checkout("exp", version=3) branch_v3 = await db.open_table("items", branch="exp", version=3) # checkout_latest re-attaches to the branch's writable HEAD. await branch_v3.checkout_latest() # With no branch, a version opens main at that version. main_v3 = await db.open_table("items", version=3) ``` TypeScript ```typescript // Open version 3 of branch "exp" (a read-only view): check out from an // existing table, or open it directly from the connection. const branchV3 = await (await table.branches()).checkout("exp", 3); const opened = await db.openTable("items", undefined, { branch: "exp", version: 3 }); // checkoutLatest re-attaches to the branch's writable HEAD. await branchV3.checkoutLatest(); // With no branch, a version opens main at that version. const mainV3 = await db.openTable("items", undefined, { version: 3 }); ``` ### Testing - Added unit tests (Rust, Python sync + async, TypeScript): branch-scoped resolution at a version number shared with `main` and with another branch, read-only enforcement on a pinned handle, `checkout_latest` recovery to the branch's HEAD, fork-point reads, and the nonexistent-version/branch error paths. - Ran smoke tests against the Python and TypeScript SDKs on local machine. |
||
|
|
53517b3aaa |
feat: add table branch support (#3490)
### Description
Adds first-class support for table branches across the Rust core and the
Python and TypeScript SDKs.
Rust
```rust
use lance::dataset::refs::Ref;
// Create a branch from main and write to it — main is untouched.
let exp = table.create_branch("exp", Ref::Version(None, None)).await?;
exp.add(batches).await?;
// Reopen the branch later: check out from a table, or open it directly.
let exp = table.checkout_branch("exp").await?;
let exp = db.open_table("items").branch("exp").execute().await?;
let branches = table.list_branches().await?;
table.delete_branch("exp").await?;
```
Python
```python
# Create a branch from main and write to it
branch = await table.branches.create("exp", from_ref="main")
await branch.add(data)
# Reopen the branch later: check out from a table, or open it directly.
branch = await table.branches.checkout("exp")
branch = await db.open_table("items", branch="exp")
await table.branches.list()
await table.branches.delete("exp")
```
TypeScript
```typescript
const branches = await table.branches();
// Create a branch from main and write to it
const branch = await branches.create("exp");
await branch.add(data);
// Reopen the branch later: check out from a table, or open it directly.
const checkedOut = await branches.checkout("exp");
const opened = await db.openTable("items", undefined, { branch: "exp" });
await branches.list();
await branches.delete("exp");
```
### Testing
- Added unit tests
- ran smoke tests against python and typescript sdks on local machine
### Next steps
- Add RemoteTable support
- Add Branch Comparison support
- Merge Branching support
|
||
|
|
3e25f584eb |
fix(python): push down namespace full reads (#3516)
## Bug Fix ### What is the bug? Namespace-backed `LanceTable.to_arrow()` full-table reads bypassed the existing `QueryTable` server-side query path and called the lower-level table `to_arrow()` implementation directly. In Geneva/Sophon this could fail while parsing the Arrow IPC response for `hist.get_table().to_arrow()` / `to_pandas()`, even though `hist.get_table().search().to_arrow()` worked. ### What issues or incorrect behavior does the bug cause? Full-table reads on namespace-backed tables with `QueryTable` pushdown could fail with Arrow IPC parse errors, while query/search reads on the same table succeeded. Since `to_pandas()` delegates through `to_arrow()` for non-blob/native cases, pandas export was affected too. ### How does this PR fix the problem? When `QueryTable` pushdown is enabled, sync and async table `to_arrow()` now construct a plain no-filter, no-limit, all-columns query and execute it through the table-level `_execute_query()` path. `AsyncTable` now preserves namespace context from async namespace connections so async full reads can make the same pushdown decision. Non-namespace tables and namespace tables without `QueryTable` pushdown keep their existing behavior. ### Tests - `uv run --extra tests --extra dev --no-sync ruff check python/lancedb/table.py python/lancedb/namespace.py python/tests/test_namespace.py` - `uv run --extra tests --extra dev --no-sync ruff format python/lancedb/table.py python/lancedb/namespace.py python/tests/test_namespace.py` - `uv run --extra tests --extra dev --no-sync pytest python/tests/test_namespace.py::TestPushdownOperations::test_lance_table_to_arrow_uses_query_pushdown python/tests/test_namespace.py::TestAsyncPushdownOperations::test_async_table_to_arrow_uses_query_pushdown python/tests/test_namespace.py::test_local_table_to_arrow_and_to_pandas_are_unchanged -q` - `uv run --extra tests --extra dev --no-sync pytest python/tests/test_namespace.py -q` |
||
|
|
59fbfd4158 |
chore: update lance dependency to v8.0.0-beta.6 (#3510)
Updates LanceDB Lance dependencies from v8.0.0-beta.5 to v8.0.0-beta.6 and refreshes Cargo metadata. No compatibility fixes were required; Java lance-core was bumped to 8.0.0-beta.6 as well. Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.6 |
||
|
|
f37e698e2f |
chore: update lance dependency to v8.0.0-beta.5 (#3508)
Updates Lance dependencies from v8.0.0-beta.4 to v8.0.0-beta.5 across the Rust workspace and Java lance-core version. No compatibility code changes were required; clippy and rustfmt pass after installing the missing runner components. Lance tag: https://github.com/lance-format/lance/releases/tag/v8.0.0-beta.5 |