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

Jefffrey pushed a commit to branch 59_maintenance
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/59_maintenance by this push:
     new 9ea30dfacb [59_maintenance] Update version to `59.3.2` and add 
CHANGELOG (#11797)
9ea30dfacb is described below

commit 9ea30dfacb7003de9ffc87ef50231f18229fcdb5
Author: Andrew Lamb <[email protected]>
AuthorDate: Thu Oct 22 21:16:02 2026 -0400

    [59_maintenance] Update version to `59.3.2` and add CHANGELOG (#11797)
    
    # Which issue does this PR close?
    
    - Part of https://github.com/apache/arrow-rs/issues/11664
    
    # Rationale for this change
    
    Prepare for the `59.3.2` patch release from the `59_maintenance` branch
    
    # What changes are included in this PR?
    1. Update version to `59.3.2`
    2. Move the `59.3.1` changelog entry into `CHANGELOG-old.md`
    3. Add `59.3.2` CHANGELOG (see rendered version
    https://github.com/alamb/arrow-rs/blob/alamb/prepare_59.3.2/CHANGELOG.md)
    
    Note: the backport PRs on `59_maintenance` did not carry `bug` /
    `development-process` labels, so `git-cliff` could not group them. The
    changelog entries were written by hand in the same format, grouping all
    fixes under "Bug fixes" and omitting the CI-only changes (#11781,
    #11793), following how the corresponding `main` PRs were labeled.
    
    # Are these changes tested?
    By CI
    
    # Are there any user-facing changes?
    
    New version and changelog
    
    ---------
    
    Co-authored-by: Claude Fable 5.1 <[email protected]>
    Co-authored-by: Jefffrey <[email protected]>
---
 CHANGELOG-old.md                        | 20 +++++++++++++
 CHANGELOG.md                            | 33 +++++++++++----------
 Cargo.lock                              | 52 ++++++++++++++++-----------------
 Cargo.toml                              | 42 +++++++++++++-------------
 arrow-ipc/src/writer.rs                 |  6 ++--
 dev/release/README.md                   | 15 +++++-----
 dev/release/create-tarball.sh           | 11 +++++--
 dev/release/rat_exclude_files.txt       |  3 ++
 dev/release/verify-release-candidate.sh | 24 +++++++++++++++
 9 files changed, 129 insertions(+), 77 deletions(-)

diff --git a/CHANGELOG-old.md b/CHANGELOG-old.md
index a8cef69b3f..7df5f7abc9 100644
--- a/CHANGELOG-old.md
+++ b/CHANGELOG-old.md
@@ -21,6 +21,26 @@
 
 # Changelog
 
+## [59.3.1](https://github.com/apache/arrow-rs/tree/59.3.1) - (2026-10-10)
+
+[Full Changelog](https://github.com/apache/arrow-rs/compare/59.3.0...59.3.1)
+
+### Bug fixes
+- [59_maintenance] fix(arrow-array): avoid returning corrupt array in 
`GenericByteArray::into_builder` by @Jefffrey in 
[#11446](https://github.com/apache/arrow-rs/pull/11446)
+- [59_maintenance] fix(arrow-array): preserve type params in 
`PrimitiveArray::into_builder` by @Jefffrey in 
[#11448](https://github.com/apache/arrow-rs/pull/11448)
+- [59_maintenance] fix(arrow-cast): avoid panicking during failed List -> 
ListView cast by @Jefffrey in 
[#11445](https://github.com/apache/arrow-rs/pull/11445)
+- [59_maintenance] Fix filter_nulls for predicates selecting all or no rows by 
@Jefffrey in [#11444](https://github.com/apache/arrow-rs/pull/11444)
+- [59_maintenance] fix: finish methods in `PrimitiveDictionaryBuilder` discard 
type params by @Jefffrey in 
[#11442](https://github.com/apache/arrow-rs/pull/11442)
+- [59_maintenance] fix(arrow-array): `PrimitiveRunBuilder` was buggy after 
`finish` by @Jefffrey in [#11441](https://github.com/apache/arrow-rs/pull/11441)
+- [59_maintenance] fix(parquet): keep virtual columns in the schema reported 
with a schema hint by @Jefffrey in 
[#11447](https://github.com/apache/arrow-rs/pull/11447)
+- [59_maintenance] fix(arrow-data): fix gaps in ListView equality by @Jefffrey 
in [#11439](https://github.com/apache/arrow-rs/pull/11439)
+- [59_maintenance] fix: Parquet `ByteArrayDecoderPlain::read` can silently 
fail to read the correct number of values by @Jefffrey in 
[#11440](https://github.com/apache/arrow-rs/pull/11440)
+- [59_maintenance] fix(parquet): reject Thrift list sizes larger than 
remaining input by @Jefffrey in 
[#11353](https://github.com/apache/arrow-rs/pull/11353)
+
+### Miscellaneous
+- [59_maintenance] Identify the chronoutil-derived MIT code in the root 
LICENSE.txt by @Jefffrey in 
[#11358](https://github.com/apache/arrow-rs/pull/11358)
+- [59_maintenance] fix: update rustls to address RUSTSEC-2026-0285 by 
@Jefffrey in [#11357](https://github.com/apache/arrow-rs/pull/11357)
+
 ## [59.3.0](https://github.com/apache/arrow-rs/tree/59.3.0) - (2026-08-25)
 
 [Full Changelog](https://github.com/apache/arrow-rs/compare/59.2.0...59.3.0)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1a5c12dbf8..b007369c47 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,23 +20,24 @@
 # Changelog
 
 
-## [59.3.1](https://github.com/apache/arrow-rs/tree/59.3.1) - (2026-10-10)
+## [59.3.2](https://github.com/apache/arrow-rs/tree/59.3.2) - (2026-10-22)
 
-[Full Changelog](https://github.com/apache/arrow-rs/compare/59.3.0...59.3.1)
+[Full Changelog](https://github.com/apache/arrow-rs/compare/59.3.1...59.3.2)
 
 ### Bug fixes
-- [59_maintenance] fix(arrow-array): avoid returning corrupt array in 
`GenericByteArray::into_builder` by @Jefffrey in 
[#11446](https://github.com/apache/arrow-rs/pull/11446)
-- [59_maintenance] fix(arrow-array): preserve type params in 
`PrimitiveArray::into_builder` by @Jefffrey in 
[#11448](https://github.com/apache/arrow-rs/pull/11448)
-- [59_maintenance] fix(arrow-cast): avoid panicking during failed List -> 
ListView cast by @Jefffrey in 
[#11445](https://github.com/apache/arrow-rs/pull/11445)
-- [59_maintenance] Fix filter_nulls for predicates selecting all or no rows by 
@Jefffrey in [#11444](https://github.com/apache/arrow-rs/pull/11444)
-- [59_maintenance] fix: finish methods in `PrimitiveDictionaryBuilder` discard 
type params by @Jefffrey in 
[#11442](https://github.com/apache/arrow-rs/pull/11442)
-- [59_maintenance] fix(arrow-array): `PrimitiveRunBuilder` was buggy after 
`finish` by @Jefffrey in [#11441](https://github.com/apache/arrow-rs/pull/11441)
-- [59_maintenance] fix(parquet): keep virtual columns in the schema reported 
with a schema hint by @Jefffrey in 
[#11447](https://github.com/apache/arrow-rs/pull/11447)
-- [59_maintenance] fix(arrow-data): fix gaps in ListView equality by @Jefffrey 
in [#11439](https://github.com/apache/arrow-rs/pull/11439)
-- [59_maintenance] fix: Parquet `ByteArrayDecoderPlain::read` can silently 
fail to read the correct number of values by @Jefffrey in 
[#11440](https://github.com/apache/arrow-rs/pull/11440)
-- [59_maintenance] fix(parquet): reject Thrift list sizes larger than 
remaining input by @Jefffrey in 
[#11353](https://github.com/apache/arrow-rs/pull/11353)
-
-### Miscellaneous
-- [59_maintenance] Identify the chronoutil-derived MIT code in the root 
LICENSE.txt by @Jefffrey in 
[#11358](https://github.com/apache/arrow-rs/pull/11358)
-- [59_maintenance] fix: update rustls to address RUSTSEC-2026-0285 by 
@Jefffrey in [#11357](https://github.com/apache/arrow-rs/pull/11357)
+- [59_maintenance] Write empty validity buffers for arrays without nulls in 
IPC writer by @alamb in [#11820](https://github.com/apache/arrow-rs/pull/11820)
+- [59_maintenance] fix(arrow-buffer): prevent use-after-free in 
Buffer::shrink_to_fit when MemoryReservation::resize panics by @alamb in 
[#11787](https://github.com/apache/arrow-rs/pull/11787)
+- [59_maintenance] fix(parquet): skip miniblocks wider than 64 values instead 
of erroring by @Jefffrey in 
[#11754](https://github.com/apache/arrow-rs/pull/11754)
+- [59_maintenance] fix: account for offsets in runarrays when using extend for 
MutableArrayData by @Jefffrey in 
[#11671](https://github.com/apache/arrow-rs/pull/11671)
+- [59_maintenance] fix: account for offset when building RunArray from 
ArrayData by @alamb in [#11739](https://github.com/apache/arrow-rs/pull/11739)
+- [59_maintenance] fix: use correct length in runarray validation by @alamb in 
[#11740](https://github.com/apache/arrow-rs/pull/11740)
+- [59_maintenance] fix: account for arraydata offset when comparing runarrays 
by @Jefffrey in [#11673](https://github.com/apache/arrow-rs/pull/11673)
+- [59_maintenance] fix(arrow-schema): validate `UnionFields` when 
deserializing by @Jefffrey in 
[#11672](https://github.com/apache/arrow-rs/pull/11672)
+- [59_maintenance] fix: implement `ArrayData::validate_values` for union types 
by @Jefffrey in [#11678](https://github.com/apache/arrow-rs/pull/11678)
+- [59_maintenance] Fix sliced sparse union ArrayData conversion by @Jefffrey 
in [#11679](https://github.com/apache/arrow-rs/pull/11679)
+- [59_maintenance] fix(arrow-data): account for FixedSizeList parent offset in 
MutableArrayData by @Jefffrey in 
[#11683](https://github.com/apache/arrow-rs/pull/11683)
+- [59_maintenance] fix: `UnionFields::from_iter` should validate input by 
@Jefffrey in [#11670](https://github.com/apache/arrow-rs/pull/11670)
+- [59_maintenance] fix(arrow-array): use the field's type id in dense union 
logical_nulls by @Jefffrey in 
[#11680](https://github.com/apache/arrow-rs/pull/11680)
+- [59_maintenance] Parquet: list the dictionary page first in 
page_encoding_stats by @Jefffrey in 
[#11699](https://github.com/apache/arrow-rs/pull/11699)
+- [59_maintenance] fix(arrow-data): check view nulls at the right index in 
`ArrayData` equality by @Jefffrey in 
[#11675](https://github.com/apache/arrow-rs/pull/11675)
 
diff --git a/Cargo.lock b/Cargo.lock
index aecbf188da..839c9f1f98 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -170,7 +170,7 @@ dependencies = [
 
 [[package]]
 name = "arrow"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-arith",
  "arrow-array",
@@ -197,7 +197,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-arith"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -210,7 +210,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-array"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "ahash",
  "arrow-buffer",
@@ -231,7 +231,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-avro"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "apache-avro",
  "arrow",
@@ -268,7 +268,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-buffer"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "bytes",
  "criterion",
@@ -280,7 +280,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-cast"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -303,7 +303,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-csv"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -322,7 +322,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-data"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-buffer",
  "arrow-schema",
@@ -333,7 +333,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-flight"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "anyhow",
  "arrow-arith",
@@ -373,7 +373,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-integration-test"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow",
  "arrow-buffer",
@@ -386,7 +386,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-integration-testing"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow",
  "arrow-buffer",
@@ -406,7 +406,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-ipc"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -425,7 +425,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-json"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arbitrary",
  "arrow-array",
@@ -456,7 +456,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-ord"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -469,7 +469,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-pyarrow"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-data",
@@ -479,7 +479,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-row"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -494,7 +494,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-schema"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "bitflags",
  "criterion",
@@ -507,7 +507,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-select"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "ahash",
  "arrow-array",
@@ -520,7 +520,7 @@ dependencies = [
 
 [[package]]
 name = "arrow-string"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-array",
  "arrow-buffer",
@@ -2334,7 +2334,7 @@ dependencies = [
 
 [[package]]
 name = "parquet"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "ahash",
  "arrow",
@@ -2383,7 +2383,7 @@ dependencies = [
 
 [[package]]
 name = "parquet-geospatial"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-schema",
  "geo-traits",
@@ -2395,7 +2395,7 @@ dependencies = [
 
 [[package]]
 name = "parquet-variant"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow",
  "arrow-schema",
@@ -2411,7 +2411,7 @@ dependencies = [
 
 [[package]]
 name = "parquet-variant-compute"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow",
  "arrow-schema",
@@ -2428,7 +2428,7 @@ dependencies = [
 
 [[package]]
 name = "parquet-variant-json"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "arrow-schema",
  "base64 0.23.0",
@@ -2440,7 +2440,7 @@ dependencies = [
 
 [[package]]
 name = "parquet_derive"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "parquet",
  "proc-macro2",
@@ -2450,7 +2450,7 @@ dependencies = [
 
 [[package]]
 name = "parquet_derive_test"
-version = "59.3.1"
+version = "59.3.2"
 dependencies = [
  "chrono",
  "parquet",
diff --git a/Cargo.toml b/Cargo.toml
index acc3a02b8d..4bd6465794 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -68,7 +68,7 @@ exclude = [
 ]
 
 [workspace.package]
-version = "59.3.1"
+version = "59.3.2"
 repository = "https://github.com/apache/arrow-rs";
 authors = ["Apache Arrow <[email protected]>"]
 license = "Apache-2.0"
@@ -84,26 +84,26 @@ edition = "2024"
 rust-version = "1.85"
 
 [workspace.dependencies]
-arrow = { version = "59.3.1", path = "./arrow", default-features = false }
-arrow-arith = { version = "59.3.1", path = "./arrow-arith" }
-arrow-array = { version = "59.3.1", path = "./arrow-array" }
-arrow-buffer = { version = "59.3.1", path = "./arrow-buffer" }
-arrow-cast = { version = "59.3.1", path = "./arrow-cast" }
-arrow-csv = { version = "59.3.1", path = "./arrow-csv" }
-arrow-data = { version = "59.3.1", path = "./arrow-data" }
-arrow-ipc = { version = "59.3.1", path = "./arrow-ipc" }
-arrow-json = { version = "59.3.1", path = "./arrow-json" }
-arrow-ord = { version = "59.3.1", path = "./arrow-ord" }
-arrow-pyarrow = { version = "59.3.1", path = "./arrow-pyarrow" }
-arrow-row = { version = "59.3.1", path = "./arrow-row" }
-arrow-schema = { version = "59.3.1", path = "./arrow-schema" }
-arrow-select = { version = "59.3.1", path = "./arrow-select" }
-arrow-string = { version = "59.3.1", path = "./arrow-string" }
-parquet = { version = "59.3.1", path = "./parquet", default-features = false }
-parquet-geospatial = { version = "59.3.1", path = "./parquet-geospatial" }
-parquet-variant = { version = "59.3.1", path = "./parquet-variant" }
-parquet-variant-json = { version = "59.3.1", path = "./parquet-variant-json" }
-parquet-variant-compute = { version = "59.3.1", path = 
"./parquet-variant-compute" }
+arrow = { version = "59.3.2", path = "./arrow", default-features = false }
+arrow-arith = { version = "59.3.2", path = "./arrow-arith" }
+arrow-array = { version = "59.3.2", path = "./arrow-array" }
+arrow-buffer = { version = "59.3.2", path = "./arrow-buffer" }
+arrow-cast = { version = "59.3.2", path = "./arrow-cast" }
+arrow-csv = { version = "59.3.2", path = "./arrow-csv" }
+arrow-data = { version = "59.3.2", path = "./arrow-data" }
+arrow-ipc = { version = "59.3.2", path = "./arrow-ipc" }
+arrow-json = { version = "59.3.2", path = "./arrow-json" }
+arrow-ord = { version = "59.3.2", path = "./arrow-ord" }
+arrow-pyarrow = { version = "59.3.2", path = "./arrow-pyarrow" }
+arrow-row = { version = "59.3.2", path = "./arrow-row" }
+arrow-schema = { version = "59.3.2", path = "./arrow-schema" }
+arrow-select = { version = "59.3.2", path = "./arrow-select" }
+arrow-string = { version = "59.3.2", path = "./arrow-string" }
+parquet = { version = "59.3.2", path = "./parquet", default-features = false }
+parquet-geospatial = { version = "59.3.2", path = "./parquet-geospatial" }
+parquet-variant = { version = "59.3.2", path = "./parquet-variant" }
+parquet-variant-json = { version = "59.3.2", path = "./parquet-variant-json" }
+parquet-variant-compute = { version = "59.3.2", path = 
"./parquet-variant-compute" }
 
 chrono = { version = "0.4.40", default-features = false, features = ["clock"] }
 
diff --git a/arrow-ipc/src/writer.rs b/arrow-ipc/src/writer.rs
index cae1712908..f9bed46293 100644
--- a/arrow-ipc/src/writer.rs
+++ b/arrow-ipc/src/writer.rs
@@ -2374,10 +2374,8 @@ fn write_array_data(
     let num_rows = array_data.len();
     let null_count = array_data.null_count();
     if !matches!(array_data.data_type(), DataType::Null) {
-        meta.nodes.push(crate::FieldNode::new(
-            num_rows as i64,
-            null_count as i64,
-        ));
+        meta.nodes
+            .push(crate::FieldNode::new(num_rows as i64, null_count as i64));
     } else {
         // NullArray's null_count equals to len, but ArrayData null_count is 
always 0.
         meta.nodes
diff --git a/dev/release/README.md b/dev/release/README.md
index 8de898863d..be2a1f80d6 100644
--- a/dev/release/README.md
+++ b/dev/release/README.md
@@ -45,7 +45,7 @@ crates.io, the Rust ecosystem's package manager.
 
 We create a `CHANGELOG.md` so our users know what has been changed between 
releases.
 
-## Prepare CHANGELOG and version:
+## Prepare CHANGELOG and version
 
 - Ensure [`git-cliff`](https://git-cliff.org/docs/installation/) is installed
 
@@ -103,7 +103,7 @@ distribution servers.
 
 Pick numbers in sequential order, with `1` for `rc1`, `2` for `rc2`, etc.
 
-### Create git tag for the release:
+### Create git tag for the release
 
 While the official release artifact is a signed tarball, we also tag the 
commit it was created for convenience and code archaeology.
 
@@ -135,11 +135,11 @@ The `create-tarball.sh` script
    apache distribution svn server
 
 2. provide you an email template to
-   send to [email protected] for release voting.
+   send to <[email protected]> for release voting.
 
 ### Vote on Release Candidate tarball
 
-Send an email, based on the output from the script to [email protected].
+Send an email, based on the output from the script to <[email protected]>.
 See an [example of how the email should 
look](https://lists.apache.org/thread/2vpxdt6n7kzo72sxpr7q8yyby4495gnk).
 
 For the release to become "official" it needs at least three Apache Arrow PMC 
members to vote +1 on it.
@@ -156,7 +156,7 @@ The `dev/release/verify-release-candidate.sh` script in 
this repository can assi
 
 If the release is not approved, fix whatever the problem is and try again with 
the next RC number
 
-### If the release is approved,
+### If the release is approved
 
 Then, create a new release on GitHub using the tag `<version>` (e.g. `4.1.0`).
 
@@ -167,7 +167,7 @@ git tag <version> <version>-<rc>
 git push apache <version>
 ```
 
-Move tarball to the release location in SVN, e.g. 
https://dist.apache.org/repos/dist/release/arrow/arrow-rs-4.1.0/, using the 
`release-tarball.sh` script:
+Move tarball to the release location in SVN, e.g. 
<https://dist.apache.org/repos/dist/release/arrow/arrow-rs-4.1.0/>, using the 
`release-tarball.sh` script:
 
 ```shell
 ./dev/release/release-tarball.sh 4.1.0 2
@@ -179,7 +179,7 @@ Congratulations! The release is now official!
 
 The [`release.yml`] workflow automatically creates a github release for the 
tag.
 Check that the release is created and contains the correct changelog here:
-https://github.com/apache/arrow-rs/releases
+<https://github.com/apache/arrow-rs/releases>
 
 [`release.yml`]: 
https://github.com/apache/arrow-rs/blob/main/.github/workflows/release.yml#L1-L0
 
@@ -216,7 +216,6 @@ Rust Arrow Crates:
 (cd arrow-ipc && cargo publish)
 (cd arrow-csv && cargo publish)
 (cd arrow-json && cargo publish)
-(cd arrow-avro && cargo publish)
 (cd arrow-arith && cargo publish)
 (cd arrow-string && cargo publish)
 (cd arrow-row && cargo publish)
diff --git a/dev/release/create-tarball.sh b/dev/release/create-tarball.sh
index 332de47715..4c3a4f89bd 100755
--- a/dev/release/create-tarball.sh
+++ b/dev/release/create-tarball.sh
@@ -79,13 +79,20 @@ 
url="https://dist.apache.org/repos/dist/dev/arrow/${release}-rc${rc}";
 
 echo "Attempting to create ${tarball} from tag ${tag}"
 
+# Write out the submodule commits referenced so that release verification
+# can later ensure it uses the same versions of test data.
+tmpdir=$(mktemp -d)
+trap 'rm -r "${tmpdir}"' EXIT
+git -C "${SOURCE_TOP_DIR}" ls-tree -r ${tag} \
+    | awk '$2 == "commit" { print $4, $3 }' > ${tmpdir}/.gitmodules-commits
 
 # create <tarball> containing the files in git at $tag
 # the files in the tarball are prefixed with {release}
 # (e.g. apache-arrow-rs-4.0.1)
 mkdir -p ${distdir}
 (cd "${SOURCE_TOP_DIR}" && \
-     git archive ${tag} --prefix ${release}/ \
+     git archive --prefix ${release}/ \
+         --add-file ${tmpdir}/.gitmodules-commits ${tag} \
          | gzip > ${tarball})
 
 echo "Running rat license checker on ${tarball}"
@@ -118,7 +125,7 @@ The proposed release tarball and signatures are hosted at 
[2].
 
 The changelog is located at [3].
 
-The release tracking issue is: [4]
+The release tracking issue is: [5]
 
 Please download, verify checksums and signatures, run the unit tests,
 and vote on the release. There is a script [4] that automates some of
diff --git a/dev/release/rat_exclude_files.txt 
b/dev/release/rat_exclude_files.txt
index d08a0ea8c7..05223bcb19 100644
--- a/dev/release/rat_exclude_files.txt
+++ b/dev/release/rat_exclude_files.txt
@@ -11,6 +11,9 @@ parquet_derive/test/dependency/*
 .gitattributes
 **.gitignore
 .gitmodules
+.gitmodules-commits
+AGENTS.md
+CLAUDE.md
 Cargo.lock
 filtered_rat.txt
 rat.txt
diff --git a/dev/release/verify-release-candidate.sh 
b/dev/release/verify-release-candidate.sh
index d8b888effe..902218675e 100755
--- a/dev/release/verify-release-candidate.sh
+++ b/dev/release/verify-release-candidate.sh
@@ -95,6 +95,17 @@ setup_tempdir() {
   fi
 }
 
+# Print the commit for the submodule at path $1 recorded in .gitmodules-commits
+submodule_commit() {
+  local commit
+  commit=$(awk -v path="$1" '$1 == path { print $2 }' .gitmodules-commits)
+  if [ -z "${commit}" ]; then
+    echo "No commit for submodule $1 found in .gitmodules-commits" >&2
+    return 1
+  fi
+  echo "${commit}"
+}
+
 test_source_distribution() {
   # install rust toolchain in a similar fashion like test-miniconda
   export RUSTUP_HOME=$PWD/test-rustup
@@ -117,6 +128,19 @@ test_source_distribution() {
   export ARROW_TEST_DATA=$PWD/arrow-testing-data/data
   export PARQUET_TEST_DATA=$PWD/parquet-testing-data/data
 
+  if [ -f .gitmodules-commits ]; then
+    # Use the testing repository commits referenced by the release
+    local arrow_testing_commit parquet_testing_commit
+    arrow_testing_commit=$(submodule_commit testing)
+    parquet_testing_commit=$(submodule_commit parquet-testing)
+    # Fetch the commits explicitly, as they may not be reachable from any
+    # branch (e.g. a submodule pinned to a pull request's head commit)
+    git -C arrow-testing-data fetch origin "${arrow_testing_commit}"
+    git -C arrow-testing-data checkout "${arrow_testing_commit}"
+    git -C parquet-testing-data fetch origin "${parquet_testing_commit}"
+    git -C parquet-testing-data checkout "${parquet_testing_commit}"
+  fi
+
   cargo test --all
 
   # verify that the leaf crates can be published to crates.io

Reply via email to