This is an automated email from the ASF dual-hosted git repository.

timsaucer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-python.git


The following commit(s) were added to refs/heads/main by this push:
     new 9af1681f Create workspace with core and util crates (#1414)
9af1681f is described below

commit 9af1681f203ec2a21b64371a1dc6361641ffb2f9
Author: Tim Saucer <[email protected]>
AuthorDate: Mon Mar 16 12:05:00 2026 +0100

    Create workspace with core and util crates (#1414)
    
    * Break up the repository into a workspace with three crates
    
    * We have a workspace cargo lock file now so this is not needed
    
    * Cleanup
    
    * These files should be redundant because of the build.rs file
    
    * More moving around of utils to clean up
    
    * Add note on how to run FFI example tests
    
    * Add back in dep removed during rebase
    
    * taplo fmt
    
    * Since we have a workspace we know the example version is in sync so we do 
not need this test
    
    * Add description, homepage, and repository to Cargo.toml
    
    Co-authored-by: Kevin Liu <[email protected]>
    
    * Add description, homepage, and repository to Cargo.toml
    
    Co-authored-by: Kevin Liu <[email protected]>
    
    * Add description, homepage, and repository to Cargo.toml
    
    Co-authored-by: Kevin Liu <[email protected]>
    
    * Removed unused include
    
    Co-authored-by: Kevin Liu <[email protected]>
    
    ---------
    
    Co-authored-by: Kevin Liu <[email protected]>
---
 .cargo/config.toml                                 |    5 -
 .github/workflows/test.yml                         |   12 -
 Cargo.lock                                         |   33 +
 Cargo.toml                                         |   78 +-
 README.md                                          |    9 +
 crates/core/Cargo.toml                             |   82 +
 build.rs => crates/core/build.rs                   |    0
 {src => crates/core/src}/array.rs                  |    2 +-
 {src => crates/core/src}/catalog.rs                |   20 +-
 {src => crates/core/src}/common.rs                 |    0
 {src => crates/core/src}/common/data_type.rs       |    0
 {src => crates/core/src}/common/df_schema.rs       |    0
 {src => crates/core/src}/common/function.rs        |    0
 {src => crates/core/src}/common/schema.rs          |    0
 {src => crates/core/src}/config.rs                 |    0
 {src => crates/core/src}/context.rs                |   13 +-
 {src => crates/core/src}/dataframe.rs              |    2 +-
 {src => crates/core/src}/dataset.rs                |    0
 {src => crates/core/src}/dataset_exec.rs           |    0
 src/sql.rs => crates/core/src/errors.rs            |    4 +-
 {src => crates/core/src}/expr.rs                   |    0
 {src => crates/core/src}/expr/aggregate.rs         |    0
 {src => crates/core/src}/expr/aggregate_expr.rs    |    0
 {src => crates/core/src}/expr/alias.rs             |    0
 {src => crates/core/src}/expr/analyze.rs           |    0
 {src => crates/core/src}/expr/between.rs           |    0
 {src => crates/core/src}/expr/binary_expr.rs       |    0
 {src => crates/core/src}/expr/bool_expr.rs         |    0
 {src => crates/core/src}/expr/case.rs              |    0
 {src => crates/core/src}/expr/cast.rs              |    0
 {src => crates/core/src}/expr/column.rs            |    0
 {src => crates/core/src}/expr/conditional_expr.rs  |    0
 {src => crates/core/src}/expr/copy_to.rs           |    0
 {src => crates/core/src}/expr/create_catalog.rs    |    0
 .../core/src}/expr/create_catalog_schema.rs        |    0
 .../core/src}/expr/create_external_table.rs        |    0
 {src => crates/core/src}/expr/create_function.rs   |    0
 {src => crates/core/src}/expr/create_index.rs      |    0
 .../core/src}/expr/create_memory_table.rs          |    0
 {src => crates/core/src}/expr/create_view.rs       |    0
 {src => crates/core/src}/expr/describe_table.rs    |    0
 {src => crates/core/src}/expr/distinct.rs          |    0
 {src => crates/core/src}/expr/dml.rs               |    0
 .../core/src}/expr/drop_catalog_schema.rs          |    0
 {src => crates/core/src}/expr/drop_function.rs     |    0
 {src => crates/core/src}/expr/drop_table.rs        |    0
 {src => crates/core/src}/expr/drop_view.rs         |    0
 {src => crates/core/src}/expr/empty_relation.rs    |    0
 {src => crates/core/src}/expr/exists.rs            |    0
 {src => crates/core/src}/expr/explain.rs           |    0
 {src => crates/core/src}/expr/extension.rs         |    0
 {src => crates/core/src}/expr/filter.rs            |    0
 {src => crates/core/src}/expr/grouping_set.rs      |    0
 {src => crates/core/src}/expr/in_list.rs           |    0
 {src => crates/core/src}/expr/in_subquery.rs       |    0
 {src => crates/core/src}/expr/indexed_field.rs     |    0
 {src => crates/core/src}/expr/join.rs              |    0
 {src => crates/core/src}/expr/like.rs              |    0
 {src => crates/core/src}/expr/limit.rs             |    0
 {src => crates/core/src}/expr/literal.rs           |    0
 {src => crates/core/src}/expr/logical_node.rs      |    0
 {src => crates/core/src}/expr/placeholder.rs       |    0
 {src => crates/core/src}/expr/projection.rs        |    0
 {src => crates/core/src}/expr/recursive_query.rs   |    0
 {src => crates/core/src}/expr/repartition.rs       |    0
 {src => crates/core/src}/expr/scalar_subquery.rs   |    0
 {src => crates/core/src}/expr/scalar_variable.rs   |    0
 {src => crates/core/src}/expr/set_comparison.rs    |    0
 {src => crates/core/src}/expr/signature.rs         |    0
 {src => crates/core/src}/expr/sort.rs              |    0
 {src => crates/core/src}/expr/sort_expr.rs         |    0
 {src => crates/core/src}/expr/statement.rs         |    0
 {src => crates/core/src}/expr/subquery.rs          |    0
 {src => crates/core/src}/expr/subquery_alias.rs    |    0
 {src => crates/core/src}/expr/table_scan.rs        |    0
 {src => crates/core/src}/expr/union.rs             |    0
 {src => crates/core/src}/expr/unnest.rs            |    0
 {src => crates/core/src}/expr/unnest_expr.rs       |    0
 {src => crates/core/src}/expr/values.rs            |    0
 {src => crates/core/src}/expr/window.rs            |    0
 {src => crates/core/src}/functions.rs              |    0
 {src => crates/core/src}/lib.rs                    |    4 -
 {src => crates/core/src}/options.rs                |    0
 {src => crates/core/src}/physical_plan.rs          |    0
 .../core/src}/pyarrow_filter_expression.rs         |    0
 {src => crates/core/src}/pyarrow_util.rs           |    0
 {src => crates/core/src}/record_batch.rs           |    2 +-
 {src => crates/core/src}/sql.rs                    |    0
 {src => crates/core/src}/sql/exceptions.rs         |    0
 {src => crates/core/src}/sql/logical.rs            |    0
 {src => crates/core/src}/sql/util.rs               |    0
 {src => crates/core/src}/store.rs                  |    0
 {src => crates/core/src}/substrait.rs              |    2 +-
 {src => crates/core/src}/table.rs                  |    2 +-
 {src => crates/core/src}/udaf.rs                   |    2 +-
 {src => crates/core/src}/udf.rs                    |    2 +-
 {src => crates/core/src}/udtf.rs                   |    2 +-
 {src => crates/core/src}/udwf.rs                   |    2 +-
 {src => crates/core/src}/unparser/dialect.rs       |    0
 {src => crates/core/src}/unparser/mod.rs           |    0
 crates/util/Cargo.toml                             |   34 +
 {src => crates/util/src}/errors.rs                 |    0
 src/utils.rs => crates/util/src/lib.rs             |   65 +-
 examples/datafusion-ffi-example/.cargo/config.toml |    5 -
 examples/datafusion-ffi-example/Cargo.lock         | 3127 --------------------
 examples/datafusion-ffi-example/Cargo.toml         |   47 +-
 .../datafusion-ffi-example/src/catalog_provider.rs |    3 +-
 examples/datafusion-ffi-example/src/lib.rs         |    1 -
 .../datafusion-ffi-example/src/table_function.rs   |    2 +-
 .../datafusion-ffi-example/src/table_provider.rs   |    3 +-
 examples/datafusion-ffi-example/src/utils.rs       |   64 -
 pyproject.toml                                     |    1 +
 112 files changed, 274 insertions(+), 3356 deletions(-)

diff --git a/.cargo/config.toml b/.cargo/config.toml
deleted file mode 100644
index af951327..00000000
--- a/.cargo/config.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-[target.x86_64-apple-darwin]
-rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
-
-[target.aarch64-apple-darwin]
-rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 69256301..a2f304aa 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -41,18 +41,6 @@ jobs:
     steps:
       - uses: actions/checkout@v6
 
-      - name: Verify example datafusion version
-        run: |
-          MAIN_VERSION=$(grep -A 1 "name = \"datafusion-common\"" Cargo.lock | 
grep "version = " | head -1 | sed 's/.*version = "\(.*\)"/\1/')
-          EXAMPLE_VERSION=$(grep -A 1 "name = \"datafusion-common\"" 
examples/datafusion-ffi-example/Cargo.lock | grep "version = " | head -1 | sed 
's/.*version = "\(.*\)"/\1/')
-          echo "Main crate datafusion version: $MAIN_VERSION"
-          echo "FFI example datafusion version: $EXAMPLE_VERSION"
-
-          if [ "$MAIN_VERSION" != "$EXAMPLE_VERSION" ]; then
-            echo "❌ Error: FFI example datafusion versions don't match!"
-            exit 1
-          fi
-
       - name: Setup Python
         uses: actions/setup-python@v6
         with:
diff --git a/Cargo.lock b/Cargo.lock
index 40b1ba7f..e44c84b9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1274,6 +1274,26 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "datafusion-ffi-example"
+version = "52.0.0"
+dependencies = [
+ "arrow",
+ "arrow-array",
+ "arrow-schema",
+ "async-trait",
+ "datafusion-catalog",
+ "datafusion-common",
+ "datafusion-expr",
+ "datafusion-ffi",
+ "datafusion-functions-aggregate",
+ "datafusion-functions-window",
+ "datafusion-python-util",
+ "pyo3",
+ "pyo3-build-config",
+ "pyo3-log",
+]
+
 [[package]]
 name = "datafusion-functions"
 version = "53.0.0"
