Compare commits

...

8 Commits

Author SHA1 Message Date
Lance Release
7a96d72086 Bump version: 0.22.0 → 0.22.1-beta.0 2025-09-10 14:24:30 +00:00
Lance Release
e612686fdb Bump version: 0.25.0 → 0.25.1-beta.0 2025-09-10 14:24:07 +00:00
Wyatt Alt
e77d57a5b6 chore: update lance to 0.35.0-beta4 (#2639)
Updates lance to 0.35.0-beta4, which also incurs a datafusion update.
This brings in a fix for a memory leak in index caching, resulting from
a cyclical reference.
2025-09-10 06:19:35 -07:00
Jack Ye
9391ad1450 feat: support mTLS for remote database (#2638)
This PR adds mTLS (mutual TLS) configuration support for the LanceDB
remote HTTP client, allowing users to authenticate with client
certificates and configure custom CA certificates for server
verification.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-09-09 21:04:46 -07:00
LuQQiu
79960b254e fix: add partition statistics to MetadataEraser (#2637)
Some of the data fusion optimizers optimize based on data statistics
(e.g. total bytes, number of rows).
If those statistics are not supplied, optimizers cannot optimize on top.
One example is Anti Hash Join which can optimize from LeftAnti (Left:
big table, Right: small table) to RightAnti (Left: small table, Right:
big table). Left Anti requires reading the whole big & small table while
RightAnti only requires reading the whole left table and supports limit
push down to only read partial of big table
2025-09-09 09:13:22 -07:00
Xuanwo
d19c64e29b chore: bump version for JSON support (#2633)
Bump version of lance to latest beta for JSON support.

Signed-off-by: Xuanwo <github@xuanwo.io>
2025-09-05 12:26:28 -07:00
Lance Release
06d5612443 Bump version: 0.22.0-beta.2 → 0.22.0 2025-09-04 08:33:40 +00:00
Lance Release
45f96f4151 Bump version: 0.22.0-beta.1 → 0.22.0-beta.2 2025-09-04 08:33:09 +00:00
28 changed files with 428 additions and 123 deletions

View File

@@ -1,5 +1,5 @@
[tool.bumpversion]
current_version = "0.22.0-beta.1"
current_version = "0.22.1-beta.0"
parse = """(?x)
(?P<major>0|[1-9]\\d*)\\.
(?P<minor>0|[1-9]\\d*)\\.

182
Cargo.lock generated
View File

@@ -1966,9 +1966,9 @@ dependencies = [
[[package]]
name = "datafusion"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a11e19a7ccc5bb979c95c1dceef663eab39c9061b3bbf8d1937faf0f03bf41f"
checksum = "69dfeda1633bf8ec75b068d9f6c27cdc392ffcf5ff83128d5dbab65b73c1fd02"
dependencies = [
"arrow",
"arrow-ipc",
@@ -2014,9 +2014,9 @@ dependencies = [
[[package]]
name = "datafusion-catalog"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94985e67cab97b1099db2a7af11f31a45008b282aba921c1e1d35327c212ec18"
checksum = "2848fd1e85e2953116dab9cc2eb109214b0888d7bbd2230e30c07f1794f642c0"
dependencies = [
"arrow",
"async-trait",
@@ -2040,9 +2040,9 @@ dependencies = [
[[package]]
name = "datafusion-catalog-listing"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e002df133bdb7b0b9b429d89a69aa77b35caeadee4498b2ce1c7c23a99516988"
checksum = "051a1634628c2d1296d4e326823e7536640d87a118966cdaff069b68821ad53b"
dependencies = [
"arrow",
"async-trait",
@@ -2063,14 +2063,15 @@ dependencies = [
[[package]]
name = "datafusion-common"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13242fc58fd753787b0a538e5ae77d356cb9d0656fa85a591a33c5f106267f6"
checksum = "765e4ad4ef7a4500e389a3f1e738791b71ff4c29fd00912c2f541d62b25da096"
dependencies = [
"ahash",
"arrow",
"arrow-ipc",
"base64 0.22.1",
"chrono",
"half",
"hashbrown 0.14.5",
"indexmap 2.11.0",
@@ -2085,9 +2086,9 @@ dependencies = [
[[package]]
name = "datafusion-common-runtime"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2239f964e95c3a5d6b4a8cde07e646de8995c1396a7fd62c6e784f5341db499"
checksum = "40a2ae8393051ce25d232a6065c4558ab5a535c9637d5373bacfd464ac88ea12"
dependencies = [
"futures",
"log",
@@ -2096,9 +2097,9 @@ dependencies = [
[[package]]
name = "datafusion-datasource"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cf792579bc8bf07d1b2f68c2d5382f8a63679cce8fbebfd4ba95742b6e08864"
checksum = "90cd841a77f378bc1a5c4a1c37345e1885a9203b008203f9f4b3a769729bf330"
dependencies = [
"arrow",
"async-trait",
@@ -2124,9 +2125,9 @@ dependencies = [
[[package]]
name = "datafusion-datasource-csv"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfc114f9a1415174f3e8d2719c371fc72092ef2195a7955404cfe6b2ba29a706"
checksum = "77f4a2c64939c6f0dd15b246723a699fa30d59d0133eb36a86e8ff8c6e2a8dc6"
dependencies = [
"arrow",
"async-trait",
@@ -2149,9 +2150,9 @@ dependencies = [
[[package]]
name = "datafusion-datasource-json"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d88dd5e215c420a52362b9988ecd4cefd71081b730663d4f7d886f706111fc75"
checksum = "11387aaf931b2993ad9273c63ddca33f05aef7d02df9b70fb757429b4b71cdae"
dependencies = [
"arrow",
"async-trait",
@@ -2174,15 +2175,15 @@ dependencies = [
[[package]]
name = "datafusion-doc"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0e7b648387b0c1937b83cb328533c06c923799e73a9e3750b762667f32662c0"
checksum = "8ff336d1d755399753a9e4fbab001180e346fc8bfa063a97f1214b82274c00f8"
[[package]]
name = "datafusion-execution"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9609d83d52ff8315283c6dad3b97566e877d8f366fab4c3297742f33dcd636c7"
checksum = "042ea192757d1b2d7dcf71643e7ff33f6542c7704f00228d8b85b40003fd8e0f"
dependencies = [
"arrow",
"dashmap",
@@ -2199,11 +2200,12 @@ dependencies = [
[[package]]
name = "datafusion-expr"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e75230cd67f650ef0399eb00f54d4a073698f2c0262948298e5299fc7324da63"
checksum = "025222545d6d7fab71e2ae2b356526a1df67a2872222cbae7535e557a42abd2e"
dependencies = [
"arrow",
"async-trait",
"chrono",
"datafusion-common",
"datafusion-doc",
@@ -2219,9 +2221,9 @@ dependencies = [
[[package]]
name = "datafusion-expr-common"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70fafb3a045ed6c49cfca0cd090f62cf871ca6326cc3355cb0aaf1260fa760b6"
checksum = "9d5c267104849d5fa6d81cf5ba88f35ecd58727729c5eb84066c25227b644ae2"
dependencies = [
"arrow",
"datafusion-common",
@@ -2232,9 +2234,9 @@ dependencies = [
[[package]]
name = "datafusion-functions"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdf9a9cf655265861a20453b1e58357147eab59bdc90ce7f2f68f1f35104d3bb"
checksum = "c620d105aa208fcee45c588765483314eb415f5571cfd6c1bae3a59c5b4d15bb"
dependencies = [
"arrow",
"arrow-buffer",
@@ -2261,9 +2263,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-aggregate"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f07e49733d847be0a05235e17b884d326a2fd402c97a89fe8bcf0bfba310005"
checksum = "35f61d5198a35ed368bf3aacac74f0d0fa33de7a7cb0c57e9f68ab1346d2f952"
dependencies = [
"ahash",
"arrow",
@@ -2282,9 +2284,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-aggregate-common"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4512607e10d72b0b0a1dc08f42cb5bd5284cb8348b7fea49dc83409493e32b1b"
checksum = "13efdb17362be39b5024f6da0d977ffe49c0212929ec36eec550e07e2bc7812f"
dependencies = [
"ahash",
"arrow",
@@ -2295,9 +2297,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-nested"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ab331806e34f5545e5f03396e4d5068077395b1665795d8f88c14ec4f1e0b7a"
checksum = "9187678af567d7c9e004b72a0b6dc5b0a00ebf4901cb3511ed2db4effe092e66"
dependencies = [
"arrow",
"arrow-ord",
@@ -2307,6 +2309,7 @@ dependencies = [
"datafusion-expr",
"datafusion-functions",
"datafusion-functions-aggregate",
"datafusion-functions-aggregate-common",
"datafusion-macros",
"datafusion-physical-expr-common",
"itertools 0.14.0",
@@ -2316,9 +2319,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-table"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4ac2c0be983a06950ef077e34e0174aa0cb9e346f3aeae459823158037ade37"
checksum = "ecf156589cc21ef59fe39c7a9a841b4a97394549643bbfa88cc44e8588cf8fe5"
dependencies = [
"arrow",
"async-trait",
@@ -2332,9 +2335,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-window"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36f3d92731de384c90906941d36dcadf6a86d4128409a9c5cd916662baed5f53"
checksum = "edcb25e3e369f1366ec9a261456e45b5aad6ea1c0c8b4ce546587207c501ed9e"
dependencies = [
"arrow",
"datafusion-common",
@@ -2350,9 +2353,9 @@ dependencies = [
[[package]]
name = "datafusion-functions-window-common"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c679f8bf0971704ec8fd4249fcbb2eb49d6a12cc3e7a840ac047b4928d3541b5"
checksum = "8996a8e11174d0bd7c62dc2f316485affc6ae5ffd5b8a68b508137ace2310294"
dependencies = [
"datafusion-common",
"datafusion-physical-expr-common",
@@ -2360,9 +2363,9 @@ dependencies = [
[[package]]
name = "datafusion-macros"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2821de7cb0362d12e75a5196b636a59ea3584ec1e1cc7dc6f5e34b9e8389d251"
checksum = "95ee8d1be549eb7316f437035f2cec7ec42aba8374096d807c4de006a3b5d78a"
dependencies = [
"datafusion-expr",
"quote",
@@ -2371,14 +2374,15 @@ dependencies = [
[[package]]
name = "datafusion-optimizer"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1594c7a97219ede334f25347ad8d57056621e7f4f35a0693c8da876e10dd6a53"
checksum = "c9fa98671458254928af854e5f6c915e66b860a8bde505baea0ff2892deab74d"
dependencies = [
"arrow",
"chrono",
"datafusion-common",
"datafusion-expr",
"datafusion-expr-common",
"datafusion-physical-expr",
"indexmap 2.11.0",
"itertools 0.14.0",
@@ -2389,9 +2393,9 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc6da0f2412088d23f6b01929dedd687b5aee63b19b674eb73d00c3eb3c883b7"
checksum = "3515d51531cca5f7b5a6f3ea22742b71bb36fc378b465df124ff9a2fa349b002"
dependencies = [
"ahash",
"arrow",
@@ -2411,9 +2415,9 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr-common"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcb0dbd9213078a593c3fe28783beaa625a4e6c6a6c797856ee2ba234311fb96"
checksum = "24485475d9c618a1d33b2a3dad003d946dc7a7bbf0354d125301abc0a5a79e3e"
dependencies = [
"ahash",
"arrow",
@@ -2425,9 +2429,9 @@ dependencies = [
[[package]]
name = "datafusion-physical-optimizer"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d140854b2db3ef8ac611caad12bfb2e1e1de827077429322a6188f18fc0026a"
checksum = "b9da411a0a64702f941a12af2b979434d14ec5d36c6f49296966b2c7639cbb3a"
dependencies = [
"arrow",
"datafusion-common",
@@ -2437,15 +2441,16 @@ dependencies = [
"datafusion-physical-expr",
"datafusion-physical-expr-common",
"datafusion-physical-plan",
"datafusion-pruning",
"itertools 0.14.0",
"log",
]
[[package]]
name = "datafusion-physical-plan"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b46cbdf21a01206be76d467f325273b22c559c744a012ead5018dfe79597de08"
checksum = "a6d168282bb7b54880bb3159f89b51c047db4287f5014d60c3ef4c6e1468212b"
dependencies = [
"ahash",
"arrow",
@@ -2472,10 +2477,28 @@ dependencies = [
]
[[package]]
name = "datafusion-session"
version = "48.0.1"
name = "datafusion-pruning"
version = "49.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a72733766ddb5b41534910926e8da5836622316f6283307fd9fb7e19811a59c"
checksum = "391a457b9d23744c53eeb89edd1027424cba100581488d89800ed841182df905"
dependencies = [
"arrow",
"arrow-schema",
"datafusion-common",
"datafusion-datasource",
"datafusion-expr-common",
"datafusion-physical-expr",
"datafusion-physical-expr-common",
"datafusion-physical-plan",
"itertools 0.14.0",
"log",
]
[[package]]
name = "datafusion-session"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053201c2bb729c7938f85879034df2b5a52cfaba16f1b3b66ab8505c81b2aad3"
dependencies = [
"arrow",
"async-trait",
@@ -2497,9 +2520,9 @@ dependencies = [
[[package]]
name = "datafusion-sql"
version = "48.0.1"
version = "49.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5162338cdec9cc7ea13a0e6015c361acad5ec1d88d83f7c86301f789473971f"
checksum = "9082779be8ce4882189b229c0cff4393bd0808282a7194130c9f32159f185e25"
dependencies = [
"arrow",
"bigdecimal",
@@ -3006,8 +3029,7 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]]
name = "fsst"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c9c2b8bb2a1aa18407a8ed0b60496288f3e01ba6d8e215d49bd85f995a12eae"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-array",
"rand 0.9.2",
@@ -4185,8 +4207,7 @@ dependencies = [
[[package]]
name = "lance"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bed718abdd224433ac7df789027b018157796a2038d4912423ef3e2b005a07a"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-arith",
@@ -4250,8 +4271,7 @@ dependencies = [
[[package]]
name = "lance-arrow"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d99ea2fe8e81091008b29cb0e3b4b028328729cec8018c425f99b8e42535170d"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -4270,8 +4290,7 @@ dependencies = [
[[package]]
name = "lance-bitpacking"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1403fee0dc51f50497122ac81cbfbb6aa17dc4cb6fd2ed85c3a6e3c5da8036f"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrayref",
"paste",
@@ -4281,8 +4300,7 @@ dependencies = [
[[package]]
name = "lance-core"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe11e18299e5d95e3f26268504d09b139d6e254493aa50fec1c95bb3ec30b64d"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -4318,8 +4336,7 @@ dependencies = [
[[package]]
name = "lance-datafusion"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd1225086ca750870aca9e2f91869a886a3f0f5e05ed75efa5c9a813b36317a8"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-array",
@@ -4349,8 +4366,7 @@ dependencies = [
[[package]]
name = "lance-datagen"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5de5bea2c57fc98351f5f6fd9f68905267ae1bb674ac33c38f78a9c319106a07"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-array",
@@ -4368,8 +4384,7 @@ dependencies = [
[[package]]
name = "lance-encoding"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7480da1a6fcf204e90cf3b8c79a2843fdab0949d9afe8cd038d8726ccca725a8"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-arith",
"arrow-array",
@@ -4406,8 +4421,7 @@ dependencies = [
[[package]]
name = "lance-file"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2c3106776198dcddbfec1df8b828edcb852ac80cc8077d7185dc1e524e3cf3"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-arith",
"arrow-array",
@@ -4442,8 +4456,7 @@ dependencies = [
[[package]]
name = "lance-index"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34a3f8128c200b2d055f71c60a603e0952a248b914c2edbdea9ec7636e4d6d26"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-array",
@@ -4500,8 +4513,7 @@ dependencies = [
[[package]]
name = "lance-io"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eba4eac3c02e8b8834f7b23d3d3e3c89b5fb614b07569e6aef5bbc1350e94d73"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-arith",
@@ -4542,8 +4554,7 @@ dependencies = [
[[package]]
name = "lance-linalg"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62092af5e1c7cc2168b6abdae44eeddfb6d2ed14c2035173bef20723f84f57b4"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -4567,8 +4578,7 @@ dependencies = [
[[package]]
name = "lance-table"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edfa48241aa42250f2b8f90812a3c51030ece2f8226ec99c753553c04468a6f8"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow",
"arrow-array",
@@ -4607,8 +4617,7 @@ dependencies = [
[[package]]
name = "lance-testing"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed6887d39beb6e358fae1f25ec3341bc7c61dc7044dd9dc9550b687b83bdc56f"
source = "git+https://github.com/lancedb/lance.git?tag=v0.35.0-beta.4#e842a8f922b90c298c356dd1c6afdc83ca5253f2"
dependencies = [
"arrow-array",
"arrow-schema",
@@ -4619,7 +4628,7 @@ dependencies = [
[[package]]
name = "lancedb"
version = "0.22.0-beta.1"
version = "0.22.0"
dependencies = [
"arrow",
"arrow-array",
@@ -4706,7 +4715,7 @@ dependencies = [
[[package]]
name = "lancedb-nodejs"
version = "0.22.0-beta.1"
version = "0.22.0"
dependencies = [
"arrow-array",
"arrow-ipc",
@@ -4726,7 +4735,7 @@ dependencies = [
[[package]]
name = "lancedb-python"
version = "0.25.0-beta.1"
version = "0.25.0"
dependencies = [
"arrow",
"env_logger",
@@ -7693,7 +7702,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4521174166bac1ff04fe16ef4524c70144cd29682a45978978ca3d7f4e0be11"
dependencies = [
"log",
"recursive",
"sqlparser_derive",
]

View File

@@ -15,14 +15,14 @@ categories = ["database-implementations"]
rust-version = "1.78.0"
[workspace.dependencies]
lance = { "version" = "=0.35.0", default-features = false, "features" = ["dynamodb"] }
lance-io = { "version" = "=0.35.0", default-features = false }
lance-index = { "version" = "=0.35.0" }
lance-linalg = { "version" = "=0.35.0" }
lance-table = { "version" = "=0.35.0" }
lance-testing = { "version" = "=0.35.0" }
lance-datafusion = { "version" = "=0.35.0" }
lance-encoding = { "version" = "=0.35.0" }
lance = { "version" = "=0.35.0", default-features = false, "features" = ["dynamodb"], "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-io = { "version" = "=0.35.0", default-features = false, "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-index = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-linalg = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-table = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-testing = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-datafusion = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
lance-encoding = { "version" = "=0.35.0", "tag" = "v0.35.0-beta.4", "git" = "https://github.com/lancedb/lance.git" }
# Note that this one does not include pyarrow
arrow = { version = "55.1", optional = false }
arrow-array = "55.1"
@@ -33,12 +33,12 @@ arrow-schema = "55.1"
arrow-arith = "55.1"
arrow-cast = "55.1"
async-trait = "0"
datafusion = { version = "48.0", default-features = false }
datafusion-catalog = "48.0"
datafusion-common = { version = "48.0", default-features = false }
datafusion-execution = "48.0"
datafusion-expr = "48.0"
datafusion-physical-plan = "48.0"
datafusion = { version = "49.0", default-features = false }
datafusion-catalog = "49.0"
datafusion-common = { version = "49.0", default-features = false }
datafusion-execution = "49.0"
datafusion-expr = "49.0"
datafusion-physical-plan = "49.0"
env_logger = "0.11"
half = { "version" = "2.6.0", default-features = false, features = [
"num-traits",

View File

@@ -8,7 +8,7 @@
<parent>
<groupId>com.lancedb</groupId>
<artifactId>lancedb-parent</artifactId>
<version>0.22.0-beta.1</version>
<version>0.22.1-beta.0</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -8,7 +8,7 @@
<parent>
<groupId>com.lancedb</groupId>
<artifactId>lancedb-parent</artifactId>
<version>0.22.0-beta.1</version>
<version>0.22.1-beta.0</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -6,7 +6,7 @@
<groupId>com.lancedb</groupId>
<artifactId>lancedb-parent</artifactId>
<version>0.22.0-beta.1</version>
<version>0.22.1-beta.0</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>LanceDB Java SDK Parent POM</description>

View File

@@ -1,7 +1,7 @@
[package]
name = "lancedb-nodejs"
edition.workspace = true
version = "0.22.0-beta.1"
version = "0.22.1-beta.0"
license.workspace = true
description.workspace = true
repository.workspace = true

View File

@@ -3,7 +3,13 @@
import * as http from "http";
import { RequestListener } from "http";
import { Connection, ConnectionOptions, connect } from "../lancedb";
import {
ClientConfig,
Connection,
ConnectionOptions,
TlsConfig,
connect,
} from "../lancedb";
async function withMockDatabase(
listener: RequestListener,
@@ -148,4 +154,88 @@ describe("remote connection", () => {
},
);
});
describe("TlsConfig", () => {
it("should create TlsConfig with all fields", () => {
const tlsConfig: TlsConfig = {
certFile: "/path/to/cert.pem",
keyFile: "/path/to/key.pem",
sslCaCert: "/path/to/ca.pem",
assertHostname: false,
};
expect(tlsConfig.certFile).toBe("/path/to/cert.pem");
expect(tlsConfig.keyFile).toBe("/path/to/key.pem");
expect(tlsConfig.sslCaCert).toBe("/path/to/ca.pem");
expect(tlsConfig.assertHostname).toBe(false);
});
it("should create TlsConfig with partial fields", () => {
const tlsConfig: TlsConfig = {
certFile: "/path/to/cert.pem",
keyFile: "/path/to/key.pem",
};
expect(tlsConfig.certFile).toBe("/path/to/cert.pem");
expect(tlsConfig.keyFile).toBe("/path/to/key.pem");
expect(tlsConfig.sslCaCert).toBeUndefined();
expect(tlsConfig.assertHostname).toBeUndefined();
});
it("should create ClientConfig with TlsConfig", () => {
const tlsConfig: TlsConfig = {
certFile: "/path/to/cert.pem",
keyFile: "/path/to/key.pem",
sslCaCert: "/path/to/ca.pem",
assertHostname: true,
};
const clientConfig: ClientConfig = {
userAgent: "test-agent",
tlsConfig: tlsConfig,
};
expect(clientConfig.userAgent).toBe("test-agent");
expect(clientConfig.tlsConfig).toBeDefined();
expect(clientConfig.tlsConfig?.certFile).toBe("/path/to/cert.pem");
expect(clientConfig.tlsConfig?.keyFile).toBe("/path/to/key.pem");
expect(clientConfig.tlsConfig?.sslCaCert).toBe("/path/to/ca.pem");
expect(clientConfig.tlsConfig?.assertHostname).toBe(true);
});
it("should handle empty TlsConfig", () => {
const tlsConfig: TlsConfig = {};
expect(tlsConfig.certFile).toBeUndefined();
expect(tlsConfig.keyFile).toBeUndefined();
expect(tlsConfig.sslCaCert).toBeUndefined();
expect(tlsConfig.assertHostname).toBeUndefined();
});
it("should accept TlsConfig in connection options", () => {
const tlsConfig: TlsConfig = {
certFile: "/path/to/cert.pem",
keyFile: "/path/to/key.pem",
sslCaCert: "/path/to/ca.pem",
assertHostname: false,
};
// Just verify that the ClientConfig accepts the TlsConfig
const clientConfig: ClientConfig = {
tlsConfig: tlsConfig,
};
const connectionOptions: ConnectionOptions = {
apiKey: "fake",
clientConfig: clientConfig,
};
// Verify the configuration structure is correct
expect(connectionOptions.clientConfig).toBeDefined();
expect(connectionOptions.clientConfig?.tlsConfig).toBeDefined();
expect(connectionOptions.clientConfig?.tlsConfig?.certFile).toBe(
"/path/to/cert.pem",
);
});
});
});

View File

@@ -21,6 +21,7 @@ export {
ClientConfig,
TimeoutConfig,
RetryConfig,
TlsConfig,
OptimizeStats,
CompactionStats,
RemovalStats,

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-darwin-arm64",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["darwin"],
"cpu": ["arm64"],
"main": "lancedb.darwin-arm64.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-darwin-x64",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["darwin"],
"cpu": ["x64"],
"main": "lancedb.darwin-x64.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-linux-arm64-gnu",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["linux"],
"cpu": ["arm64"],
"main": "lancedb.linux-arm64-gnu.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-linux-arm64-musl",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["linux"],
"cpu": ["arm64"],
"main": "lancedb.linux-arm64-musl.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-linux-x64-gnu",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["linux"],
"cpu": ["x64"],
"main": "lancedb.linux-x64-gnu.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-linux-x64-musl",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["linux"],
"cpu": ["x64"],
"main": "lancedb.linux-x64-musl.node",

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-win32-arm64-msvc",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": [
"win32"
],

View File

@@ -1,6 +1,6 @@
{
"name": "@lancedb/lancedb-win32-x64-msvc",
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"os": ["win32"],
"cpu": ["x64"],
"main": "lancedb.win32-x64-msvc.node",

View File

@@ -1,12 +1,12 @@
{
"name": "@lancedb/lancedb",
"version": "0.22.0-beta.1",
"version": "0.22.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@lancedb/lancedb",
"version": "0.22.0-beta.1",
"version": "0.22.0",
"cpu": [
"x64",
"arm64"

View File

@@ -11,7 +11,7 @@
"ann"
],
"private": false,
"version": "0.22.0-beta.1",
"version": "0.22.1-beta.0",
"main": "dist/index.js",
"exports": {
".": "./dist/index.js",

View File

@@ -69,6 +69,20 @@ pub struct RetryConfig {
pub statuses: Option<Vec<u16>>,
}
/// TLS/mTLS configuration for the remote HTTP client.
#[napi(object)]
#[derive(Debug, Default)]
pub struct TlsConfig {
/// Path to the client certificate file (PEM format) for mTLS authentication.
pub cert_file: Option<String>,
/// Path to the client private key file (PEM format) for mTLS authentication.
pub key_file: Option<String>,
/// Path to the CA certificate file (PEM format) for server verification.
pub ssl_ca_cert: Option<String>,
/// Whether to verify the hostname in the server's certificate.
pub assert_hostname: Option<bool>,
}
#[napi(object)]
#[derive(Debug, Default)]
pub struct ClientConfig {
@@ -77,6 +91,7 @@ pub struct ClientConfig {
pub timeout_config: Option<TimeoutConfig>,
pub extra_headers: Option<HashMap<String, String>>,
pub id_delimiter: Option<String>,
pub tls_config: Option<TlsConfig>,
}
impl From<TimeoutConfig> for lancedb::remote::TimeoutConfig {
@@ -107,6 +122,17 @@ impl From<RetryConfig> for lancedb::remote::RetryConfig {
}
}
impl From<TlsConfig> for lancedb::remote::TlsConfig {
fn from(config: TlsConfig) -> Self {
Self {
cert_file: config.cert_file,
key_file: config.key_file,
ssl_ca_cert: config.ssl_ca_cert,
assert_hostname: config.assert_hostname.unwrap_or(true),
}
}
}
impl From<ClientConfig> for lancedb::remote::ClientConfig {
fn from(config: ClientConfig) -> Self {
Self {
@@ -117,6 +143,7 @@ impl From<ClientConfig> for lancedb::remote::ClientConfig {
timeout_config: config.timeout_config.map(Into::into).unwrap_or_default(),
extra_headers: config.extra_headers.unwrap_or_default(),
id_delimiter: config.id_delimiter,
tls_config: config.tls_config.map(Into::into),
}
}
}

View File

@@ -1,5 +1,5 @@
[tool.bumpversion]
current_version = "0.25.0"
current_version = "0.25.1-beta.0"
parse = """(?x)
(?P<major>0|[1-9]\\d*)\\.
(?P<minor>0|[1-9]\\d*)\\.

View File

@@ -1,6 +1,6 @@
[package]
name = "lancedb-python"
version = "0.25.0"
version = "0.25.1-beta.0"
edition.workspace = true
description = "Python bindings for LanceDB"
license.workspace = true

View File

@@ -8,7 +8,7 @@ from typing import List, Optional
from lancedb import __version__
__all__ = ["TimeoutConfig", "RetryConfig", "ClientConfig"]
__all__ = ["TimeoutConfig", "RetryConfig", "TlsConfig", "ClientConfig"]
@dataclass
@@ -112,6 +112,29 @@ class RetryConfig:
statuses: Optional[List[int]] = None
@dataclass
class TlsConfig:
"""TLS/mTLS configuration for the remote HTTP client.
Attributes
----------
cert_file: Optional[str]
Path to the client certificate file (PEM format) for mTLS authentication.
key_file: Optional[str]
Path to the client private key file (PEM format) for mTLS authentication.
ssl_ca_cert: Optional[str]
Path to the CA certificate file (PEM format) for server verification.
assert_hostname: bool
Whether to verify the hostname in the server's certificate. Default is True.
Set to False to disable hostname verification (use with caution).
"""
cert_file: Optional[str] = None
key_file: Optional[str] = None
ssl_ca_cert: Optional[str] = None
assert_hostname: bool = True
@dataclass
class ClientConfig:
user_agent: str = f"LanceDB-Python-Client/{__version__}"
@@ -119,9 +142,12 @@ class ClientConfig:
timeout_config: Optional[TimeoutConfig] = field(default_factory=TimeoutConfig)
extra_headers: Optional[dict] = None
id_delimiter: Optional[str] = None
tls_config: Optional[TlsConfig] = None
def __post_init__(self):
if isinstance(self.retry_config, dict):
self.retry_config = RetryConfig(**self.retry_config)
if isinstance(self.timeout_config, dict):
self.timeout_config = TimeoutConfig(**self.timeout_config)
if isinstance(self.tls_config, dict):
self.tls_config = TlsConfig(**self.tls_config)

View File

@@ -301,6 +301,7 @@ pub struct PyClientConfig {
timeout_config: Option<PyClientTimeoutConfig>,
extra_headers: Option<HashMap<String, String>>,
id_delimiter: Option<String>,
tls_config: Option<PyClientTlsConfig>,
}
#[derive(FromPyObject)]
@@ -321,6 +322,14 @@ pub struct PyClientTimeoutConfig {
pool_idle_timeout: Option<Duration>,
}
#[derive(FromPyObject)]
pub struct PyClientTlsConfig {
cert_file: Option<String>,
key_file: Option<String>,
ssl_ca_cert: Option<String>,
assert_hostname: bool,
}
#[cfg(feature = "remote")]
impl From<PyClientRetryConfig> for lancedb::remote::RetryConfig {
fn from(value: PyClientRetryConfig) -> Self {
@@ -347,6 +356,18 @@ impl From<PyClientTimeoutConfig> for lancedb::remote::TimeoutConfig {
}
}
#[cfg(feature = "remote")]
impl From<PyClientTlsConfig> for lancedb::remote::TlsConfig {
fn from(value: PyClientTlsConfig) -> Self {
Self {
cert_file: value.cert_file,
key_file: value.key_file,
ssl_ca_cert: value.ssl_ca_cert,
assert_hostname: value.assert_hostname,
}
}
}
#[cfg(feature = "remote")]
impl From<PyClientConfig> for lancedb::remote::ClientConfig {
fn from(value: PyClientConfig) -> Self {
@@ -356,6 +377,7 @@ impl From<PyClientConfig> for lancedb::remote::ClientConfig {
timeout_config: value.timeout_config.map(Into::into).unwrap_or_default(),
extra_headers: value.extra_headers.unwrap_or_default(),
id_delimiter: value.id_delimiter,
tls_config: value.tls_config.map(Into::into),
}
}
}

View File

@@ -1,6 +1,6 @@
[package]
name = "lancedb"
version = "0.22.0-beta.1"
version = "0.22.1-beta.0"
edition.workspace = true
description = "LanceDB: A serverless, low-latency vector database for AI applications"
license.workspace = true

View File

@@ -18,5 +18,5 @@ const ARROW_FILE_CONTENT_TYPE: &str = "application/vnd.apache.arrow.file";
#[cfg(test)]
const JSON_CONTENT_TYPE: &str = "application/json";
pub use client::{ClientConfig, RetryConfig, TimeoutConfig};
pub use client::{ClientConfig, RetryConfig, TimeoutConfig, TlsConfig};
pub use db::{RemoteDatabaseOptions, RemoteDatabaseOptionsBuilder};

View File

@@ -15,6 +15,19 @@ use crate::remote::retry::{ResolvedRetryConfig, RetryCounter};
const REQUEST_ID_HEADER: HeaderName = HeaderName::from_static("x-request-id");
/// Configuration for TLS/mTLS settings.
#[derive(Clone, Debug, Default)]
pub struct TlsConfig {
/// Path to the client certificate file (PEM format)
pub cert_file: Option<String>,
/// Path to the client private key file (PEM format)
pub key_file: Option<String>,
/// Path to the CA certificate file for server verification (PEM format)
pub ssl_ca_cert: Option<String>,
/// Whether to verify the hostname in the server's certificate
pub assert_hostname: bool,
}
/// Configuration for the LanceDB Cloud HTTP client.
#[derive(Clone, Debug)]
pub struct ClientConfig {
@@ -28,6 +41,8 @@ pub struct ClientConfig {
/// The delimiter to use when constructing object identifiers.
/// If not default, passes as query parameter.
pub id_delimiter: Option<String>,
/// TLS configuration for mTLS support
pub tls_config: Option<TlsConfig>,
}
impl Default for ClientConfig {
@@ -38,6 +53,7 @@ impl Default for ClientConfig {
user_agent: concat!("LanceDB-Rust-Client/", env!("CARGO_PKG_VERSION")).into(),
extra_headers: HashMap::new(),
id_delimiter: None,
tls_config: None,
}
}
}
@@ -245,6 +261,49 @@ impl RestfulLanceDbClient<Sender> {
if let Some(timeout) = timeout {
client_builder = client_builder.timeout(timeout);
}
// Configure mTLS if TlsConfig is provided
if let Some(tls_config) = &client_config.tls_config {
// Load client certificate and key for mTLS
if let (Some(cert_file), Some(key_file)) = (&tls_config.cert_file, &tls_config.key_file)
{
let cert = std::fs::read(cert_file).map_err(|err| Error::Other {
message: format!("Failed to read certificate file: {}", cert_file),
source: Some(Box::new(err)),
})?;
let key = std::fs::read(key_file).map_err(|err| Error::Other {
message: format!("Failed to read key file: {}", key_file),
source: Some(Box::new(err)),
})?;
let identity = reqwest::Identity::from_pem(&[&cert[..], &key[..]].concat())
.map_err(|err| Error::Other {
message: "Failed to create client identity from certificate and key".into(),
source: Some(Box::new(err)),
})?;
client_builder = client_builder.identity(identity);
}
// Load CA certificate for server verification
if let Some(ca_cert_file) = &tls_config.ssl_ca_cert {
let ca_cert = std::fs::read(ca_cert_file).map_err(|err| Error::Other {
message: format!("Failed to read CA certificate file: {}", ca_cert_file),
source: Some(Box::new(err)),
})?;
let ca_cert =
reqwest::Certificate::from_pem(&ca_cert).map_err(|err| Error::Other {
message: "Failed to create CA certificate from PEM".into(),
source: Some(Box::new(err)),
})?;
client_builder = client_builder.add_root_certificate(ca_cert);
}
// Configure hostname verification
client_builder =
client_builder.danger_accept_invalid_hostnames(!tls_config.assert_hostname);
}
let client = client_builder
.default_headers(Self::default_headers(
api_key,
@@ -661,4 +720,50 @@ mod tests {
Some(Duration::from_secs(120))
);
}
#[test]
fn test_tls_config_default() {
let config = TlsConfig::default();
assert!(config.cert_file.is_none());
assert!(config.key_file.is_none());
assert!(config.ssl_ca_cert.is_none());
assert!(!config.assert_hostname);
}
#[test]
fn test_tls_config_with_mtls() {
let tls_config = TlsConfig {
cert_file: Some("/path/to/cert.pem".to_string()),
key_file: Some("/path/to/key.pem".to_string()),
ssl_ca_cert: Some("/path/to/ca.pem".to_string()),
assert_hostname: true,
};
assert_eq!(tls_config.cert_file, Some("/path/to/cert.pem".to_string()));
assert_eq!(tls_config.key_file, Some("/path/to/key.pem".to_string()));
assert_eq!(tls_config.ssl_ca_cert, Some("/path/to/ca.pem".to_string()));
assert!(tls_config.assert_hostname);
}
#[test]
fn test_client_config_with_tls() {
let tls_config = TlsConfig {
cert_file: Some("/path/to/cert.pem".to_string()),
key_file: Some("/path/to/key.pem".to_string()),
ssl_ca_cert: None,
assert_hostname: false,
};
let client_config = ClientConfig {
tls_config: Some(tls_config.clone()),
..Default::default()
};
assert!(client_config.tls_config.is_some());
let config_tls = client_config.tls_config.unwrap();
assert_eq!(config_tls.cert_file, Some("/path/to/cert.pem".to_string()));
assert_eq!(config_tls.key_file, Some("/path/to/key.pem".to_string()));
assert!(config_tls.ssl_ca_cert.is_none());
assert!(!config_tls.assert_hostname);
}
}

View File

@@ -121,6 +121,10 @@ impl ExecutionPlan for MetadataEraserExec {
as SendableRecordBatchStream,
)
}
fn partition_statistics(&self, partition: Option<usize>) -> DataFusionResult<Statistics> {
self.input.partition_statistics(partition)
}
}
#[derive(Debug)]
@@ -227,6 +231,7 @@ pub mod tests {
prelude::{SessionConfig, SessionContext},
};
use datafusion_catalog::TableProvider;
use datafusion_common::stats::Precision;
use datafusion_execution::SendableRecordBatchStream;
use datafusion_expr::{col, lit, LogicalPlan, LogicalPlanBuilder};
use futures::{StreamExt, TryStreamExt};
@@ -495,6 +500,7 @@ pub mod tests {
plan,
"MetadataEraserExec
ProjectionExec:...
CooperativeExec...
LanceRead:...",
)
.await;
@@ -509,4 +515,24 @@ pub mod tests {
TestFixture::check_plan(plan, "").await;
}
#[tokio::test]
async fn test_metadata_eraser_propagates_statistics() {
let fixture = TestFixture::new().await;
let plan =
LogicalPlanBuilder::scan("foo", provider_as_source(fixture.adapter.clone()), None)
.unwrap()
.build()
.unwrap();
let ctx = SessionContext::new();
let physical_plan = ctx.state().create_physical_plan(&plan).await.unwrap();
assert_eq!(physical_plan.name(), "MetadataEraserExec");
let partition_stats = physical_plan.partition_statistics(None).unwrap();
assert!(matches!(partition_stats.num_rows, Precision::Exact(10)));
}
}