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 8ba06e41 Update datafusion dependency to latest in preparation for
DF54 (#1532)
8ba06e41 is described below
commit 8ba06e4147122962f356e11b73175379473f75a7
Author: Tim Saucer <[email protected]>
AuthorDate: Mon May 18 11:51:36 2026 -0400
Update datafusion dependency to latest in preparation for DF54 (#1532)
* feat: upgrade upstream DataFusion 53 → main (pre-54)
Bump workspace deps to apache/datafusion@3d06bedc (git pin) in
preparation for the 54.0.0 release. Workspace package version moves
to 54.0.0 to track the upstream major convention.
Compile fixes:
- Drop as_any impls (trait now has Any as supertrait) and use the
upstream-provided downcast_ref helper on dyn trait objects.
- Reconcile FFI provider From conversions to drop redundant `+ Send`
on Arc<dyn ...> bounds.
- Cast/TryCast: data_type → field.data_type() (FieldRef rename).
- Stub match arms for new Expr::HigherOrderFunction / Lambda /
LambdaVariable and ScalarValue::ListView / LargeListView variants;
proper exposure deferred to PR 3 audit.
- DatasetExec: partition_statistics returns Arc<Statistics>; add
required apply_expressions trait method.
- Suppress TableFunctionImpl::call deprecation pending call_with_args
refactor that needs Session plumbing.
User-facing test updates for upstream behavior changes:
- median / approx_median / approx_percentile_cont now return Float64.
- String functions (concat_ws, lower, upper, repeat, reverse,
split_part, translate) return StringView when given StringView.
- overlay appends past end-of-string rather than replacing the input.
- arrays_zip / list_zip struct field names "c0"/"c1" → "1"/"2".
- Filter on mismatched cast types now errors (was 0 matches).
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* feat: expose DataFrame.alias and tidy public API after DF53→54 audit
Companion to the upstream DataFusion 53 → main bump. The
check-upstream audit (PR 3 of dev/release/upstream-sync.md) surfaced a
small set of trivial wins; this commit ships them.
Trivial wins:
- DataFrame.alias(name) — wraps the logical plan in a SubqueryAlias.
- functions.__all__: add `instr` and `position` (both were defined as
public defs but missing from `__all__`, so they didn't show up in
`from datafusion.functions import *` or generated docs).
- top-level `datafusion.__all__`: re-export `TableProviderFactory` and
`TableProviderFactoryExportable` (previously only reachable via the
`datafusion.catalog` submodule).
Non-trivial gaps surfaced by the audit (DataFrame.registry,
into_*/task_ctx, SessionContext extensibility surface, distinct-aware
aggregate variants, TableFunctionImpl::call_with_args migration, FFI
Protocol pipeline gaps) are deferred — each warrants its own design
and PR.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* taplo fmt
* Update unit test to go along with
https://github.com/apache/datafusion/pull/22133
* docs: demonstrate alias via self-join in DataFrame.alias example
Prior example called alias("t") then to_pydict(), which did not show
the qualifier effect. Replace with a self-join that uses col("l.val")
and col("r.val") so the disambiguation behavior is visible.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* feat: wrap higher-order, lambda, and lambda-variable Expr variants
DataFusion 54 introduces Expr::HigherOrderFunction, Expr::Lambda, and
Expr::LambdaVariable. PyExpr::to_variant previously errored on each
with py_unsupported_variant_err. Add PyHigherOrderFunction, PyLambda,
and PyLambdaVariable wrappers, register them in the expr pymodule and
re-export from python/datafusion/expr.py, and dispatch to_variant to
the new wrappers.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* feat: wire rex_type and rex_call_operands for new Expr variants
Map HigherOrderFunction and Lambda to RexType::Call; LambdaVariable to
RexType::Reference. In rex_call_operands return the args for
HigherOrderFunction, the body for Lambda, and self for LambdaVariable
(mirroring Column). In rex_call_operator return the underlying UDF
name for HigherOrderFunction and the literal "lambda" for Lambda.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* feat: support LargeList/ListView/LargeListView in map_from_scalar_to_arrow
These ScalarValue variants all wrap Arc<...Array>, exposing the outer
DataType via Array::data_type(), so we can mirror the existing
ScalarValue::List arm instead of returning PyNotImplementedError. This
makes Expr.types() work for plans that round-trip through SQL or proto
where these scalar variants surface.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* refactor: switch PyTableFunction to non-deprecated call_with_args
DataFusion 53.0.0 deprecated TableFunctionImpl::call in favor of
call_with_args(args: TableFunctionArgs), which threads a Session
reference alongside the exprs. Implement call_with_args on
PyTableFunction (delegating to the FFI variant's call_with_args, or
ignoring the session for the pure-Python variant which doesn't use it)
and have __call__ build a TableFunctionArgs from the global session.
Drops both #[allow(deprecated)] attributes.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* build: revert workspace version to 53.0.0 and move DF overrides to
[patch.crates-io]
The workspace version was prematurely bumped to 54.0.0 in the
DF53→pre-54 upgrade. Restore it to 53.0.0 until we are actually
ready to cut the 54 release.
The same change had moved every datafusion-* dependency from a
crates.io version constraint to a direct git dep in
[workspace.dependencies]. Switch them back to "version = \"53\"" and
move the git rev overrides into [patch.crates-io] so the published
manifest will be patch-free.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* taplo format
* test: sort FFI test results by partition key before equality compare
Multi-partition `collect()` returns batches in execution-scheduling
order, which is non-deterministic and differs between local and CI
runners. Sort by the first value of column 0 (unique per partition in
each affected test) so the expected/actual comparison is stable.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* Bump datafusion main commit
* test: cover new DF54 expr wrappers, catalog factories, and DataFrame.alias
Add module-metadata checks for HigherOrderFunction, Lambda, LambdaVariable
and the top-level TableProviderFactory / TableProviderFactoryExportable
re-exports, plus a self-join regression test exercising the new
DataFrame.alias() qualifier-based selection path.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
---
.ai/skills/check-upstream/SKILL.md | 45 ++
Cargo.lock | 827 +++++++++------------
Cargo.toml | 9 +
crates/core/src/catalog.rs | 53 +-
crates/core/src/common/data_type.rs | 6 +-
crates/core/src/common/schema.rs | 5 -
crates/core/src/context.rs | 13 +-
crates/core/src/dataframe.rs | 5 +
crates/core/src/dataset.rs | 7 -
crates/core/src/dataset_exec.rs | 20 +-
crates/core/src/expr.rs | 42 +-
crates/core/src/expr/cast.rs | 4 +-
crates/core/src/expr/higher_order_function.rs | 84 +++
crates/core/src/expr/lambda.rs | 78 ++
crates/core/src/expr/lambda_variable.rs | 67 ++
crates/core/src/table.rs | 5 -
crates/core/src/udf.rs | 5 -
crates/core/src/udtf.rs | 16 +-
crates/core/src/udwf.rs | 5 -
.../python/tests/_test_schema_provider.py | 7 +-
.../python/tests/_test_table_function.py | 7 +-
.../python/tests/_test_table_provider.py | 6 +-
.../datafusion-ffi-example/src/aggregate_udf.rs | 5 -
.../datafusion-ffi-example/src/catalog_provider.rs | 13 -
examples/datafusion-ffi-example/src/scalar_udf.rs | 5 -
examples/datafusion-ffi-example/src/window_udf.rs | 5 -
python/datafusion/__init__.py | 9 +-
python/datafusion/dataframe.py | 26 +
python/datafusion/expr.py | 6 +
python/datafusion/functions.py | 4 +-
python/tests/test_aggregation.py | 34 +-
python/tests/test_dataframe.py | 14 +
python/tests/test_expr.py | 11 +-
python/tests/test_functions.py | 27 +-
python/tests/test_imports.py | 12 +
35 files changed, 865 insertions(+), 622 deletions(-)
diff --git a/.ai/skills/check-upstream/SKILL.md
b/.ai/skills/check-upstream/SKILL.md
index ac4835a4..3bac018e 100644
--- a/.ai/skills/check-upstream/SKILL.md
+++ b/.ai/skills/check-upstream/SKILL.md
@@ -29,6 +29,29 @@ You are auditing the datafusion-python project to find
features from the upstrea
**IMPORTANT: The Python API is the source of truth for coverage.** A function
or method is considered "exposed" if it exists in the Python API (e.g.,
`python/datafusion/functions.py`), even if there is no corresponding entry in
the Rust bindings. Many upstream functions are aliases of other functions — the
Python layer can expose these aliases by calling a different underlying Rust
binding. Do NOT report a function as missing if it appears in the Python
`__all__` list and has a working i [...]
+**IMPORTANT: audit the total upstream surface, not the delta since the last
pin.** Gaps accumulate across syncs. A patch-release bump with a "bug fixes
only" changelog does not mean there is nothing to find — pre-existing gaps from
earlier majors still need to be surfaced. Always run the full comparison.
+
+## Compile-Signal Triggers
+
+If a recent upstream bump required *any* of the following while fixing
+compile errors in `crates/core/` or the FFI example, treat that as a
+**hard signal** that user-facing surface area grew and run this skill
+before considering the bump done. Each pattern corresponds to a class of
+gap that frequently shows up in the audit:
+
+| Signal during PR 1 compile fix | Likely gap to check |
+|---|---|
+| New `Expr::*` variant added to a non-exhaustive `match`
(`HigherOrderFunction`, `Lambda`, `LambdaVariable`, …) | New lambda /
higher-order scalar functions (`any_match`, `array_transform`,
`list_transform`, …) |
+| New `ScalarValue::*` variant (`ListView`, `LargeListView`, …) | New scalar /
array functions that consume or produce the type |
+| New required trait method on `ExecutionPlan` / `TableProvider` / `*UDFImpl`
(`apply_expressions`, …) | Corresponding capability on the Python wrapper class
|
+| Renamed or restructured struct field (e.g. `Cast.data_type` → `Cast.field:
FieldRef`) | Any Python accessor / SKILL.md doc that read the old field |
+| Newly deprecated trait method with a `_with_args` / `_with_options`
replacement | The `*_with_options` variant frequently warrants a separate
Python entry point |
+
+PR 1 of `dev/release/upstream-sync.md` asks you to log these signals as
+they appear. When you run this skill, use that log as a checklist: every
+entry must either show up in the audit output or be explicitly skipped
+with a reason.
+
## Areas to Check
The user may specify an area via `$ARGUMENTS`. If no area is specified or
"all" is given, check all areas.
@@ -173,6 +196,28 @@ These upstream FFI types have been reviewed and do not
need to be independently
- FFI example in `examples/datafusion-ffi-example/`
- Type appears in union type hints where accepted
+### 8. `__all__` Hygiene (functions.py)
+
+Independent of upstream parity, also flag public `def` symbols in
+`python/datafusion/functions.py` that are missing from the module's
+`__all__`. These are functions a user can call but that do not show up in
+`from datafusion.functions import *`, in tab-completion against the
+namespace, or in generated API docs — typically an oversight rather than
+an intentional omission.
+
+**How to check:**
+1. Grep for `^def ([a-z_][a-z0-9_]*)\(` in `python/datafusion/functions.py`
+ to enumerate every public function definition.
+2. Read the `__all__` list at the top of the same file.
+3. Report any function in (1) that is not in (2). Skip private helpers
+ (names starting with `_`).
+
+A historical example: `instr` and `position` shipped as public `def`s but
+were absent from `__all__` until the gap was caught here.
+
+For each finding, propose adding the name to `__all__` in alphabetical
+position with the existing entries.
+
## Checking for Existing GitHub Issues
After identifying missing APIs, search the open issues at
https://github.com/apache/datafusion-python/issues for each gap to see if an
issue already exists requesting that API be exposed. Search using the function
or method name as the query.
diff --git a/Cargo.lock b/Cargo.lock
index 1d148b0e..0c4b7758 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,54 +2,6 @@
# 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"
@@ -115,35 +67,6 @@ version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
-[[package]]
-name = "apache-avro"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36fa98bc79671c7981272d91a8753a928ff6a1cd8e4f20a44c45bd5d313840bf"
-dependencies = [
- "bigdecimal",
- "bon",
- "bzip2",
- "crc32fast",
- "digest",
- "liblzma",
- "log",
- "miniz_oxide",
- "num-bigint",
- "quad-rand",
- "rand 0.9.4",
- "regex-lite",
- "serde",
- "serde_bytes",
- "serde_json",
- "snap",
- "strum",
- "strum_macros",
- "thiserror",
- "uuid",
- "zstd",
-]
-
[[package]]
name = "ar_archive_writer"
version = "0.5.1"
@@ -176,9 +99,9 @@ checksum =
"7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "arrow"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d441fdda254b65f3e9025910eb2c2066b6295d9c8ed409522b8d2ace1ff8574c"
+checksum = "378530e55cd479eda3c14eb345310799717e6f76d0c332041e8487022166b471"
dependencies = [
"arrow-arith",
"arrow-array",
@@ -198,9 +121,9 @@ dependencies = [
[[package]]
name = "arrow-arith"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ced5406f8b720cc0bc3aa9cf5758f93e8593cda5490677aa194e4b4b383f9a59"
+checksum = "a0ab212d2c1886e802f51c5212d78ebbcbb0bec980fff9dadc1eb8d45cd0b738"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -229,6 +152,30 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "arrow-avro"
+version = "58.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "049230728cd6e093088c8d231b4beede184e35cad7777c1505c0d5a8571f4376"
+dependencies = [
+ "arrow-array",
+ "arrow-buffer",
+ "arrow-schema",
+ "bytes",
+ "bzip2",
+ "crc",
+ "flate2",
+ "indexmap",
+ "liblzma",
+ "rand 0.9.2",
+ "serde",
+ "serde_json",
+ "snap",
+ "strum_macros",
+ "uuid",
+ "zstd",
+]
+
[[package]]
name = "arrow-buffer"
version = "58.3.0"
@@ -243,9 +190,9 @@ dependencies = [
[[package]]
name = "arrow-cast"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0127816c96533d20fc938729f48c52d3e48f99717e7a0b5ade77d742510736d"
+checksum = "4c5aefb56a2c02e9e2b30746241058b85f8983f0fcff2ba0c6d09006e1cded7f"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -265,9 +212,9 @@ dependencies = [
[[package]]
name = "arrow-csv"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca025bd0f38eeecb57c2153c0123b960494138e6a957bbda10da2b25415209fe"
+checksum = "e94e8cf7e517657a52b91ea1263acf38c4ca62a84655d72458a3359b12ab97de"
dependencies = [
"arrow-array",
"arrow-cast",
@@ -293,9 +240,9 @@ dependencies = [
[[package]]
name = "arrow-ipc"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "609a441080e338147a84e8e6904b6da482cefb957c5cdc0f3398872f69a315d0"
+checksum = "238438f0834483703d88896db6fe5a7138b2230debc31b34c0336c2996e3c64f"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -309,15 +256,16 @@ dependencies = [
[[package]]
name = "arrow-json"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ead0914e4861a531be48fe05858265cf854a4880b9ed12618b1d08cba9bebc8"
+checksum = "205ca2119e6d679d5c133c6f30e68f027738d95ed948cf77677ea69c7800036b"
dependencies = [
"arrow-array",
"arrow-buffer",
"arrow-cast",
- "arrow-data",
+ "arrow-ord",
"arrow-schema",
+ "arrow-select",
"chrono",
"half",
"indexmap",
@@ -333,9 +281,9 @@ dependencies = [
[[package]]
name = "arrow-ord"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763a7ba279b20b52dad300e68cfc37c17efa65e68623169076855b3a9e941ca5"
+checksum = "1bffd8fd2579286a5d63bac898159873e5094a79009940bcb42bbfce4f19f1d0"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -346,9 +294,9 @@ dependencies = [
[[package]]
name = "arrow-pyarrow"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e63351dc11981a316c828a6032a5021345bba882f68bc4a36c36825a50725089"
+checksum = "d29abdf672a81c1aeb57fd2661457f9918964d49aed0e9f18932535f2a9e49ce"
dependencies = [
"arrow-array",
"arrow-data",
@@ -358,9 +306,9 @@ dependencies = [
[[package]]
name = "arrow-row"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14fe367802f16d7668163ff647830258e6e0aeea9a4d79aaedf273af3bdcd3e"
+checksum = "bab5994731204603c73ba69267616c50f80780774c6bb0476f1f830625115e0c"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -382,9 +330,9 @@ dependencies = [
[[package]]
name = "arrow-select"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78694888660a9e8ac949853db393af2a8b8fc82c19ce333132dfa2e72cc1a7fe"
+checksum = "8cd065c54172ac787cf3f2f8d4107e0d3fdc26edba76fdf4f4cc170258942222"
dependencies = [
"ahash",
"arrow-array",
@@ -396,9 +344,9 @@ dependencies = [
[[package]]
name = "arrow-string"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61e04a01f8bb73ce54437514c5fd3ee2aa3e8abe4c777ee5cc55853b1652f79e"
+checksum = "29dd7cda3ab9692f43a2e4acc444d760cc17b12bb6d8232ddf64e9bab7c06b42"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -411,18 +359,6 @@ dependencies = [
"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-compression"
version = "0.4.41"
@@ -440,9 +376,6 @@ 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-recursion"
@@ -504,7 +437,6 @@ dependencies = [
"num-bigint",
"num-integer",
"num-traits",
- "serde",
]
[[package]]
@@ -519,7 +451,7 @@ version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
dependencies = [
- "digest",
+ "digest 0.10.7",
]
[[package]]
@@ -546,28 +478,12 @@ dependencies = [
]
[[package]]
-name = "bon"
-version = "3.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe"
-dependencies = [
- "bon-macros",
- "rustversion",
-]
-
-[[package]]
-name = "bon-macros"
-version = "3.9.1"
+name = "block-buffer"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c"
+checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be"
dependencies = [
- "darling",
- "ident_case",
- "prettyplease",
- "proc-macro2",
- "quote",
- "rustversion",
- "syn 2.0.117",
+ "hybrid-array",
]
[[package]]
@@ -715,6 +631,12 @@ version = "0.4.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d"
+[[package]]
+name = "const-oid"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
+
[[package]]
name = "const-random"
version = "0.1.18"
@@ -735,15 +657,6 @@ dependencies = [
"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 = "constant_time_eq"
version = "0.4.2"
@@ -766,21 +679,6 @@ 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 = "cpufeatures"
version = "0.2.17"
@@ -800,21 +698,27 @@ dependencies = [
]
[[package]]
-name = "crc32fast"
-version = "1.5.0"
+name = "crc"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
+checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
dependencies = [
- "cfg-if",
+ "crc-catalog",
]
[[package]]
-name = "crossbeam-channel"
-version = "0.5.15"
+name = "crc-catalog"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
+checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
+
+[[package]]
+name = "crc32fast"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
- "crossbeam-utils",
+ "cfg-if",
]
[[package]]
@@ -839,6 +743,15 @@ dependencies = [
"typenum",
]
+[[package]]
+name = "crypto-common"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710"
+dependencies = [
+ "hybrid-array",
+]
+
[[package]]
name = "cstr"
version = "0.2.12"
@@ -870,40 +783,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "darling"
-version = "0.23.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
-dependencies = [
- "darling_core",
- "darling_macro",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.23.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
-dependencies = [
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.23.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
-dependencies = [
- "darling_core",
- "quote",
- "syn 2.0.117",
-]
-
[[package]]
name = "dashmap"
version = "6.1.0"
@@ -921,13 +800,11 @@ dependencies = [
[[package]]
name = "datafusion"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93db0e623840612f7f2cd757f7e8a8922064192363732c88692e0870016e141b"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"arrow-schema",
"async-trait",
- "bytes",
"bzip2",
"chrono",
"datafusion-catalog",
@@ -958,14 +835,13 @@ dependencies = [
"datafusion-sql",
"flate2",
"futures",
+ "indexmap",
"itertools",
"liblzma",
"log",
"object_store",
"parking_lot",
"parquet",
- "rand 0.9.4",
- "regex",
"sqlparser",
"tempfile",
"tokio",
@@ -977,8 +853,7 @@ dependencies = [
[[package]]
name = "datafusion-catalog"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37cefde60b26a7f4ff61e9d2ff2833322f91df2b568d7238afe67bde5bdffb66"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1002,8 +877,7 @@ dependencies = [
[[package]]
name = "datafusion-catalog-listing"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17e112307715d6a7a331111a4c2330ff54bc237183511c319e3708a4cff431fb"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1025,34 +899,32 @@ dependencies = [
[[package]]
name = "datafusion-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d72a11ca44a95e1081870d3abb80c717496e8a7acb467a1d3e932bb636af5cc2"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
- "apache-avro",
"arrow",
"arrow-ipc",
+ "arrow-schema",
"chrono",
+ "foldhash 0.2.0",
"half",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"indexmap",
"itertools",
"libc",
"log",
"object_store",
"parquet",
- "paste",
"recursive",
"sqlparser",
"tokio",
+ "uuid",
"web-time",
]
[[package]]
name = "datafusion-common-runtime"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89f4afaed29670ec4fd6053643adc749fe3f4bc9d1ce1b8c5679b22c67d12def"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"futures",
"log",
@@ -1062,8 +934,7 @@ dependencies = [
[[package]]
name = "datafusion-datasource"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9fb386e1691355355a96419978a0022b7947b44d4a24a6ea99f00b6b485cbb6"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-compression",
@@ -1087,7 +958,8 @@ dependencies = [
"liblzma",
"log",
"object_store",
- "rand 0.9.4",
+ "parking_lot",
+ "rand 0.9.2",
"tokio",
"tokio-util",
"url",
@@ -1097,8 +969,7 @@ dependencies = [
[[package]]
name = "datafusion-datasource-arrow"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffa6c52cfed0734c5f93754d1c0175f558175248bf686c944fb05c373e5fc096"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"arrow-ipc",
@@ -1121,28 +992,25 @@ dependencies = [
[[package]]
name = "datafusion-datasource-avro"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a579c3bd290c66ea4b269493e75e8a3ed42c9c895a651f10210a29538aee50c4"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "apache-avro",
"arrow",
+ "arrow-avro",
"async-trait",
"bytes",
"datafusion-common",
"datafusion-datasource",
- "datafusion-physical-expr-common",
+ "datafusion-physical-expr-adapter",
"datafusion-physical-plan",
"datafusion-session",
"futures",
- "num-traits",
"object_store",
]
[[package]]
name = "datafusion-datasource-csv"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "503f29e0582c1fc189578d665ff57d9300da1f80c282777d7eb67bb79fb8cdca"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1164,8 +1032,7 @@ dependencies = [
[[package]]
name = "datafusion-datasource-json"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e33804749abc8d0c8cb7473228483cb8070e524c6f6086ee1b85a64debe2b3d2"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1180,7 +1047,6 @@ dependencies = [
"datafusion-session",
"futures",
"object_store",
- "serde_json",
"tokio",
"tokio-stream",
]
@@ -1188,8 +1054,7 @@ dependencies = [
[[package]]
name = "datafusion-datasource-parquet"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a8e0365e0e08e8ff94d912f0ababcf9065a1a304018ba90b1fc83c855b4997"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1199,6 +1064,7 @@ dependencies = [
"datafusion-datasource",
"datafusion-execution",
"datafusion-expr",
+ "datafusion-functions",
"datafusion-functions-aggregate-common",
"datafusion-physical-expr",
"datafusion-physical-expr-adapter",
@@ -1218,19 +1084,16 @@ dependencies = [
[[package]]
name = "datafusion-doc"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de6ac0df1662b9148ad3c987978b32cbec7c772f199b1d53520c8fa764a87ee"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
[[package]]
name = "datafusion-execution"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c03c7fbdaefcca4ef6ffe425a5fc2325763bfb426599bb0bf4536466efabe709"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"arrow-buffer",
"async-trait",
- "chrono",
"dashmap",
"datafusion-common",
"datafusion-expr",
@@ -1239,7 +1102,7 @@ dependencies = [
"log",
"object_store",
"parking_lot",
- "rand 0.9.4",
+ "rand 0.9.2",
"tempfile",
"url",
]
@@ -1247,10 +1110,10 @@ dependencies = [
[[package]]
name = "datafusion-expr"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "574b9b6977fedbd2a611cbff12e5caf90f31640ad9dc5870f152836d94bad0dd"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
+ "arrow-schema",
"async-trait",
"chrono",
"datafusion-common",
@@ -1261,7 +1124,6 @@ dependencies = [
"datafusion-physical-expr-common",
"indexmap",
"itertools",
- "paste",
"recursive",
"serde_json",
"sqlparser",
@@ -1270,27 +1132,24 @@ dependencies = [
[[package]]
name = "datafusion-expr-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d7c3adf3db8bf61e92eb90cb659c8e8b734593a8f7c8e12a843c7ddba24b87e"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
"indexmap",
"itertools",
- "paste",
]
[[package]]
name = "datafusion-ffi"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b95173344d04ba62755c949bf44f8d1a6e4414cf6392a635db96c07e711b9a3c"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "abi_stable",
"arrow",
"arrow-schema",
"async-ffi",
"async-trait",
+ "chrono",
"datafusion-catalog",
"datafusion-common",
"datafusion-datasource",
@@ -1299,14 +1158,17 @@ dependencies = [
"datafusion-functions-aggregate-common",
"datafusion-physical-expr",
"datafusion-physical-expr-common",
+ "datafusion-physical-optimizer",
"datafusion-physical-plan",
"datafusion-proto",
"datafusion-proto-common",
"datafusion-session",
"futures",
+ "libloading",
"log",
"prost",
"semver",
+ "stabby",
"tokio",
]
@@ -1335,8 +1197,7 @@ dependencies = [
[[package]]
name = "datafusion-functions"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28aa4e10384e782774b10e72aca4d93ef7b31aa653095d9d4536b0a3dbc51b6"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"arrow-buffer",
@@ -1351,26 +1212,24 @@ dependencies = [
"datafusion-expr",
"datafusion-expr-common",
"datafusion-macros",
+ "datafusion-physical-expr-common",
"hex",
"itertools",
"log",
- "md-5",
+ "md-5 0.11.0",
"memchr",
"num-traits",
- "rand 0.9.4",
+ "rand 0.9.2",
"regex",
"sha2",
- "unicode-segmentation",
"uuid",
]
[[package]]
name = "datafusion-functions-aggregate"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00aa6217e56098ba84e0a338176fe52f0a84cca398021512c6c8c5eff806d0ad"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
"arrow",
"datafusion-common",
"datafusion-doc",
@@ -1380,19 +1239,17 @@ dependencies = [
"datafusion-macros",
"datafusion-physical-expr",
"datafusion-physical-expr-common",
+ "foldhash 0.2.0",
"half",
"log",
"num-traits",
- "paste",
]
[[package]]
name = "datafusion-functions-aggregate-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b511250349407db7c43832ab2de63f5557b19a20dfd236b39ca2c04468b50d47"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
"arrow",
"datafusion-common",
"datafusion-expr-common",
@@ -1402,8 +1259,7 @@ dependencies = [
[[package]]
name = "datafusion-functions-nested"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef13a858e20d50f0a9bb5e96e7ac82b4e7597f247515bccca4fdd2992df0212a"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"arrow-ord",
@@ -1417,18 +1273,17 @@ dependencies = [
"datafusion-functions-aggregate-common",
"datafusion-macros",
"datafusion-physical-expr-common",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"itertools",
"itoa",
"log",
- "paste",
+ "memchr",
]
[[package]]
name = "datafusion-functions-table"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b40d3f5bbb3905f9ccb1ce9485a9595c77b69758a7c24d3ba79e334ff51e7e"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"async-trait",
@@ -1437,14 +1292,12 @@ dependencies = [
"datafusion-expr",
"datafusion-physical-plan",
"parking_lot",
- "paste",
]
[[package]]
name = "datafusion-functions-window"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4e88ec9d57c9b685d02f58bfee7be62d72610430ddcedb82a08e5d9925dbfb6"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
@@ -1455,14 +1308,12 @@ dependencies = [
"datafusion-physical-expr",
"datafusion-physical-expr-common",
"log",
- "paste",
]
[[package]]
name = "datafusion-functions-window-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8307bb93519b1a91913723a1130cfafeee3f72200d870d88e91a6fc5470ede5c"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"datafusion-common",
"datafusion-physical-expr-common",
@@ -1471,8 +1322,7 @@ dependencies = [
[[package]]
name = "datafusion-macros"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e367e6a71051d0ebdd29b2f85d12059b38b1d1f172c6906e80016da662226bd"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"datafusion-doc",
"quote",
@@ -1482,8 +1332,7 @@ dependencies = [
[[package]]
name = "datafusion-optimizer"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e929015451a67f77d9d8b727b2bf3a40c4445fdef6cdc53281d7d97c76888ace"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"chrono",
@@ -1502,10 +1351,8 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b1e68aba7a4b350401cfdf25a3d6f989ad898a7410164afe9ca52080244cb59"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
"arrow",
"datafusion-common",
"datafusion-expr",
@@ -1513,11 +1360,10 @@ dependencies = [
"datafusion-functions-aggregate-common",
"datafusion-physical-expr-common",
"half",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"indexmap",
"itertools",
"parking_lot",
- "paste",
"petgraph",
"recursive",
"tokio",
@@ -1526,8 +1372,7 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr-adapter"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea22315f33cf2e0adc104e8ec42e285f6ed93998d565c65e82fec6a9ee9f9db4"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
@@ -1541,25 +1386,23 @@ dependencies = [
[[package]]
name = "datafusion-physical-expr-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b04b45ea8ad3ac2d78f2ea2a76053e06591c9629c7a603eda16c10649ecf4362"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
"arrow",
"chrono",
"datafusion-common",
"datafusion-expr-common",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"indexmap",
"itertools",
"parking_lot",
+ "pin-project",
]
[[package]]
name = "datafusion-physical-optimizer"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cb13397809a425918f608dfe8653f332015a3e330004ab191b4404187238b95"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
@@ -1577,11 +1420,11 @@ dependencies = [
[[package]]
name = "datafusion-physical-plan"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5edc023675791af9d5fb4cc4c24abf5f7bd3bd4dcf9e5bd90ea1eff6976dcc79"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
- "ahash",
"arrow",
+ "arrow-data",
+ "arrow-ipc",
"arrow-ord",
"arrow-schema",
"async-trait",
@@ -1596,7 +1439,7 @@ dependencies = [
"datafusion-physical-expr-common",
"futures",
"half",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"indexmap",
"itertools",
"log",
@@ -1609,8 +1452,7 @@ dependencies = [
[[package]]
name = "datafusion-proto"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a387aaef949dc16bb6abc81bd1af850ec7449183aef011214f9724957495738"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"chrono",
@@ -1631,14 +1473,12 @@ dependencies = [
"datafusion-proto-common",
"object_store",
"prost",
- "rand 0.9.4",
]
[[package]]
name = "datafusion-proto-common"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e614c7c53a9c304c6a850b821010bb492e57300311835f1180613f9d2c63d9"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
@@ -1648,8 +1488,7 @@ dependencies = [
[[package]]
name = "datafusion-pruning"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac8c76860e355616555081cab5968cec1af7a80701ff374510860bcd567e365a"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"datafusion-common",
@@ -1658,7 +1497,6 @@ dependencies = [
"datafusion-physical-expr",
"datafusion-physical-expr-common",
"datafusion-physical-plan",
- "itertools",
"log",
]
@@ -1709,8 +1547,7 @@ dependencies = [
[[package]]
name = "datafusion-session"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5412111aa48e2424ba926112e192f7a6b7e4ccb450145d25ce5ede9f19dc491e"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"async-trait",
"datafusion-common",
@@ -1723,8 +1560,7 @@ dependencies = [
[[package]]
name = "datafusion-sql"
version = "53.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0d133ddf8b9b3b872acac900157f783e7b879fe9a6bccf389abebbfac45ec1"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"arrow",
"bigdecimal",
@@ -1741,9 +1577,8 @@ dependencies = [
[[package]]
name = "datafusion-substrait"
-version = "53.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5e5656a7e63d51dd3e5af3dbd347ea83bbe993a77c66b854b74961570d16490"
+version = "53.1.0"
+source =
"git+https://github.com/apache/datafusion?rev=47655fd6c9ef060d73497987e6ccb98e57196508#47655fd6c9ef060d73497987e6ccb98e57196508"
dependencies = [
"async-recursion",
"async-trait",
@@ -1765,11 +1600,22 @@ version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
- "block-buffer",
- "crypto-common",
+ "block-buffer 0.10.4",
+ "crypto-common 0.1.7",
"subtle",
]
+[[package]]
+name = "digest"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"
+dependencies = [
+ "block-buffer 0.12.0",
+ "const-oid",
+ "crypto-common 0.2.1",
+]
+
[[package]]
name = "displaydoc"
version = "0.2.5"
@@ -1963,15 +1809,6 @@ dependencies = [
"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 = "generic-array"
version = "0.14.7"
@@ -2091,6 +1928,11 @@ name = "hashbrown"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash 0.2.0",
+]
[[package]]
name = "heck"
@@ -2149,6 +1991,15 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424"
+[[package]]
+name = "hybrid-array"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da"
+dependencies = [
+ "typenum",
+]
+
[[package]]
name = "hyper"
version = "1.8.1"
@@ -2322,12 +2173,6 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
-[[package]]
-name = "ident_case"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
-
[[package]]
name = "idna"
version = "1.1.0"
@@ -2351,12 +2196,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.13.0"
+version = "2.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
+checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
dependencies = [
"equivalent",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"serde",
"serde_core",
]
@@ -2489,18 +2334,18 @@ checksum =
"2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7"
[[package]]
name = "libc"
-version = "0.2.183"
+version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "libloading"
-version = "0.7.4"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60"
dependencies = [
"cfg-if",
- "winapi",
+ "windows-link",
]
[[package]]
@@ -2531,11 +2376,12 @@ checksum =
"b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "libmimalloc-sys"
-version = "0.1.47"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d1eacfa31c33ec25e873c136ba5669f00f9866d0688bea7be4d3f7e43067df6"
+checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870"
dependencies = [
"cc",
+ "libc",
]
[[package]]
@@ -2587,7 +2433,17 @@ source =
"registry+https://github.com/rust-lang/crates.io-index"
checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
dependencies = [
"cfg-if",
- "digest",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "md-5"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98"
+dependencies = [
+ "cfg-if",
+ "digest 0.11.3",
]
[[package]]
@@ -2598,9 +2454,9 @@ checksum =
"f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
[[package]]
name = "mimalloc"
-version = "0.1.50"
+version = "0.1.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3627c4272df786b9260cabaa46aec1d59c93ede723d4c3ef646c503816b0640"
+checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8"
dependencies = [
"libmimalloc-sys",
]
@@ -2640,7 +2496,6 @@ checksum =
"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
- "serde",
]
[[package]]
@@ -2700,7 +2555,7 @@ dependencies = [
"humantime",
"hyper",
"itertools",
- "md-5",
+ "md-5 0.10.6",
"parking_lot",
"percent-encoding",
"quick-xml",
@@ -2766,9 +2621,9 @@ dependencies = [
[[package]]
name = "parquet"
-version = "58.1.0"
+version = "58.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d3f9f2205199603564127932b89695f52b62322f541d0fc7179d57c2e1c9877"
+checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908"
dependencies = [
"ahash",
"arrow-array",
@@ -2784,7 +2639,7 @@ dependencies = [
"flate2",
"futures",
"half",
- "hashbrown 0.16.1",
+ "hashbrown 0.17.1",
"lz4_flex",
"num-bigint",
"num-integer",
@@ -2879,6 +2734,26 @@ dependencies = [
"siphasher",
]
+[[package]]
+name = "pin-project"
+version = "1.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.117",
+]
+
[[package]]
name = "pin-project-lite"
version = "0.2.17"
@@ -2931,6 +2806,15 @@ dependencies = [
"syn 2.0.117",
]
+[[package]]
+name = "proc-macro-crate"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
+dependencies = [
+ "toml_edit",
+]
+
[[package]]
name = "proc-macro2"
version = "1.0.106"
@@ -3093,12 +2977,6 @@ dependencies = [
"syn 2.0.117",
]
-[[package]]
-name = "quad-rand"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a651516ddc9168ebd67b24afd085a718be02f8858fe406591b013d101ce2f40"
-
[[package]]
name = "quick-xml"
version = "0.39.2"
@@ -3138,7 +3016,7 @@ dependencies = [
"bytes",
"getrandom 0.3.4",
"lru-slab",
- "rand 0.9.4",
+ "rand 0.9.2",
"ring",
"rustc-hash",
"rustls",
@@ -3187,11 +3065,22 @@ checksum =
"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "rand"
-version = "0.9.4"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
- "rand_chacha",
+ "rand_chacha 0.9.0",
"rand_core 0.9.5",
]
@@ -3206,6 +3095,16 @@ dependencies = [
"rand_core 0.10.0",
]
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
[[package]]
name = "rand_chacha"
version = "0.9.0"
@@ -3216,6 +3115,15 @@ dependencies = [
"rand_core 0.9.5",
]
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.17",
+]
+
[[package]]
name = "rand_core"
version = "0.9.5"
@@ -3283,12 +3191,6 @@ dependencies = [
"regex-syntax",
]
-[[package]]
-name = "regex-lite"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973"
-
[[package]]
name = "regex-syntax"
version = "0.8.10"
@@ -3305,15 +3207,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "repr_offset"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea"
-dependencies = [
- "tstr",
-]
-
[[package]]
name = "reqwest"
version = "0.12.28"
@@ -3436,9 +3329,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.103.13"
+version = "0.103.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
+checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef"
dependencies = [
"ring",
"rustls-pki-types",
@@ -3530,9 +3423,9 @@ dependencies = [
[[package]]
name = "semver"
-version = "1.0.27"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
dependencies = [
"serde",
"serde_core",
@@ -3554,16 +3447,6 @@ dependencies = [
"serde_derive",
]
-[[package]]
-name = "serde_bytes"
-version = "0.11.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8"
-dependencies = [
- "serde",
- "serde_core",
-]
-
[[package]]
name = "serde_core"
version = "1.0.228"
@@ -3601,6 +3484,7 @@ version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
+ "indexmap",
"itoa",
"memchr",
"serde",
@@ -3647,15 +3531,21 @@ dependencies = [
[[package]]
name = "sha2"
-version = "0.10.9"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4"
dependencies = [
"cfg-if",
- "cpufeatures 0.2.17",
- "digest",
+ "cpufeatures 0.3.0",
+ "digest 0.11.3",
]
+[[package]]
+name = "sha2-const-stable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9"
+
[[package]]
name = "shlex"
version = "1.3.0"
@@ -3710,9 +3600,9 @@ dependencies = [
[[package]]
name = "sqlparser"
-version = "0.61.0"
+version = "0.62.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbf5ea8d4d7c808e1af1cbabebca9a2abe603bcefc22294c5b95018d53200cb7"
+checksum = "13c6d1b651dc4edf07eead2a0c6c78016ce971bc2c10da5266861b13f25e7cec"
dependencies = [
"log",
"recursive",
@@ -3730,6 +3620,41 @@ dependencies = [
"syn 2.0.117",
]
+[[package]]
+name = "stabby"
+version = "72.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "976399a0c48ea769ef7f5dc303bb88240ab8d84008647a6b2303eced3dab3945"
+dependencies = [
+ "rustversion",
+ "stabby-abi",
+]
+
+[[package]]
+name = "stabby-abi"
+version = "72.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7b54832a9a1f92a0e55e74a5c0332744426edc515bb3fbad82f10b874a87f0d"
+dependencies = [
+ "rustc_version",
+ "rustversion",
+ "sha2-const-stable",
+ "stabby-macros",
+]
+
+[[package]]
+name = "stabby-macros"
+version = "72.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a768b1e51e4dbfa4fa52ae5c01241c0a41e2938fdffbb84add0c8238092f9091"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "rand 0.8.6",
+ "syn 1.0.109",
+]
+
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
@@ -3749,23 +3674,11 @@ dependencies = [
"windows-sys 0.59.0",
]
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "strum"
-version = "0.27.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
-
[[package]]
name = "strum_macros"
-version = "0.27.2"
+version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
+checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664"
dependencies = [
"heck",
"proc-macro2",
@@ -3775,11 +3688,12 @@ dependencies = [
[[package]]
name = "substrait"
-version = "0.62.2"
+version = "0.63.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62fc4b483a129b9772ccb9c3f7945a472112fdd9140da87f8a4e7f1d44e045d0"
+checksum = "e620ff4d5c02fd6f7752931aa74b16a26af66a63022cc1ad412c77edbe0bab47"
dependencies = [
"heck",
+ "indexmap",
"pbjson",
"pbjson-build",
"pbjson-types",
@@ -3992,6 +3906,36 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "toml_datetime"
+version = "1.1.1+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.25.11+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "toml_parser",
+ "winnow",
+]
+
+[[package]]
+name = "toml_parser"
+version = "1.1.2+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+dependencies = [
+ "winnow",
+]
+
[[package]]
name = "tower"
version = "0.5.3"
@@ -4074,44 +4018,17 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-[[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 = "typenum"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
-
-[[package]]
-name = "typewit"
-version = "1.14.2"
+version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71"
+checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
[[package]]
name = "typify"
@@ -4216,13 +4133,12 @@ checksum =
"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
-version = "1.23.1"
+version = "1.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
+checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
dependencies = [
"getrandom 0.4.2",
"js-sys",
- "serde_core",
"wasm-bindgen",
]
@@ -4401,22 +4317,6 @@ dependencies = [
"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"
@@ -4426,12 +4326,6 @@ dependencies = [
"windows-sys 0.61.2",
]
-[[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"
@@ -4656,6 +4550,15 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+[[package]]
+name = "winnow"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "wit-bindgen"
version = "0.51.0"
diff --git a/Cargo.toml b/Cargo.toml
index 077bc093..13d7040a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -71,3 +71,12 @@ codegen-units = 2
# We cannot publish to crates.io with any patches in the below section.
Developers
# must remove any entries in this section before creating a release candidate.
[patch.crates-io]
+datafusion = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-substrait = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-proto = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-ffi = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-catalog = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-common = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-functions-aggregate = { git =
"https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-functions-window = { git = "https://github.com/apache/datafusion",
rev = "47655fd6c9ef060d73497987e6ccb98e57196508" }
+datafusion-expr = { git = "https://github.com/apache/datafusion", rev =
"47655fd6c9ef060d73497987e6ccb98e57196508" }
diff --git a/crates/core/src/catalog.rs b/crates/core/src/catalog.rs
index 30ec4744..8ad49b09 100644
--- a/crates/core/src/catalog.rs
+++ b/crates/core/src/catalog.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::collections::HashSet;
use std::ptr::NonNull;
use std::sync::Arc;
@@ -143,15 +142,12 @@ impl PyCatalogList {
"Schema with name {name} doesn't exist."
)))?;
- Python::attach(|py| {
- match catalog
- .as_any()
- .downcast_ref::<RustWrappedPyCatalogProvider>()
- {
+ Python::attach(
+ |py| match catalog.downcast_ref::<RustWrappedPyCatalogProvider>() {
Some(wrapped_catalog) =>
Ok(wrapped_catalog.catalog_provider.clone_ref(py)),
None => PyCatalog::new_from_parts(catalog,
self.codec.clone()).into_py_any(py),
- }
- })
+ },
+ )
}
pub fn register_catalog(&self, name: &str, catalog_provider: Bound<'_,
PyAny>) -> PyResult<()> {
@@ -201,15 +197,12 @@ impl PyCatalog {
"Schema with name {name} doesn't exist."
)))?;
- Python::attach(|py| {
- match schema
- .as_any()
- .downcast_ref::<RustWrappedPySchemaProvider>()
- {
+ Python::attach(
+ |py| match schema.downcast_ref::<RustWrappedPySchemaProvider>() {
Some(wrapped_schema) =>
Ok(wrapped_schema.schema_provider.clone_ref(py)),
None => PySchema::new_from_parts(schema,
self.codec.clone()).into_py_any(py),
- }
- })
+ },
+ )
}
pub fn register_schema(&self, name: &str, schema_provider: Bound<'_,
PyAny>) -> PyResult<()> {
@@ -356,10 +349,6 @@ impl SchemaProvider for RustWrappedPySchemaProvider {
self.owner_name.as_deref()
}
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn table_names(&self) -> Vec<String> {
Python::attach(|py| {
let provider = self.schema_provider.bind(py);
@@ -465,10 +454,6 @@ impl RustWrappedPyCatalogProvider {
#[async_trait]
impl CatalogProvider for RustWrappedPyCatalogProvider {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn schema_names(&self) -> Vec<String> {
Python::attach(|py| {
let provider = self.catalog_provider.bind(py);
@@ -496,10 +481,7 @@ impl CatalogProvider for RustWrappedPyCatalogProvider {
schema: Arc<dyn SchemaProvider>,
) -> datafusion::common::Result<Option<Arc<dyn SchemaProvider>>> {
Python::attach(|py| {
- let py_schema = match schema
- .as_any()
- .downcast_ref::<RustWrappedPySchemaProvider>()
- {
+ let py_schema = match
schema.downcast_ref::<RustWrappedPySchemaProvider>() {
Some(wrapped_schema) =>
wrapped_schema.schema_provider.as_any(),
None => &PySchema::new_from_parts(schema, self.codec.clone())
.into_py_any(py)
@@ -573,10 +555,6 @@ impl RustWrappedPyCatalogProviderList {
#[async_trait]
impl CatalogProviderList for RustWrappedPyCatalogProviderList {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn catalog_names(&self) -> Vec<String> {
Python::attach(|py| {
let provider = self.catalog_provider_list.bind(py);
@@ -604,10 +582,7 @@ impl CatalogProviderList for
RustWrappedPyCatalogProviderList {
catalog: Arc<dyn CatalogProvider>,
) -> Option<Arc<dyn CatalogProvider>> {
Python::attach(|py| {
- let py_catalog = match catalog
- .as_any()
- .downcast_ref::<RustWrappedPyCatalogProvider>()
- {
+ let py_catalog = match
catalog.downcast_ref::<RustWrappedPyCatalogProvider>() {
Some(wrapped_schema) =>
wrapped_schema.catalog_provider.as_any().clone_ref(py),
None => {
match PyCatalog::new_from_parts(catalog,
self.codec.clone()).into_py_any(py) {
@@ -661,8 +636,8 @@ fn extract_catalog_provider_from_pyobj(
.pointer_checked(Some(c"datafusion_catalog_provider"))?
.cast();
let provider = unsafe { data.as_ref() };
- let provider: Arc<dyn CatalogProvider + Send> = provider.into();
- provider as Arc<dyn CatalogProvider>
+ let provider: Arc<dyn CatalogProvider> = provider.into();
+ provider
} else {
match catalog_provider.extract::<PyCatalog>() {
Ok(py_catalog) => py_catalog.catalog,
@@ -693,8 +668,8 @@ fn extract_schema_provider_from_pyobj(
.pointer_checked(Some(c"datafusion_schema_provider"))?
.cast();
let provider = unsafe { data.as_ref() };
- let provider: Arc<dyn SchemaProvider + Send> = provider.into();
- provider as Arc<dyn SchemaProvider>
+ let provider: Arc<dyn SchemaProvider> = provider.into();
+ provider
} else {
match schema_provider.extract::<PySchema>() {
Ok(py_schema) => py_schema.schema,
diff --git a/crates/core/src/common/data_type.rs
b/crates/core/src/common/data_type.rs
index af417980..e79aea4e 100644
--- a/crates/core/src/common/data_type.rs
+++ b/crates/core/src/common/data_type.rs
@@ -334,6 +334,9 @@ impl DataTypeMap {
Ok(DataType::Interval(IntervalUnit::MonthDayNano))
}
ScalarValue::List(arr) => Ok(arr.data_type().to_owned()),
+ ScalarValue::LargeList(arr) => Ok(arr.data_type().to_owned()),
+ ScalarValue::ListView(arr) => Ok(arr.data_type().to_owned()),
+ ScalarValue::LargeListView(arr) => Ok(arr.data_type().to_owned()),
ScalarValue::Struct(_fields) => Err(PyNotImplementedError::new_err(
"ScalarValue::Struct".to_string(),
)),
@@ -346,9 +349,6 @@ impl DataTypeMap {
"ScalarValue::FixedSizeList".to_string(),
))
}
- ScalarValue::LargeList(_) => Err(PyNotImplementedError::new_err(
- "ScalarValue::LargeList".to_string(),
- )),
ScalarValue::DurationSecond(_) =>
Ok(DataType::Duration(TimeUnit::Second)),
ScalarValue::DurationMillisecond(_) =>
Ok(DataType::Duration(TimeUnit::Millisecond)),
ScalarValue::DurationMicrosecond(_) =>
Ok(DataType::Duration(TimeUnit::Microsecond)),
diff --git a/crates/core/src/common/schema.rs b/crates/core/src/common/schema.rs
index 29a27b20..94b3ce0a 100644
--- a/crates/core/src/common/schema.rs
+++ b/crates/core/src/common/schema.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::borrow::Cow;
use std::fmt::{self, Display, Formatter};
use std::sync::Arc;
@@ -219,10 +218,6 @@ impl SqlTableSource {
/// Implement TableSource, used in the logical query plan and in logical query
optimizations
impl TableSource for SqlTableSource {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn schema(&self) -> SchemaRef {
self.schema.clone()
}
diff --git a/crates/core/src/context.rs b/crates/core/src/context.rs
index 96de0188..642afeef 100644
--- a/crates/core/src/context.rs
+++ b/crates/core/src/context.rs
@@ -773,8 +773,8 @@ impl PySessionContext {
.pointer_checked(Some(c"datafusion_catalog_provider_list"))?
.cast();
let provider = unsafe { data.as_ref() };
- let provider: Arc<dyn CatalogProviderList + Send> =
provider.into();
- provider as Arc<dyn CatalogProviderList>
+ let provider: Arc<dyn CatalogProviderList> = provider.into();
+ provider
} else {
match provider.extract::<PyCatalogList>() {
Ok(py_catalog_list) => py_catalog_list.catalog_list,
@@ -809,8 +809,8 @@ impl PySessionContext {
.pointer_checked(Some(c"datafusion_catalog_provider"))?
.cast();
let provider = unsafe { data.as_ref() };
- let provider: Arc<dyn CatalogProvider + Send> = provider.into();
- provider as Arc<dyn CatalogProvider>
+ let provider: Arc<dyn CatalogProvider> = provider.into();
+ provider
} else {
match provider.extract::<PyCatalog>() {
Ok(py_catalog) => py_catalog.catalog,
@@ -1071,10 +1071,7 @@ impl PySessionContext {
"Catalog with name {name} doesn't exist."
)))?;
- match catalog
- .as_any()
- .downcast_ref::<RustWrappedPyCatalogProvider>()
- {
+ match catalog.downcast_ref::<RustWrappedPyCatalogProvider>() {
Some(wrapped_schema) =>
Ok(wrapped_schema.catalog_provider.clone_ref(py)),
None => {
Ok(PyCatalog::new_from_parts(catalog,
self.ffi_logical_codec()).into_py_any(py)?)
diff --git a/crates/core/src/dataframe.rs b/crates/core/src/dataframe.rs
index 2e74991b..8f1a20d0 100644
--- a/crates/core/src/dataframe.rs
+++ b/crates/core/src/dataframe.rs
@@ -578,6 +578,11 @@ impl PyDataFrame {
Ok(PyTable::from(table_provider))
}
+ fn alias(&self, alias: &str) -> PyDataFusionResult<Self> {
+ let df = self.df.as_ref().clone().alias(alias)?;
+ Ok(Self::new(df))
+ }
+
#[pyo3(signature = (*args))]
fn select_exprs(&self, args: Vec<PyBackedStr>) -> PyDataFusionResult<Self>
{
let args = args.iter().map(|s| s.as_ref()).collect::<Vec<&str>>();
diff --git a/crates/core/src/dataset.rs b/crates/core/src/dataset.rs
index dbeafcd9..2a577033 100644
--- a/crates/core/src/dataset.rs
+++ b/crates/core/src/dataset.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use async_trait::async_trait;
@@ -62,12 +61,6 @@ impl Dataset {
#[async_trait]
impl TableProvider for Dataset {
- /// Returns the table provider as [`Any`](std::any::Any) so that it can be
- /// downcast to a specific implementation.
- fn as_any(&self) -> &dyn Any {
- self
- }
-
/// Get a reference to the schema for this table
fn schema(&self) -> SchemaRef {
Python::attach(|py| {
diff --git a/crates/core/src/dataset_exec.rs b/crates/core/src/dataset_exec.rs
index a7dd1500..771119a0 100644
--- a/crates/core/src/dataset_exec.rs
+++ b/crates/core/src/dataset_exec.rs
@@ -15,18 +15,18 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use datafusion::arrow::datatypes::SchemaRef;
use datafusion::arrow::error::{ArrowError, Result as ArrowResult};
use datafusion::arrow::pyarrow::PyArrowType;
use datafusion::arrow::record_batch::RecordBatch;
+use datafusion::common::tree_node::TreeNodeRecursion;
use datafusion::error::{DataFusionError as InnerDataFusionError, Result as
DFResult};
use datafusion::execution::context::TaskContext;
use datafusion::logical_expr::Expr;
use datafusion::logical_expr::utils::conjunction;
-use datafusion::physical_expr::{EquivalenceProperties, LexOrdering};
+use datafusion::physical_expr::{EquivalenceProperties, LexOrdering,
PhysicalExpr};
use datafusion::physical_plan::execution_plan::{Boundedness, EmissionType};
use datafusion::physical_plan::stream::RecordBatchStreamAdapter;
use datafusion::physical_plan::{
@@ -156,11 +156,6 @@ impl ExecutionPlan for DatasetExec {
Self::static_name()
}
- /// Return a reference to Any that can be used for downcasting
- fn as_any(&self) -> &dyn Any {
- self
- }
-
/// Get the schema for this execution plan
fn schema(&self) -> SchemaRef {
self.schema.clone()
@@ -235,8 +230,15 @@ impl ExecutionPlan for DatasetExec {
})
}
- fn partition_statistics(&self, _partition: Option<usize>) ->
DFResult<Statistics> {
- Ok(self.projected_statistics.clone())
+ fn partition_statistics(&self, _partition: Option<usize>) ->
DFResult<Arc<Statistics>> {
+ Ok(Arc::new(self.projected_statistics.clone()))
+ }
+
+ fn apply_expressions(
+ &self,
+ _f: &mut dyn FnMut(&dyn PhysicalExpr) -> DFResult<TreeNodeRecursion>,
+ ) -> DFResult<TreeNodeRecursion> {
+ Ok(TreeNodeRecursion::Continue)
}
fn properties(&self) -> &Arc<PlanProperties> {
diff --git a/crates/core/src/expr.rs b/crates/core/src/expr.rs
index 2e633bae..eac571a1 100644
--- a/crates/core/src/expr.rs
+++ b/crates/core/src/expr.rs
@@ -23,8 +23,8 @@ use datafusion::arrow::datatypes::{DataType, Field};
use datafusion::arrow::pyarrow::PyArrowType;
use datafusion::functions::core::expr_ext::FieldAccessor;
use datafusion::logical_expr::expr::{
- AggregateFunction, AggregateFunctionParams, FieldMetadata, InList,
InSubquery, ScalarFunction,
- SetComparison, WindowFunction,
+ AggregateFunction, AggregateFunctionParams, FieldMetadata,
HigherOrderFunction, InList,
+ InSubquery, Lambda, ScalarFunction, SetComparison, WindowFunction,
};
use datafusion::logical_expr::utils::exprlist_to_fields;
use datafusion::logical_expr::{
@@ -91,9 +91,12 @@ pub mod explain;
pub mod extension;
pub mod filter;
pub mod grouping_set;
+pub mod higher_order_function;
pub mod in_list;
pub mod in_subquery;
pub mod join;
+pub mod lambda;
+pub mod lambda_variable;
pub mod like;
pub mod limit;
pub mod literal;
@@ -226,6 +229,14 @@ impl PyExpr {
Expr::SetComparison(value) => {
Ok(set_comparison::PySetComparison::from(value.clone()).into_bound_py_any(py)?)
}
+ Expr::HigherOrderFunction(value) => Ok(
+
higher_order_function::PyHigherOrderFunction::from(value.clone())
+ .into_bound_py_any(py)?,
+ ),
+ Expr::Lambda(value) =>
Ok(lambda::PyLambda::from(value.clone()).into_bound_py_any(py)?),
+ Expr::LambdaVariable(value) => {
+
Ok(lambda_variable::PyLambdaVariable::from(value.clone()).into_bound_py_any(py)?)
+ }
})
}
@@ -393,7 +404,10 @@ impl PyExpr {
| Expr::OuterReferenceColumn(_, _)
| Expr::Unnest(_)
| Expr::IsNotUnknown(_)
- | Expr::SetComparison(_) => RexType::Call,
+ | Expr::SetComparison(_)
+ | Expr::HigherOrderFunction(..)
+ | Expr::Lambda(..) => RexType::Call,
+ Expr::LambdaVariable(..) => RexType::Reference,
Expr::ScalarSubquery(..) => RexType::ScalarSubquery,
#[allow(deprecated)]
Expr::Wildcard { .. } => {
@@ -425,9 +439,10 @@ impl PyExpr {
pub fn rex_call_operands(&self) -> PyResult<Vec<PyExpr>> {
match &self.expr {
// Expr variants that are themselves the operand to return
- Expr::Column(..) | Expr::ScalarVariable(..) | Expr::Literal(..) =>
{
- Ok(vec![PyExpr::from(self.expr.clone())])
- }
+ Expr::Column(..)
+ | Expr::ScalarVariable(..)
+ | Expr::Literal(..)
+ | Expr::LambdaVariable(..) =>
Ok(vec![PyExpr::from(self.expr.clone())]),
Expr::Alias(alias) => Ok(vec![PyExpr::from(*alias.expr.clone())]),
@@ -454,13 +469,15 @@ impl PyExpr {
params: AggregateFunctionParams { args, .. },
..
})
- | Expr::ScalarFunction(ScalarFunction { args, .. }) => {
+ | Expr::ScalarFunction(ScalarFunction { args, .. })
+ | Expr::HigherOrderFunction(HigherOrderFunction { args, .. }) => {
Ok(args.iter().map(|arg| PyExpr::from(arg.clone())).collect())
}
Expr::WindowFunction(boxed_window_fn) => {
let args = &boxed_window_fn.params.args;
Ok(args.iter().map(|arg| PyExpr::from(arg.clone())).collect())
}
+ Expr::Lambda(Lambda { body, .. }) =>
Ok(vec![PyExpr::from(*body.clone())]),
// Expr(s) that require more specific processing
Expr::Case(Case {
@@ -550,6 +567,10 @@ impl PyExpr {
right: _,
}) => format!("{op}"),
Expr::ScalarFunction(ScalarFunction { func, args: _ }) =>
func.name().to_string(),
+ Expr::HigherOrderFunction(HigherOrderFunction { func, args: _ })
=> {
+ func.name().to_string()
+ }
+ Expr::Lambda(..) => "lambda".to_string(),
Expr::Cast { .. } => "cast".to_string(),
Expr::Between { .. } => "between".to_string(),
Expr::Case { .. } => "case".to_string(),
@@ -837,7 +858,9 @@ impl PyExpr {
| Operator::QuestionPipe
| Operator::Colon => Err(py_type_err(format!("Unsupported
expr: ${op}"))),
},
- Expr::Cast(Cast { expr: _, data_type }) =>
DataTypeMap::map_from_arrow_type(data_type),
+ Expr::Cast(Cast { expr: _, field }) => {
+ DataTypeMap::map_from_arrow_type(field.data_type())
+ }
Expr::Literal(scalar_value, _) =>
DataTypeMap::map_from_scalar_value(scalar_value),
_ => Err(py_type_err(format!(
"Non Expr::Literal encountered in types: {expr:?}"
@@ -893,6 +916,9 @@ pub(crate) fn init_module(m: &Bound<'_, PyModule>) ->
PyResult<()> {
m.add_class::<union::PyUnion>()?;
m.add_class::<unnest::PyUnnest>()?;
m.add_class::<unnest_expr::PyUnnestExpr>()?;
+ m.add_class::<higher_order_function::PyHigherOrderFunction>()?;
+ m.add_class::<lambda::PyLambda>()?;
+ m.add_class::<lambda_variable::PyLambdaVariable>()?;
m.add_class::<extension::PyExtension>()?;
m.add_class::<filter::PyFilter>()?;
m.add_class::<projection::PyProjection>()?;
diff --git a/crates/core/src/expr/cast.rs b/crates/core/src/expr/cast.rs
index 37d60353..484d0c05 100644
--- a/crates/core/src/expr/cast.rs
+++ b/crates/core/src/expr/cast.rs
@@ -52,7 +52,7 @@ impl PyCast {
}
fn data_type(&self) -> PyResult<PyDataType> {
- Ok(self.cast.data_type.clone().into())
+ Ok(self.cast.field.data_type().clone().into())
}
}
@@ -81,6 +81,6 @@ impl PyTryCast {
}
fn data_type(&self) -> PyResult<PyDataType> {
- Ok(self.try_cast.data_type.clone().into())
+ Ok(self.try_cast.field.data_type().clone().into())
}
}
diff --git a/crates/core/src/expr/higher_order_function.rs
b/crates/core/src/expr/higher_order_function.rs
new file mode 100644
index 00000000..91a94de2
--- /dev/null
+++ b/crates/core/src/expr/higher_order_function.rs
@@ -0,0 +1,84 @@
+// 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::fmt::{self, Display, Formatter};
+
+use datafusion::logical_expr::expr::HigherOrderFunction;
+use pyo3::prelude::*;
+
+use super::PyExpr;
+
+#[pyclass(
+ from_py_object,
+ frozen,
+ name = "HigherOrderFunction",
+ module = "datafusion.expr",
+ subclass
+)]
+#[derive(Clone)]
+pub struct PyHigherOrderFunction {
+ higher_order: HigherOrderFunction,
+}
+
+impl From<HigherOrderFunction> for PyHigherOrderFunction {
+ fn from(higher_order: HigherOrderFunction) -> PyHigherOrderFunction {
+ PyHigherOrderFunction { higher_order }
+ }
+}
+
+impl From<PyHigherOrderFunction> for HigherOrderFunction {
+ fn from(higher_order: PyHigherOrderFunction) -> Self {
+ higher_order.higher_order
+ }
+}
+
+impl Display for PyHigherOrderFunction {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ write!(
+ f,
+ "HigherOrderFunction(name={}, args={:?})",
+ self.higher_order.name(),
+ &self.higher_order.args,
+ )
+ }
+}
+
+#[pymethods]
+impl PyHigherOrderFunction {
+ /// Name of the higher-order function being invoked.
+ fn name(&self) -> String {
+ self.higher_order.name().to_string()
+ }
+
+ /// Arguments passed to the higher-order function. Some entries may be
+ /// `Lambda` expressions; others are ordinary value expressions.
+ fn args(&self) -> Vec<PyExpr> {
+ self.higher_order
+ .args
+ .iter()
+ .map(|e| PyExpr::from(e.clone()))
+ .collect()
+ }
+
+ fn __repr__(&self) -> PyResult<String> {
+ Ok(format!("HigherOrderFunction({self})"))
+ }
+
+ fn __name__(&self) -> PyResult<String> {
+ Ok("HigherOrderFunction".to_string())
+ }
+}
diff --git a/crates/core/src/expr/lambda.rs b/crates/core/src/expr/lambda.rs
new file mode 100644
index 00000000..3ebc6e61
--- /dev/null
+++ b/crates/core/src/expr/lambda.rs
@@ -0,0 +1,78 @@
+// 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::fmt::{self, Display, Formatter};
+
+use datafusion::logical_expr::expr::Lambda;
+use pyo3::prelude::*;
+
+use super::PyExpr;
+
+#[pyclass(
+ from_py_object,
+ frozen,
+ name = "Lambda",
+ module = "datafusion.expr",
+ subclass
+)]
+#[derive(Clone)]
+pub struct PyLambda {
+ lambda: Lambda,
+}
+
+impl From<Lambda> for PyLambda {
+ fn from(lambda: Lambda) -> PyLambda {
+ PyLambda { lambda }
+ }
+}
+
+impl From<PyLambda> for Lambda {
+ fn from(lambda: PyLambda) -> Self {
+ lambda.lambda
+ }
+}
+
+impl Display for PyLambda {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ write!(
+ f,
+ "Lambda(params={:?}, body={:?})",
+ &self.lambda.params, &self.lambda.body,
+ )
+ }
+}
+
+#[pymethods]
+impl PyLambda {
+ /// Parameter names of the lambda.
+ fn params(&self) -> Vec<String> {
+ self.lambda.params.clone()
+ }
+
+ /// Body expression of the lambda.
+ fn body(&self) -> PyExpr {
+ (*self.lambda.body).clone().into()
+ }
+
+ fn __repr__(&self) -> PyResult<String> {
+ Ok(format!("Lambda({self})"))
+ }
+
+ fn __name__(&self) -> PyResult<String> {
+ Ok("Lambda".to_string())
+ }
+}
diff --git a/crates/core/src/expr/lambda_variable.rs
b/crates/core/src/expr/lambda_variable.rs
new file mode 100644
index 00000000..2ef554e1
--- /dev/null
+++ b/crates/core/src/expr/lambda_variable.rs
@@ -0,0 +1,67 @@
+// 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::fmt::{self, Display, Formatter};
+
+use datafusion::logical_expr::expr::LambdaVariable;
+use pyo3::prelude::*;
+
+#[pyclass(
+ from_py_object,
+ frozen,
+ name = "LambdaVariable",
+ module = "datafusion.expr",
+ subclass
+)]
+#[derive(Clone)]
+pub struct PyLambdaVariable {
+ variable: LambdaVariable,
+}
+
+impl From<LambdaVariable> for PyLambdaVariable {
+ fn from(variable: LambdaVariable) -> PyLambdaVariable {
+ PyLambdaVariable { variable }
+ }
+}
+
+impl From<PyLambdaVariable> for LambdaVariable {
+ fn from(variable: PyLambdaVariable) -> Self {
+ variable.variable
+ }
+}
+
+impl Display for PyLambdaVariable {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ write!(f, "LambdaVariable({})", &self.variable.name)
+ }
+}
+
+#[pymethods]
+impl PyLambdaVariable {
+ /// Reference name of the lambda parameter.
+ fn name(&self) -> String {
+ self.variable.name.clone()
+ }
+
+ fn __repr__(&self) -> PyResult<String> {
+ Ok(format!("LambdaVariable({self})"))
+ }
+
+ fn __name__(&self) -> PyResult<String> {
+ Ok("LambdaVariable".to_string())
+ }
+}
diff --git a/crates/core/src/table.rs b/crates/core/src/table.rs
index 62334977..e0f0f0d1 100644
--- a/crates/core/src/table.rs
+++ b/crates/core/src/table.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use arrow::datatypes::SchemaRef;
@@ -150,10 +149,6 @@ impl TempViewTable {
#[async_trait]
impl TableProvider for TempViewTable {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn schema(&self) -> SchemaRef {
Arc::new(self.df.schema().as_arrow().clone())
}
diff --git a/crates/core/src/udf.rs b/crates/core/src/udf.rs
index c0a39cb4..d48bc729 100644
--- a/crates/core/src/udf.rs
+++ b/crates/core/src/udf.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::hash::{Hash, Hasher};
use std::ptr::NonNull;
use std::sync::Arc;
@@ -94,10 +93,6 @@ impl Hash for PythonFunctionScalarUDF {
}
impl ScalarUDFImpl for PythonFunctionScalarUDF {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn name(&self) -> &str {
&self.name
}
diff --git a/crates/core/src/udtf.rs b/crates/core/src/udtf.rs
index 9371732d..b3de25e5 100644
--- a/crates/core/src/udtf.rs
+++ b/crates/core/src/udtf.rs
@@ -18,7 +18,7 @@
use std::ptr::NonNull;
use std::sync::Arc;
-use datafusion::catalog::{TableFunctionImpl, TableProvider};
+use datafusion::catalog::{TableFunctionArgs, TableFunctionImpl, TableProvider};
use datafusion::error::Result as DataFusionResult;
use datafusion::logical_expr::Expr;
use datafusion_ffi::udtf::FFI_TableFunction;
@@ -93,7 +93,11 @@ impl PyTableFunction {
#[pyo3(signature = (*args))]
pub fn __call__(&self, args: Vec<PyExpr>) -> PyResult<PyTable> {
let args: Vec<Expr> = args.iter().map(|e| e.expr.clone()).collect();
- let table_provider = self.call(&args).map_err(py_datafusion_err)?;
+ let global = PySessionContext::global_ctx()?;
+ let state = global.ctx.state();
+ let table_provider = self
+ .call_with_args(TableFunctionArgs::new(&args, &state))
+ .map_err(py_datafusion_err)?;
Ok(PyTable::from(table_provider))
}
@@ -125,10 +129,12 @@ fn call_python_table_function(
}
impl TableFunctionImpl for PyTableFunction {
- fn call(&self, args: &[Expr]) -> DataFusionResult<Arc<dyn TableProvider>> {
+ fn call_with_args(&self, args: TableFunctionArgs) ->
DataFusionResult<Arc<dyn TableProvider>> {
match &self.inner {
- PyTableFunctionInner::FFIFunction(func) => func.call(args),
- PyTableFunctionInner::PythonFunction(obj) =>
call_python_table_function(obj, args),
+ PyTableFunctionInner::FFIFunction(func) =>
func.call_with_args(args),
+ PyTableFunctionInner::PythonFunction(obj) => {
+ call_python_table_function(obj, args.exprs())
+ }
}
}
}
diff --git a/crates/core/src/udwf.rs b/crates/core/src/udwf.rs
index 1d3608ad..40e6208c 100644
--- a/crates/core/src/udwf.rs
+++ b/crates/core/src/udwf.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::ops::Range;
use std::ptr::NonNull;
use std::sync::Arc;
@@ -317,10 +316,6 @@ impl MultiColumnWindowUDF {
}
impl WindowUDFImpl for MultiColumnWindowUDF {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn name(&self) -> &str {
&self.name
}
diff --git
a/examples/datafusion-ffi-example/python/tests/_test_schema_provider.py
b/examples/datafusion-ffi-example/python/tests/_test_schema_provider.py
index 93449c66..c4a94348 100644
--- a/examples/datafusion-ffi-example/python/tests/_test_schema_provider.py
+++ b/examples/datafusion-ffi-example/python/tests/_test_schema_provider.py
@@ -63,15 +63,18 @@ def test_schema_provider_extract_values(inner_capsule:
bool) -> None:
result =
ctx.table(f"{expected_schema_name}.{expected_table_name}").collect()
assert len(result) == 2
+ # Multi-partition collect order is non-deterministic; sort batches by
+ # first value of col0 so col0 and col1 stay aligned.
+ result = sorted(result, key=lambda r: r.column(0)[0].as_py())
col0_result = [r.column(0) for r in result]
col1_result = [r.column(1) for r in result]
expected_col0 = [
- pa.array([10, 20, 30], type=pa.int32()),
pa.array([5, 7], type=pa.int32()),
+ pa.array([10, 20, 30], type=pa.int32()),
]
expected_col1 = [
- pa.array([1, 2, 5], type=pa.float64()),
pa.array([1.5, 2.5], type=pa.float64()),
+ pa.array([1, 2, 5], type=pa.float64()),
]
assert col0_result == expected_col0
assert col1_result == expected_col1
diff --git
a/examples/datafusion-ffi-example/python/tests/_test_table_function.py
b/examples/datafusion-ffi-example/python/tests/_test_table_function.py
index bf5aae3b..de4662dd 100644
--- a/examples/datafusion-ffi-example/python/tests/_test_table_function.py
+++ b/examples/datafusion-ffi-example/python/tests/_test_table_function.py
@@ -39,7 +39,8 @@ def test_ffi_table_function_register() -> None:
assert result[0].num_columns == 4
print(result)
- result = [r.column(0) for r in result]
+ # Multi-partition collect order is non-deterministic; sort by first value.
+ result = sorted((r.column(0) for r in result), key=lambda a: a[0].as_py())
expected = [
pa.array([0, 1, 2], type=pa.int32()),
pa.array([3, 4, 5, 6], type=pa.int32()),
@@ -61,7 +62,7 @@ def test_ffi_table_function_call_directly():
assert result[0].num_columns == 4
print(result)
- result = [r.column(0) for r in result]
+ result = sorted((r.column(0) for r in result), key=lambda a: a[0].as_py())
expected = [
pa.array([0, 1, 2], type=pa.int32()),
pa.array([3, 4, 5, 6], type=pa.int32()),
@@ -96,7 +97,7 @@ def common_table_function_test(test_ctx: SessionContext) ->
None:
assert result[0].num_columns == 3
print(result)
- result = [r.column(0) for r in result]
+ result = sorted((r.column(0) for r in result), key=lambda a: a[0].as_py())
expected = [
pa.array([0, 1], type=pa.int32()),
pa.array([2, 3, 4], type=pa.int32()),
diff --git
a/examples/datafusion-ffi-example/python/tests/_test_table_provider.py
b/examples/datafusion-ffi-example/python/tests/_test_table_provider.py
index fc77d2d3..aee16f83 100644
--- a/examples/datafusion-ffi-example/python/tests/_test_table_provider.py
+++ b/examples/datafusion-ffi-example/python/tests/_test_table_provider.py
@@ -36,7 +36,9 @@ def test_table_provider_ffi(inner_capsule: bool) -> None:
assert len(result) == 4
assert result[0].num_columns == 3
- result = [r.column(0) for r in result]
+ # Multi-partition collect order is non-deterministic; sort by first value
+ # in column 0, which is unique per partition (0, 2, 4, 6).
+ result = sorted((r.column(0) for r in result), key=lambda a: a[0].as_py())
expected = [
pa.array([0, 1], type=pa.int32()),
pa.array([2, 3, 4], type=pa.int32()),
@@ -47,5 +49,5 @@ def test_table_provider_ffi(inner_capsule: bool) -> None:
assert result == expected
result = ctx.read_table(table).collect()
- result = [r.column(0) for r in result]
+ result = sorted((r.column(0) for r in result), key=lambda a: a[0].as_py())
assert result == expected
diff --git a/examples/datafusion-ffi-example/src/aggregate_udf.rs
b/examples/datafusion-ffi-example/src/aggregate_udf.rs
index d5343ff9..86737778 100644
--- a/examples/datafusion-ffi-example/src/aggregate_udf.rs
+++ b/examples/datafusion-ffi-example/src/aggregate_udf.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use arrow_schema::DataType;
@@ -61,10 +60,6 @@ impl MySumUDF {
}
impl AggregateUDFImpl for MySumUDF {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn name(&self) -> &str {
"my_custom_sum"
}
diff --git a/examples/datafusion-ffi-example/src/catalog_provider.rs
b/examples/datafusion-ffi-example/src/catalog_provider.rs
index bd5da1e4..6131ab0f 100644
--- a/examples/datafusion-ffi-example/src/catalog_provider.rs
+++ b/examples/datafusion-ffi-example/src/catalog_provider.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::fmt::Debug;
use std::sync::Arc;
@@ -106,10 +105,6 @@ impl FixedSchemaProvider {
#[async_trait]
impl SchemaProvider for FixedSchemaProvider {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn table_names(&self) -> Vec<String> {
self.inner.table_names()
}
@@ -149,10 +144,6 @@ pub(crate) struct MyCatalogProvider {
}
impl CatalogProvider for MyCatalogProvider {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn schema_names(&self) -> Vec<String> {
self.inner.schema_names()
}
@@ -220,10 +211,6 @@ pub(crate) struct MyCatalogProviderList {
}
impl CatalogProviderList for MyCatalogProviderList {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn catalog_names(&self) -> Vec<String> {
self.inner.catalog_names()
}
diff --git a/examples/datafusion-ffi-example/src/scalar_udf.rs
b/examples/datafusion-ffi-example/src/scalar_udf.rs
index 37492478..a3c65e87 100644
--- a/examples/datafusion-ffi-example/src/scalar_udf.rs
+++ b/examples/datafusion-ffi-example/src/scalar_udf.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use arrow_array::{Array, BooleanArray};
@@ -61,10 +60,6 @@ impl IsNullUDF {
}
impl ScalarUDFImpl for IsNullUDF {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn name(&self) -> &str {
"my_custom_is_null"
}
diff --git a/examples/datafusion-ffi-example/src/window_udf.rs
b/examples/datafusion-ffi-example/src/window_udf.rs
index cbf179a8..f33a166e 100644
--- a/examples/datafusion-ffi-example/src/window_udf.rs
+++ b/examples/datafusion-ffi-example/src/window_udf.rs
@@ -15,7 +15,6 @@
// specific language governing permissions and limitations
// under the License.
-use std::any::Any;
use std::sync::Arc;
use arrow_schema::{DataType, FieldRef};
@@ -56,10 +55,6 @@ impl MyRankUDF {
}
impl WindowUDFImpl for MyRankUDF {
- fn as_any(&self) -> &dyn Any {
- self
- }
-
fn name(&self) -> &str {
"my_custom_rank"
}
diff --git a/python/datafusion/__init__.py b/python/datafusion/__init__.py
index f08b464b..601419fa 100644
--- a/python/datafusion/__init__.py
+++ b/python/datafusion/__init__.py
@@ -69,7 +69,12 @@ from . import functions, object_store, substrait, unparser
# The following imports are okay to remain as opaque to the user.
from ._internal import Config
-from .catalog import Catalog, Table
+from .catalog import (
+ Catalog,
+ Table,
+ TableProviderFactory,
+ TableProviderFactoryExportable,
+)
from .col import col, column
from .common import DFSchema
from .context import (
@@ -133,6 +138,8 @@ __all__ = [
"SessionContext",
"Table",
"TableFunction",
+ "TableProviderFactory",
+ "TableProviderFactoryExportable",
"WindowFrame",
"WindowUDF",
"catalog",
diff --git a/python/datafusion/dataframe.py b/python/datafusion/dataframe.py
index 2b07861d..9ac8293d 100644
--- a/python/datafusion/dataframe.py
+++ b/python/datafusion/dataframe.py
@@ -523,6 +523,32 @@ class DataFrame:
"""
return self.df.select_exprs(*args)
+ def alias(self, alias: str) -> DataFrame:
+ """Assign a table alias to this :py:class:`DataFrame`.
+
+ Replaces the qualifiers of the output columns with ``alias``. Useful
for
+ self-joins and any situation that needs an unambiguous table-style
+ qualifier (``alias.col``) for downstream references.
+
+ Args:
+ alias: Table alias to apply to the DataFrame's columns.
+
+ Returns:
+ DataFrame with columns re-qualified under ``alias``.
+
+ Example:
+ >>> from datafusion import col
+ >>> ctx = dfn.SessionContext()
+ >>> df = ctx.from_pydict({"id": [1, 2], "val": [10, 20]})
+ >>> left = df.alias("l")
+ >>> right = df.alias("r")
+ >>> left.join(right, left_on="id", right_on="id").select(
+ ... "id", col("l.val").alias("lval"),
col("r.val").alias("rval")
+ ... ).sort("id").to_pydict()
+ {'id': [1, 2], 'lval': [10, 20], 'rval': [10, 20]}
+ """
+ return DataFrame(self.df.alias(alias))
+
def select(self, *exprs: Expr | str) -> DataFrame:
"""Project arbitrary expressions into a new :py:class:`DataFrame`.
diff --git a/python/datafusion/expr.py b/python/datafusion/expr.py
index e0135e3e..55cc2e52 100644
--- a/python/datafusion/expr.py
+++ b/python/datafusion/expr.py
@@ -150,6 +150,9 @@ TransactionIsolationLevel =
expr_internal.TransactionIsolationLevel
TransactionStart = expr_internal.TransactionStart
TryCast = expr_internal.TryCast
Union = expr_internal.Union
+HigherOrderFunction = expr_internal.HigherOrderFunction
+Lambda = expr_internal.Lambda
+LambdaVariable = expr_internal.LambdaVariable
Unnest = expr_internal.Unnest
UnnestExpr = expr_internal.UnnestExpr
Values = expr_internal.Values
@@ -193,6 +196,7 @@ __all__ = [
"FileType",
"Filter",
"GroupingSet",
+ "HigherOrderFunction",
"ILike",
"InList",
"InSubquery",
@@ -207,6 +211,8 @@ __all__ = [
"Join",
"JoinConstraint",
"JoinType",
+ "Lambda",
+ "LambdaVariable",
"Like",
"Limit",
"Literal",
diff --git a/python/datafusion/functions.py b/python/datafusion/functions.py
index 08062851..9761d187 100644
--- a/python/datafusion/functions.py
+++ b/python/datafusion/functions.py
@@ -184,6 +184,7 @@ __all__ = [
"ifnull",
"in_list",
"initcap",
+ "instr",
"isnan",
"iszero",
"lag",
@@ -273,6 +274,7 @@ __all__ = [
"percent_rank",
"percentile_cont",
"pi",
+ "position",
"pow",
"power",
"quantile_cont",
@@ -3874,7 +3876,7 @@ def arrays_zip(*arrays: Expr) -> Expr:
>>> result = df.select(
... dfn.functions.arrays_zip(dfn.col("a"),
dfn.col("b")).alias("result"))
>>> result.collect_column("result")[0].as_py()
- [{'c0': 1, 'c1': 3}, {'c0': 2, 'c1': 4}]
+ [{'1': 1, '2': 3}, {'1': 2, '2': 4}]
"""
args = [a.expr for a in arrays]
return Expr(f.arrays_zip(args))
diff --git a/python/tests/test_aggregation.py b/python/tests/test_aggregation.py
index 24033284..f5c54f75 100644
--- a/python/tests/test_aggregation.py
+++ b/python/tests/test_aggregation.py
@@ -125,18 +125,34 @@ def test_aggregation_stats(df, agg_expr, calc_expected):
pa.array([1], type=pa.uint64()),
False,
),
- (f.approx_median(column("b")), pa.array([4]), False),
- (f.median(column("b"), distinct=True), pa.array([5]), False),
- (f.median(column("b"), filter=column("a") != 2), pa.array([5]), False),
- (f.approx_median(column("b"), filter=column("a") != 2), pa.array([5]),
False),
- (f.approx_percentile_cont(column("b"), 0.5), pa.array([4]), False),
+ (f.approx_median(column("b")), pa.array([4], type=pa.float64()),
False),
+ (
+ f.median(column("b"), distinct=True),
+ pa.array([5], type=pa.float64()),
+ False,
+ ),
+ (
+ f.median(column("b"), filter=column("a") != 2),
+ pa.array([5], type=pa.float64()),
+ False,
+ ),
+ (
+ f.approx_median(column("b"), filter=column("a") != 2),
+ pa.array([5], type=pa.float64()),
+ False,
+ ),
+ (
+ f.approx_percentile_cont(column("b"), 0.5),
+ pa.array([4], type=pa.float64()),
+ False,
+ ),
(
f.approx_percentile_cont(
column("b").sort(ascending=True, nulls_first=False),
0.5,
num_centroids=2,
),
- pa.array([4]),
+ pa.array([4.75], type=pa.float64()),
False,
),
(
@@ -212,19 +228,19 @@ def test_aggregation(df, agg_expr, expected, array_sort):
(
"approx_percentile_cont",
f.approx_percentile_cont(column("c3"), 0.95, num_centroids=200),
- [73, 68, 122, 124, 115],
+ [73.55, 68.0, 122.5, 124.2, 115.6],
),
(
"approx_perc_cont_few_centroids",
f.approx_percentile_cont(column("c3"), 0.95, num_centroids=5),
- [72, 68, 119, 124, 115],
+ [72.775, 68.0, 119.4075, 124.825, 115.44],
),
(
"approx_perc_cont_filtered",
f.approx_percentile_cont(
column("c3"), 0.95, num_centroids=200, filter=column("c3") >
lit(0)
),
- [83, 68, 122, 124, 117],
+ [83.0, 68.0, 122.75, 124.9, 117.6],
),
(
"corr",
diff --git a/python/tests/test_dataframe.py b/python/tests/test_dataframe.py
index 9e2f791e..6bd0ce9f 100644
--- a/python/tests/test_dataframe.py
+++ b/python/tests/test_dataframe.py
@@ -292,6 +292,20 @@ def test_select_exprs(df):
assert result.column(1) == pa.array([3, 3, 3])
+def test_alias_self_join(df):
+ left = df.alias("l")
+ right = df.alias("r")
+ joined = left.join(right, left_on="a", right_on="a").select(
+ "a",
+ column("l.b").alias("lb"),
+ column("r.b").alias("rb"),
+ )
+ result = joined.sort(column("a")).collect()[0]
+ assert result.column(0) == pa.array([1, 2, 3])
+ assert result.column(1) == pa.array([4, 5, 6])
+ assert result.column(2) == pa.array([4, 5, 6])
+
+
def test_drop_quoted_columns():
ctx = SessionContext()
batch = pa.RecordBatch.from_arrays([pa.array([1, 2, 3])],
names=["ID_For_Students"])
diff --git a/python/tests/test_expr.py b/python/tests/test_expr.py
index 6a466f6f..cf1fe43e 100644
--- a/python/tests/test_expr.py
+++ b/python/tests/test_expr.py
@@ -172,7 +172,10 @@ def test_relational_expr(test_ctx):
assert df.filter(col("b") == "beta").count() == 1
assert df.filter(col("b") != "beta").count() == 2
- assert df.filter(col("a") == "beta").count() == 0
+ # Upstream DataFusion now errors on string→Int64 implicit cast in filter
+ # (previously silently produced 0 matches).
+ with pytest.raises(Exception, match="Cannot cast string 'beta'"):
+ df.filter(col("a") == "beta").count()
assert df.filter(col("a") == None).count() == 1 # noqa: E711
assert df.filter(col("a") != None).count() == 3 # noqa: E711
assert df.filter(col("b") == None).count() == 1 # noqa: E711
@@ -613,7 +616,7 @@ def test_alias_with_metadata(df):
#
pytest.param(
col("c").reverse(),
- pa.array(["olleH", " dlrow ", "!", None], type=pa.string()),
+ pa.array(["olleH", " dlrow ", "!", None], type=pa.string_view()),
id="reverse",
),
pytest.param(
@@ -633,7 +636,7 @@ def test_alias_with_metadata(df):
),
pytest.param(
col("c").lower(),
- pa.array(["hello", " world ", "!", None], type=pa.string()),
+ pa.array(["hello", " world ", "!", None], type=pa.string_view()),
id="lower",
),
pytest.param(
@@ -767,7 +770,7 @@ def test_alias_with_metadata(df):
),
pytest.param(
col("c").upper(),
- pa.array(["HELLO", " WORLD ", "!", None], type=pa.string()),
+ pa.array(["HELLO", " WORLD ", "!", None], type=pa.string_view()),
id="upper",
),
pytest.param(
diff --git a/python/tests/test_functions.py b/python/tests/test_functions.py
index d9781b1f..5538fc33 100644
--- a/python/tests/test_functions.py
+++ b/python/tests/test_functions.py
@@ -836,7 +836,7 @@ def test_map_functions(func, expected):
(f.chr(literal(68)), pa.array(["D", "D", "D"])),
(
f.concat_ws("-", column("a"), literal("test")),
- pa.array(["Hello-test", "World-test", "!-test"]),
+ pa.array(["Hello-test", "World-test", "!-test"],
type=pa.string_view()),
),
(
f.concat(column("a").cast(pa.string()), literal("?")),
@@ -851,7 +851,10 @@ def test_map_functions(func, expected):
pa.array(["Hel", "Wor", "!"], type=pa.string_view()),
),
(f.length(column("c")), pa.array([6, 7, 2], type=pa.int32())),
- (f.lower(column("a")), pa.array(["hello", "world", "!"])),
+ (
+ f.lower(column("a")),
+ pa.array(["hello", "world", "!"], type=pa.string_view()),
+ ),
(f.lpad(column("a"), literal(7)), pa.array([" Hello", " World", "
!"])),
(
f.ltrim(column("c")),
@@ -871,13 +874,16 @@ def test_map_functions(func, expected):
(f.octet_length(column("a")), pa.array([5, 5, 1], type=pa.int32())),
(
f.repeat(column("a"), literal(2)),
- pa.array(["HelloHello", "WorldWorld", "!!"]),
+ pa.array(["HelloHello", "WorldWorld", "!!"],
type=pa.string_view()),
),
(
f.replace(column("a"), literal("l"), literal("?")),
pa.array(["He??o", "Wor?d", "!"]),
),
- (f.reverse(column("a")), pa.array(["olleH", "dlroW", "!"])),
+ (
+ f.reverse(column("a")),
+ pa.array(["olleH", "dlroW", "!"], type=pa.string_view()),
+ ),
(
f.right(column("a"), literal(4)),
pa.array(["ello", "orld", "!"], type=pa.string_view()),
@@ -892,7 +898,7 @@ def test_map_functions(func, expected):
),
(
f.split_part(column("a"), literal("l"), literal(1)),
- pa.array(["He", "Wor", "!"]),
+ pa.array(["He", "Wor", "!"], type=pa.string_view()),
),
(f.contains(column("a"), literal("ell")), pa.array([True, False,
False])),
(f.starts_with(column("a"), literal("Wor")), pa.array([False, True,
False])),
@@ -903,14 +909,17 @@ def test_map_functions(func, expected):
),
(
f.translate(column("a"), literal("or"), literal("ld")),
- pa.array(["Helll", "Wldld", "!"]),
+ pa.array(["Helll", "Wldld", "!"], type=pa.string_view()),
),
(f.trim(column("c")), pa.array(["hello", "world", "!"],
type=pa.string_view())),
- (f.upper(column("c")), pa.array(["HELLO ", " WORLD ", " !"])),
+ (
+ f.upper(column("c")),
+ pa.array(["HELLO ", " WORLD ", " !"], type=pa.string_view()),
+ ),
(f.ends_with(column("a"), literal("llo")), pa.array([True, False,
False])),
(
f.overlay(column("a"), literal("--"), literal(2)),
- pa.array(["H--lo", "W--ld", "--"]),
+ pa.array(["H--lo", "W--ld", "!--"]),
),
(
f.regexp_like(column("a"), literal("(ell|orl)")),
@@ -2063,7 +2072,7 @@ def test_arrays_zip_aliases(func):
df = ctx.from_pydict({"a": [[1, 2]], "b": [[3, 4]]})
result = df.select(func(column("a"), column("b")).alias("v")).collect()
values = result[0].column(0)[0].as_py()
- assert values == [{"c0": 1, "c1": 3}, {"c0": 2, "c1": 4}]
+ assert values == [{"1": 1, "2": 3}, {"1": 2, "2": 4}]
@pytest.mark.parametrize("func", [f.string_to_array, f.string_to_list])
diff --git a/python/tests/test_imports.py b/python/tests/test_imports.py
index fca94b35..fea4cc91 100644
--- a/python/tests/test_imports.py
+++ b/python/tests/test_imports.py
@@ -22,6 +22,8 @@ from datafusion import (
DataFrame,
ScalarUDF,
SessionContext,
+ TableProviderFactory,
+ TableProviderFactoryExportable,
functions,
)
from datafusion.common import (
@@ -47,6 +49,7 @@ from datafusion.expr import (
Extension,
Filter,
GroupingSet,
+ HigherOrderFunction,
ILike,
InList,
InSubquery,
@@ -60,6 +63,8 @@ from datafusion.expr import (
Join,
JoinConstraint,
JoinType,
+ Lambda,
+ LambdaVariable,
Like,
Limit,
Literal,
@@ -160,9 +165,16 @@ def test_class_module_is_datafusion():
DropTable,
Repartition,
Partitioning,
+ HigherOrderFunction,
+ Lambda,
+ LambdaVariable,
]:
assert klass.__module__ == "datafusion.expr"
+ # catalog factory types (re-exported at top level)
+ for klass in [TableProviderFactory, TableProviderFactoryExportable]:
+ assert klass.__module__ == "datafusion.catalog"
+
# schema
for klass in [DFSchema]:
assert klass.__module__ == "datafusion.common"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]