@@ -1598,6 +1618,7 @@ dependencies = [
  "datafusion",
  "datafusion-ffi",
  "datafusion-proto",
+ "datafusion-python-util",
  "datafusion-substrait",
  "futures",
  "log",
@@ -1616,6 +1637,18 @@ dependencies = [
  "uuid",
 ]
 
+[[package]]
+name = "datafusion-python-util"
+version = "52.0.0"
+dependencies = [
+ "arrow",
+ "datafusion",
+ "datafusion-ffi",
+ "prost",
+ "pyo3",
+ "tokio",
+]
+
 [[package]]
 name = "datafusion-session"
 version = "53.0.0"
diff --git a/Cargo.toml b/Cargo.toml
index b584470d..aa8aa6b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,8 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-[package]
-name = "datafusion-python"
+[workspace.package]
 version = "52.0.0"
 homepage = "https://datafusion.apache.org/python";
 repository = "https://github.com/apache/datafusion-python";
@@ -26,67 +25,43 @@ readme = "README.md"
 license = "Apache-2.0"
 edition = "2024"
 rust-version = "1.88"
-include = [
-  "/src",
-  "/datafusion",
-  "/LICENSE.txt",
-  "build.rs",
-  "pyproject.toml",
-  "Cargo.toml",
-  "Cargo.lock",
-]
 
-[features]
-default = ["mimalloc"]
-protoc = ["datafusion-substrait/protoc"]
-substrait = ["dep:datafusion-substrait"]
+[workspace]
+members = ["crates/core", "crates/util", "examples/datafusion-ffi-example"]
+resolver = "3"
 
-[dependencies]
-tokio = { version = "1.49", features = [
-  "macros",
-  "rt",
-  "rt-multi-thread",
-  "sync",
-] }
-pyo3 = { version = "0.28", features = [
-  "extension-module",
-  "abi3",
-  "abi3-py310",
-] }
-pyo3-async-runtimes = { version = "0.28", features = ["tokio-runtime"] }
+[workspace.dependencies]
+tokio = { version = "1.49" }
+pyo3 = { version = "0.28" }
+pyo3-async-runtimes = { version = "0.28" }
 pyo3-log = "0.13.3"
-arrow = { version = "58", features = ["pyarrow"] }
+arrow = { version = "58" }
+arrow-array = { version = "58" }
+arrow-schema = { version = "58" }
 arrow-select = { version = "58" }
-datafusion = { version = "53", features = ["avro", "unicode_expressions"] }
-datafusion-substrait = { version = "53", optional = true }
+datafusion = { version = "53" }
+datafusion-substrait = { version = "53" }
 datafusion-proto = { version = "53" }
 datafusion-ffi = { version = "53" }
-prost = "0.14.3" # keep in line with `datafusion-substrait`
+datafusion-catalog = { version = "53", default-features = false }
+datafusion-common = { version = "53", default-features = false }
+datafusion-functions-aggregate = { version = "53" }
+datafusion-functions-window = { version = "53" }
+datafusion-expr = { version = "53" }
+prost = "0.14.3"
 serde_json = "1"
-uuid = { version = "1.21", features = ["v4"] }
-mimalloc = { version = "0.1", optional = true, default-features = false, 
features = [
-  "local_dynamic_tls",
-] }
+uuid = { version = "1.21" }
+mimalloc = { version = "0.1", default-features = false }
 async-trait = "0.1.89"
 futures = "0.3"
 cstr = "0.2"
-object_store = { version = "0.13.1", features = [
-  "aws",
-  "gcp",
-  "azure",
-  "http",
-] }
+object_store = { version = "0.13.1" }
 url = "2"
 log = "0.4.29"
 parking_lot = "0.12"
-
-[build-dependencies]
-prost-types = "0.14.3"     # keep in line with `datafusion-substrait`
+prost-types = "0.14.3"                                            # keep in 
line with `datafusion-substrait`
 pyo3-build-config = "0.28"
-
-[lib]
-name = "datafusion_python"
-crate-type = ["cdylib", "rlib"]
+datafusion-python-util = { path = "crates/util" }
 
 [profile.release]
 lto = true
@@ -99,3 +74,8 @@ datafusion = { git = 
"https://github.com/apache/datafusion.git";, rev = "35749607
 datafusion-substrait = { git = "https://github.com/apache/datafusion.git";, rev 
= "35749607f585b3bf25b66b7d2289c56c18d03e4f" }
 datafusion-proto = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
 datafusion-ffi = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
+datafusion-catalog = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
+datafusion-common = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
+datafusion-functions-aggregate = { git = 
"https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
+datafusion-functions-window = { git = 
"https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
+datafusion-expr = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
diff --git a/README.md b/README.md
index 810ac871..c2425787 100644
--- a/README.md
+++ b/README.md
@@ -278,6 +278,15 @@ uv run --no-project maturin develop --uv
 uv run --no-project pytest .
 ```
 
+To run the FFI tests within the examples folder, after you have built
+`datafusion-python` with the previous commands:
+
+```bash
+cd examples/datafusion-ffi-example
+uv run --no-project maturin develop --uv
+uv run --no-project pytest python/tests/_test_*py
+```
+
 ### Running & Installing pre-commit hooks
 
 `datafusion-python` takes advantage of [pre-commit](https://pre-commit.com/) 
to assist developers with code linting to help reduce
diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml
new file mode 100644
index 00000000..3e2b01c8
--- /dev/null
+++ b/crates/core/Cargo.toml
@@ -0,0 +1,82 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+[package]
+name = "datafusion-python"
+version.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+license.workspace = true
+description.workspace = true
+homepage.workspace = true
+repository.workspace = true
+include = [
+  "src",
+  "../LICENSE.txt",
+  "build.rs",
+  "../pyproject.toml",
+  "Cargo.toml",
+  "../Cargo.lock",
+]
+
+[dependencies]
+tokio = { workspace = true, features = [
+  "macros",
+  "rt",
+  "rt-multi-thread",
+  "sync",
+] }
+pyo3 = { workspace = true, features = [
+  "extension-module",
+  "abi3",
+  "abi3-py310",
+] }
+pyo3-async-runtimes = { workspace = true, features = ["tokio-runtime"] }
+pyo3-log = { workspace = true }
+arrow = { workspace = true, features = ["pyarrow"] }
+arrow-select = { workspace = true }
+datafusion = { workspace = true, features = ["avro", "unicode_expressions"] }
+datafusion-substrait = { workspace = true, optional = true }
+datafusion-proto = { workspace = true }
+datafusion-ffi = { workspace = true }
+prost = { workspace = true } # keep in line with `datafusion-substrait`
+serde_json = { workspace = true }
+uuid = { workspace = true, features = ["v4"] }
+mimalloc = { workspace = true, optional = true, features = [
+  "local_dynamic_tls",
+] }
+async-trait = { workspace = true }
+futures = { workspace = true }
+cstr = { workspace = true }
+object_store = { workspace = true, features = ["aws", "gcp", "azure", "http"] }
+url = { workspace = true }
+log = { workspace = true }
+parking_lot = { workspace = true }
+datafusion-python-util = { workspace = true }
+
+[build-dependencies]
+prost-types = { workspace = true }
+pyo3-build-config = { workspace = true }
+
+[features]
+default = ["mimalloc"]
+protoc = ["datafusion-substrait/protoc"]
+substrait = ["dep:datafusion-substrait"]
+
+[lib]
+name = "datafusion_python"
+crate-type = ["cdylib", "rlib"]
diff --git a/build.rs b/crates/core/build.rs
similarity index 100%
rename from build.rs
rename to crates/core/build.rs
diff --git a/src/array.rs b/crates/core/src/array.rs
similarity index 98%
rename from src/array.rs
rename to crates/core/src/array.rs
index 1ff08dfb..99e63ef5 100644
--- a/src/array.rs
+++ b/crates/core/src/array.rs
@@ -22,13 +22,13 @@ use arrow::array::{Array, ArrayRef};
 use arrow::datatypes::{Field, FieldRef};
 use arrow::ffi::{FFI_ArrowArray, FFI_ArrowSchema};
 use arrow::pyarrow::ToPyArrow;
+use datafusion_python_util::validate_pycapsule;
 use pyo3::ffi::c_str;
 use pyo3::prelude::{PyAnyMethods, PyCapsuleMethods};
 use pyo3::types::PyCapsule;
 use pyo3::{Bound, PyAny, PyResult, Python, pyclass, pymethods};
 
 use crate::errors::PyDataFusionResult;
-use crate::utils::validate_pycapsule;
 
 /// A Python object which implements the Arrow PyCapsule for importing
 /// into other libraries.
diff --git a/src/catalog.rs b/crates/core/src/catalog.rs
similarity index 97%
rename from src/catalog.rs
rename to crates/core/src/catalog.rs
index 43325c30..f707e7e5 100644
--- a/src/catalog.rs
+++ b/crates/core/src/catalog.rs
@@ -30,19 +30,20 @@ use datafusion::datasource::TableProvider;
 use datafusion_ffi::catalog_provider::FFI_CatalogProvider;
 use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
 use datafusion_ffi::schema_provider::FFI_SchemaProvider;
+use datafusion_python_util::{
+    create_logical_extension_capsule, ffi_logical_codec_from_pycapsule, 
validate_pycapsule,
+    wait_for_future,
+};
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::PyKeyError;
 use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::PyCapsule;
 
+use crate::context::PySessionContext;
 use crate::dataset::Dataset;
 use crate::errors::{PyDataFusionError, PyDataFusionResult, py_datafusion_err, 
to_datafusion_err};
 use crate::table::PyTable;
-use crate::utils::{
-    create_logical_extension_capsule, extract_logical_extension_codec, 
validate_pycapsule,
-    wait_for_future,
-};
 
 #[pyclass(
     from_py_object,
@@ -710,6 +711,17 @@ fn extract_schema_provider_from_pyobj(
     Ok(provider)
 }
 
+fn extract_logical_extension_codec(
+    py: Python,
+    obj: Option<Bound<PyAny>>,
+) -> PyResult<Arc<FFI_LogicalExtensionCodec>> {
+    let obj = match obj {
+        Some(obj) => obj,
+        None => PySessionContext::global_ctx()?.into_bound_py_any(py)?,
+    };
+    ffi_logical_codec_from_pycapsule(obj).map(Arc::new)
+}
+
 pub(crate) fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
     m.add_class::<PyCatalog>()?;
     m.add_class::<PySchema>()?;
diff --git a/src/common.rs b/crates/core/src/common.rs
similarity index 100%
rename from src/common.rs
rename to crates/core/src/common.rs
diff --git a/src/common/data_type.rs b/crates/core/src/common/data_type.rs
similarity index 100%
rename from src/common/data_type.rs
rename to crates/core/src/common/data_type.rs
diff --git a/src/common/df_schema.rs b/crates/core/src/common/df_schema.rs
similarity index 100%
rename from src/common/df_schema.rs
rename to crates/core/src/common/df_schema.rs
diff --git a/src/common/function.rs b/crates/core/src/common/function.rs
similarity index 100%
rename from src/common/function.rs
rename to crates/core/src/common/function.rs
diff --git a/src/common/schema.rs b/crates/core/src/common/schema.rs
similarity index 100%
rename from src/common/schema.rs
rename to crates/core/src/common/schema.rs
diff --git a/src/config.rs b/crates/core/src/config.rs
similarity index 100%
rename from src/config.rs
rename to crates/core/src/config.rs
diff --git a/src/context.rs b/crates/core/src/context.rs
similarity index 99%
rename from src/context.rs
rename to crates/core/src/context.rs
index 2eaf5a73..709fdc5a 100644
--- a/src/context.rs
+++ b/crates/core/src/context.rs
@@ -52,6 +52,10 @@ use 
datafusion_ffi::catalog_provider_list::FFI_CatalogProviderList;
 use datafusion_ffi::execution::FFI_TaskContextProvider;
 use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
 use datafusion_proto::logical_plan::DefaultLogicalExtensionCodec;
+use datafusion_python_util::{
+    create_logical_extension_capsule, ffi_logical_codec_from_pycapsule, 
get_global_ctx,
+    get_tokio_runtime, spawn_future, validate_pycapsule, wait_for_future,
+};
 use object_store::ObjectStore;
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::{PyKeyError, PyValueError};
@@ -82,10 +86,6 @@ use crate::udaf::PyAggregateUDF;
 use crate::udf::PyScalarUDF;
 use crate::udtf::PyTableFunction;
 use crate::udwf::PyWindowUDF;
-use crate::utils::{
-    create_logical_extension_capsule, extract_logical_extension_codec, 
get_global_ctx,
-    get_tokio_runtime, spawn_future, validate_pycapsule, wait_for_future,
-};
 
 /// Configuration options for a SessionContext
 #[pyclass(
@@ -1187,8 +1187,7 @@ impl PySessionContext {
         &self,
         codec: Bound<'py, PyAny>,
     ) -> PyDataFusionResult<Self> {
-        let py = codec.py();
-        let logical_codec = extract_logical_extension_codec(py, Some(codec))?;
+        let logical_codec = Arc::new(ffi_logical_codec_from_pycapsule(codec)?);
 
         Ok({
             Self {
@@ -1246,7 +1245,7 @@ impl PySessionContext {
 
     fn default_logical_codec(ctx: &Arc<SessionContext>) -> 
Arc<FFI_LogicalExtensionCodec> {
         let codec = Arc::new(DefaultLogicalExtensionCodec {});
-        let runtime = get_tokio_runtime().0.handle().clone();
+        let runtime = get_tokio_runtime().handle().clone();
         let ctx_provider = Arc::clone(ctx) as Arc<dyn TaskContextProvider>;
         Arc::new(FFI_LogicalExtensionCodec::new(
             codec,
diff --git a/src/dataframe.rs b/crates/core/src/dataframe.rs
similarity index 99%
rename from src/dataframe.rs
rename to crates/core/src/dataframe.rs
index eb1fa4a8..29fc05ed 100644
--- a/src/dataframe.rs
+++ b/crates/core/src/dataframe.rs
@@ -41,6 +41,7 @@ use datafusion::logical_expr::SortExpr;
 use datafusion::logical_expr::dml::InsertOp;
 use datafusion::parquet::basic::{BrotliLevel, Compression, GzipLevel, 
ZstdLevel};
 use datafusion::prelude::*;
+use datafusion_python_util::{is_ipython_env, spawn_future, validate_pycapsule, 
wait_for_future};
 use futures::{StreamExt, TryStreamExt};
 use parking_lot::Mutex;
 use pyo3::PyErr;
@@ -58,7 +59,6 @@ use crate::physical_plan::PyExecutionPlan;
 use crate::record_batch::{PyRecordBatchStream, poll_next_batch};
 use crate::sql::logical::PyLogicalPlan;
 use crate::table::{PyTable, TempViewTable};
-use crate::utils::{is_ipython_env, spawn_future, validate_pycapsule, 
wait_for_future};
 
 /// File-level static CStr for the Arrow array stream capsule name.
 static ARROW_ARRAY_STREAM_NAME: &CStr = cstr!("arrow_array_stream");
diff --git a/src/dataset.rs b/crates/core/src/dataset.rs
similarity index 100%
rename from src/dataset.rs
rename to crates/core/src/dataset.rs
diff --git a/src/dataset_exec.rs b/crates/core/src/dataset_exec.rs
similarity index 100%
rename from src/dataset_exec.rs
rename to crates/core/src/dataset_exec.rs
diff --git a/src/sql.rs b/crates/core/src/errors.rs
similarity index 93%
copy from src/sql.rs
copy to crates/core/src/errors.rs
index dea9b566..8babc5a5 100644
--- a/src/sql.rs
+++ b/crates/core/src/errors.rs
@@ -15,6 +15,4 @@
 // specific language governing permissions and limitations
 // under the License.
 
-pub mod exceptions;
-pub mod logical;
-pub(crate) mod util;
+pub use datafusion_python_util::errors::*;
diff --git a/src/expr.rs b/crates/core/src/expr.rs
similarity index 100%
rename from src/expr.rs
rename to crates/core/src/expr.rs
diff --git a/src/expr/aggregate.rs b/crates/core/src/expr/aggregate.rs
similarity index 100%
rename from src/expr/aggregate.rs
rename to crates/core/src/expr/aggregate.rs
diff --git a/src/expr/aggregate_expr.rs b/crates/core/src/expr/aggregate_expr.rs
similarity index 100%
rename from src/expr/aggregate_expr.rs
rename to crates/core/src/expr/aggregate_expr.rs
diff --git a/src/expr/alias.rs b/crates/core/src/expr/alias.rs
similarity index 100%
rename from src/expr/alias.rs
rename to crates/core/src/expr/alias.rs
diff --git a/src/expr/analyze.rs b/crates/core/src/expr/analyze.rs
similarity index 100%
rename from src/expr/analyze.rs
rename to crates/core/src/expr/analyze.rs
diff --git a/src/expr/between.rs b/crates/core/src/expr/between.rs
similarity index 100%
rename from src/expr/between.rs
rename to crates/core/src/expr/between.rs
diff --git a/src/expr/binary_expr.rs b/crates/core/src/expr/binary_expr.rs
similarity index 100%
rename from src/expr/binary_expr.rs
rename to crates/core/src/expr/binary_expr.rs
diff --git a/src/expr/bool_expr.rs b/crates/core/src/expr/bool_expr.rs
similarity index 100%
rename from src/expr/bool_expr.rs
rename to crates/core/src/expr/bool_expr.rs
diff --git a/src/expr/case.rs b/crates/core/src/expr/case.rs
similarity index 100%
rename from src/expr/case.rs
rename to crates/core/src/expr/case.rs
diff --git a/src/expr/cast.rs b/crates/core/src/expr/cast.rs
similarity index 100%
rename from src/expr/cast.rs
rename to crates/core/src/expr/cast.rs
diff --git a/src/expr/column.rs b/crates/core/src/expr/column.rs
similarity index 100%
rename from src/expr/column.rs
rename to crates/core/src/expr/column.rs
diff --git a/src/expr/conditional_expr.rs 
b/crates/core/src/expr/conditional_expr.rs
similarity index 100%
rename from src/expr/conditional_expr.rs
rename to crates/core/src/expr/conditional_expr.rs
diff --git a/src/expr/copy_to.rs b/crates/core/src/expr/copy_to.rs
similarity index 100%
rename from src/expr/copy_to.rs
rename to crates/core/src/expr/copy_to.rs
diff --git a/src/expr/create_catalog.rs b/crates/core/src/expr/create_catalog.rs
similarity index 100%
rename from src/expr/create_catalog.rs
rename to crates/core/src/expr/create_catalog.rs
diff --git a/src/expr/create_catalog_schema.rs 
b/crates/core/src/expr/create_catalog_schema.rs
similarity index 100%
rename from src/expr/create_catalog_schema.rs
rename to crates/core/src/expr/create_catalog_schema.rs
diff --git a/src/expr/create_external_table.rs 
b/crates/core/src/expr/create_external_table.rs
similarity index 100%
rename from src/expr/create_external_table.rs
rename to crates/core/src/expr/create_external_table.rs
diff --git a/src/expr/create_function.rs 
b/crates/core/src/expr/create_function.rs
similarity index 100%
rename from src/expr/create_function.rs
rename to crates/core/src/expr/create_function.rs
diff --git a/src/expr/create_index.rs b/crates/core/src/expr/create_index.rs
similarity index 100%
rename from src/expr/create_index.rs
rename to crates/core/src/expr/create_index.rs
diff --git a/src/expr/create_memory_table.rs 
b/crates/core/src/expr/create_memory_table.rs
similarity index 100%
rename from src/expr/create_memory_table.rs
rename to crates/core/src/expr/create_memory_table.rs
diff --git a/src/expr/create_view.rs b/crates/core/src/expr/create_view.rs
similarity index 100%
rename from src/expr/create_view.rs
rename to crates/core/src/expr/create_view.rs
diff --git a/src/expr/describe_table.rs b/crates/core/src/expr/describe_table.rs
similarity index 100%
rename from src/expr/describe_table.rs
rename to crates/core/src/expr/describe_table.rs
diff --git a/src/expr/distinct.rs b/crates/core/src/expr/distinct.rs
similarity index 100%
rename from src/expr/distinct.rs
rename to crates/core/src/expr/distinct.rs
diff --git a/src/expr/dml.rs b/crates/core/src/expr/dml.rs
similarity index 100%
rename from src/expr/dml.rs
rename to crates/core/src/expr/dml.rs
diff --git a/src/expr/drop_catalog_schema.rs 
b/crates/core/src/expr/drop_catalog_schema.rs
similarity index 100%
rename from src/expr/drop_catalog_schema.rs
rename to crates/core/src/expr/drop_catalog_schema.rs
diff --git a/src/expr/drop_function.rs b/crates/core/src/expr/drop_function.rs
similarity index 100%
rename from src/expr/drop_function.rs
rename to crates/core/src/expr/drop_function.rs
diff --git a/src/expr/drop_table.rs b/crates/core/src/expr/drop_table.rs
similarity index 100%
rename from src/expr/drop_table.rs
rename to crates/core/src/expr/drop_table.rs
diff --git a/src/expr/drop_view.rs b/crates/core/src/expr/drop_view.rs
similarity index 100%
rename from src/expr/drop_view.rs
rename to crates/core/src/expr/drop_view.rs
diff --git a/src/expr/empty_relation.rs b/crates/core/src/expr/empty_relation.rs
similarity index 100%
rename from src/expr/empty_relation.rs
rename to crates/core/src/expr/empty_relation.rs
diff --git a/src/expr/exists.rs b/crates/core/src/expr/exists.rs
similarity index 100%
rename from src/expr/exists.rs
rename to crates/core/src/expr/exists.rs
diff --git a/src/expr/explain.rs b/crates/core/src/expr/explain.rs
similarity index 100%
rename from src/expr/explain.rs
rename to crates/core/src/expr/explain.rs
diff --git a/src/expr/extension.rs b/crates/core/src/expr/extension.rs
similarity index 100%
rename from src/expr/extension.rs
rename to crates/core/src/expr/extension.rs
diff --git a/src/expr/filter.rs b/crates/core/src/expr/filter.rs
similarity index 100%
rename from src/expr/filter.rs
rename to crates/core/src/expr/filter.rs
diff --git a/src/expr/grouping_set.rs b/crates/core/src/expr/grouping_set.rs
similarity index 100%
rename from src/expr/grouping_set.rs
rename to crates/core/src/expr/grouping_set.rs
diff --git a/src/expr/in_list.rs b/crates/core/src/expr/in_list.rs
similarity index 100%
rename from src/expr/in_list.rs
rename to crates/core/src/expr/in_list.rs
diff --git a/src/expr/in_subquery.rs b/crates/core/src/expr/in_subquery.rs
similarity index 100%
rename from src/expr/in_subquery.rs
rename to crates/core/src/expr/in_subquery.rs
diff --git a/src/expr/indexed_field.rs b/crates/core/src/expr/indexed_field.rs
similarity index 100%
rename from src/expr/indexed_field.rs
rename to crates/core/src/expr/indexed_field.rs
diff --git a/src/expr/join.rs b/crates/core/src/expr/join.rs
similarity index 100%
rename from src/expr/join.rs
rename to crates/core/src/expr/join.rs
diff --git a/src/expr/like.rs b/crates/core/src/expr/like.rs
similarity index 100%
rename from src/expr/like.rs
rename to crates/core/src/expr/like.rs
diff --git a/src/expr/limit.rs b/crates/core/src/expr/limit.rs
similarity index 100%
rename from src/expr/limit.rs
rename to crates/core/src/expr/limit.rs
diff --git a/src/expr/literal.rs b/crates/core/src/expr/literal.rs
similarity index 100%
rename from src/expr/literal.rs
rename to crates/core/src/expr/literal.rs
diff --git a/src/expr/logical_node.rs b/crates/core/src/expr/logical_node.rs
similarity index 100%
rename from src/expr/logical_node.rs
rename to crates/core/src/expr/logical_node.rs
diff --git a/src/expr/placeholder.rs b/crates/core/src/expr/placeholder.rs
similarity index 100%
rename from src/expr/placeholder.rs
rename to crates/core/src/expr/placeholder.rs
diff --git a/src/expr/projection.rs b/crates/core/src/expr/projection.rs
similarity index 100%
rename from src/expr/projection.rs
rename to crates/core/src/expr/projection.rs
diff --git a/src/expr/recursive_query.rs 
b/crates/core/src/expr/recursive_query.rs
similarity index 100%
rename from src/expr/recursive_query.rs
rename to crates/core/src/expr/recursive_query.rs
diff --git a/src/expr/repartition.rs b/crates/core/src/expr/repartition.rs
similarity index 100%
rename from src/expr/repartition.rs
rename to crates/core/src/expr/repartition.rs
diff --git a/src/expr/scalar_subquery.rs 
b/crates/core/src/expr/scalar_subquery.rs
similarity index 100%
rename from src/expr/scalar_subquery.rs
rename to crates/core/src/expr/scalar_subquery.rs
diff --git a/src/expr/scalar_variable.rs 
b/crates/core/src/expr/scalar_variable.rs
similarity index 100%
rename from src/expr/scalar_variable.rs
rename to crates/core/src/expr/scalar_variable.rs
diff --git a/src/expr/set_comparison.rs b/crates/core/src/expr/set_comparison.rs
similarity index 100%
rename from src/expr/set_comparison.rs
rename to crates/core/src/expr/set_comparison.rs
diff --git a/src/expr/signature.rs b/crates/core/src/expr/signature.rs
similarity index 100%
rename from src/expr/signature.rs
rename to crates/core/src/expr/signature.rs
diff --git a/src/expr/sort.rs b/crates/core/src/expr/sort.rs
similarity index 100%
rename from src/expr/sort.rs
rename to crates/core/src/expr/sort.rs
diff --git a/src/expr/sort_expr.rs b/crates/core/src/expr/sort_expr.rs
similarity index 100%
rename from src/expr/sort_expr.rs
rename to crates/core/src/expr/sort_expr.rs
diff --git a/src/expr/statement.rs b/crates/core/src/expr/statement.rs
similarity index 100%
rename from src/expr/statement.rs
rename to crates/core/src/expr/statement.rs
diff --git a/src/expr/subquery.rs b/crates/core/src/expr/subquery.rs
similarity index 100%
rename from src/expr/subquery.rs
rename to crates/core/src/expr/subquery.rs
diff --git a/src/expr/subquery_alias.rs b/crates/core/src/expr/subquery_alias.rs
similarity index 100%
rename from src/expr/subquery_alias.rs
rename to crates/core/src/expr/subquery_alias.rs
diff --git a/src/expr/table_scan.rs b/crates/core/src/expr/table_scan.rs
similarity index 100%
rename from src/expr/table_scan.rs
rename to crates/core/src/expr/table_scan.rs
diff --git a/src/expr/union.rs b/crates/core/src/expr/union.rs
similarity index 100%
rename from src/expr/union.rs
rename to crates/core/src/expr/union.rs
diff --git a/src/expr/unnest.rs b/crates/core/src/expr/unnest.rs
similarity index 100%
rename from src/expr/unnest.rs
rename to crates/core/src/expr/unnest.rs
diff --git a/src/expr/unnest_expr.rs b/crates/core/src/expr/unnest_expr.rs
similarity index 100%
rename from src/expr/unnest_expr.rs
rename to crates/core/src/expr/unnest_expr.rs
diff --git a/src/expr/values.rs b/crates/core/src/expr/values.rs
similarity index 100%
rename from src/expr/values.rs
rename to crates/core/src/expr/values.rs
diff --git a/src/expr/window.rs b/crates/core/src/expr/window.rs
similarity index 100%
rename from src/expr/window.rs
rename to crates/core/src/expr/window.rs
diff --git a/src/functions.rs b/crates/core/src/functions.rs
similarity index 100%
rename from src/functions.rs
rename to crates/core/src/functions.rs
diff --git a/src/lib.rs b/crates/core/src/lib.rs
similarity index 97%
rename from src/lib.rs
rename to crates/core/src/lib.rs
index 468243a3..fc2d006d 100644
--- a/src/lib.rs
+++ b/crates/core/src/lib.rs
@@ -62,15 +62,11 @@ mod udaf;
 mod udf;
 pub mod udtf;
 mod udwf;
-pub mod utils;
 
 #[cfg(feature = "mimalloc")]
 #[global_allocator]
 static GLOBAL: MiMalloc = MiMalloc;
 
-// Used to define Tokio Runtime as a Python module attribute
-pub(crate) struct TokioRuntime(tokio::runtime::Runtime);
-
 /// Low-level DataFusion internal package.
 ///
 /// The higher-level public API is defined in pure python files under the
diff --git a/src/options.rs b/crates/core/src/options.rs
similarity index 100%
rename from src/options.rs
rename to crates/core/src/options.rs
diff --git a/src/physical_plan.rs b/crates/core/src/physical_plan.rs
similarity index 100%
rename from src/physical_plan.rs
rename to crates/core/src/physical_plan.rs
diff --git a/src/pyarrow_filter_expression.rs 
b/crates/core/src/pyarrow_filter_expression.rs
similarity index 100%
rename from src/pyarrow_filter_expression.rs
rename to crates/core/src/pyarrow_filter_expression.rs
diff --git a/src/pyarrow_util.rs b/crates/core/src/pyarrow_util.rs
similarity index 100%
rename from src/pyarrow_util.rs
rename to crates/core/src/pyarrow_util.rs
diff --git a/src/record_batch.rs b/crates/core/src/record_batch.rs
similarity index 98%
rename from src/record_batch.rs
rename to crates/core/src/record_batch.rs
index e8abc641..0492c6c7 100644
--- a/src/record_batch.rs
+++ b/crates/core/src/record_batch.rs
@@ -20,6 +20,7 @@ use std::sync::Arc;
 use datafusion::arrow::pyarrow::ToPyArrow;
 use datafusion::arrow::record_batch::RecordBatch;
 use datafusion::physical_plan::SendableRecordBatchStream;
+use datafusion_python_util::wait_for_future;
 use futures::StreamExt;
 use pyo3::exceptions::{PyStopAsyncIteration, PyStopIteration};
 use pyo3::prelude::*;
@@ -27,7 +28,6 @@ use pyo3::{PyAny, PyResult, Python, pyclass, pymethods};
 use tokio::sync::Mutex;
 
 use crate::errors::PyDataFusionError;
-use crate::utils::wait_for_future;
 
 #[pyclass(name = "RecordBatch", module = "datafusion", subclass, frozen)]
 pub struct PyRecordBatch {
diff --git a/src/sql.rs b/crates/core/src/sql.rs
similarity index 100%
rename from src/sql.rs
rename to crates/core/src/sql.rs
diff --git a/src/sql/exceptions.rs b/crates/core/src/sql/exceptions.rs
similarity index 100%
rename from src/sql/exceptions.rs
rename to crates/core/src/sql/exceptions.rs
diff --git a/src/sql/logical.rs b/crates/core/src/sql/logical.rs
similarity index 100%
rename from src/sql/logical.rs
rename to crates/core/src/sql/logical.rs
diff --git a/src/sql/util.rs b/crates/core/src/sql/util.rs
similarity index 100%
rename from src/sql/util.rs
rename to crates/core/src/sql/util.rs
diff --git a/src/store.rs b/crates/core/src/store.rs
similarity index 100%
rename from src/store.rs
rename to crates/core/src/store.rs
diff --git a/src/substrait.rs b/crates/core/src/substrait.rs
similarity index 99%
rename from src/substrait.rs
rename to crates/core/src/substrait.rs
index c2f11252..27e446f4 100644
--- a/src/substrait.rs
+++ b/crates/core/src/substrait.rs
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use datafusion_python_util::wait_for_future;
 use datafusion_substrait::logical_plan::{consumer, producer};
 use datafusion_substrait::serializer;
 use datafusion_substrait::substrait::proto::Plan;
@@ -25,7 +26,6 @@ use pyo3::types::PyBytes;
 use crate::context::PySessionContext;
 use crate::errors::{PyDataFusionError, PyDataFusionResult, py_datafusion_err, 
to_datafusion_err};
 use crate::sql::logical::PyLogicalPlan;
-use crate::utils::wait_for_future;
 
 #[pyclass(
     from_py_object,
diff --git a/src/table.rs b/crates/core/src/table.rs
similarity index 99%
rename from src/table.rs
rename to crates/core/src/table.rs
index b9f30af9..3dfe3e9c 100644
--- a/src/table.rs
+++ b/crates/core/src/table.rs
@@ -27,13 +27,13 @@ use datafusion::datasource::{TableProvider, TableType};
 use datafusion::logical_expr::{Expr, LogicalPlanBuilder, 
TableProviderFilterPushDown};
 use datafusion::physical_plan::ExecutionPlan;
 use datafusion::prelude::DataFrame;
+use datafusion_python_util::table_provider_from_pycapsule;
 use pyo3::IntoPyObjectExt;
 use pyo3::prelude::*;
 
 use crate::context::PySessionContext;
 use crate::dataframe::PyDataFrame;
 use crate::dataset::Dataset;
-use crate::utils::table_provider_from_pycapsule;
 
 /// This struct is used as a common method for all TableProviders,
 /// whether they refer to an FFI provider, an internally known
diff --git a/src/udaf.rs b/crates/core/src/udaf.rs
similarity index 99%
rename from src/udaf.rs
rename to crates/core/src/udaf.rs
index 7ba499c6..ed26c79c 100644
--- a/src/udaf.rs
+++ b/crates/core/src/udaf.rs
@@ -27,6 +27,7 @@ use datafusion::logical_expr::{
     Accumulator, AccumulatorFactoryFunction, AggregateUDF, AggregateUDFImpl, 
create_udaf,
 };
 use datafusion_ffi::udaf::FFI_AggregateUDF;
+use datafusion_python_util::{parse_volatility, validate_pycapsule};
 use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyTuple};
@@ -34,7 +35,6 @@ use pyo3::types::{PyCapsule, PyTuple};
 use crate::common::data_type::PyScalarValue;
 use crate::errors::{PyDataFusionResult, py_datafusion_err, to_datafusion_err};
 use crate::expr::PyExpr;
-use crate::utils::{parse_volatility, validate_pycapsule};
 
 #[derive(Debug)]
 struct RustAccumulator {
diff --git a/src/udf.rs b/crates/core/src/udf.rs
similarity index 99%
rename from src/udf.rs
rename to crates/core/src/udf.rs
index 2d60abc0..7543f96d 100644
--- a/src/udf.rs
+++ b/crates/core/src/udf.rs
@@ -32,6 +32,7 @@ use datafusion::logical_expr::{
     Volatility,
 };
 use datafusion_ffi::udf::FFI_ScalarUDF;
+use datafusion_python_util::{parse_volatility, validate_pycapsule};
 use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyTuple};
@@ -39,7 +40,6 @@ use pyo3::types::{PyCapsule, PyTuple};
 use crate::array::PyArrowArrayExportable;
 use crate::errors::{PyDataFusionResult, py_datafusion_err, to_datafusion_err};
 use crate::expr::PyExpr;
-use crate::utils::{parse_volatility, validate_pycapsule};
 
 /// This struct holds the Python written function that is a
 /// ScalarUDF.
diff --git a/src/udtf.rs b/crates/core/src/udtf.rs
similarity index 99%
rename from src/udtf.rs
rename to crates/core/src/udtf.rs
index 24df93e2..77c5ffbb 100644
--- a/src/udtf.rs
+++ b/crates/core/src/udtf.rs
@@ -22,6 +22,7 @@ use datafusion::catalog::{TableFunctionImpl, TableProvider};
 use datafusion::error::Result as DataFusionResult;
 use datafusion::logical_expr::Expr;
 use datafusion_ffi::udtf::FFI_TableFunction;
+use datafusion_python_util::validate_pycapsule;
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::{PyImportError, PyTypeError};
 use pyo3::ffi::c_str;
@@ -32,7 +33,6 @@ use crate::context::PySessionContext;
 use crate::errors::{py_datafusion_err, to_datafusion_err};
 use crate::expr::PyExpr;
 use crate::table::PyTable;
-use crate::utils::validate_pycapsule;
 
 /// Represents a user defined table function
 #[pyclass(from_py_object, frozen, name = "TableFunction", module = 
"datafusion")]
diff --git a/src/udwf.rs b/crates/core/src/udwf.rs
similarity index 99%
rename from src/udwf.rs
rename to crates/core/src/udwf.rs
index de63e2f9..ff7ab035 100644
--- a/src/udwf.rs
+++ b/crates/core/src/udwf.rs
@@ -32,6 +32,7 @@ use datafusion::logical_expr::{
 };
 use datafusion::scalar::ScalarValue;
 use datafusion_ffi::udwf::FFI_WindowUDF;
+use datafusion_python_util::{parse_volatility, validate_pycapsule};
 use pyo3::exceptions::PyValueError;
 use pyo3::ffi::c_str;
 use pyo3::prelude::*;
@@ -40,7 +41,6 @@ use pyo3::types::{PyCapsule, PyList, PyTuple};
 use crate::common::data_type::PyScalarValue;
 use crate::errors::{PyDataFusionResult, py_datafusion_err, to_datafusion_err};
 use crate::expr::PyExpr;
-use crate::utils::{parse_volatility, validate_pycapsule};
 
 #[derive(Debug)]
 struct RustPartitionEvaluator {
diff --git a/src/unparser/dialect.rs b/crates/core/src/unparser/dialect.rs
similarity index 100%
rename from src/unparser/dialect.rs
rename to crates/core/src/unparser/dialect.rs
diff --git a/src/unparser/mod.rs b/crates/core/src/unparser/mod.rs
similarity index 100%
rename from src/unparser/mod.rs
rename to crates/core/src/unparser/mod.rs
diff --git a/crates/util/Cargo.toml b/crates/util/Cargo.toml
new file mode 100644
index 00000000..00d5946a
--- /dev/null
+++ b/crates/util/Cargo.toml
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+[package]
+name = "datafusion-python-util"
+version.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+license.workspace = true
+description.workspace = true
+homepage.workspace = true
+repository.workspace = true
+
+[dependencies]
+tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread"] }
+pyo3 = { workspace = true }
+datafusion = { workspace = true }
+datafusion-ffi = { workspace = true }
+arrow = { workspace = true }
+prost = { workspace = true }
diff --git a/src/errors.rs b/crates/util/src/errors.rs
similarity index 100%
rename from src/errors.rs
rename to crates/util/src/errors.rs
diff --git a/src/utils.rs b/crates/util/src/lib.rs
similarity index 85%
rename from src/utils.rs
rename to crates/util/src/lib.rs
index 5085018f..2678a6b9 100644
--- a/src/utils.rs
+++ b/crates/util/src/lib.rs
@@ -25,7 +25,6 @@ use datafusion::execution::context::SessionContext;
 use datafusion::logical_expr::Volatility;
 use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
 use datafusion_ffi::table_provider::FFI_TableProvider;
-use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::{PyImportError, PyTypeError, PyValueError};
 use pyo3::ffi::c_str;
 use pyo3::prelude::*;
@@ -34,24 +33,24 @@ use tokio::runtime::Runtime;
 use tokio::task::JoinHandle;
 use tokio::time::sleep;
 
-use crate::TokioRuntime;
-use crate::context::PySessionContext;
 use crate::errors::{PyDataFusionError, PyDataFusionResult, py_datafusion_err, 
to_datafusion_err};
 
+pub mod errors;
+
 /// Utility to get the Tokio Runtime from Python
 #[inline]
-pub(crate) fn get_tokio_runtime() -> &'static TokioRuntime {
+pub fn get_tokio_runtime() -> &'static Runtime {
     // NOTE: Other pyo3 python libraries have had issues with using tokio
     // behind a forking app-server like `gunicorn`
     // If we run into that problem, in the future we can look to `delta-rs`
     // which adds a check in that disallows calls from a forked process
     // 
https://github.com/delta-io/delta-rs/blob/87010461cfe01563d91a4b9cd6fa468e2ad5f283/python/src/utils.rs#L10-L31
-    static RUNTIME: OnceLock<TokioRuntime> = OnceLock::new();
-    RUNTIME.get_or_init(|| 
TokioRuntime(tokio::runtime::Runtime::new().unwrap()))
+    static RUNTIME: OnceLock<Runtime> = OnceLock::new();
+    RUNTIME.get_or_init(|| Runtime::new().unwrap())
 }
 
 #[inline]
-pub(crate) fn is_ipython_env(py: Python) -> &'static bool {
+pub fn is_ipython_env(py: Python) -> &'static bool {
     static IS_IPYTHON_ENV: OnceLock<bool> = OnceLock::new();
     IS_IPYTHON_ENV.get_or_init(|| {
         py.import("IPython")
@@ -63,7 +62,7 @@ pub(crate) fn is_ipython_env(py: Python) -> &'static bool {
 
 /// Utility to get the Global Datafussion CTX
 #[inline]
-pub(crate) fn get_global_ctx() -> &'static Arc<SessionContext> {
+pub fn get_global_ctx() -> &'static Arc<SessionContext> {
     static CTX: OnceLock<Arc<SessionContext>> = OnceLock::new();
     CTX.get_or_init(|| Arc::new(SessionContext::new()))
 }
@@ -77,7 +76,7 @@ where
     F: Future + Send,
     F::Output: Send,
 {
-    let runtime: &Runtime = &get_tokio_runtime().0;
+    let runtime: &Runtime = get_tokio_runtime();
     const INTERVAL_CHECK_SIGNALS: Duration = Duration::from_millis(1_000);
 
     // Some fast running processes that generate many `wait_for_future` calls 
like
@@ -111,12 +110,12 @@ where
 
 /// Spawn a [`Future`] on the Tokio runtime and wait for completion
 /// while respecting Python signal handling.
-pub(crate) fn spawn_future<F, T>(py: Python, fut: F) -> PyDataFusionResult<T>
+pub fn spawn_future<F, T>(py: Python, fut: F) -> PyDataFusionResult<T>
 where
     F: Future<Output = datafusion::common::Result<T>> + Send + 'static,
     T: Send + 'static,
 {
-    let rt = &get_tokio_runtime().0;
+    let rt = get_tokio_runtime();
     let handle: JoinHandle<datafusion::common::Result<T>> = rt.spawn(fut);
     // Wait for the join handle while respecting Python signal handling.
     // We handle errors in two steps so `?` maps the error types correctly:
@@ -138,7 +137,7 @@ where
     Ok(inner_result?)
 }
 
-pub(crate) fn parse_volatility(value: &str) -> PyDataFusionResult<Volatility> {
+pub fn parse_volatility(value: &str) -> PyDataFusionResult<Volatility> {
     Ok(match value {
         "immutable" => Volatility::Immutable,
         "stable" => Volatility::Stable,
@@ -152,7 +151,7 @@ pub(crate) fn parse_volatility(value: &str) -> 
PyDataFusionResult<Volatility> {
     })
 }
 
-pub(crate) fn validate_pycapsule(capsule: &Bound<PyCapsule>, name: &str) -> 
PyResult<()> {
+pub fn validate_pycapsule(capsule: &Bound<PyCapsule>, name: &str) -> 
PyResult<()> {
     let capsule_name = capsule.name()?;
     if capsule_name.is_none() {
         return Err(PyValueError::new_err(format!(
@@ -170,7 +169,7 @@ pub(crate) fn validate_pycapsule(capsule: 
&Bound<PyCapsule>, name: &str) -> PyRe
     Ok(())
 }
 
-pub(crate) fn table_provider_from_pycapsule<'py>(
+pub fn table_provider_from_pycapsule<'py>(
     mut obj: Bound<'py, PyAny>,
     session: Bound<'py, PyAny>,
 ) -> PyResult<Option<Arc<dyn TableProvider>>> {
@@ -202,37 +201,31 @@ pub(crate) fn table_provider_from_pycapsule<'py>(
     }
 }
 
-pub(crate) fn extract_logical_extension_codec(
-    py: Python,
-    obj: Option<Bound<PyAny>>,
-) -> PyResult<Arc<FFI_LogicalExtensionCodec>> {
-    let obj = match obj {
-        Some(obj) => obj,
-        None => PySessionContext::global_ctx()?.into_bound_py_any(py)?,
-    };
-    let capsule = if obj.hasattr("__datafusion_logical_extension_codec__")? {
-        obj.getattr("__datafusion_logical_extension_codec__")?
-            .call0()?
+pub fn create_logical_extension_capsule<'py>(
+    py: Python<'py>,
+    codec: &FFI_LogicalExtensionCodec,
+) -> PyResult<Bound<'py, PyCapsule>> {
+    let name = cr"datafusion_logical_extension_codec".into();
+    let codec = codec.clone();
+
+    PyCapsule::new(py, codec, Some(name))
+}
+
+pub fn ffi_logical_codec_from_pycapsule(obj: Bound<PyAny>) -> 
PyResult<FFI_LogicalExtensionCodec> {
+    let attr_name = "__datafusion_logical_extension_codec__";
+    let capsule = if obj.hasattr(attr_name)? {
+        obj.getattr(attr_name)?.call0()?
     } else {
         obj
     };
-    let capsule = capsule.cast::<PyCapsule>().map_err(py_datafusion_err)?;
 
+    let capsule = capsule.cast::<PyCapsule>()?;
     validate_pycapsule(capsule, "datafusion_logical_extension_codec")?;
 
     let data: NonNull<FFI_LogicalExtensionCodec> = capsule
         .pointer_checked(Some(c_str!("datafusion_logical_extension_codec")))?
         .cast();
     let codec = unsafe { data.as_ref() };
-    Ok(Arc::new(codec.clone()))
-}
 
-pub(crate) fn create_logical_extension_capsule<'py>(
-    py: Python<'py>,
-    codec: &FFI_LogicalExtensionCodec,
-) -> PyResult<Bound<'py, PyCapsule>> {
-    let name = cr"datafusion_logical_extension_codec".into();
-    let codec = codec.clone();
-
-    PyCapsule::new(py, codec, Some(name))
+    Ok(codec.clone())
 }
diff --git a/examples/datafusion-ffi-example/.cargo/config.toml 
b/examples/datafusion-ffi-example/.cargo/config.toml
deleted file mode 100644
index af951327..00000000
--- a/examples/datafusion-ffi-example/.cargo/config.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-[target.x86_64-apple-darwin]
-rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
-
-[target.aarch64-apple-darwin]
-rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
diff --git a/examples/datafusion-ffi-example/Cargo.lock 
b/examples/datafusion-ffi-example/Cargo.lock
deleted file mode 100644
index ede9b446..00000000
--- a/examples/datafusion-ffi-example/Cargo.lock
+++ /dev/null
@@ -1,3127 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "abi_stable"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "69d6512d3eb05ffe5004c59c206de7f99c34951504056ce23fc953842f12c445"
-dependencies = [
- "abi_stable_derive",
- "abi_stable_shared",
- "const_panic",
- "core_extensions",
- "crossbeam-channel",
- "generational-arena",
- "libloading",
- "lock_api",
- "parking_lot",
- "paste",
- "repr_offset",
- "rustc_version",
- "serde",
- "serde_derive",
- "serde_json",
-]
-
-[[package]]
-name = "abi_stable_derive"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d7178468b407a4ee10e881bc7a328a65e739f0863615cca4429d43916b05e898"
-dependencies = [
- "abi_stable_shared",
- "as_derive_utils",
- "core_extensions",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn 1.0.109",
- "typed-arena",
-]
-
-[[package]]
-name = "abi_stable_shared"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b2b5df7688c123e63f4d4d649cba63f2967ba7f7861b1664fca3f77d3dad2b63"
-dependencies = [
- "core_extensions",
-]
-
-[[package]]
-name = "adler2"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
-
-[[package]]
-name = "ahash"
-version = "0.8.12"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
-dependencies = [
- "cfg-if",
- "const-random",
- "getrandom 0.3.4",
- "once_cell",
- "version_check",
- "zerocopy",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "alloc-no-stdlib"
-version = "2.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
-
-[[package]]
-name = "alloc-stdlib"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
-dependencies = [
- "alloc-no-stdlib",
-]
-
-[[package]]
-name = "allocator-api2"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
-
-[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
-
-[[package]]
-name = "arc-swap"
-version = "1.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5"
-dependencies = [
- "rustversion",
-]
-
-[[package]]
-name = "arrow"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "602268ce9f569f282cedb9a9f6bac569b680af47b9b077d515900c03c5d190da"
-dependencies = [
- "arrow-arith",
- "arrow-array",
- "arrow-buffer",
- "arrow-cast",
- "arrow-csv",
- "arrow-data",
- "arrow-ipc",
- "arrow-json",
- "arrow-ord",
- "arrow-row",
- "arrow-schema",
- "arrow-select",
- "arrow-string",
-]
-
-[[package]]
-name = "arrow-arith"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cd53c6bf277dea91f136ae8e3a5d7041b44b5e489e244e637d00ae302051f56f"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "chrono",
- "num-traits",
-]
-
-[[package]]
-name = "arrow-array"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e53796e07a6525edaf7dc28b540d477a934aff14af97967ad1d5550878969b9e"
-dependencies = [
- "ahash",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "chrono",
- "chrono-tz",
- "half",
- "hashbrown 0.16.1",
- "num-complex",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "arrow-buffer"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f2c1a85bb2e94ee10b76531d8bc3ce9b7b4c0d508cabfb17d477f63f2617bd20"
-dependencies = [
- "bytes",
- "half",
- "num-bigint",
- "num-traits",
-]
-
-[[package]]
-name = "arrow-cast"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "89fb245db6b0e234ed8e15b644edb8664673fefe630575e94e62cd9d489a8a26"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-ord",
- "arrow-schema",
- "arrow-select",
- "atoi",
- "base64",
- "chrono",
- "comfy-table",
- "half",
- "lexical-core",
- "num-traits",
- "ryu",
-]
-
-[[package]]
-name = "arrow-csv"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d374882fb465a194462527c0c15a93aa19a554cf690a6b77a26b2a02539937a7"
-dependencies = [
- "arrow-array",
- "arrow-cast",
- "arrow-schema",
- "chrono",
- "csv",
- "csv-core",
- "regex",
-]
-
-[[package]]
-name = "arrow-data"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "189d210bc4244c715fa3ed9e6e22864673cccb73d5da28c2723fb2e527329b33"
-dependencies = [
- "arrow-buffer",
- "arrow-schema",
- "half",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "arrow-ipc"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7968c2e5210c41f4909b2ef76f6e05e172b99021c2def5edf3cc48fdd39d1d6c"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "arrow-select",
- "flatbuffers",
- "lz4_flex",
-]
-
-[[package]]
-name = "arrow-json"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "92111dba5bf900f443488e01f00d8c4ddc2f47f5c50039d18120287b580baa22"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-cast",
- "arrow-data",
- "arrow-schema",
- "chrono",
- "half",
- "indexmap",
- "itoa",
- "lexical-core",
- "memchr",
- "num-traits",
- "ryu",
- "serde_core",
- "serde_json",
- "simdutf8",
-]
-
-[[package]]
-name = "arrow-ord"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "211136cb253577ee1a6665f741a13136d4e563f64f5093ffd6fb837af90b9495"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "arrow-select",
-]
-
-[[package]]
-name = "arrow-row"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8e0f20145f9f5ea3fe383e2ba7a7487bf19be36aa9dbf5dd6a1f92f657179663"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "half",
-]
-
-[[package]]
-name = "arrow-schema"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1b47e0ca91cc438d2c7879fe95e0bca5329fff28649e30a88c6f760b1faeddcb"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "arrow-select"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "750a7d1dda177735f5e82a314485b6915c7cccdbb278262ac44090f4aba4a325"
-dependencies = [
- "ahash",
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "num-traits",
-]
-
-[[package]]
-name = "arrow-string"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e1eab1208bc4fe55d768cdc9b9f3d9df5a794cdb3ee2586bf89f9b30dc31ad8c"
-dependencies = [
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-schema",
- "arrow-select",
- "memchr",
- "num-traits",
- "regex",
- "regex-syntax",
-]
-
-[[package]]
-name = "as_derive_utils"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ff3c96645900a44cf11941c111bd08a6573b0e2f9f69bc9264b179d8fae753c4"
-dependencies = [
- "core_extensions",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "async-ffi"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f4de21c0feef7e5a556e51af767c953f0501f7f300ba785cc99c47bdc8081a50"
-dependencies = [
- "abi_stable",
-]
-
-[[package]]
-name = "async-trait"
-version = "0.1.89"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "atoi"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
-
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "bitflags"
-version = "2.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
-
-[[package]]
-name = "brotli"
-version = "8.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560"
-dependencies = [
- "alloc-no-stdlib",
- "alloc-stdlib",
- "brotli-decompressor",
-]
-
-[[package]]
-name = "brotli-decompressor"
-version = "5.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
-dependencies = [
- "alloc-no-stdlib",
- "alloc-stdlib",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c81d250916401487680ed13b8b675660281dcfc3ab0121fe44c94bcab9eae2fb"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
-name = "bytes"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
-
-[[package]]
-name = "cc"
-version = "1.2.56"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2"
-dependencies = [
- "find-msvc-tools",
- "jobserver",
- "libc",
- "shlex",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
-
-[[package]]
-name = "chrono"
-version = "0.4.44"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
-dependencies = [
- "iana-time-zone",
- "num-traits",
- "windows-link",
-]
-
-[[package]]
-name = "chrono-tz"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3"
-dependencies = [
- "chrono",
- "phf",
-]
-
-[[package]]
-name = "comfy-table"
-version = "7.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47"
-dependencies = [
- "unicode-segmentation",
- "unicode-width",
-]
-
-[[package]]
-name = "const-random"
-version = "0.1.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
-dependencies = [
- "const-random-macro",
-]
-
-[[package]]
-name = "const-random-macro"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
-dependencies = [
- "getrandom 0.2.17",
- "once_cell",
- "tiny-keccak",
-]
-
-[[package]]
-name = "const_panic"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652"
-dependencies = [
- "typewit",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
-
-[[package]]
-name = "core_extensions"
-version = "1.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "42bb5e5d0269fd4f739ea6cedaf29c16d81c27a7ce7582008e90eb50dcd57003"
-dependencies = [
- "core_extensions_proc_macros",
-]
-
-[[package]]
-name = "core_extensions_proc_macros"
-version = "1.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "533d38ecd2709b7608fb8e18e4504deb99e9a72879e6aa66373a76d8dc4259ea"
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
-
-[[package]]
-name = "crunchy"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
-
-[[package]]
-name = "csv"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938"
-dependencies = [
- "csv-core",
- "itoa",
- "ryu",
- "serde_core",
-]
-
-[[package]]
-name = "csv-core"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "dashmap"
-version = "6.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
-dependencies = [
- "cfg-if",
- "crossbeam-utils",
- "hashbrown 0.14.5",
- "lock_api",
- "once_cell",
- "parking_lot_core",
-]
-
-[[package]]
-name = "datafusion-catalog"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "dashmap",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr",
- "datafusion-physical-plan",
- "datafusion-session",
- "futures",
- "itertools",
- "log",
- "object_store",
- "parking_lot",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-catalog-listing"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "datafusion-catalog",
- "datafusion-common",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr",
- "datafusion-physical-expr-adapter",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "futures",
- "itertools",
- "log",
- "object_store",
-]
-
-[[package]]
-name = "datafusion-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "arrow-ipc",
- "chrono",
- "half",
- "hashbrown 0.16.1",
- "indexmap",
- "itertools",
- "libc",
- "log",
- "object_store",
- "parquet",
- "paste",
- "tokio",
- "web-time",
-]
-
-[[package]]
-name = "datafusion-common-runtime"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "futures",
- "log",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-datasource"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "bytes",
- "chrono",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr",
- "datafusion-physical-expr-adapter",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-session",
- "futures",
- "glob",
- "itertools",
- "log",
- "object_store",
- "rand",
- "tokio",
- "url",
-]
-
-[[package]]
-name = "datafusion-datasource-arrow"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "arrow-ipc",
- "async-trait",
- "bytes",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-session",
- "futures",
- "itertools",
- "object_store",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-datasource-csv"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "bytes",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-session",
- "futures",
- "object_store",
- "regex",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-datasource-json"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "bytes",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-session",
- "futures",
- "object_store",
- "serde_json",
- "tokio",
- "tokio-stream",
-]
-
-[[package]]
-name = "datafusion-datasource-parquet"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "bytes",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-functions-aggregate-common",
- "datafusion-physical-expr",
- "datafusion-physical-expr-adapter",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-pruning",
- "datafusion-session",
- "futures",
- "itertools",
- "log",
- "object_store",
- "parking_lot",
- "parquet",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-doc"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-
-[[package]]
-name = "datafusion-execution"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "arrow-buffer",
- "async-trait",
- "chrono",
- "dashmap",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-physical-expr-common",
- "futures",
- "log",
- "object_store",
- "parking_lot",
- "rand",
- "tempfile",
- "url",
-]
-
-[[package]]
-name = "datafusion-expr"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "chrono",
- "datafusion-common",
- "datafusion-doc",
- "datafusion-expr-common",
- "datafusion-functions-aggregate-common",
- "datafusion-functions-window-common",
- "datafusion-physical-expr-common",
- "indexmap",
- "itertools",
- "paste",
- "serde_json",
- "sqlparser",
-]
-
-[[package]]
-name = "datafusion-expr-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "datafusion-common",
- "indexmap",
- "itertools",
- "paste",
-]
-
-[[package]]
-name = "datafusion-ffi"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "abi_stable",
- "arrow",
- "arrow-schema",
- "async-ffi",
- "async-trait",
- "datafusion-catalog",
- "datafusion-common",
- "datafusion-datasource",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-functions-aggregate-common",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-proto",
- "datafusion-proto-common",
- "datafusion-session",
- "futures",
- "log",
- "prost",
- "semver",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-ffi-example"
-version = "0.2.0"
-dependencies = [
- "arrow",
- "arrow-array",
- "arrow-schema",
- "async-trait",
- "datafusion-catalog",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-ffi",
- "datafusion-functions-aggregate",
- "datafusion-functions-window",
- "pyo3",
- "pyo3-build-config",
- "pyo3-log",
-]
-
-[[package]]
-name = "datafusion-functions"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "arrow-buffer",
- "base64",
- "chrono",
- "chrono-tz",
- "datafusion-common",
- "datafusion-doc",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-expr-common",
- "datafusion-macros",
- "hex",
- "itertools",
- "log",
- "memchr",
- "num-traits",
- "rand",
- "regex",
- "unicode-segmentation",
- "uuid",
-]
-
-[[package]]
-name = "datafusion-functions-aggregate"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "datafusion-common",
- "datafusion-doc",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-functions-aggregate-common",
- "datafusion-macros",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "half",
- "log",
- "num-traits",
- "paste",
-]
-
-[[package]]
-name = "datafusion-functions-aggregate-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "datafusion-common",
- "datafusion-expr-common",
- "datafusion-physical-expr-common",
-]
-
-[[package]]
-name = "datafusion-functions-table"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "async-trait",
- "datafusion-catalog",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-physical-plan",
- "parking_lot",
- "paste",
-]
-
-[[package]]
-name = "datafusion-functions-window"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "datafusion-common",
- "datafusion-doc",
- "datafusion-expr",
- "datafusion-functions-window-common",
- "datafusion-macros",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "log",
- "paste",
-]
-
-[[package]]
-name = "datafusion-functions-window-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "datafusion-common",
- "datafusion-physical-expr-common",
-]
-
-[[package]]
-name = "datafusion-macros"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "datafusion-doc",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "datafusion-physical-expr"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-expr-common",
- "datafusion-functions-aggregate-common",
- "datafusion-physical-expr-common",
- "half",
- "hashbrown 0.16.1",
- "indexmap",
- "itertools",
- "parking_lot",
- "paste",
- "petgraph",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-physical-expr-adapter"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "datafusion-common",
- "datafusion-expr",
- "datafusion-functions",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "itertools",
-]
-
-[[package]]
-name = "datafusion-physical-expr-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "chrono",
- "datafusion-common",
- "datafusion-expr-common",
- "hashbrown 0.16.1",
- "indexmap",
- "itertools",
- "parking_lot",
-]
-
-[[package]]
-name = "datafusion-physical-plan"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "ahash",
- "arrow",
- "arrow-ord",
- "arrow-schema",
- "async-trait",
- "datafusion-common",
- "datafusion-common-runtime",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-functions",
- "datafusion-functions-aggregate-common",
- "datafusion-functions-window-common",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "futures",
- "half",
- "hashbrown 0.16.1",
- "indexmap",
- "itertools",
- "log",
- "num-traits",
- "parking_lot",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "datafusion-proto"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "chrono",
- "datafusion-catalog",
- "datafusion-catalog-listing",
- "datafusion-common",
- "datafusion-datasource",
- "datafusion-datasource-arrow",
- "datafusion-datasource-csv",
- "datafusion-datasource-json",
- "datafusion-datasource-parquet",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-functions-table",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "datafusion-proto-common",
- "object_store",
- "prost",
- "rand",
-]
-
-[[package]]
-name = "datafusion-proto-common"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "datafusion-common",
- "prost",
-]
-
-[[package]]
-name = "datafusion-pruning"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "arrow",
- "datafusion-common",
- "datafusion-datasource",
- "datafusion-expr-common",
- "datafusion-physical-expr",
- "datafusion-physical-expr-common",
- "datafusion-physical-plan",
- "itertools",
- "log",
-]
-
-[[package]]
-name = "datafusion-session"
-version = "53.0.0"
-source = 
"git+https://github.com/apache/datafusion.git?rev=35749607f585b3bf25b66b7d2289c56c18d03e4f#35749607f585b3bf25b66b7d2289c56c18d03e4f";
-dependencies = [
- "async-trait",
- "datafusion-common",
- "datafusion-execution",
- "datafusion-expr",
- "datafusion-physical-plan",
- "parking_lot",
-]
-
-[[package]]
-name = "displaydoc"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "either"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
-
-[[package]]
-name = "equivalent"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
-
-[[package]]
-name = "errno"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
-dependencies = [
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
-
-[[package]]
-name = "find-msvc-tools"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
-
-[[package]]
-name = "fixedbitset"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
-
-[[package]]
-name = "flatbuffers"
-version = "25.12.19"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3"
-dependencies = [
- "bitflags",
- "rustc_version",
-]
-
-[[package]]
-name = "flate2"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
-dependencies = [
- "miniz_oxide",
- "zlib-rs",
-]
-
-[[package]]
-name = "foldhash"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
-
-[[package]]
-name = "foldhash"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "futures"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
-
-[[package]]
-name = "futures-task"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
-
-[[package]]
-name = "futures-util"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite",
- "slab",
-]
-
-[[package]]
-name = "generational-arena"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi",
- "wasip2",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi",
- "wasip2",
- "wasip3",
-]
-
-[[package]]
-name = "glob"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
-
-[[package]]
-name = "half"
-version = "2.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
-dependencies = [
- "cfg-if",
- "crunchy",
- "num-traits",
- "zerocopy",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.14.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-
-[[package]]
-name = "hashbrown"
-version = "0.15.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
-dependencies = [
- "foldhash 0.1.5",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
-dependencies = [
- "allocator-api2",
- "equivalent",
- "foldhash 0.2.0",
-]
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hex"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
-
-[[package]]
-name = "http"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
-dependencies = [
- "bytes",
- "itoa",
-]
-
-[[package]]
-name = "humantime"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424"
-
-[[package]]
-name = "iana-time-zone"
-version = "0.1.65"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
-dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "log",
- "wasm-bindgen",
- "windows-core",
-]
-
-[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "icu_collections"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
-dependencies = [
- "displaydoc",
- "potential_utf",
- "yoke",
- "zerofrom",
- "zerovec",
-]
-
-[[package]]
-name = "icu_locale_core"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
-dependencies = [
- "displaydoc",
- "litemap",
- "tinystr",
- "writeable",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
-dependencies = [
- "icu_collections",
- "icu_normalizer_data",
- "icu_properties",
- "icu_provider",
- "smallvec",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer_data"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
-
-[[package]]
-name = "icu_properties"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
-dependencies = [
- "icu_collections",
- "icu_locale_core",
- "icu_properties_data",
- "icu_provider",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "icu_properties_data"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
-
-[[package]]
-name = "icu_provider"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
-dependencies = [
- "displaydoc",
- "icu_locale_core",
- "writeable",
- "yoke",
- "zerofrom",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "id-arena"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
-
-[[package]]
-name = "idna"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
-dependencies = [
- "idna_adapter",
- "smallvec",
- "utf8_iter",
-]
-
-[[package]]
-name = "idna_adapter"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
-dependencies = [
- "icu_normalizer",
- "icu_properties",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
-dependencies = [
- "equivalent",
- "hashbrown 0.16.1",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "integer-encoding"
-version = "3.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
-
-[[package]]
-name = "itertools"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
-
-[[package]]
-name = "jobserver"
-version = "0.1.34"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
-dependencies = [
- "getrandom 0.3.4",
- "libc",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.85"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
-dependencies = [
- "once_cell",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "leb128fmt"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
-
-[[package]]
-name = "lexical-core"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594"
-dependencies = [
- "lexical-parse-float",
- "lexical-parse-integer",
- "lexical-util",
- "lexical-write-float",
- "lexical-write-integer",
-]
-
-[[package]]
-name = "lexical-parse-float"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56"
-dependencies = [
- "lexical-parse-integer",
- "lexical-util",
-]
-
-[[package]]
-name = "lexical-parse-integer"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34"
-dependencies = [
- "lexical-util",
-]
-
-[[package]]
-name = "lexical-util"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17"
-
-[[package]]
-name = "lexical-write-float"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361"
-dependencies = [
- "lexical-util",
- "lexical-write-integer",
-]
-
-[[package]]
-name = "lexical-write-integer"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df"
-dependencies = [
- "lexical-util",
-]
-
-[[package]]
-name = "libc"
-version = "0.2.182"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
-
-[[package]]
-name = "libloading"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
-dependencies = [
- "cfg-if",
- "winapi",
-]
-
-[[package]]
-name = "libm"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
-
-[[package]]
-name = "litemap"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
-
-[[package]]
-name = "lock_api"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
-dependencies = [
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.29"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
-
-[[package]]
-name = "lz4_flex"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ab6473172471198271ff72e9379150e9dfd70d8e533e0752a27e515b48dd375e"
-dependencies = [
- "twox-hash",
-]
-
-[[package]]
-name = "memchr"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
- "libm",
-]
-
-[[package]]
-name = "object_store"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c2858065e55c148d294a9f3aae3b0fa9458edadb41a108397094566f4e3c0dfb"
-dependencies = [
- "async-trait",
- "bytes",
- "chrono",
- "futures",
- "http",
- "humantime",
- "itertools",
- "parking_lot",
- "percent-encoding",
- "thiserror",
- "tokio",
- "tracing",
- "url",
- "walkdir",
- "wasm-bindgen-futures",
- "web-time",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.21.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-
-[[package]]
-name = "ordered-float"
-version = "2.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.12"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-link",
-]
-
-[[package]]
-name = "parquet"
-version = "58.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3f491d0ef1b510194426ee67ddc18a9b747ef3c42050c19322a2cd2e1666c29b"
-dependencies = [
- "ahash",
- "arrow-array",
- "arrow-buffer",
- "arrow-data",
- "arrow-ipc",
- "arrow-schema",
- "arrow-select",
- "base64",
- "brotli",
- "bytes",
- "chrono",
- "flate2",
- "futures",
- "half",
- "hashbrown 0.16.1",
- "lz4_flex",
- "num-bigint",
- "num-integer",
- "num-traits",
- "object_store",
- "paste",
- "seq-macro",
- "simdutf8",
- "snap",
- "thrift",
- "tokio",
- "twox-hash",
- "zstd",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
-
-[[package]]
-name = "petgraph"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
-dependencies = [
- "fixedbitset",
- "hashbrown 0.15.5",
- "indexmap",
- "serde",
-]
-
-[[package]]
-name = "phf"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7"
-dependencies = [
- "phf_shared",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.32"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
-
-[[package]]
-name = "portable-atomic"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
-
-[[package]]
-name = "potential_utf"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
-dependencies = [
- "zerovec",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
-
-[[package]]
-name = "prettyplease"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
-dependencies = [
- "proc-macro2",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "prost"
-version = "0.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
-dependencies = [
- "bytes",
- "prost-derive",
-]
-
-[[package]]
-name = "prost-derive"
-version = "0.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
-dependencies = [
- "anyhow",
- "itertools",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "pyo3"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cf85e27e86080aafd5a22eae58a162e133a589551542b3e5cee4beb27e54f8e1"
-dependencies = [
- "libc",
- "once_cell",
- "portable-atomic",
- "pyo3-build-config",
- "pyo3-ffi",
- "pyo3-macros",
-]
-
-[[package]]
-name = "pyo3-build-config"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8bf94ee265674bf76c09fa430b0e99c26e319c945d96ca0d5a8215f31bf81cf7"
-dependencies = [
- "target-lexicon",
-]
-
-[[package]]
-name = "pyo3-ffi"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "491aa5fc66d8059dd44a75f4580a2962c1862a1c2945359db36f6c2818b748dc"
-dependencies = [
- "libc",
- "pyo3-build-config",
-]
-
-[[package]]
-name = "pyo3-log"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "26c2ec80932c5c3b2d4fbc578c9b56b2d4502098587edb8bef5b6bfcad43682e"
-dependencies = [
- "arc-swap",
- "log",
- "pyo3",
-]
-
-[[package]]
-name = "pyo3-macros"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f5d671734e9d7a43449f8480f8b38115df67bef8d21f76837fa75ee7aaa5e52e"
-dependencies = [
- "proc-macro2",
- "pyo3-macros-backend",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "pyo3-macros-backend"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "22faaa1ce6c430a1f71658760497291065e6450d7b5dc2bcf254d49f66ee700a"
-dependencies = [
- "heck",
- "proc-macro2",
- "pyo3-build-config",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.44"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "r-efi"
-version = "5.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-
-[[package]]
-name = "rand"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
-dependencies = [
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
-dependencies = [
- "getrandom 0.3.4",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.5.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "regex"
-version = "1.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c"
-
-[[package]]
-name = "repr_offset"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea"
-dependencies = [
- "tstr",
-]
-
-[[package]]
-name = "rustc_version"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
-dependencies = [
- "bitflags",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
-name = "ryu"
-version = "1.0.23"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "semver"
-version = "1.0.27"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
-
-[[package]]
-name = "seq-macro"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.149"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
-dependencies = [
- "itoa",
- "memchr",
- "serde",
- "serde_core",
- "zmij",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "simd-adler32"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
-
-[[package]]
-name = "simdutf8"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
-
-[[package]]
-name = "siphasher"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
-
-[[package]]
-name = "slab"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[package]]
-name = "snap"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b"
-
-[[package]]
-name = "sqlparser"
-version = "0.61.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "dbf5ea8d4d7c808e1af1cbabebca9a2abe603bcefc22294c5b95018d53200cb7"
-dependencies = [
- "log",
- "sqlparser_derive",
-]
-
-[[package]]
-name = "sqlparser_derive"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a6dd45d8fc1c79299bfbb7190e42ccbbdf6a5f52e4a6ad98d92357ea965bd289"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "target-lexicon"
-version = "0.13.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
-
-[[package]]
-name = "tempfile"
-version = "3.25.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1"
-dependencies = [
- "fastrand",
- "getrandom 0.4.1",
- "once_cell",
- "rustix",
- "windows-sys",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "thrift"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09"
-dependencies = [
- "byteorder",
- "integer-encoding",
- "ordered-float",
-]
-
-[[package]]
-name = "tiny-keccak"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
-dependencies = [
- "crunchy",
-]
-
-[[package]]
-name = "tinystr"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
-[[package]]
-name = "tokio"
-version = "1.49.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
-dependencies = [
- "bytes",
- "pin-project-lite",
- "tokio-macros",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
- "tokio-util",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.18"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
-dependencies = [
- "bytes",
- "futures-core",
- "futures-sink",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.36"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "tstr"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7f8e0294f14baae476d0dd0a2d780b2e24d66e349a9de876f5126777a37bdba7"
-dependencies = [
- "tstr_proc_macros",
-]
-
-[[package]]
-name = "tstr_proc_macros"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a"
-
-[[package]]
-name = "twox-hash"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
-
-[[package]]
-name = "typed-arena"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
-
-[[package]]
-name = "typewit"
-version = "1.14.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
-
-[[package]]
-name = "unicode-width"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
-name = "url"
-version = "2.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
- "serde",
-]
-
-[[package]]
-name = "utf8_iter"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
-
-[[package]]
-name = "uuid"
-version = "1.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb"
-dependencies = [
- "getrandom 0.4.1",
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "version_check"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
-
-[[package]]
-name = "walkdir"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.1+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
-
-[[package]]
-name = "wasip2"
-version = "1.0.2+wasi-0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
-dependencies = [
- "wit-bindgen",
-]
-
-[[package]]
-name = "wasip3"
-version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
-dependencies = [
- "wit-bindgen",
-]
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.108"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
-dependencies = [
- "cfg-if",
- "once_cell",
- "rustversion",
- "wasm-bindgen-macro",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.58"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
-dependencies = [
- "cfg-if",
- "futures-util",
- "js-sys",
- "once_cell",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.108"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.108"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
-dependencies = [
- "bumpalo",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.108"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "wasm-encoder"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
-dependencies = [
- "leb128fmt",
- "wasmparser",
-]
-
-[[package]]
-name = "wasm-metadata"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
-dependencies = [
- "anyhow",
- "indexmap",
- "wasm-encoder",
- "wasmparser",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
-dependencies = [
- "bitflags",
- "hashbrown 0.15.5",
- "indexmap",
- "semver",
-]
-
-[[package]]
-name = "web-sys"
-version = "0.3.85"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "web-time"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
-dependencies = [
- "windows-sys",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-core"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
-dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-result"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "wit-bindgen"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
-dependencies = [
- "wit-bindgen-rust-macro",
-]
-
-[[package]]
-name = "wit-bindgen-core"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
-dependencies = [
- "anyhow",
- "heck",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-bindgen-rust"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
-dependencies = [
- "anyhow",
- "heck",
- "indexmap",
- "prettyplease",
- "syn 2.0.117",
- "wasm-metadata",
- "wit-bindgen-core",
- "wit-component",
-]
-
-[[package]]
-name = "wit-bindgen-rust-macro"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
-dependencies = [
- "anyhow",
- "prettyplease",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
- "wit-bindgen-core",
- "wit-bindgen-rust",
-]
-
-[[package]]
-name = "wit-component"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
-dependencies = [
- "anyhow",
- "bitflags",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "wasm-encoder",
- "wasm-metadata",
- "wasmparser",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-parser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser",
-]
-
-[[package]]
-name = "writeable"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
-
-[[package]]
-name = "yoke"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
-dependencies = [
- "stable_deref_trait",
- "yoke-derive",
- "zerofrom",
-]
-
-[[package]]
-name = "yoke-derive"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
- "synstructure",
-]
-
-[[package]]
-name = "zerocopy"
-version = "0.8.39"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.8.39"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "zerofrom"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
-dependencies = [
- "zerofrom-derive",
-]
-
-[[package]]
-name = "zerofrom-derive"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
- "synstructure",
-]
-
-[[package]]
-name = "zerotrie"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
-dependencies = [
- "displaydoc",
- "yoke",
- "zerofrom",
-]
-
-[[package]]
-name = "zerovec"
-version = "0.11.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
-dependencies = [
- "yoke",
- "zerofrom",
- "zerovec-derive",
-]
-
-[[package]]
-name = "zerovec-derive"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "zlib-rs"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c745c48e1007337ed136dc99df34128b9faa6ed542d80a1c673cf55a6d7236c8"
-
-[[package]]
-name = "zmij"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
-
-[[package]]
-name = "zstd"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
-dependencies = [
- "zstd-safe",
-]
-
-[[package]]
-name = "zstd-safe"
-version = "7.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
-dependencies = [
- "zstd-sys",
-]
-
-[[package]]
-name = "zstd-sys"
-version = "2.0.16+zstd.1.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
-dependencies = [
- "cc",
- "pkg-config",
-]
diff --git a/examples/datafusion-ffi-example/Cargo.toml 
b/examples/datafusion-ffi-example/Cargo.toml
index be6096fa..178dce9f 100644
--- a/examples/datafusion-ffi-example/Cargo.toml
+++ b/examples/datafusion-ffi-example/Cargo.toml
@@ -17,40 +17,37 @@
 
 [package]
 name = "datafusion-ffi-example"
-version = "0.2.0"
-edition = "2024"
+version.workspace = true
+edition.workspace = true
+license.workspace = true
+description.workspace = true
+homepage.workspace = true
+repository.workspace = true
+publish = false
 
 [dependencies]
-datafusion-catalog = { version = "53", default-features = false }
-datafusion-common = { version = "53", default-features = false }
-datafusion-functions-aggregate = { version = "53" }
-datafusion-functions-window = { version = "53" }
-datafusion-expr = { version = "53" }
-datafusion-ffi = { version = "53" }
+datafusion-catalog = { workspace = true, default-features = false }
+datafusion-common = { workspace = true, default-features = false }
+datafusion-functions-aggregate = { workspace = true }
+datafusion-functions-window = { workspace = true }
+datafusion-expr = { workspace = true }
+datafusion-ffi = { workspace = true }
 
-pyo3 = { version = "0.28", features = [
+arrow = { workspace = true }
+arrow-array = { workspace = true }
+arrow-schema = { workspace = true }
+async-trait = { workspace = true }
+datafusion-python-util.workspace = true
+pyo3 = { workspace = true, features = [
   "extension-module",
   "abi3",
-  "abi3-py39",
+  "abi3-py310",
 ] }
-arrow = { version = "58" }
-arrow-array = { version = "58" }
-arrow-schema = { version = "58" }
-async-trait = "0.1.89"
-pyo3-log = "0.13.2"
+pyo3-log = { workspace = true }
 
 [build-dependencies]
-pyo3-build-config = "0.28"
+pyo3-build-config = { workspace = true }
 
 [lib]
 name = "datafusion_ffi_example"
 crate-type = ["cdylib", "rlib"]
-
-# TODO: remove when datafusion-53 is released
-[patch.crates-io]
-datafusion-catalog = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
-datafusion-common = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
-datafusion-functions-aggregate = { git = 
"https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
-datafusion-functions-window = { git = 
"https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
-datafusion-expr = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
-datafusion-ffi = { git = "https://github.com/apache/datafusion.git";, rev = 
"35749607f585b3bf25b66b7d2289c56c18d03e4f" }
diff --git a/examples/datafusion-ffi-example/src/catalog_provider.rs 
b/examples/datafusion-ffi-example/src/catalog_provider.rs
index d0e07c78..bd5da1e4 100644
--- a/examples/datafusion-ffi-example/src/catalog_provider.rs
+++ b/examples/datafusion-ffi-example/src/catalog_provider.rs
@@ -29,11 +29,10 @@ use datafusion_common::error::{DataFusionError, Result};
 use datafusion_ffi::catalog_provider::FFI_CatalogProvider;
 use datafusion_ffi::catalog_provider_list::FFI_CatalogProviderList;
 use datafusion_ffi::schema_provider::FFI_SchemaProvider;
+use datafusion_python_util::ffi_logical_codec_from_pycapsule;
 use pyo3::types::PyCapsule;
 use pyo3::{Bound, PyAny, PyResult, Python, pyclass, pymethods};
 
-use crate::utils::ffi_logical_codec_from_pycapsule;
-
 pub fn my_table() -> Arc<dyn TableProvider + 'static> {
     use arrow::datatypes::{DataType, Field};
     use datafusion_common::record_batch;
diff --git a/examples/datafusion-ffi-example/src/lib.rs 
b/examples/datafusion-ffi-example/src/lib.rs
index 23f2001a..3627c149 100644
--- a/examples/datafusion-ffi-example/src/lib.rs
+++ b/examples/datafusion-ffi-example/src/lib.rs
@@ -29,7 +29,6 @@ pub(crate) mod catalog_provider;
 pub(crate) mod scalar_udf;
 pub(crate) mod table_function;
 pub(crate) mod table_provider;
-pub(crate) mod utils;
 pub(crate) mod window_udf;
 
 #[pymodule]
diff --git a/examples/datafusion-ffi-example/src/table_function.rs 
b/examples/datafusion-ffi-example/src/table_function.rs
index 0914e161..79c13f64 100644
--- a/examples/datafusion-ffi-example/src/table_function.rs
+++ b/examples/datafusion-ffi-example/src/table_function.rs
@@ -21,11 +21,11 @@ use datafusion_catalog::{TableFunctionImpl, TableProvider};
 use datafusion_common::error::Result as DataFusionResult;
 use datafusion_expr::Expr;
 use datafusion_ffi::udtf::FFI_TableFunction;
+use datafusion_python_util::ffi_logical_codec_from_pycapsule;
 use pyo3::types::PyCapsule;
 use pyo3::{Bound, PyAny, PyResult, Python, pyclass, pymethods};
 
 use crate::table_provider::MyTableProvider;
-use crate::utils::ffi_logical_codec_from_pycapsule;
 
 #[pyclass(
     from_py_object,
diff --git a/examples/datafusion-ffi-example/src/table_provider.rs 
b/examples/datafusion-ffi-example/src/table_provider.rs
index 2c79e6ef..358ef740 100644
--- a/examples/datafusion-ffi-example/src/table_provider.rs
+++ b/examples/datafusion-ffi-example/src/table_provider.rs
@@ -22,12 +22,11 @@ use arrow_schema::{DataType, Field, Schema};
 use datafusion_catalog::MemTable;
 use datafusion_common::error::{DataFusionError, Result as DataFusionResult};
 use datafusion_ffi::table_provider::FFI_TableProvider;
+use datafusion_python_util::ffi_logical_codec_from_pycapsule;
 use pyo3::exceptions::PyRuntimeError;
 use pyo3::types::PyCapsule;
 use pyo3::{Bound, PyAny, PyResult, Python, pyclass, pymethods};
 
-use crate::utils::ffi_logical_codec_from_pycapsule;
-
 /// In order to provide a test that demonstrates different sized record 
batches,
 /// the first batch will have num_rows, the second batch num_rows+1, and so on.
 #[pyclass(
diff --git a/examples/datafusion-ffi-example/src/utils.rs 
b/examples/datafusion-ffi-example/src/utils.rs
deleted file mode 100644
index 5f2865aa..00000000
--- a/examples/datafusion-ffi-example/src/utils.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-use std::ptr::NonNull;
-
-use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
-use pyo3::exceptions::PyValueError;
-use pyo3::ffi::c_str;
-use pyo3::prelude::{PyAnyMethods, PyCapsuleMethods};
-use pyo3::types::PyCapsule;
-use pyo3::{Bound, PyAny, PyResult};
-
-pub(crate) fn ffi_logical_codec_from_pycapsule(
-    obj: Bound<PyAny>,
-) -> PyResult<FFI_LogicalExtensionCodec> {
-    let attr_name = "__datafusion_logical_extension_codec__";
-    let capsule = if obj.hasattr(attr_name)? {
-        obj.getattr(attr_name)?.call0()?
-    } else {
-        obj
-    };
-
-    let capsule = capsule.cast::<PyCapsule>()?;
-    validate_pycapsule(capsule, "datafusion_logical_extension_codec")?;
-
-    let data: NonNull<FFI_LogicalExtensionCodec> = capsule
-        .pointer_checked(Some(c_str!("datafusion_logical_extension_codec")))?
-        .cast();
-    let codec = unsafe { data.as_ref() };
-
-    Ok(codec.clone())
-}
-
-pub(crate) fn validate_pycapsule(capsule: &Bound<PyCapsule>, name: &str) -> 
PyResult<()> {
-    let capsule_name = capsule.name()?;
-    if capsule_name.is_none() {
-        return Err(PyValueError::new_err(format!(
-            "Expected {name} PyCapsule to have name set."
-        )));
-    }
-
-    let capsule_name = unsafe { capsule_name.unwrap().as_cstr().to_str()? };
-    if capsule_name != name {
-        return Err(PyValueError::new_err(format!(
-            "Expected name '{name}' in PyCapsule, instead got '{capsule_name}'"
-        )));
-    }
-
-    Ok(())
-}
diff --git a/pyproject.toml b/pyproject.toml
index b238e049..117aeefc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -59,6 +59,7 @@ repository = "https://github.com/apache/datafusion-python";
 profile = "black"
 
 [tool.maturin]
+manifest-path = "crates/core/Cargo.toml"
 python-source = "python"
 module-name = "datafusion._internal"
 include = [{ path = "Cargo.lock", format = "sdist" }]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to