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

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


The following commit(s) were added to refs/heads/main by this push:
     new 65652297 chore: Switch to stable Rust (#505)
65652297 is described below

commit 65652297114a1d393434ecbe655fc07d0c281ba9
Author: Andy Grove <[email protected]>
AuthorDate: Tue Jun 4 07:35:24 2024 -0600

    chore: Switch to stable Rust (#505)
    
    * initial commit
    
    * change github workflow
    
    * try to use stable rustfmt
    
    * update CI
    
    * lint
    
    * CI
    
    * clippy
    
    * clippy
    
    * ignore some tests
    
    * remove more nightly references
    
    * add some assertions to make code safe
    
    * revert a change
    
    * use Rust 1.77
    
    * specify rust version 1.77.2
    
    * fix CI
    
    ---------
    
    Co-authored-by: Chao Sun <[email protected]>
---
 .github/actions/setup-builder/action.yaml          |   2 +-
 .github/actions/setup-macos-builder/action.yaml    |   2 +-
 .github/workflows/benchmark-tpch.yml               |   2 +-
 .github/workflows/benchmark.yml                    |   2 +-
 .github/workflows/pr_build.yml                     |   2 +-
 .github/workflows/spark_sql_test.yml               |   2 +-
 .github/workflows/spark_sql_test_ansi.yml          |   2 +-
 Makefile                                           |  16 +-
 core/Cargo.lock                                    | 354 ++++++--------
 core/Cargo.toml                                    |   1 -
 core/rustfmt.toml                                  |   8 -
 core/src/common/mod.rs                             |   5 -
 core/src/common/mutable_vector.rs                  | 409 ----------------
 core/src/common/vector.rs                          | 523 ---------------------
 core/src/execution/datafusion/planner.rs           |  15 +-
 core/src/execution/datafusion/spark_hash.rs        |   2 +-
 core/src/execution/shuffle/row.rs                  |   6 +-
 core/src/lib.rs                                    |   6 -
 rust-toolchain                                     |   2 +-
 .../org/apache/comet/CometExpressionSuite.scala    |   4 +-
 20 files changed, 180 insertions(+), 1185 deletions(-)

diff --git a/.github/actions/setup-builder/action.yaml 
b/.github/actions/setup-builder/action.yaml
index 6fa71649..0787d9ee 100644
--- a/.github/actions/setup-builder/action.yaml
+++ b/.github/actions/setup-builder/action.yaml
@@ -21,7 +21,7 @@ inputs:
   rust-version:
     description: 'version of rust to install (e.g. nightly)'
     required: true
-    default: 'nightly'
+    default: 'stable'
   jdk-version:
     description: 'jdk version to install (e.g., 17)'
     required: true
diff --git a/.github/actions/setup-macos-builder/action.yaml 
b/.github/actions/setup-macos-builder/action.yaml
index cc1b6317..7c1c8b52 100644
--- a/.github/actions/setup-macos-builder/action.yaml
+++ b/.github/actions/setup-macos-builder/action.yaml
@@ -21,7 +21,7 @@ inputs:
   rust-version:
     description: 'version of rust to install (e.g. nightly)'
     required: true
-    default: 'nightly'
+    default: 'stable'
   jdk-version:
     description: 'jdk version to install (e.g., 17)'
     required: true
diff --git a/.github/workflows/benchmark-tpch.yml 
b/.github/workflows/benchmark-tpch.yml
index fbf5cfdb..f4c547a8 100644
--- a/.github/workflows/benchmark-tpch.yml
+++ b/.github/workflows/benchmark-tpch.yml
@@ -37,7 +37,7 @@ on:
   workflow_dispatch:
 
 env:
-  RUST_VERSION: nightly
+  RUST_VERSION: stable
 
 jobs:
   prepare:
diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml
index e9767f76..023b6a68 100644
--- a/.github/workflows/benchmark.yml
+++ b/.github/workflows/benchmark.yml
@@ -37,7 +37,7 @@ on:
   workflow_dispatch:
 
 env:
-  RUST_VERSION: nightly
+  RUST_VERSION: stable
 
 jobs:
   prepare:
diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index 7de198a4..503978fc 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -37,7 +37,7 @@ on:
   workflow_dispatch:
 
 env:
-  RUST_VERSION: nightly
+  RUST_VERSION: stable
 
 jobs:
   linux-test:
diff --git a/.github/workflows/spark_sql_test.yml 
b/.github/workflows/spark_sql_test.yml
index 997136de..352e0ecb 100644
--- a/.github/workflows/spark_sql_test.yml
+++ b/.github/workflows/spark_sql_test.yml
@@ -37,7 +37,7 @@ on:
   workflow_dispatch:
 
 env:
-  RUST_VERSION: nightly
+  RUST_VERSION: stable
 
 jobs:
   spark-sql-catalyst:
diff --git a/.github/workflows/spark_sql_test_ansi.yml 
b/.github/workflows/spark_sql_test_ansi.yml
index 5c5d2858..337e59ef 100644
--- a/.github/workflows/spark_sql_test_ansi.yml
+++ b/.github/workflows/spark_sql_test_ansi.yml
@@ -37,7 +37,7 @@ on:
   workflow_dispatch:
 
 env:
-  RUST_VERSION: nightly
+  RUST_VERSION: stable
 
 jobs:
   spark-sql-catalyst:
diff --git a/Makefile b/Makefile
index f20687cd..b9b9707b 100644
--- a/Makefile
+++ b/Makefile
@@ -44,10 +44,10 @@ format:
 
 core-amd64:
        rustup target add x86_64-apple-darwin
-       cd core && RUSTFLAGS="-Ctarget-cpu=skylake 
-Ctarget-feature=-prefer-256-bit" CC=o64-clang CXX=o64-clang++ cargo build 
--target x86_64-apple-darwin --features nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=skylake 
-Ctarget-feature=-prefer-256-bit" CC=o64-clang CXX=o64-clang++ cargo build 
--target x86_64-apple-darwin --release
        mkdir -p common/target/classes/org/apache/comet/darwin/x86_64
        cp core/target/x86_64-apple-darwin/release/libcomet.dylib 
common/target/classes/org/apache/comet/darwin/x86_64
-       cd core && RUSTFLAGS="-Ctarget-cpu=haswell 
-Ctarget-feature=-prefer-256-bit" cargo build --features nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=haswell 
-Ctarget-feature=-prefer-256-bit" cargo build --release
        mkdir -p common/target/classes/org/apache/comet/linux/amd64
        cp core/target/release/libcomet.so 
common/target/classes/org/apache/comet/linux/amd64
        jar -cf common/target/comet-native-x86_64.jar \
@@ -57,10 +57,10 @@ core-amd64:
 
 core-arm64:
        rustup target add aarch64-apple-darwin
-       cd core && RUSTFLAGS="-Ctarget-cpu=apple-m1" 
CC=arm64-apple-darwin21.4-clang CXX=arm64-apple-darwin21.4-clang++ 
CARGO_FEATURE_NEON=1 cargo build --target aarch64-apple-darwin --features 
nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=apple-m1" 
CC=arm64-apple-darwin21.4-clang CXX=arm64-apple-darwin21.4-clang++ 
CARGO_FEATURE_NEON=1 cargo build --target aarch64-apple-darwin --release
        mkdir -p common/target/classes/org/apache/comet/darwin/aarch64
        cp core/target/aarch64-apple-darwin/release/libcomet.dylib 
common/target/classes/org/apache/comet/darwin/aarch64
-       cd core && RUSTFLAGS="-Ctarget-cpu=native" cargo build --features 
nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=native" cargo build --release
        mkdir -p common/target/classes/org/apache/comet/linux/aarch64
        cp core/target/release/libcomet.so 
common/target/classes/org/apache/comet/linux/aarch64
        jar -cf common/target/comet-native-aarch64.jar \
@@ -70,12 +70,12 @@ core-arm64:
 
 release-linux: clean
        rustup target add aarch64-apple-darwin x86_64-apple-darwin
-       cd core && RUSTFLAGS="-Ctarget-cpu=apple-m1" 
CC=arm64-apple-darwin21.4-clang CXX=arm64-apple-darwin21.4-clang++ 
CARGO_FEATURE_NEON=1 cargo build --target aarch64-apple-darwin --features 
nightly --release
-       cd core && RUSTFLAGS="-Ctarget-cpu=skylake 
-Ctarget-feature=-prefer-256-bit" CC=o64-clang CXX=o64-clang++ cargo build 
--target x86_64-apple-darwin --features nightly --release
-       cd core && RUSTFLAGS="-Ctarget-cpu=native 
-Ctarget-feature=-prefer-256-bit" cargo build --features nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=apple-m1" 
CC=arm64-apple-darwin21.4-clang CXX=arm64-apple-darwin21.4-clang++ 
CARGO_FEATURE_NEON=1 cargo build --target aarch64-apple-darwin --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=skylake 
-Ctarget-feature=-prefer-256-bit" CC=o64-clang CXX=o64-clang++ cargo build 
--target x86_64-apple-darwin --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=native 
-Ctarget-feature=-prefer-256-bit" cargo build --release
        ./mvnw install -Prelease -DskipTests $(PROFILES)
 release:
-       cd core && RUSTFLAGS="-Ctarget-cpu=native" cargo build --features 
nightly --release
+       cd core && RUSTFLAGS="-Ctarget-cpu=native" cargo build --release
        ./mvnw install -Prelease -DskipTests $(PROFILES)
 benchmark-%: clean release
        cd spark && COMET_CONF_DIR=$(shell pwd)/conf MAVEN_OPTS='-Xmx20g' 
../mvnw exec:java -Dexec.mainClass="$*" -Dexec.classpathScope="test" 
-Dexec.cleanupDaemonThreads="false" -Dexec.args="$(filter-out 
$@,$(MAKECMDGOALS))" $(PROFILES)
diff --git a/core/Cargo.lock b/core/Cargo.lock
index 105bcaf7..6c8d54ab 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "addr2line"
-version = "0.21.0"
+version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
 dependencies = [
  "gimli",
 ]
@@ -84,15 +84,15 @@ checksum = 
"4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
 
 [[package]]
 name = "anstyle"
-version = "1.0.6"
+version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
 
 [[package]]
 name = "anyhow"
-version = "1.0.82"
+version = "1.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
 
 [[package]]
 name = "arc-swap"
@@ -333,7 +333,7 @@ checksum = 
"c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -347,15 +347,15 @@ dependencies = [
 
 [[package]]
 name = "autocfg"
-version = "1.2.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "backtrace"
-version = "0.3.71"
+version = "0.3.72"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
+checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11"
 dependencies = [
  "addr2line",
  "cc",
@@ -368,9 +368,9 @@ dependencies = [
 
 [[package]]
 name = "base64"
-version = "0.22.0"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "bitflags"
@@ -444,9 +444,9 @@ checksum = 
"79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
 name = "bytemuck"
-version = "1.15.0"
+version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15"
+checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5"
 
 [[package]]
 name = "byteorder"
@@ -468,12 +468,13 @@ checksum = 
"37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
 
 [[package]]
 name = "cc"
-version = "1.0.94"
+version = "1.0.98"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7"
+checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
 dependencies = [
  "jobserver",
  "libc",
+ "once_cell",
 ]
 
 [[package]]
@@ -625,7 +626,7 @@ dependencies = [
  "parquet-format",
  "paste",
  "pprof",
- "prost 0.12.4",
+ "prost 0.12.6",
  "prost-build",
  "rand",
  "regex",
@@ -705,9 +706,9 @@ dependencies = [
 
 [[package]]
 name = "crc32fast"
-version = "1.4.0"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
 dependencies = [
  "cfg-if",
 ]
@@ -769,9 +770,9 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
 
 [[package]]
 name = "crunchy"
@@ -1093,9 +1094,9 @@ checksum = 
"fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
 [[package]]
 name = "either"
-version = "1.11.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
 
 [[package]]
 name = "equivalent"
@@ -1105,9 +1106,9 @@ checksum = 
"5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.8"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
 dependencies = [
  "libc",
  "windows-sys 0.52.0",
@@ -1115,9 +1116,9 @@ dependencies = [
 
 [[package]]
 name = "fastrand"
-version = "2.0.2"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
 
 [[package]]
 name = "findshlibs"
@@ -1149,9 +1150,9 @@ dependencies = [
 
 [[package]]
 name = "flate2"
-version = "1.0.28"
+version = "1.0.30"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
 dependencies = [
  "crc32fast",
  "miniz_oxide",
@@ -1228,7 +1229,7 @@ checksum = 
"87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -1273,9 +1274,9 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.14"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
 dependencies = [
  "cfg-if",
  "libc",
@@ -1284,9 +1285,9 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.28.1"
+version = "0.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
 
 [[package]]
 name = "glob"
@@ -1312,9 +1313,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.14.3"
+version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
  "ahash",
  "allocator-api2",
@@ -1335,6 +1336,12 @@ version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
 [[package]]
 name = "hermit-abi"
 version = "0.3.9"
@@ -1425,9 +1432,9 @@ dependencies = [
 
 [[package]]
 name = "instant"
-version = "0.1.12"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -1493,9 +1500,9 @@ checksum = 
"49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
 name = "java-locator"
-version = "0.1.5"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "90003f2fd9c52f212c21d8520f1128da0080bad6fff16b68fe6e7f2f0c3780c2"
+checksum = "d2abecabd9961c5e01405a6426687fcf1bd94a269927137e4c3cc1a7419b93fd"
 dependencies = [
  "glob",
  "lazy_static",
@@ -1527,9 +1534,9 @@ checksum = 
"8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 
 [[package]]
 name = "jobserver"
-version = "0.1.30"
+version = "0.1.31"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2"
+checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
 dependencies = [
  "libc",
 ]
@@ -1615,9 +1622,9 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.153"
+version = "0.2.155"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
 
 [[package]]
 name = "libloading"
@@ -1637,9 +1644,9 @@ checksum = 
"4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
 
 [[package]]
 name = "libmimalloc-sys"
-version = "0.1.35"
+version = "0.1.38"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3979b5c37ece694f1f5e51e7ecc871fdb0f517ed04ee45f88d15d6d553cb9664"
+checksum = "0e7bb23d733dfcc8af652a78b7bf232f0e967710d044732185e561e47c0336b6"
 dependencies = [
  "cc",
  "libc",
@@ -1647,15 +1654,15 @@ dependencies = [
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
 
 [[package]]
 name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1760,18 +1767,18 @@ dependencies = [
 
 [[package]]
 name = "mimalloc"
-version = "0.1.39"
+version = "0.1.42"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c"
+checksum = "e9186d86b79b52f4a77af65604b51225e8db1d6ee7e3f41aec1e40829c71a176"
 dependencies = [
  "libmimalloc-sys",
 ]
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
 dependencies = [
  "adler",
 ]
@@ -1795,9 +1802,9 @@ dependencies = [
 
 [[package]]
 name = "num"
-version = "0.4.2"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41"
+checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
 dependencies = [
  "num-bigint",
  "num-complex",
@@ -1809,20 +1816,19 @@ dependencies = [
 
 [[package]]
 name = "num-bigint"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
 dependencies = [
- "autocfg",
  "num-integer",
  "num-traits",
 ]
 
 [[package]]
 name = "num-complex"
-version = "0.4.5"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
 dependencies = [
  "num-traits",
 ]
@@ -1848,9 +1854,9 @@ dependencies = [
 
 [[package]]
 name = "num-iter"
-version = "0.1.44"
+version = "0.1.45"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
 dependencies = [
  "autocfg",
  "num-integer",
@@ -1859,11 +1865,10 @@ dependencies = [
 
 [[package]]
 name = "num-rational"
-version = "0.4.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
 dependencies = [
- "autocfg",
  "num-bigint",
  "num-integer",
  "num-traits",
@@ -1871,9 +1876,9 @@ dependencies = [
 
 [[package]]
 name = "num-traits"
-version = "0.2.18"
+version = "0.2.19"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
 dependencies = [
  "autocfg",
  "libm",
@@ -1891,9 +1896,9 @@ dependencies = [
 
 [[package]]
 name = "object"
-version = "0.32.2"
+version = "0.35.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e"
 dependencies = [
  "memchr",
 ]
@@ -1951,9 +1956,9 @@ dependencies = [
 
 [[package]]
 name = "parking_lot"
-version = "0.12.1"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
 dependencies = [
  "lock_api",
  "parking_lot_core",
@@ -1961,15 +1966,15 @@ dependencies = [
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
  "libc",
  "redox_syscall",
  "smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.5",
 ]
 
 [[package]]
@@ -2001,18 +2006,18 @@ dependencies = [
 
 [[package]]
 name = "parse-zoneinfo"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41"
+checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
 dependencies = [
  "regex",
 ]
 
 [[package]]
 name = "paste"
-version = "1.0.14"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
 
 [[package]]
 name = "percent-encoding"
@@ -2022,9 +2027,9 @@ checksum = 
"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "petgraph"
-version = "0.6.4"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
 dependencies = [
  "fixedbitset",
  "indexmap",
@@ -2088,9 +2093,9 @@ checksum = 
"d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
 
 [[package]]
 name = "plotters"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
+checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3"
 dependencies = [
  "num-traits",
  "plotters-backend",
@@ -2101,15 +2106,15 @@ dependencies = [
 
 [[package]]
 name = "plotters-backend"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7"
 
 [[package]]
 name = "plotters-svg"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705"
 dependencies = [
  "plotters-backend",
 ]
@@ -2143,9 +2148,9 @@ checksum = 
"5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.80"
+version = "1.0.85"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e"
+checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
 dependencies = [
  "unicode-ident",
 ]
@@ -2162,12 +2167,12 @@ dependencies = [
 
 [[package]]
 name = "prost"
-version = "0.12.4"
+version = "0.12.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922"
+checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
 dependencies = [
  "bytes",
- "prost-derive 0.12.4",
+ "prost-derive 0.12.6",
 ]
 
 [[package]]
@@ -2205,15 +2210,15 @@ dependencies = [
 
 [[package]]
 name = "prost-derive"
-version = "0.12.4"
+version = "0.12.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48"
+checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
 dependencies = [
  "anyhow",
  "itertools 0.12.1",
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2296,11 +2301,11 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.4.1"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.5.0",
 ]
 
 [[package]]
@@ -2343,9 +2348,9 @@ dependencies = [
 
 [[package]]
 name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
 
 [[package]]
 name = "rustc_version"
@@ -2358,9 +2363,9 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.32"
+version = "0.38.34"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
 dependencies = [
  "bitflags 2.5.0",
  "errno",
@@ -2371,15 +2376,15 @@ dependencies = [
 
 [[package]]
 name = "rustversion"
-version = "1.0.15"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
 
 [[package]]
 name = "ryu"
-version = "1.0.17"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
 name = "same-file"
@@ -2398,9 +2403,9 @@ checksum = 
"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "semver"
-version = "1.0.22"
+version = "1.0.23"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "seq-macro"
@@ -2410,9 +2415,9 @@ checksum = 
"a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
 
 [[package]]
 name = "serde"
-version = "1.0.197"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
 dependencies = [
  "serde_derive",
 ]
@@ -2429,20 +2434,20 @@ dependencies = [
 
 [[package]]
 name = "serde_derive"
-version = "1.0.197"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.116"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
 dependencies = [
  "itoa",
  "ryu",
@@ -2546,7 +2551,7 @@ checksum = 
"01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2578,15 +2583,15 @@ dependencies = [
 
 [[package]]
 name = "strum_macros"
-version = "0.26.2"
+version = "0.26.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946"
+checksum = "f7993a8e3a9e88a00351486baae9522c91b123a088f76469e5bd5cc17198ea87"
 dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2631,9 +2636,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.59"
+version = "2.0.66"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a"
+checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2654,22 +2659,22 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.58"
+version = "1.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.58"
+version = "1.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2753,9 +2758,9 @@ checksum = 
"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.37.0"
+version = "1.38.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
+checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
 dependencies = [
  "backtrace",
  "bytes",
@@ -2766,13 +2771,13 @@ dependencies = [
 
 [[package]]
 name = "tokio-macros"
-version = "2.2.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2805,7 +2810,7 @@ checksum = 
"34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
@@ -2872,9 +2877,9 @@ checksum = 
"d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
 
 [[package]]
 name = "unicode-width"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6"
 
 [[package]]
 name = "unsafe-any-ors"
@@ -2954,7 +2959,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
  "wasm-bindgen-shared",
 ]
 
@@ -2976,7 +2981,7 @@ checksum = 
"e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3027,11 +3032,11 @@ checksum = 
"ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.6"
+version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
 dependencies = [
- "winapi",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -3082,21 +3087,6 @@ dependencies = [
  "windows_x86_64_msvc 0.42.2",
 ]
 
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
 [[package]]
 name = "windows-targets"
 version = "0.52.5"
@@ -3119,12 +3109,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
 
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
 [[package]]
 name = "windows_aarch64_gnullvm"
 version = "0.52.5"
@@ -3137,12 +3121,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.52.5"
@@ -3155,12 +3133,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
 [[package]]
 name = "windows_i686_gnu"
 version = "0.52.5"
@@ -3179,12 +3151,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
 [[package]]
 name = "windows_i686_msvc"
 version = "0.52.5"
@@ -3197,12 +3163,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.52.5"
@@ -3215,12 +3175,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.52.5"
@@ -3233,12 +3187,6 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.52.5"
@@ -3247,22 +3195,22 @@ checksum = 
"bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
 
 [[package]]
 name = "zerocopy"
-version = "0.7.32"
+version = "0.7.34"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.32"
+version = "0.7.34"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.59",
+ "syn 2.0.66",
 ]
 
 [[package]]
diff --git a/core/Cargo.toml b/core/Cargo.toml
index 6a179a6e..4584dffc 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -89,7 +89,6 @@ assertables = "7"
 
 [features]
 default = []
-nightly = []
 
 [profile.release]
 debug = true
diff --git a/core/rustfmt.toml b/core/rustfmt.toml
index 39a3fe63..3463af61 100644
--- a/core/rustfmt.toml
+++ b/core/rustfmt.toml
@@ -17,11 +17,3 @@
 
 edition = "2021"
 max_width = 100
-
-# The following requires nightly feature:
-#  rustup install nightly
-#  rustup component add rustfmt --toolchain nightly
-#  cargo +nightly fmt
-wrap_comments = true
-comment_width = 100
-imports_granularity = "Crate" # group imports by crate
diff --git a/core/src/common/mod.rs b/core/src/common/mod.rs
index 8d5030c0..1b7dfad2 100644
--- a/core/src/common/mod.rs
+++ b/core/src/common/mod.rs
@@ -35,10 +35,5 @@ trait ValueSetter<T: TypeTrait> {
     fn append_value(&mut self, v: &T::Native);
 }
 
-mod vector;
-
 mod buffer;
 pub use buffer::*;
-
-mod mutable_vector;
-pub use mutable_vector::*;
diff --git a/core/src/common/mutable_vector.rs 
b/core/src/common/mutable_vector.rs
deleted file mode 100644
index ba29fc01..00000000
--- a/core/src/common/mutable_vector.rs
+++ /dev/null
@@ -1,409 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-use arrow::{
-    array::ArrayData, buffer::Buffer as ArrowBuffer, datatypes::DataType as 
ArrowDataType,
-};
-
-use crate::{
-    common::{bit, CometBuffer, ValueGetter, ValueSetter},
-    BinaryType, StringType, StringView, TypeTrait,
-};
-
-const DEFAULT_ARRAY_LEN: usize = 4;
-
-/// A mutable vector that can be re-used across batches.
-#[derive(Debug)]
-pub struct MutableVector {
-    /// The Arrow type for the elements of this vector.
-    pub(crate) arrow_type: ArrowDataType,
-
-    /// The number of total elements in this vector.
-    pub(crate) num_values: usize,
-
-    /// The number of null elements in this vector, must <= `num_values`.
-    pub(crate) num_nulls: usize,
-
-    /// The capacity of the vector
-    pub(crate) capacity: usize,
-
-    /// How many bits are required to store a single value
-    pub(crate) bit_width: usize,
-
-    /// The validity buffer of this Arrow vector. A bit set at position `i` 
indicates the `i`th
-    /// element is not null. Otherwise, an unset bit at position `i` indicates 
the `i`th element is
-    /// null.
-    pub(crate) validity_buffer: CometBuffer,
-
-    /// The value buffer of this Arrow vector. This could store either offsets 
if the vector
-    /// is of list or struct type, or actual values themselves otherwise.
-    pub(crate) value_buffer: CometBuffer,
-
-    /// Child vectors for non-primitive types (e.g., list, struct).
-    pub(crate) children: Vec<MutableVector>,
-
-    /// Dictionary (i.e., values) associated with this vector. Only set if 
using dictionary
-    /// encoding.
-    pub(crate) dictionary: Option<Box<MutableVector>>,
-
-    /// Whether all the values in the vector are not null.
-    ///
-    /// This is useful so we can skip setting non-null for each individual 
value, in the
-    /// `validity_buffer`.
-    all_non_null: bool,
-}
-
-impl MutableVector {
-    pub fn new(capacity: usize, arrow_type: &ArrowDataType) -> Self {
-        let bit_width = Self::bit_width(arrow_type);
-        Self::new_with_bit_width(capacity, arrow_type.clone(), bit_width)
-    }
-
-    pub fn new_with_bit_width(
-        capacity: usize,
-        arrow_type: ArrowDataType,
-        bit_width: usize,
-    ) -> Self {
-        let validity_len = bit::ceil(capacity, 8);
-        let validity_buffer = CometBuffer::new(validity_len);
-
-        let mut value_capacity = capacity;
-        if Self::is_binary_type(&arrow_type) {
-            // Arrow offset array needs to have one extra slot
-            value_capacity += 1;
-        }
-        // Make sure the capacity is positive
-        let len = bit::ceil(value_capacity * bit_width, 8);
-        let mut value_buffer = CometBuffer::new(len);
-
-        let mut children = Vec::new();
-
-        match arrow_type {
-            ArrowDataType::Binary | ArrowDataType::Utf8 => {
-                children.push(MutableVector::new_with_bit_width(
-                    capacity,
-                    ArrowDataType::Int8,
-                    DEFAULT_ARRAY_LEN * 8,
-                ));
-            }
-            _ => {}
-        }
-
-        if Self::is_binary_type(&arrow_type) {
-            // Setup the first offset which is always 0.
-            let zero: u32 = 0;
-            bit::memcpy_value(&zero, 4, &mut value_buffer);
-        }
-
-        Self {
-            arrow_type,
-            num_values: 0,
-            num_nulls: 0,
-            capacity,
-            bit_width,
-            validity_buffer,
-            value_buffer,
-            children,
-            dictionary: None,
-            all_non_null: false,
-        }
-    }
-
-    /// Appends a non-null value `v` to the end of this vector.
-    #[inline]
-    pub fn append_value<T: TypeTrait>(&mut self, v: &T::Native) {
-        <dyn ValueSetter<T>>::append_value(self, v);
-    }
-
-    /// Gets the non-null value at `idx` of this vector.
-    #[inline]
-    pub fn value<T: TypeTrait>(&self, idx: usize) -> T::Native {
-        <dyn ValueGetter<T>>::value(self, idx)
-    }
-
-    /// Whether the given value at `idx` of this vector is null.
-    #[inline]
-    pub fn is_null(&self, idx: usize) -> bool {
-        unsafe { !bit::get_bit_raw(self.validity_buffer.as_ptr(), idx) }
-    }
-
-    /// Resets this vector to the initial state.
-    #[inline]
-    pub fn reset(&mut self) {
-        self.num_values = 0;
-        self.num_nulls = 0;
-        self.all_non_null = false;
-        self.validity_buffer.reset();
-        if Self::is_binary_type(&self.arrow_type) {
-            // Reset the first offset to 0
-            let zero: u32 = 0;
-            bit::memcpy_value(&zero, 4, &mut self.value_buffer);
-            // Also reset the child value vector
-            let child = &mut self.children[0];
-            child.reset();
-        } else if Self::should_reset_value_buffer(&self.arrow_type) {
-            self.value_buffer.reset();
-        }
-    }
-
-    /// Appends a new null value to the end of this vector.
-    #[inline]
-    pub fn put_null(&mut self) {
-        self.put_nulls(1)
-    }
-
-    /// Appends `n` null values to the end of this vector.
-    #[inline]
-    pub fn put_nulls(&mut self, n: usize) {
-        // We need to update offset buffer for binary.
-        if Self::is_binary_type(&self.arrow_type) {
-            let mut offset = self.num_values * 4;
-            let prev_offset_value = bit::read_num_bytes_u32(4, 
&self.value_buffer[offset..]);
-            offset += 4;
-            (0..n).for_each(|_| {
-                bit::memcpy_value(&prev_offset_value, 4, &mut 
self.value_buffer[offset..]);
-                offset += 4;
-            });
-        }
-
-        self.num_nulls += n;
-        self.num_values += n;
-    }
-
-    /// Returns the number of total values (including both null and non-null) 
of this vector.
-    #[inline]
-    pub fn num_values(&self) -> usize {
-        self.num_values
-    }
-
-    /// Returns the number of null values of this vector.
-    #[inline]
-    pub fn num_nulls(&self) -> usize {
-        self.num_nulls
-    }
-
-    #[inline]
-    pub fn set_not_null(&mut self, i: usize) {
-        unsafe {
-            bit::set_bit_raw(self.validity_buffer.as_mut_ptr(), i);
-        }
-    }
-
-    /// Sets all values in this vector to be non-null.
-    #[inline]
-    pub fn set_all_non_null(&mut self) {
-        self.all_non_null = true;
-    }
-
-    /// Sets the content of validity buffer to be `buffer`.
-    pub fn set_validity_buffer(&mut self, buffer: &ArrowBuffer) {
-        self.validity_buffer = buffer.into();
-    }
-
-    /// Sets the content of value buffer to be `buffer`.
-    pub fn set_value_buffer(&mut self, buffer: &ArrowBuffer) {
-        self.value_buffer = buffer.into();
-    }
-
-    /// Sets the dictionary of this to be `dict`.
-    pub fn set_dictionary(&mut self, dict: MutableVector) {
-        self.dictionary = Some(Box::new(dict))
-    }
-
-    /// Clones this into an Arrow [`ArrayData`](arrow::array::ArrayData). Note 
that the caller of
-    /// this method MUST make sure the returned `ArrayData` won't live longer 
than this vector
-    /// itself. Otherwise, dangling pointer may happen.
-    ///
-    /// # Safety
-    ///
-    /// This method is highly unsafe since it calls `to_immutable` which leaks 
raw pointer to the
-    /// memory region that are tracked by `ArrowMutableBuffer`. Please see 
comments on
-    /// `to_immutable` buffer to understand the motivation.
-    pub fn get_array_data(&mut self) -> ArrayData {
-        unsafe {
-            let data_type = if let Some(d) = &self.dictionary {
-                ArrowDataType::Dictionary(
-                    Box::new(ArrowDataType::Int32),
-                    Box::new(d.arrow_type.clone()),
-                )
-            } else {
-                self.arrow_type.clone()
-            };
-            let mut builder = ArrayData::builder(data_type)
-                .len(self.num_values)
-                .add_buffer(self.value_buffer.to_arrow());
-
-            builder = if self.all_non_null {
-                builder.null_count(0)
-            } else {
-                builder
-                    .null_bit_buffer(Some(self.validity_buffer.to_arrow()))
-                    .null_count(self.num_nulls)
-            };
-
-            if Self::is_binary_type(&self.arrow_type) && 
self.dictionary.is_none() {
-                let child = &mut self.children[0];
-                builder = builder.add_buffer(child.value_buffer.to_arrow());
-            }
-
-            if let Some(d) = &mut self.dictionary {
-                builder = builder.add_child_data(d.get_array_data());
-            }
-
-            builder.build_unchecked()
-        }
-    }
-
-    /// Returns the number of bits it takes to store one element of 
`arrow_type` in the value buffer
-    /// of this vector.
-    pub fn bit_width(arrow_type: &ArrowDataType) -> usize {
-        match arrow_type {
-            ArrowDataType::Boolean => 1,
-            ArrowDataType::Int8 => 8,
-            ArrowDataType::Int16 => 16,
-            ArrowDataType::Int32 | ArrowDataType::Float32 | 
ArrowDataType::Date32 => 32,
-            ArrowDataType::Int64 | ArrowDataType::Float64 | 
ArrowDataType::Timestamp(_, _) => 64,
-            ArrowDataType::FixedSizeBinary(type_length) => *type_length as 
usize * 8,
-            ArrowDataType::Decimal128(..) => 128, // Arrow stores decimal with 
16 bytes
-            ArrowDataType::Binary | ArrowDataType::Utf8 => 32, // Only count 
offset size
-            dt => panic!("Unsupported Arrow data type: {:?}", dt),
-        }
-    }
-
-    #[inline]
-    fn is_binary_type(dt: &ArrowDataType) -> bool {
-        matches!(dt, ArrowDataType::Binary | ArrowDataType::Utf8)
-    }
-
-    #[inline]
-    fn should_reset_value_buffer(dt: &ArrowDataType) -> bool {
-        // - Boolean type expects have a zeroed value buffer
-        // - Decimal may pad buffer with 0xff so we need to clear them before 
a new batch
-        matches!(dt, ArrowDataType::Boolean | ArrowDataType::Decimal128(_, _))
-    }
-
-    /// Creates an immutable reference from a mutable Arrow buffer `buf`.
-    ///
-    /// # Safety
-    ///
-    /// This function is highly unsafe. Please see documentation of the 
[`to_arrow`] method for
-    /// details.
-    #[inline]
-    unsafe fn to_immutable(buf: &CometBuffer) -> ArrowBuffer {
-        buf.to_arrow()
-    }
-}
-
-impl<T: TypeTrait> ValueGetter<T> for MutableVector {
-    default fn value(&self, idx: usize) -> T::Native {
-        unsafe {
-            let ptr = self.value_buffer.as_ptr() as *const T::Native;
-            *ptr.add(idx)
-        }
-    }
-}
-
-impl ValueGetter<StringType> for MutableVector {
-    fn value(&self, _: usize) -> StringView {
-        unimplemented!("'value' on StringType is currently unsupported");
-    }
-}
-
-impl ValueGetter<BinaryType> for MutableVector {
-    fn value(&self, _: usize) -> StringView {
-        unimplemented!("'value' on BinaryType is currently unsupported");
-    }
-}
-
-impl<T: TypeTrait> ValueSetter<T> for MutableVector {
-    default fn append_value(&mut self, v: &T::Native) {
-        unsafe {
-            let ptr = self.value_buffer.as_mut_ptr() as *mut T::Native;
-            *ptr.add(self.num_values) = *v;
-        }
-        self.num_values += 1;
-    }
-}
-
-impl ValueSetter<StringType> for MutableVector {
-    fn append_value(&mut self, _: &StringView) {
-        unimplemented!("'append_value' on StringType is currently 
unsupported");
-    }
-}
-
-impl ValueSetter<BinaryType> for MutableVector {
-    fn append_value(&mut self, _: &StringView) {
-        unimplemented!("'append_value' on BinaryType is currently 
unsupported");
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use crate::IntegerType;
-
-    #[test]
-    fn set_and_get() {
-        let mut mv = MutableVector::new(1024, &ArrowDataType::Int32);
-
-        for n in 0..100 {
-            mv.append_value::<IntegerType>(&(n * n));
-        }
-        assert_eq!(mv.num_values(), 100);
-        assert_eq!(mv.num_nulls(), 0);
-
-        for n in 0..100 {
-            assert_eq!(mv.value::<IntegerType>(n) as usize, n * n);
-        }
-
-        mv.reset();
-
-        for n in 0..200 {
-            if n % 2 == 0 {
-                mv.put_null();
-            } else {
-                mv.append_value::<IntegerType>(&(n * 2));
-            }
-        }
-
-        assert_eq!(mv.num_values(), 200);
-        assert_eq!(mv.num_nulls(), 100);
-
-        for n in 0..200 {
-            if n % 2 == 0 {
-                assert!(mv.is_null(n));
-            } else {
-                assert_eq!(mv.value::<IntegerType>(n) as usize, n * 2);
-            }
-        }
-    }
-
-    #[test]
-    #[should_panic]
-    fn set_string_unsupported() {
-        let mut mv = MutableVector::new(1024, &ArrowDataType::Utf8);
-        let sv = StringView::default();
-        mv.append_value::<StringType>(&sv);
-    }
-
-    #[test]
-    #[should_panic]
-    fn get_string_unsupported() {
-        let mv = MutableVector::new(1024, &ArrowDataType::Utf8);
-        mv.value::<StringType>(0);
-    }
-}
diff --git a/core/src/common/vector.rs b/core/src/common/vector.rs
deleted file mode 100644
index 1afb1e78..00000000
--- a/core/src/common/vector.rs
+++ /dev/null
@@ -1,523 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-use crate::{
-    common::{bit, ValueGetter},
-    BoolType, DataType, TypeTrait, BITS_PER_BYTE, STRING_VIEW_LEN, 
STRING_VIEW_PREFIX_LEN,
-};
-use arrow::{
-    array::{Array, ArrayRef},
-    buffer::{Buffer, MutableBuffer},
-    datatypes::DataType as ArrowDataType,
-};
-use arrow_data::ArrayData;
-
-/// A vector that holds elements of plain types (i.e., no nested type such as 
list, map, struct).
-pub struct PlainVector {
-    /// The data type for elements in this vector
-    data_type: DataType,
-    /// Total number of values in this vector
-    num_values: usize,
-    /// Total number of nulls in this vector. Must <= `num_values`.
-    num_nulls: usize,
-    /// The value buffer
-    value_buffer: ValueBuffer,
-    /// Number of bytes for each element in the vector. For variable length 
types such as string
-    /// and binary, this will be the size of [`StringView`] which is always 16 
bytes.
-    value_size: usize,
-    /// Offsets into buffers
-    offset: usize,
-    /// The validity buffer. If empty, all values in this vector are not null.
-    validity_buffer: Option<Buffer>,
-    /// Whether this vector is dictionary encoded
-    is_dictionary: bool,
-    /// Indices (or dictionary keys) when `is_dictionary` is true. Otherwise, 
this is always
-    /// an empty vector.
-    indices: IndexBuffer,
-}
-
-impl<T: TypeTrait> ValueGetter<T> for PlainVector {
-    default fn value(&self, idx: usize) -> T::Native {
-        let offset = self.offset(idx);
-        unsafe {
-            let ptr = self.value_buffer.as_ptr() as *const T::Native;
-            *ptr.add(offset)
-        }
-    }
-}
-
-impl ValueGetter<BoolType> for PlainVector {
-    fn value(&self, idx: usize) -> bool {
-        let offset = self.offset(idx);
-        unsafe { bit::get_bit_raw(self.value_buffer.as_ptr(), offset) }
-    }
-}
-
-impl PlainVector {
-    /// Returns the data type of this vector.
-    pub fn data_type(&self) -> &DataType {
-        &self.data_type
-    }
-
-    /// Returns the total number of elements in this vector.
-    pub fn num_values(&self) -> usize {
-        self.num_values
-    }
-
-    /// Returns the total number of nulls in this vector.
-    pub fn num_nulls(&self) -> usize {
-        self.num_nulls
-    }
-
-    /// Whether there is any null in this vector.
-    pub fn has_null(&self) -> bool {
-        self.num_nulls > 0
-    }
-
-    /// Whether the element at `idx` is null.
-    pub fn is_null(&self, idx: usize) -> bool {
-        if let Some(validity_buffer) = &self.validity_buffer {
-            unsafe {
-                return !bit::get_bit_raw(validity_buffer.as_ptr(), self.offset 
+ idx);
-            }
-        }
-
-        false
-    }
-
-    #[inline(always)]
-    pub fn value<T: TypeTrait>(&self, idx: usize) -> T::Native {
-        <dyn ValueGetter<T>>::value(self, idx)
-    }
-
-    #[inline(always)]
-    fn offset(&self, idx: usize) -> usize {
-        let idx = self.offset + idx;
-        if self.is_dictionary {
-            self.indices.get(idx)
-        } else {
-            idx
-        }
-    }
-}
-
-impl From<ArrayData> for PlainVector {
-    fn from(data: ArrayData) -> Self {
-        assert!(!data.buffers().is_empty(), "expected at least one buffer");
-        let arrow_dt = data.data_type();
-        let dt: DataType = arrow_dt.into();
-        let is_dictionary = matches!(arrow_dt, ArrowDataType::Dictionary(_, 
_));
-
-        let mut value_buffers = data.buffers();
-        let mut indices = IndexBuffer::empty();
-        let validity_buffer = data.nulls().map(|nb| nb.buffer().clone());
-
-        if is_dictionary {
-            // in case of dictionary data, the dictionary values are stored in 
child data, while
-            // dictionary keys are stored in `value_buffer`.
-            assert_eq!(
-                data.child_data().len(),
-                1,
-                "child data should contain a single array"
-            );
-            let child_data = &data.child_data()[0];
-            indices = IndexBuffer::new(value_buffers[0].clone(), data.len() + 
data.offset());
-            value_buffers = child_data.buffers();
-        }
-
-        let value_size = dt.kind().type_size() / BITS_PER_BYTE;
-        let value_buffer = ValueBuffer::new(&dt, value_buffers.to_vec(), 
data.len());
-
-        Self {
-            data_type: dt,
-            num_values: data.len(),
-            num_nulls: data.null_count(),
-            value_buffer,
-            value_size,
-            offset: data.offset(),
-            validity_buffer,
-            is_dictionary,
-            indices,
-        }
-    }
-}
-
-impl From<ArrayRef> for PlainVector {
-    fn from(value: ArrayRef) -> Self {
-        Self::from(value.into_data())
-    }
-}
-
-struct ValueBuffer {
-    ptr: *const u8,
-    /// Keep the `ptr` alive
-    original_buffers: Vec<Buffer>,
-}
-
-impl ValueBuffer {
-    pub fn new(dt: &DataType, buffers: Vec<Buffer>, len: usize) -> Self {
-        if matches!(dt, DataType::String | DataType::Binary) {
-            assert_eq!(
-                2,
-                buffers.len(),
-                "expected two buffers (offset, value) for string/binary"
-            );
-
-            let mut string_view_buf = MutableBuffer::from_len_zeroed(len * 16);
-            let buf_mut = string_view_buf.as_mut_ptr();
-
-            let offsets = buffers[0].as_ptr() as *const i32;
-            let values = buffers[1].as_ptr();
-
-            let mut dst_offset = 0;
-            let mut start = 0;
-            unsafe {
-                for i in 0..len {
-                    // StringView format:
-                    //   - length (4 bytes)
-                    //   - first 4 bytes of the string/binary (4 bytes)
-                    //   - pointer to the string/binary (8 bytes)
-                    let end = *offsets.add(i + 1);
-                    let len = end - start;
-                    let value = values.add(start as usize);
-                    *(buf_mut.add(dst_offset) as *mut i32) = len;
-                    if len >= STRING_VIEW_PREFIX_LEN as i32 {
-                        // only store prefix if the string has at least 4 
bytes, otherwise, we'll
-                        // zero pad the bytes.
-                        std::ptr::copy_nonoverlapping(
-                            value,
-                            buf_mut.add(dst_offset + STRING_VIEW_PREFIX_LEN),
-                            STRING_VIEW_PREFIX_LEN,
-                        );
-                    }
-                    *(buf_mut.add(dst_offset + STRING_VIEW_PREFIX_LEN + 4) as 
*mut usize) =
-                        value as usize;
-                    start = end;
-                    dst_offset += STRING_VIEW_LEN;
-                }
-            }
-
-            let string_buffer: Buffer = string_view_buf.into();
-            let ptr = string_buffer.as_ptr();
-
-            Self {
-                ptr,
-                original_buffers: vec![string_buffer, buffers[1].clone()],
-            }
-        } else {
-            let ptr = buffers[0].as_ptr();
-            Self {
-                ptr,
-                original_buffers: buffers,
-            }
-        }
-    }
-
-    /// Returns the raw pointer for the data in this value buffer.
-    /// NOTE: caller of this should NOT store the raw pointer to avoid 
dangling pointers.
-    pub fn as_ptr(&self) -> *const u8 {
-        self.ptr
-    }
-}
-
-struct IndexBuffer {
-    ptr: *const u8,
-    /// Keep the `ptr` alive.
-    buf: Option<Buffer>,
-    /// Total number of elements in the index buffer
-    len: usize,
-}
-
-impl IndexBuffer {
-    pub fn new(buf: Buffer, len: usize) -> Self {
-        let ptr = buf.as_ptr();
-        Self {
-            buf: Some(buf),
-            ptr,
-            len,
-        }
-    }
-
-    pub fn empty() -> Self {
-        Self {
-            buf: None,
-            ptr: std::ptr::null(),
-            len: 0,
-        }
-    }
-
-    #[inline]
-    pub fn get(&self, i: usize) -> usize {
-        debug_assert!(i < self.len);
-        unsafe {
-            let ptr = self.ptr as *const i32;
-            *ptr.add(i) as usize
-        }
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use crate::{
-        BoolType, ByteType, DataType, DateType, DecimalType, DoubleType, 
FloatType, IntegerType,
-        NativeEqual, ShortType, StringType, TimestampType, TypeTrait, 
STRING_VIEW_PREFIX_LEN,
-    };
-
-    use crate::common::vector::PlainVector;
-    use arrow::{
-        array::{
-            Array, BooleanArray, Date32Array, Decimal128Array, Float32Array, 
Float64Array,
-            Int16Array, Int32Array, Int8Array, StringArray,
-        },
-        buffer::Buffer,
-        datatypes::{DataType as ArrowDataType, ToByteSlice},
-    };
-    use arrow_array::TimestampMicrosecondArray;
-    use arrow_data::ArrayData;
-
-    #[test]
-    fn primitive_no_null() {
-        let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
-        let vector = PlainVector::from(arr.into_data());
-
-        assert_eq!(5, vector.num_values());
-        assert_eq!(0, vector.num_nulls());
-        assert_eq!(4, vector.value_size);
-        assert!(vector.validity_buffer.is_none());
-
-        for i in 0..5 {
-            assert!(!vector.is_null(i));
-            assert_eq!(i as i32, vector.value::<IntegerType>(i))
-        }
-    }
-
-    fn check_answer<T: TypeTrait>(expected: &[Option<T::Native>], actual: 
&PlainVector) {
-        assert_eq!(expected.len(), actual.num_values());
-        let nulls = expected
-            .iter()
-            .filter(|v| v.is_none())
-            .collect::<Vec<&Option<T::Native>>>();
-        assert_eq!(nulls.len(), actual.num_nulls());
-
-        for i in 0..expected.len() {
-            if let Some(v) = expected[i] {
-                assert!(!actual.is_null(i));
-                assert!(v.is_equal(&actual.value::<T>(i)));
-            } else {
-                assert!(actual.is_null(i));
-            }
-        }
-    }
-
-    #[test]
-    fn primitive_with_nulls() {
-        let data = vec![Some(0), None, Some(2), None, Some(4)];
-        let arr = TimestampMicrosecondArray::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<TimestampType>(&data, &vector);
-    }
-
-    #[test]
-    fn primitive_with_offsets_nulls() {
-        let arr = Int32Array::from(vec![Some(0), None, Some(2), None, Some(4), 
None, Some(7)]);
-        let data = arr.into_data();
-        let vector = PlainVector::from(data.slice(2, 3));
-
-        assert_eq!(3, vector.num_values());
-        assert_eq!(1, vector.num_nulls());
-
-        for i in 0..2 {
-            if i % 2 == 0 {
-                assert!(!vector.is_null(i));
-                assert_eq!((i + 2) as i32, vector.value::<IntegerType>(i));
-            } else {
-                assert!(vector.is_null(i));
-            }
-        }
-    }
-
-    #[test]
-    fn primitive_dictionary() {
-        let value_data = ArrayData::builder(ArrowDataType::Int8)
-            .len(8)
-            .add_buffer(Buffer::from(
-                &[10_i8, 11, 12, 13, 14, 15, 16, 17].to_byte_slice(),
-            ))
-            .build()
-            .unwrap();
-
-        // Construct a buffer for value offsets, for the nested array:
-        let keys = Buffer::from(&[2_i32, 3, 4].to_byte_slice());
-
-        // Construct a dictionary array from the above two
-        let key_type = ArrowDataType::Int32;
-        let value_type = ArrowDataType::Int8;
-        let dict_data_type = ArrowDataType::Dictionary(Box::new(key_type), 
Box::new(value_type));
-        let dict_data = ArrayData::builder(dict_data_type)
-            .len(3)
-            .add_buffer(keys)
-            .add_child_data(value_data)
-            .build()
-            .unwrap();
-
-        let vector = PlainVector::from(dict_data);
-
-        assert_eq!(DataType::Byte, *vector.data_type());
-        assert_eq!(3, vector.num_values());
-        assert_eq!(0, vector.num_nulls());
-        assert!(!vector.has_null());
-        assert_eq!(12, vector.value::<ByteType>(0));
-        assert_eq!(13, vector.value::<ByteType>(1));
-        assert_eq!(14, vector.value::<ByteType>(2));
-    }
-
-    #[test]
-    fn bools() {
-        let data = vec![Some(true), None, Some(false), None, Some(true)];
-        let arr = BooleanArray::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<BoolType>(&data, &vector);
-    }
-
-    #[test]
-    fn bytes() {
-        let data = vec![Some(4_i8), None, None, Some(5_i8), Some(7_i8)];
-        let arr = Int8Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<ByteType>(&data, &vector);
-    }
-
-    #[test]
-    fn shorts() {
-        let data = vec![Some(4_i16), None, None, Some(-40_i16), Some(-3_i16)];
-        let arr = Int16Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<ShortType>(&data, &vector);
-    }
-
-    #[test]
-    fn floats() {
-        let data = vec![
-            Some(4.0_f32),
-            Some(-0.0_f32),
-            Some(-3.0_f32),
-            Some(0.0_f32),
-            Some(std::f32::consts::PI),
-        ];
-        let arr = Float32Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<FloatType>(&data, &vector);
-    }
-
-    #[test]
-    fn doubles() {
-        let data = vec![
-            None,
-            Some(std::f64::consts::PI),
-            Some(4.0_f64),
-            Some(f64::NAN),
-        ];
-        let arr = Float64Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<DoubleType>(&data, &vector);
-    }
-
-    #[test]
-    fn decimals() {
-        let data = vec![Some(1_i128), None, None, Some(i128::MAX)];
-        let arr = Decimal128Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<DecimalType>(&data, &vector);
-    }
-
-    #[test]
-    fn timestamps() {
-        // 1:        00:00:00.001
-        // 37800005: 10:30:00.005
-        // 86399210: 23:59:59.210
-        let data = vec![Some(1), None, Some(37_800_005), Some(86_399_210)];
-        let arr = TimestampMicrosecondArray::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<TimestampType>(&data, &vector);
-    }
-
-    #[test]
-    fn dates() {
-        let data = vec![Some(100), None, Some(200), None];
-        let arr = Date32Array::from(data.clone());
-        let vector = PlainVector::from(arr.into_data());
-
-        check_answer::<DateType>(&data, &vector);
-    }
-
-    #[test]
-    fn string_no_nulls() {
-        let values: Vec<&str> = vec!["hello", "", "comet"];
-        let arr = StringArray::from(values.clone());
-
-        let vector = PlainVector::from(arr.into_data());
-        assert_eq!(3, vector.num_values());
-        assert_eq!(0, vector.num_nulls());
-
-        for i in 0..values.len() {
-            let expected = values[i];
-            let actual = vector.value::<StringType>(i);
-            assert_eq!(expected.len(), actual.len as usize);
-            if expected.len() >= STRING_VIEW_PREFIX_LEN {
-                assert_eq!(
-                    &expected[..STRING_VIEW_PREFIX_LEN],
-                    String::from_utf8_lossy(&actual.prefix)
-                );
-            }
-            assert_eq!(expected, actual.as_utf8_str());
-        }
-    }
-
-    #[test]
-    fn string_with_nulls() {
-        let data = [Some("hello"), None, Some("comet")];
-        let arr = StringArray::from(data.to_vec().clone());
-
-        let vector = PlainVector::from(arr.into_data());
-        assert_eq!(3, vector.num_values());
-        assert_eq!(1, vector.num_nulls());
-
-        for i in 0..data.len() {
-            if data[i].is_none() {
-                assert!(vector.is_null(i));
-            } else {
-                let expected = data[i].unwrap();
-                let actual = vector.value::<StringType>(i);
-                if expected.len() >= STRING_VIEW_PREFIX_LEN {
-                    assert_eq!(
-                        &expected[..STRING_VIEW_PREFIX_LEN],
-                        String::from_utf8_lossy(&actual.prefix)
-                    );
-                }
-                assert_eq!(expected, actual.as_utf8_str());
-            }
-        }
-    }
-}
diff --git a/core/src/execution/datafusion/planner.rs 
b/core/src/execution/datafusion/planner.rs
index 3a8548f7..a5bcf565 100644
--- a/core/src/execution/datafusion/planner.rs
+++ b/core/src/execution/datafusion/planner.rs
@@ -836,14 +836,13 @@ impl PhysicalPlanner {
                 }
 
                 // Consumes the first input source for the scan
-                let input_source = if self.exec_context_id == 
TEST_EXEC_CONTEXT_ID
-                    && inputs.is_empty()
-                {
-                    // For unit test, we will set input batch to scan directly 
by `set_input_batch`.
-                    None
-                } else {
-                    Some(inputs.remove(0))
-                };
+                let input_source =
+                    if self.exec_context_id == TEST_EXEC_CONTEXT_ID && 
inputs.is_empty() {
+                        // For unit test, we will set input batch to scan 
directly by `set_input_batch`.
+                        None
+                    } else {
+                        Some(inputs.remove(0))
+                    };
 
                 // The `ScanExec` operator will take actual arrays from Spark 
during execution
                 let scan = ScanExec::new(self.exec_context_id, input_source, 
fields)?;
diff --git a/core/src/execution/datafusion/spark_hash.rs 
b/core/src/execution/datafusion/spark_hash.rs
index 15d3a502..4d91a87d 100644
--- a/core/src/execution/datafusion/spark_hash.rs
+++ b/core/src/execution/datafusion/spark_hash.rs
@@ -84,7 +84,7 @@ pub(crate) fn spark_compatible_murmur3_hash<T: 
AsRef<[u8]>>(data: T, seed: u32)
 
     // safety:
     // avoid boundary checking in performance critical codes.
-    // all operations are garenteed to be safe
+    // all operations are guaranteed to be safe
     unsafe {
         let mut h1 = hash_bytes_by_int(
             std::slice::from_raw_parts(data.get_unchecked(0), len_aligned),
diff --git a/core/src/execution/shuffle/row.rs 
b/core/src/execution/shuffle/row.rs
index 419ef9b4..2d1312c1 100644
--- a/core/src/execution/shuffle/row.rs
+++ b/core/src/execution/shuffle/row.rs
@@ -207,7 +207,7 @@ impl Default for SparkUnsafeRow {
 }
 
 impl SparkUnsafeRow {
-    fn new(schema: &Vec<DataType>) -> Self {
+    fn new(schema: &[DataType]) -> Self {
         Self {
             row_addr: -1,
             row_size: -1,
@@ -1046,7 +1046,7 @@ pub(crate) fn append_columns(
     row_sizes_ptr: *mut jint,
     row_start: usize,
     row_end: usize,
-    schema: &Vec<DataType>,
+    schema: &[DataType],
     column_idx: usize,
     builder: &mut Box<dyn ArrayBuilder>,
     prefer_dictionary_ratio: f64,
@@ -3283,7 +3283,7 @@ pub fn process_sorted_row_partition(
     batch_size: usize,
     row_addresses_ptr: *mut jlong,
     row_sizes_ptr: *mut jint,
-    schema: &Vec<DataType>,
+    schema: &[DataType],
     output_path: String,
     prefer_dictionary_ratio: f64,
     checksum_enabled: bool,
diff --git a/core/src/lib.rs b/core/src/lib.rs
index f209859a..b608461e 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -20,12 +20,6 @@
 #![allow(dead_code)]
 #![allow(clippy::upper_case_acronyms)]
 #![allow(clippy::derive_partial_eq_without_eq)] // For prost generated struct
-#![cfg_attr(feature = "nightly", feature(core_intrinsics))]
-#![feature(specialization)]
-
-// Branch prediction hint. This is currently only available on nightly.
-#[cfg(feature = "nightly")]
-use core::intrinsics::{likely, unlikely};
 
 use jni::{
     objects::{JClass, JString},
diff --git a/rust-toolchain b/rust-toolchain
index 55d7013e..369f9966 100644
--- a/rust-toolchain
+++ b/rust-toolchain
@@ -1 +1 @@
-nightly-2023-09-05
+1.77.2
diff --git a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala 
b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
index e69054db..7516a078 100644
--- a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
+++ b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
@@ -1606,7 +1606,7 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
         .mode("overwrite")
         .parquet(shortArrayPath)
       val shortArrayQuery = "select a, -a from t"
-      runArrayTest(shortArrayQuery, " caused", shortArrayPath)
+      runArrayTest(shortArrayQuery, "", shortArrayPath)
 
       // byte values test
       val byteArrayPath = new Path(dir.toURI.toString, 
"byte_array_test.parquet").toString
@@ -1616,7 +1616,7 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
         .mode("overwrite")
         .parquet(byteArrayPath)
       val byteArrayQuery = "select a, -a from t"
-      runArrayTest(byteArrayQuery, " caused", byteArrayPath)
+      runArrayTest(byteArrayQuery, "", byteArrayPath)
 
       // interval values test
       withTable("t_interval") {


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

Reply via email to