You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by gi...@apache.org on 2026/10/12 10:44:51 UTC
(iceberg-rust) branch gh-pages updated: deploy: 693339072b87eebf075479393a8ef55182f27aca
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new dfd069aa5 deploy: 693339072b87eebf075479393a8ef55182f27aca
dfd069aa5 is described below
commit dfd069aa55d117901c7c19d7ef5c4d6a32634988
Author: github-merge-queue[bot] <gi...@users.noreply.github.com>
AuthorDate: Mon Oct 12 10:44:45 2026 +0000
deploy: 693339072b87eebf075479393a8ef55182f27aca
---
.../arrow/fn.datum_to_arrow_type_with_ree.html | 2 +-
.../arrow/fn.strip_metadata_from_schema.html | 2 +-
api/iceberg/spec/struct.Schema.html | 2 +-
api/src/iceberg/arrow/schema.rs.html | 3817 ++++++++++----------
4 files changed, 1957 insertions(+), 1866 deletions(-)
diff --git a/api/iceberg/arrow/fn.datum_to_arrow_type_with_ree.html b/api/iceberg/arrow/fn.datum_to_arrow_type_with_ree.html
index 90a0df1cf..713243544 100644
--- a/api/iceberg/arrow/fn.datum_to_arrow_type_with_ree.html
+++ b/api/iceberg/arrow/fn.datum_to_arrow_type_with_ree.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Converts a Datum (Iceberg type + primitive literal) to its corresponding Arrow DataType with Run-End Encoding (REE)."><title>datum_to_arrow_type_with_ree in iceberg::arrow - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSeri [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Converts a Datum (Iceberg type + primitive literal) to its corresponding Arrow DataType with Run-End Encoding (REE)."><title>datum_to_arrow_type_with_ree in iceberg::arrow - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSeri [...]
with Run-End Encoding (REE).</p>
<p>This function is used for constant fields in record batches, where all values are the same.
Run-End Encoding provides efficient storage for such constant columns.</p>
diff --git a/api/iceberg/arrow/fn.strip_metadata_from_schema.html b/api/iceberg/arrow/fn.strip_metadata_from_schema.html
index 7d1a0f3e3..4dbbf8d23 100644
--- a/api/iceberg/arrow/fn.strip_metadata_from_schema.html
+++ b/api/iceberg/arrow/fn.strip_metadata_from_schema.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Strips all metadata from an Arrow schema and its nested fields."><title>strip_metadata_from_schema in iceberg::arrow - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Strips all metadata from an Arrow schema and its nested fields."><title>strip_metadata_from_schema in iceberg::arrow - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de. [...]
<p>This function recursively removes metadata from all fields at every level of the schema,
including nested struct, list, and map fields. This is useful for schema comparison
where metadata differences should be ignored.</p>
diff --git a/api/iceberg/spec/struct.Schema.html b/api/iceberg/spec/struct.Schema.html
index a6d3d35b2..3a30134c0 100644
--- a/api/iceberg/spec/struct.Schema.html
+++ b/api/iceberg/spec/struct.Schema.html
@@ -49,7 +49,7 @@ checked, as it only affects newly written rows (read identically at any version)
</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Schema" class="impl"><a class="src rightside" href="../../src/iceberg/spec/schema/mod.rs.html#65">Source</a><a href="#impl-Clone-for-Schema" class="anchor">§</a><h3 class="code-header">impl <a class [...]
__D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summar [...]
and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-Schema" class="impl"><a class="src rightside" href="../../src/iceberg/spec/schema/mod.rs.html#65">Source</a><a href="#impl-Serialize-for-Schema" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serde_core::se [...]
- __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Tr [...]
+ __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Tr [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: CastFrom<U>,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code><T as As>::as_::<U></code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&self) -> &(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/src/iceberg/arrow/schema.rs.html b/api/src/iceberg/arrow/schema.rs.html
index b3e1950e6..7495906fe 100644
--- a/api/src/iceberg/arrow/schema.rs.html
+++ b/api/src/iceberg/arrow/schema.rs.html
@@ -893,1982 +893,2073 @@
<a href=#893 id=893 data-nosnippet>893</a> };
<a href=#894 id=894 data-nosnippet>894</a> <span class="prelude-val">Some</span>(Datum::new(
<a href=#895 id=895 data-nosnippet>895</a> primitive_type.clone(),
-<a href=#896 id=896 data-nosnippet>896</a> PrimitiveLiteral::Int128(i128::from_be_bytes(bytes.try_into()<span class="question-mark">?</span>)),
-<a href=#897 id=897 data-nosnippet>897</a> ))
-<a href=#898 id=898 data-nosnippet>898</a> }
-<a href=#899 id=899 data-nosnippet>899</a> (
-<a href=#900 id=900 data-nosnippet>900</a> PrimitiveType::Decimal {
-<a href=#901 id=901 data-nosnippet>901</a> precision: <span class="kw">_</span>,
-<a href=#902 id=902 data-nosnippet>902</a> scale: <span class="kw">_</span>,
-<a href=#903 id=903 data-nosnippet>903</a> },
-<a href=#904 id=904 data-nosnippet>904</a> Statistics::FixedLenByteArray(stats),
-<a href=#905 id=905 data-nosnippet>905</a> ) => {
-<a href=#906 id=906 data-nosnippet>906</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.min_bytes_opt() <span class="kw">else </span>{
-<a href=#907 id=907 data-nosnippet>907</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#908 id=908 data-nosnippet>908</a> };
-<a href=#909 id=909 data-nosnippet>909</a> <span class="prelude-val">Some</span>(Datum::new(
-<a href=#910 id=910 data-nosnippet>910</a> primitive_type.clone(),
-<a href=#911 id=911 data-nosnippet>911</a> PrimitiveLiteral::Int128(
-<a href=#912 id=912 data-nosnippet>912</a> i128_from_be_bytes(bytes)
-<a href=#913 id=913 data-nosnippet>913</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
-<a href=#914 id=914 data-nosnippet>914</a> ),
-<a href=#915 id=915 data-nosnippet>915</a> ))
-<a href=#916 id=916 data-nosnippet>916</a> }
-<a href=#917 id=917 data-nosnippet>917</a> (
-<a href=#918 id=918 data-nosnippet>918</a> PrimitiveType::Decimal {
-<a href=#919 id=919 data-nosnippet>919</a> precision: <span class="kw">_</span>,
-<a href=#920 id=920 data-nosnippet>920</a> scale: <span class="kw">_</span>,
-<a href=#921 id=921 data-nosnippet>921</a> },
-<a href=#922 id=922 data-nosnippet>922</a> Statistics::Int32(stats),
-<a href=#923 id=923 data-nosnippet>923</a> ) => stats.min_opt().map(|val| {
-<a href=#924 id=924 data-nosnippet>924</a> Datum::new(
-<a href=#925 id=925 data-nosnippet>925</a> primitive_type.clone(),
-<a href=#926 id=926 data-nosnippet>926</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
-<a href=#927 id=927 data-nosnippet>927</a> )
-<a href=#928 id=928 data-nosnippet>928</a> }),
-<a href=#929 id=929 data-nosnippet>929</a>
-<a href=#930 id=930 data-nosnippet>930</a> (
-<a href=#931 id=931 data-nosnippet>931</a> PrimitiveType::Decimal {
-<a href=#932 id=932 data-nosnippet>932</a> precision: <span class="kw">_</span>,
-<a href=#933 id=933 data-nosnippet>933</a> scale: <span class="kw">_</span>,
-<a href=#934 id=934 data-nosnippet>934</a> },
-<a href=#935 id=935 data-nosnippet>935</a> Statistics::Int64(stats),
-<a href=#936 id=936 data-nosnippet>936</a> ) => stats.min_opt().map(|val| {
-<a href=#937 id=937 data-nosnippet>937</a> Datum::new(
-<a href=#938 id=938 data-nosnippet>938</a> primitive_type.clone(),
-<a href=#939 id=939 data-nosnippet>939</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
-<a href=#940 id=940 data-nosnippet>940</a> )
-<a href=#941 id=941 data-nosnippet>941</a> }),
-<a href=#942 id=942 data-nosnippet>942</a> (PrimitiveType::Uuid, Statistics::FixedLenByteArray(stats)) => {
-<a href=#943 id=943 data-nosnippet>943</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.min_bytes_opt() <span class="kw">else </span>{
-<a href=#944 id=944 data-nosnippet>944</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#945 id=945 data-nosnippet>945</a> };
-<a href=#946 id=946 data-nosnippet>946</a> <span class="kw">if </span>bytes.len() != <span class="number">16 </span>{
-<a href=#947 id=947 data-nosnippet>947</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#948 id=948 data-nosnippet>948</a> ErrorKind::Unexpected,
-<a href=#949 id=949 data-nosnippet>949</a> <span class="string">"Invalid length of uuid bytes."</span>,
-<a href=#950 id=950 data-nosnippet>950</a> ));
-<a href=#951 id=951 data-nosnippet>951</a> }
-<a href=#952 id=952 data-nosnippet>952</a> <span class="prelude-val">Some</span>(Datum::uuid(Uuid::from_bytes(
-<a href=#953 id=953 data-nosnippet>953</a> bytes[..<span class="number">16</span>].try_into().unwrap(),
-<a href=#954 id=954 data-nosnippet>954</a> )))
-<a href=#955 id=955 data-nosnippet>955</a> }
-<a href=#956 id=956 data-nosnippet>956</a> (PrimitiveType::Fixed(len), Statistics::FixedLenByteArray(stat)) => {
-<a href=#957 id=957 data-nosnippet>957</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stat.min_bytes_opt() <span class="kw">else </span>{
-<a href=#958 id=958 data-nosnippet>958</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#959 id=959 data-nosnippet>959</a> };
-<a href=#960 id=960 data-nosnippet>960</a> <span class="kw">if </span>bytes.len() != <span class="kw-2">*</span>len <span class="kw">as </span>usize {
-<a href=#961 id=961 data-nosnippet>961</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#962 id=962 data-nosnippet>962</a> ErrorKind::Unexpected,
-<a href=#963 id=963 data-nosnippet>963</a> <span class="string">"Invalid length of fixed bytes."</span>,
-<a href=#964 id=964 data-nosnippet>964</a> ));
-<a href=#965 id=965 data-nosnippet>965</a> }
-<a href=#966 id=966 data-nosnippet>966</a> <span class="prelude-val">Some</span>(Datum::fixed(bytes.to_vec()))
-<a href=#967 id=967 data-nosnippet>967</a> }
-<a href=#968 id=968 data-nosnippet>968</a> (PrimitiveType::Binary, Statistics::ByteArray(stat)) => {
-<a href=#969 id=969 data-nosnippet>969</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(stat
-<a href=#970 id=970 data-nosnippet>970</a> .min_bytes_opt()
-<a href=#971 id=971 data-nosnippet>971</a> .map(|bytes| Datum::binary(bytes.to_vec())));
-<a href=#972 id=972 data-nosnippet>972</a> }
-<a href=#973 id=973 data-nosnippet>973</a> <span class="kw">_ </span>=> {
-<a href=#974 id=974 data-nosnippet>974</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#975 id=975 data-nosnippet>975</a> }
-<a href=#976 id=976 data-nosnippet>976</a> })
-<a href=#977 id=977 data-nosnippet>977</a>}
-<a href=#978 id=978 data-nosnippet>978</a>
-<a href=#979 id=979 data-nosnippet>979</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>get_parquet_stat_max_as_datum(
-<a href=#980 id=980 data-nosnippet>980</a> primitive_type: <span class="kw-2">&</span>PrimitiveType,
-<a href=#981 id=981 data-nosnippet>981</a> stats: <span class="kw-2">&</span>Statistics,
-<a href=#982 id=982 data-nosnippet>982</a>) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Datum>> {
-<a href=#983 id=983 data-nosnippet>983</a> <span class="prelude-val">Ok</span>(<span class="kw">match </span>(primitive_type, stats) {
-<a href=#984 id=984 data-nosnippet>984</a> (PrimitiveType::Boolean, Statistics::Boolean(stats)) => {
-<a href=#985 id=985 data-nosnippet>985</a> stats.max_opt().map(|val| Datum::bool(<span class="kw-2">*</span>val))
-<a href=#986 id=986 data-nosnippet>986</a> }
-<a href=#987 id=987 data-nosnippet>987</a> (PrimitiveType::Int, Statistics::Int32(stats)) => {
-<a href=#988 id=988 data-nosnippet>988</a> stats.max_opt().map(|val| Datum::int(<span class="kw-2">*</span>val))
-<a href=#989 id=989 data-nosnippet>989</a> }
-<a href=#990 id=990 data-nosnippet>990</a> (PrimitiveType::Date, Statistics::Int32(stats)) => {
-<a href=#991 id=991 data-nosnippet>991</a> stats.max_opt().map(|val| Datum::date(<span class="kw-2">*</span>val))
+<a href=#896 id=896 data-nosnippet>896</a> PrimitiveLiteral::Int128(
+<a href=#897 id=897 data-nosnippet>897</a> <span class="comment">// An empty bound carries no value; reject it rather than
+<a href=#898 id=898 data-nosnippet>898</a> // decode it as zero, which could prune matching row groups.
+<a href=#899 id=899 data-nosnippet>899</a> </span>i128_from_be_bytes(bytes)
+<a href=#900 id=900 data-nosnippet>900</a> .filter(|<span class="kw">_</span>| !bytes.is_empty())
+<a href=#901 id=901 data-nosnippet>901</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
+<a href=#902 id=902 data-nosnippet>902</a> ),
+<a href=#903 id=903 data-nosnippet>903</a> ))
+<a href=#904 id=904 data-nosnippet>904</a> }
+<a href=#905 id=905 data-nosnippet>905</a> (
+<a href=#906 id=906 data-nosnippet>906</a> PrimitiveType::Decimal {
+<a href=#907 id=907 data-nosnippet>907</a> precision: <span class="kw">_</span>,
+<a href=#908 id=908 data-nosnippet>908</a> scale: <span class="kw">_</span>,
+<a href=#909 id=909 data-nosnippet>909</a> },
+<a href=#910 id=910 data-nosnippet>910</a> Statistics::FixedLenByteArray(stats),
+<a href=#911 id=911 data-nosnippet>911</a> ) => {
+<a href=#912 id=912 data-nosnippet>912</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.min_bytes_opt() <span class="kw">else </span>{
+<a href=#913 id=913 data-nosnippet>913</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#914 id=914 data-nosnippet>914</a> };
+<a href=#915 id=915 data-nosnippet>915</a> <span class="prelude-val">Some</span>(Datum::new(
+<a href=#916 id=916 data-nosnippet>916</a> primitive_type.clone(),
+<a href=#917 id=917 data-nosnippet>917</a> PrimitiveLiteral::Int128(
+<a href=#918 id=918 data-nosnippet>918</a> i128_from_be_bytes(bytes)
+<a href=#919 id=919 data-nosnippet>919</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
+<a href=#920 id=920 data-nosnippet>920</a> ),
+<a href=#921 id=921 data-nosnippet>921</a> ))
+<a href=#922 id=922 data-nosnippet>922</a> }
+<a href=#923 id=923 data-nosnippet>923</a> (
+<a href=#924 id=924 data-nosnippet>924</a> PrimitiveType::Decimal {
+<a href=#925 id=925 data-nosnippet>925</a> precision: <span class="kw">_</span>,
+<a href=#926 id=926 data-nosnippet>926</a> scale: <span class="kw">_</span>,
+<a href=#927 id=927 data-nosnippet>927</a> },
+<a href=#928 id=928 data-nosnippet>928</a> Statistics::Int32(stats),
+<a href=#929 id=929 data-nosnippet>929</a> ) => stats.min_opt().map(|val| {
+<a href=#930 id=930 data-nosnippet>930</a> Datum::new(
+<a href=#931 id=931 data-nosnippet>931</a> primitive_type.clone(),
+<a href=#932 id=932 data-nosnippet>932</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
+<a href=#933 id=933 data-nosnippet>933</a> )
+<a href=#934 id=934 data-nosnippet>934</a> }),
+<a href=#935 id=935 data-nosnippet>935</a>
+<a href=#936 id=936 data-nosnippet>936</a> (
+<a href=#937 id=937 data-nosnippet>937</a> PrimitiveType::Decimal {
+<a href=#938 id=938 data-nosnippet>938</a> precision: <span class="kw">_</span>,
+<a href=#939 id=939 data-nosnippet>939</a> scale: <span class="kw">_</span>,
+<a href=#940 id=940 data-nosnippet>940</a> },
+<a href=#941 id=941 data-nosnippet>941</a> Statistics::Int64(stats),
+<a href=#942 id=942 data-nosnippet>942</a> ) => stats.min_opt().map(|val| {
+<a href=#943 id=943 data-nosnippet>943</a> Datum::new(
+<a href=#944 id=944 data-nosnippet>944</a> primitive_type.clone(),
+<a href=#945 id=945 data-nosnippet>945</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
+<a href=#946 id=946 data-nosnippet>946</a> )
+<a href=#947 id=947 data-nosnippet>947</a> }),
+<a href=#948 id=948 data-nosnippet>948</a> (PrimitiveType::Uuid, Statistics::FixedLenByteArray(stats)) => {
+<a href=#949 id=949 data-nosnippet>949</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.min_bytes_opt() <span class="kw">else </span>{
+<a href=#950 id=950 data-nosnippet>950</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#951 id=951 data-nosnippet>951</a> };
+<a href=#952 id=952 data-nosnippet>952</a> <span class="kw">if </span>bytes.len() != <span class="number">16 </span>{
+<a href=#953 id=953 data-nosnippet>953</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#954 id=954 data-nosnippet>954</a> ErrorKind::Unexpected,
+<a href=#955 id=955 data-nosnippet>955</a> <span class="string">"Invalid length of uuid bytes."</span>,
+<a href=#956 id=956 data-nosnippet>956</a> ));
+<a href=#957 id=957 data-nosnippet>957</a> }
+<a href=#958 id=958 data-nosnippet>958</a> <span class="prelude-val">Some</span>(Datum::uuid(Uuid::from_bytes(
+<a href=#959 id=959 data-nosnippet>959</a> bytes[..<span class="number">16</span>].try_into().unwrap(),
+<a href=#960 id=960 data-nosnippet>960</a> )))
+<a href=#961 id=961 data-nosnippet>961</a> }
+<a href=#962 id=962 data-nosnippet>962</a> (PrimitiveType::Fixed(len), Statistics::FixedLenByteArray(stat)) => {
+<a href=#963 id=963 data-nosnippet>963</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stat.min_bytes_opt() <span class="kw">else </span>{
+<a href=#964 id=964 data-nosnippet>964</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#965 id=965 data-nosnippet>965</a> };
+<a href=#966 id=966 data-nosnippet>966</a> <span class="kw">if </span>bytes.len() != <span class="kw-2">*</span>len <span class="kw">as </span>usize {
+<a href=#967 id=967 data-nosnippet>967</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#968 id=968 data-nosnippet>968</a> ErrorKind::Unexpected,
+<a href=#969 id=969 data-nosnippet>969</a> <span class="string">"Invalid length of fixed bytes."</span>,
+<a href=#970 id=970 data-nosnippet>970</a> ));
+<a href=#971 id=971 data-nosnippet>971</a> }
+<a href=#972 id=972 data-nosnippet>972</a> <span class="prelude-val">Some</span>(Datum::fixed(bytes.to_vec()))
+<a href=#973 id=973 data-nosnippet>973</a> }
+<a href=#974 id=974 data-nosnippet>974</a> (PrimitiveType::Binary, Statistics::ByteArray(stat)) => {
+<a href=#975 id=975 data-nosnippet>975</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(stat
+<a href=#976 id=976 data-nosnippet>976</a> .min_bytes_opt()
+<a href=#977 id=977 data-nosnippet>977</a> .map(|bytes| Datum::binary(bytes.to_vec())));
+<a href=#978 id=978 data-nosnippet>978</a> }
+<a href=#979 id=979 data-nosnippet>979</a> <span class="kw">_ </span>=> {
+<a href=#980 id=980 data-nosnippet>980</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#981 id=981 data-nosnippet>981</a> }
+<a href=#982 id=982 data-nosnippet>982</a> })
+<a href=#983 id=983 data-nosnippet>983</a>}
+<a href=#984 id=984 data-nosnippet>984</a>
+<a href=#985 id=985 data-nosnippet>985</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>get_parquet_stat_max_as_datum(
+<a href=#986 id=986 data-nosnippet>986</a> primitive_type: <span class="kw-2">&</span>PrimitiveType,
+<a href=#987 id=987 data-nosnippet>987</a> stats: <span class="kw-2">&</span>Statistics,
+<a href=#988 id=988 data-nosnippet>988</a>) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Datum>> {
+<a href=#989 id=989 data-nosnippet>989</a> <span class="prelude-val">Ok</span>(<span class="kw">match </span>(primitive_type, stats) {
+<a href=#990 id=990 data-nosnippet>990</a> (PrimitiveType::Boolean, Statistics::Boolean(stats)) => {
+<a href=#991 id=991 data-nosnippet>991</a> stats.max_opt().map(|val| Datum::bool(<span class="kw-2">*</span>val))
<a href=#992 id=992 data-nosnippet>992</a> }
-<a href=#993 id=993 data-nosnippet>993</a> (PrimitiveType::Long, Statistics::Int64(stats)) => {
-<a href=#994 id=994 data-nosnippet>994</a> stats.max_opt().map(|val| Datum::long(<span class="kw-2">*</span>val))
+<a href=#993 id=993 data-nosnippet>993</a> (PrimitiveType::Int, Statistics::Int32(stats)) => {
+<a href=#994 id=994 data-nosnippet>994</a> stats.max_opt().map(|val| Datum::int(<span class="kw-2">*</span>val))
<a href=#995 id=995 data-nosnippet>995</a> }
-<a href=#996 id=996 data-nosnippet>996</a> (PrimitiveType::Time, Statistics::Int64(stats)) => {
-<a href=#997 id=997 data-nosnippet>997</a> <span class="kw">let </span><span class="prelude-val">Some</span>(val) = stats.max_opt() <span class="kw">else </span>{
-<a href=#998 id=998 data-nosnippet>998</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#999 id=999 data-nosnippet>999</a> };
-<a href=#1000 id=1000 data-nosnippet>1000</a>
-<a href=#1001 id=1001 data-nosnippet>1001</a> <span class="prelude-val">Some</span>(Datum::time_micros(<span class="kw-2">*</span>val)<span class="question-mark">?</span>)
-<a href=#1002 id=1002 data-nosnippet>1002</a> }
-<a href=#1003 id=1003 data-nosnippet>1003</a> (PrimitiveType::Timestamp, Statistics::Int64(stats)) => {
-<a href=#1004 id=1004 data-nosnippet>1004</a> stats.max_opt().map(|val| Datum::timestamp_micros(<span class="kw-2">*</span>val))
-<a href=#1005 id=1005 data-nosnippet>1005</a> }
-<a href=#1006 id=1006 data-nosnippet>1006</a> (PrimitiveType::Timestamptz, Statistics::Int64(stats)) => {
-<a href=#1007 id=1007 data-nosnippet>1007</a> stats.max_opt().map(|val| Datum::timestamptz_micros(<span class="kw-2">*</span>val))
+<a href=#996 id=996 data-nosnippet>996</a> (PrimitiveType::Date, Statistics::Int32(stats)) => {
+<a href=#997 id=997 data-nosnippet>997</a> stats.max_opt().map(|val| Datum::date(<span class="kw-2">*</span>val))
+<a href=#998 id=998 data-nosnippet>998</a> }
+<a href=#999 id=999 data-nosnippet>999</a> (PrimitiveType::Long, Statistics::Int64(stats)) => {
+<a href=#1000 id=1000 data-nosnippet>1000</a> stats.max_opt().map(|val| Datum::long(<span class="kw-2">*</span>val))
+<a href=#1001 id=1001 data-nosnippet>1001</a> }
+<a href=#1002 id=1002 data-nosnippet>1002</a> (PrimitiveType::Time, Statistics::Int64(stats)) => {
+<a href=#1003 id=1003 data-nosnippet>1003</a> <span class="kw">let </span><span class="prelude-val">Some</span>(val) = stats.max_opt() <span class="kw">else </span>{
+<a href=#1004 id=1004 data-nosnippet>1004</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1005 id=1005 data-nosnippet>1005</a> };
+<a href=#1006 id=1006 data-nosnippet>1006</a>
+<a href=#1007 id=1007 data-nosnippet>1007</a> <span class="prelude-val">Some</span>(Datum::time_micros(<span class="kw-2">*</span>val)<span class="question-mark">?</span>)
<a href=#1008 id=1008 data-nosnippet>1008</a> }
-<a href=#1009 id=1009 data-nosnippet>1009</a> (PrimitiveType::TimestampNs, Statistics::Int64(stats)) => {
-<a href=#1010 id=1010 data-nosnippet>1010</a> stats.max_opt().map(|val| Datum::timestamp_nanos(<span class="kw-2">*</span>val))
+<a href=#1009 id=1009 data-nosnippet>1009</a> (PrimitiveType::Timestamp, Statistics::Int64(stats)) => {
+<a href=#1010 id=1010 data-nosnippet>1010</a> stats.max_opt().map(|val| Datum::timestamp_micros(<span class="kw-2">*</span>val))
<a href=#1011 id=1011 data-nosnippet>1011</a> }
-<a href=#1012 id=1012 data-nosnippet>1012</a> (PrimitiveType::TimestamptzNs, Statistics::Int64(stats)) => {
-<a href=#1013 id=1013 data-nosnippet>1013</a> stats.max_opt().map(|val| Datum::timestamptz_nanos(<span class="kw-2">*</span>val))
+<a href=#1012 id=1012 data-nosnippet>1012</a> (PrimitiveType::Timestamptz, Statistics::Int64(stats)) => {
+<a href=#1013 id=1013 data-nosnippet>1013</a> stats.max_opt().map(|val| Datum::timestamptz_micros(<span class="kw-2">*</span>val))
<a href=#1014 id=1014 data-nosnippet>1014</a> }
-<a href=#1015 id=1015 data-nosnippet>1015</a> (PrimitiveType::Float, Statistics::Float(stats)) => {
-<a href=#1016 id=1016 data-nosnippet>1016</a> stats.max_opt().map(|val| Datum::float(<span class="kw-2">*</span>val))
+<a href=#1015 id=1015 data-nosnippet>1015</a> (PrimitiveType::TimestampNs, Statistics::Int64(stats)) => {
+<a href=#1016 id=1016 data-nosnippet>1016</a> stats.max_opt().map(|val| Datum::timestamp_nanos(<span class="kw-2">*</span>val))
<a href=#1017 id=1017 data-nosnippet>1017</a> }
-<a href=#1018 id=1018 data-nosnippet>1018</a> (PrimitiveType::Double, Statistics::Double(stats)) => {
-<a href=#1019 id=1019 data-nosnippet>1019</a> stats.max_opt().map(|val| Datum::double(<span class="kw-2">*</span>val))
+<a href=#1018 id=1018 data-nosnippet>1018</a> (PrimitiveType::TimestamptzNs, Statistics::Int64(stats)) => {
+<a href=#1019 id=1019 data-nosnippet>1019</a> stats.max_opt().map(|val| Datum::timestamptz_nanos(<span class="kw-2">*</span>val))
<a href=#1020 id=1020 data-nosnippet>1020</a> }
-<a href=#1021 id=1021 data-nosnippet>1021</a> (PrimitiveType::String, Statistics::ByteArray(stats)) => {
-<a href=#1022 id=1022 data-nosnippet>1022</a> <span class="kw">let </span><span class="prelude-val">Some</span>(val) = stats.max_opt() <span class="kw">else </span>{
-<a href=#1023 id=1023 data-nosnippet>1023</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1024 id=1024 data-nosnippet>1024</a> };
-<a href=#1025 id=1025 data-nosnippet>1025</a>
-<a href=#1026 id=1026 data-nosnippet>1026</a> <span class="prelude-val">Some</span>(Datum::string(val.as_utf8()<span class="question-mark">?</span>))
-<a href=#1027 id=1027 data-nosnippet>1027</a> }
-<a href=#1028 id=1028 data-nosnippet>1028</a> (
-<a href=#1029 id=1029 data-nosnippet>1029</a> PrimitiveType::Decimal {
-<a href=#1030 id=1030 data-nosnippet>1030</a> precision: <span class="kw">_</span>,
-<a href=#1031 id=1031 data-nosnippet>1031</a> scale: <span class="kw">_</span>,
-<a href=#1032 id=1032 data-nosnippet>1032</a> },
-<a href=#1033 id=1033 data-nosnippet>1033</a> Statistics::ByteArray(stats),
-<a href=#1034 id=1034 data-nosnippet>1034</a> ) => {
-<a href=#1035 id=1035 data-nosnippet>1035</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
-<a href=#1036 id=1036 data-nosnippet>1036</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1037 id=1037 data-nosnippet>1037</a> };
-<a href=#1038 id=1038 data-nosnippet>1038</a> <span class="prelude-val">Some</span>(Datum::new(
-<a href=#1039 id=1039 data-nosnippet>1039</a> primitive_type.clone(),
-<a href=#1040 id=1040 data-nosnippet>1040</a> PrimitiveLiteral::Int128(i128::from_be_bytes(bytes.try_into()<span class="question-mark">?</span>)),
-<a href=#1041 id=1041 data-nosnippet>1041</a> ))
-<a href=#1042 id=1042 data-nosnippet>1042</a> }
-<a href=#1043 id=1043 data-nosnippet>1043</a> (
-<a href=#1044 id=1044 data-nosnippet>1044</a> PrimitiveType::Decimal {
-<a href=#1045 id=1045 data-nosnippet>1045</a> precision: <span class="kw">_</span>,
-<a href=#1046 id=1046 data-nosnippet>1046</a> scale: <span class="kw">_</span>,
-<a href=#1047 id=1047 data-nosnippet>1047</a> },
-<a href=#1048 id=1048 data-nosnippet>1048</a> Statistics::FixedLenByteArray(stats),
-<a href=#1049 id=1049 data-nosnippet>1049</a> ) => {
-<a href=#1050 id=1050 data-nosnippet>1050</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
-<a href=#1051 id=1051 data-nosnippet>1051</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1052 id=1052 data-nosnippet>1052</a> };
-<a href=#1053 id=1053 data-nosnippet>1053</a> <span class="prelude-val">Some</span>(Datum::new(
-<a href=#1054 id=1054 data-nosnippet>1054</a> primitive_type.clone(),
-<a href=#1055 id=1055 data-nosnippet>1055</a> PrimitiveLiteral::Int128(
-<a href=#1056 id=1056 data-nosnippet>1056</a> i128_from_be_bytes(bytes)
-<a href=#1057 id=1057 data-nosnippet>1057</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
-<a href=#1058 id=1058 data-nosnippet>1058</a> ),
-<a href=#1059 id=1059 data-nosnippet>1059</a> ))
-<a href=#1060 id=1060 data-nosnippet>1060</a> }
-<a href=#1061 id=1061 data-nosnippet>1061</a> (
-<a href=#1062 id=1062 data-nosnippet>1062</a> PrimitiveType::Decimal {
-<a href=#1063 id=1063 data-nosnippet>1063</a> precision: <span class="kw">_</span>,
-<a href=#1064 id=1064 data-nosnippet>1064</a> scale: <span class="kw">_</span>,
-<a href=#1065 id=1065 data-nosnippet>1065</a> },
-<a href=#1066 id=1066 data-nosnippet>1066</a> Statistics::Int32(stats),
-<a href=#1067 id=1067 data-nosnippet>1067</a> ) => stats.max_opt().map(|val| {
-<a href=#1068 id=1068 data-nosnippet>1068</a> Datum::new(
-<a href=#1069 id=1069 data-nosnippet>1069</a> primitive_type.clone(),
-<a href=#1070 id=1070 data-nosnippet>1070</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
-<a href=#1071 id=1071 data-nosnippet>1071</a> )
-<a href=#1072 id=1072 data-nosnippet>1072</a> }),
-<a href=#1073 id=1073 data-nosnippet>1073</a>
-<a href=#1074 id=1074 data-nosnippet>1074</a> (
-<a href=#1075 id=1075 data-nosnippet>1075</a> PrimitiveType::Decimal {
-<a href=#1076 id=1076 data-nosnippet>1076</a> precision: <span class="kw">_</span>,
-<a href=#1077 id=1077 data-nosnippet>1077</a> scale: <span class="kw">_</span>,
-<a href=#1078 id=1078 data-nosnippet>1078</a> },
-<a href=#1079 id=1079 data-nosnippet>1079</a> Statistics::Int64(stats),
-<a href=#1080 id=1080 data-nosnippet>1080</a> ) => stats.max_opt().map(|val| {
-<a href=#1081 id=1081 data-nosnippet>1081</a> Datum::new(
-<a href=#1082 id=1082 data-nosnippet>1082</a> primitive_type.clone(),
-<a href=#1083 id=1083 data-nosnippet>1083</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
-<a href=#1084 id=1084 data-nosnippet>1084</a> )
-<a href=#1085 id=1085 data-nosnippet>1085</a> }),
-<a href=#1086 id=1086 data-nosnippet>1086</a> (PrimitiveType::Uuid, Statistics::FixedLenByteArray(stats)) => {
-<a href=#1087 id=1087 data-nosnippet>1087</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
-<a href=#1088 id=1088 data-nosnippet>1088</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1089 id=1089 data-nosnippet>1089</a> };
-<a href=#1090 id=1090 data-nosnippet>1090</a> <span class="kw">if </span>bytes.len() != <span class="number">16 </span>{
-<a href=#1091 id=1091 data-nosnippet>1091</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1092 id=1092 data-nosnippet>1092</a> ErrorKind::Unexpected,
-<a href=#1093 id=1093 data-nosnippet>1093</a> <span class="string">"Invalid length of uuid bytes."</span>,
-<a href=#1094 id=1094 data-nosnippet>1094</a> ));
-<a href=#1095 id=1095 data-nosnippet>1095</a> }
-<a href=#1096 id=1096 data-nosnippet>1096</a> <span class="prelude-val">Some</span>(Datum::uuid(Uuid::from_bytes(
-<a href=#1097 id=1097 data-nosnippet>1097</a> bytes[..<span class="number">16</span>].try_into().unwrap(),
-<a href=#1098 id=1098 data-nosnippet>1098</a> )))
-<a href=#1099 id=1099 data-nosnippet>1099</a> }
-<a href=#1100 id=1100 data-nosnippet>1100</a> (PrimitiveType::Fixed(len), Statistics::FixedLenByteArray(stat)) => {
-<a href=#1101 id=1101 data-nosnippet>1101</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stat.max_bytes_opt() <span class="kw">else </span>{
-<a href=#1102 id=1102 data-nosnippet>1102</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1103 id=1103 data-nosnippet>1103</a> };
-<a href=#1104 id=1104 data-nosnippet>1104</a> <span class="kw">if </span>bytes.len() != <span class="kw-2">*</span>len <span class="kw">as </span>usize {
-<a href=#1105 id=1105 data-nosnippet>1105</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1106 id=1106 data-nosnippet>1106</a> ErrorKind::Unexpected,
-<a href=#1107 id=1107 data-nosnippet>1107</a> <span class="string">"Invalid length of fixed bytes."</span>,
-<a href=#1108 id=1108 data-nosnippet>1108</a> ));
-<a href=#1109 id=1109 data-nosnippet>1109</a> }
-<a href=#1110 id=1110 data-nosnippet>1110</a> <span class="prelude-val">Some</span>(Datum::fixed(bytes.to_vec()))
+<a href=#1021 id=1021 data-nosnippet>1021</a> (PrimitiveType::Float, Statistics::Float(stats)) => {
+<a href=#1022 id=1022 data-nosnippet>1022</a> stats.max_opt().map(|val| Datum::float(<span class="kw-2">*</span>val))
+<a href=#1023 id=1023 data-nosnippet>1023</a> }
+<a href=#1024 id=1024 data-nosnippet>1024</a> (PrimitiveType::Double, Statistics::Double(stats)) => {
+<a href=#1025 id=1025 data-nosnippet>1025</a> stats.max_opt().map(|val| Datum::double(<span class="kw-2">*</span>val))
+<a href=#1026 id=1026 data-nosnippet>1026</a> }
+<a href=#1027 id=1027 data-nosnippet>1027</a> (PrimitiveType::String, Statistics::ByteArray(stats)) => {
+<a href=#1028 id=1028 data-nosnippet>1028</a> <span class="kw">let </span><span class="prelude-val">Some</span>(val) = stats.max_opt() <span class="kw">else </span>{
+<a href=#1029 id=1029 data-nosnippet>1029</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1030 id=1030 data-nosnippet>1030</a> };
+<a href=#1031 id=1031 data-nosnippet>1031</a>
+<a href=#1032 id=1032 data-nosnippet>1032</a> <span class="prelude-val">Some</span>(Datum::string(val.as_utf8()<span class="question-mark">?</span>))
+<a href=#1033 id=1033 data-nosnippet>1033</a> }
+<a href=#1034 id=1034 data-nosnippet>1034</a> (
+<a href=#1035 id=1035 data-nosnippet>1035</a> PrimitiveType::Decimal {
+<a href=#1036 id=1036 data-nosnippet>1036</a> precision: <span class="kw">_</span>,
+<a href=#1037 id=1037 data-nosnippet>1037</a> scale: <span class="kw">_</span>,
+<a href=#1038 id=1038 data-nosnippet>1038</a> },
+<a href=#1039 id=1039 data-nosnippet>1039</a> Statistics::ByteArray(stats),
+<a href=#1040 id=1040 data-nosnippet>1040</a> ) => {
+<a href=#1041 id=1041 data-nosnippet>1041</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
+<a href=#1042 id=1042 data-nosnippet>1042</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1043 id=1043 data-nosnippet>1043</a> };
+<a href=#1044 id=1044 data-nosnippet>1044</a> <span class="prelude-val">Some</span>(Datum::new(
+<a href=#1045 id=1045 data-nosnippet>1045</a> primitive_type.clone(),
+<a href=#1046 id=1046 data-nosnippet>1046</a> PrimitiveLiteral::Int128(
+<a href=#1047 id=1047 data-nosnippet>1047</a> <span class="comment">// An empty bound carries no value; reject it rather than
+<a href=#1048 id=1048 data-nosnippet>1048</a> // decode it as zero, which could prune matching row groups.
+<a href=#1049 id=1049 data-nosnippet>1049</a> </span>i128_from_be_bytes(bytes)
+<a href=#1050 id=1050 data-nosnippet>1050</a> .filter(|<span class="kw">_</span>| !bytes.is_empty())
+<a href=#1051 id=1051 data-nosnippet>1051</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
+<a href=#1052 id=1052 data-nosnippet>1052</a> ),
+<a href=#1053 id=1053 data-nosnippet>1053</a> ))
+<a href=#1054 id=1054 data-nosnippet>1054</a> }
+<a href=#1055 id=1055 data-nosnippet>1055</a> (
+<a href=#1056 id=1056 data-nosnippet>1056</a> PrimitiveType::Decimal {
+<a href=#1057 id=1057 data-nosnippet>1057</a> precision: <span class="kw">_</span>,
+<a href=#1058 id=1058 data-nosnippet>1058</a> scale: <span class="kw">_</span>,
+<a href=#1059 id=1059 data-nosnippet>1059</a> },
+<a href=#1060 id=1060 data-nosnippet>1060</a> Statistics::FixedLenByteArray(stats),
+<a href=#1061 id=1061 data-nosnippet>1061</a> ) => {
+<a href=#1062 id=1062 data-nosnippet>1062</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
+<a href=#1063 id=1063 data-nosnippet>1063</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1064 id=1064 data-nosnippet>1064</a> };
+<a href=#1065 id=1065 data-nosnippet>1065</a> <span class="prelude-val">Some</span>(Datum::new(
+<a href=#1066 id=1066 data-nosnippet>1066</a> primitive_type.clone(),
+<a href=#1067 id=1067 data-nosnippet>1067</a> PrimitiveLiteral::Int128(
+<a href=#1068 id=1068 data-nosnippet>1068</a> i128_from_be_bytes(bytes)
+<a href=#1069 id=1069 data-nosnippet>1069</a> .ok_or_else(|| <span class="macro">invalid_data!</span>(<span class="string">"Can't convert bytes to i128: {bytes:?}"</span>))<span class="question-mark">?</span>,
+<a href=#1070 id=1070 data-nosnippet>1070</a> ),
+<a href=#1071 id=1071 data-nosnippet>1071</a> ))
+<a href=#1072 id=1072 data-nosnippet>1072</a> }
+<a href=#1073 id=1073 data-nosnippet>1073</a> (
+<a href=#1074 id=1074 data-nosnippet>1074</a> PrimitiveType::Decimal {
+<a href=#1075 id=1075 data-nosnippet>1075</a> precision: <span class="kw">_</span>,
+<a href=#1076 id=1076 data-nosnippet>1076</a> scale: <span class="kw">_</span>,
+<a href=#1077 id=1077 data-nosnippet>1077</a> },
+<a href=#1078 id=1078 data-nosnippet>1078</a> Statistics::Int32(stats),
+<a href=#1079 id=1079 data-nosnippet>1079</a> ) => stats.max_opt().map(|val| {
+<a href=#1080 id=1080 data-nosnippet>1080</a> Datum::new(
+<a href=#1081 id=1081 data-nosnippet>1081</a> primitive_type.clone(),
+<a href=#1082 id=1082 data-nosnippet>1082</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
+<a href=#1083 id=1083 data-nosnippet>1083</a> )
+<a href=#1084 id=1084 data-nosnippet>1084</a> }),
+<a href=#1085 id=1085 data-nosnippet>1085</a>
+<a href=#1086 id=1086 data-nosnippet>1086</a> (
+<a href=#1087 id=1087 data-nosnippet>1087</a> PrimitiveType::Decimal {
+<a href=#1088 id=1088 data-nosnippet>1088</a> precision: <span class="kw">_</span>,
+<a href=#1089 id=1089 data-nosnippet>1089</a> scale: <span class="kw">_</span>,
+<a href=#1090 id=1090 data-nosnippet>1090</a> },
+<a href=#1091 id=1091 data-nosnippet>1091</a> Statistics::Int64(stats),
+<a href=#1092 id=1092 data-nosnippet>1092</a> ) => stats.max_opt().map(|val| {
+<a href=#1093 id=1093 data-nosnippet>1093</a> Datum::new(
+<a href=#1094 id=1094 data-nosnippet>1094</a> primitive_type.clone(),
+<a href=#1095 id=1095 data-nosnippet>1095</a> PrimitiveLiteral::Int128(i128::from(<span class="kw-2">*</span>val)),
+<a href=#1096 id=1096 data-nosnippet>1096</a> )
+<a href=#1097 id=1097 data-nosnippet>1097</a> }),
+<a href=#1098 id=1098 data-nosnippet>1098</a> (PrimitiveType::Uuid, Statistics::FixedLenByteArray(stats)) => {
+<a href=#1099 id=1099 data-nosnippet>1099</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stats.max_bytes_opt() <span class="kw">else </span>{
+<a href=#1100 id=1100 data-nosnippet>1100</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1101 id=1101 data-nosnippet>1101</a> };
+<a href=#1102 id=1102 data-nosnippet>1102</a> <span class="kw">if </span>bytes.len() != <span class="number">16 </span>{
+<a href=#1103 id=1103 data-nosnippet>1103</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1104 id=1104 data-nosnippet>1104</a> ErrorKind::Unexpected,
+<a href=#1105 id=1105 data-nosnippet>1105</a> <span class="string">"Invalid length of uuid bytes."</span>,
+<a href=#1106 id=1106 data-nosnippet>1106</a> ));
+<a href=#1107 id=1107 data-nosnippet>1107</a> }
+<a href=#1108 id=1108 data-nosnippet>1108</a> <span class="prelude-val">Some</span>(Datum::uuid(Uuid::from_bytes(
+<a href=#1109 id=1109 data-nosnippet>1109</a> bytes[..<span class="number">16</span>].try_into().unwrap(),
+<a href=#1110 id=1110 data-nosnippet>1110</a> )))
<a href=#1111 id=1111 data-nosnippet>1111</a> }
-<a href=#1112 id=1112 data-nosnippet>1112</a> (PrimitiveType::Binary, Statistics::ByteArray(stat)) => {
-<a href=#1113 id=1113 data-nosnippet>1113</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(stat
-<a href=#1114 id=1114 data-nosnippet>1114</a> .max_bytes_opt()
-<a href=#1115 id=1115 data-nosnippet>1115</a> .map(|bytes| Datum::binary(bytes.to_vec())));
-<a href=#1116 id=1116 data-nosnippet>1116</a> }
-<a href=#1117 id=1117 data-nosnippet>1117</a> <span class="kw">_ </span>=> {
-<a href=#1118 id=1118 data-nosnippet>1118</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
-<a href=#1119 id=1119 data-nosnippet>1119</a> }
-<a href=#1120 id=1120 data-nosnippet>1120</a> })
-<a href=#1121 id=1121 data-nosnippet>1121</a>}
-<a href=#1122 id=1122 data-nosnippet>1122</a>
-<a href=#1123 id=1123 data-nosnippet>1123</a><span class="kw">impl </span>TryFrom<<span class="kw-2">&</span>ArrowSchema> <span class="kw">for </span>Schema {
-<a href=#1124 id=1124 data-nosnippet>1124</a> <span class="kw">type </span>Error = Error;
-<a href=#1125 id=1125 data-nosnippet>1125</a>
-<a href=#1126 id=1126 data-nosnippet>1126</a> <span class="kw">fn </span>try_from(schema: <span class="kw-2">&</span>ArrowSchema) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1127 id=1127 data-nosnippet>1127</a> arrow_schema_to_schema(schema)
-<a href=#1128 id=1128 data-nosnippet>1128</a> }
-<a href=#1129 id=1129 data-nosnippet>1129</a>}
-<a href=#1130 id=1130 data-nosnippet>1130</a>
-<a href=#1131 id=1131 data-nosnippet>1131</a><span class="kw">impl </span>TryFrom<<span class="kw-2">&</span>Schema> <span class="kw">for </span>ArrowSchema {
-<a href=#1132 id=1132 data-nosnippet>1132</a> <span class="kw">type </span>Error = Error;
-<a href=#1133 id=1133 data-nosnippet>1133</a>
-<a href=#1134 id=1134 data-nosnippet>1134</a> <span class="kw">fn </span>try_from(schema: <span class="kw-2">&</span>Schema) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1135 id=1135 data-nosnippet>1135</a> schema_to_arrow_schema(schema)
-<a href=#1136 id=1136 data-nosnippet>1136</a> }
-<a href=#1137 id=1137 data-nosnippet>1137</a>}
-<a href=#1138 id=1138 data-nosnippet>1138</a>
-<a href=#1139 id=1139 data-nosnippet>1139</a><span class="doccomment">/// Converts a Datum (Iceberg type + primitive literal) to its corresponding Arrow DataType
-<a href=#1140 id=1140 data-nosnippet>1140</a>/// with Run-End Encoding (REE).
-<a href=#1141 id=1141 data-nosnippet>1141</a>///
-<a href=#1142 id=1142 data-nosnippet>1142</a>/// This function is used for constant fields in record batches, where all values are the same.
-<a href=#1143 id=1143 data-nosnippet>1143</a>/// Run-End Encoding provides efficient storage for such constant columns.
-<a href=#1144 id=1144 data-nosnippet>1144</a>///
-<a href=#1145 id=1145 data-nosnippet>1145</a>/// # Arguments
-<a href=#1146 id=1146 data-nosnippet>1146</a>/// * `datum` - The Datum to convert, which contains both type and value information
-<a href=#1147 id=1147 data-nosnippet>1147</a>///
-<a href=#1148 id=1148 data-nosnippet>1148</a>/// # Returns
-<a href=#1149 id=1149 data-nosnippet>1149</a>/// Arrow DataType with Run-End Encoding applied
-<a href=#1150 id=1150 data-nosnippet>1150</a>///
-<a href=#1151 id=1151 data-nosnippet>1151</a>/// # Example
-<a href=#1152 id=1152 data-nosnippet>1152</a>/// ```
-<a href=#1153 id=1153 data-nosnippet>1153</a>/// use iceberg::arrow::datum_to_arrow_type_with_ree;
-<a href=#1154 id=1154 data-nosnippet>1154</a>/// use iceberg::spec::Datum;
-<a href=#1155 id=1155 data-nosnippet>1155</a>///
-<a href=#1156 id=1156 data-nosnippet>1156</a>/// let datum = Datum::string("test_file.parquet");
-<a href=#1157 id=1157 data-nosnippet>1157</a>/// let ree_type = datum_to_arrow_type_with_ree(&datum);
-<a href=#1158 id=1158 data-nosnippet>1158</a>/// // Returns: RunEndEncoded(Int32, Utf8)
-<a href=#1159 id=1159 data-nosnippet>1159</a>/// ```
-<a href=#1160 id=1160 data-nosnippet>1160</a></span><span class="kw">pub fn </span>datum_to_arrow_type_with_ree(datum: <span class="kw-2">&</span>Datum) -> DataType {
-<a href=#1161 id=1161 data-nosnippet>1161</a> primitive_type_to_arrow_type_with_ree(datum.data_type())
-<a href=#1162 id=1162 data-nosnippet>1162</a>}
-<a href=#1163 id=1163 data-nosnippet>1163</a>
-<a href=#1164 id=1164 data-nosnippet>1164</a><span class="doccomment">/// Returns the run-end-encoded Arrow type used to materialize a per-file constant
-<a href=#1165 id=1165 data-nosnippet>1165</a>/// column of the given Iceberg primitive type. Shared by both the value and the
-<a href=#1166 id=1166 data-nosnippet>1166</a>/// all-null constant paths so a column keeps one Arrow type across files.
-<a href=#1167 id=1167 data-nosnippet>1167</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>primitive_type_to_arrow_type_with_ree(primitive_type: <span class="kw-2">&</span>PrimitiveType) -> DataType {
-<a href=#1168 id=1168 data-nosnippet>1168</a> <span class="comment">// Helper to create REE type with the given values type.
-<a href=#1169 id=1169 data-nosnippet>1169</a> // Note: values field is nullable as Arrow expects this when building the
-<a href=#1170 id=1170 data-nosnippet>1170</a> // final Arrow schema with `RunArray::try_new`.
-<a href=#1171 id=1171 data-nosnippet>1171</a> </span><span class="kw">let </span>make_ree = |values_type: DataType| -> DataType {
-<a href=#1172 id=1172 data-nosnippet>1172</a> <span class="kw">let </span>run_ends_field = Arc::new(Field::new(<span class="string">"run_ends"</span>, DataType::Int32, <span class="bool-val">false</span>));
-<a href=#1173 id=1173 data-nosnippet>1173</a> <span class="kw">let </span>values_field = Arc::new(Field::new(<span class="string">"values"</span>, values_type, <span class="bool-val">true</span>));
-<a href=#1174 id=1174 data-nosnippet>1174</a> DataType::RunEndEncoded(run_ends_field, values_field)
-<a href=#1175 id=1175 data-nosnippet>1175</a> };
-<a href=#1176 id=1176 data-nosnippet>1176</a>
-<a href=#1177 id=1177 data-nosnippet>1177</a> <span class="kw">match </span>primitive_type {
-<a href=#1178 id=1178 data-nosnippet>1178</a> PrimitiveType::Unknown => make_ree(DataType::Null),
-<a href=#1179 id=1179 data-nosnippet>1179</a> PrimitiveType::Boolean => make_ree(DataType::Boolean),
-<a href=#1180 id=1180 data-nosnippet>1180</a> PrimitiveType::Int => make_ree(DataType::Int32),
-<a href=#1181 id=1181 data-nosnippet>1181</a> PrimitiveType::Long => make_ree(DataType::Int64),
-<a href=#1182 id=1182 data-nosnippet>1182</a> PrimitiveType::Float => make_ree(DataType::Float32),
-<a href=#1183 id=1183 data-nosnippet>1183</a> PrimitiveType::Double => make_ree(DataType::Float64),
-<a href=#1184 id=1184 data-nosnippet>1184</a> PrimitiveType::Date => make_ree(DataType::Date32),
-<a href=#1185 id=1185 data-nosnippet>1185</a> PrimitiveType::Time => make_ree(DataType::Int64),
-<a href=#1186 id=1186 data-nosnippet>1186</a> PrimitiveType::Timestamp => make_ree(DataType::Int64),
-<a href=#1187 id=1187 data-nosnippet>1187</a> PrimitiveType::Timestamptz => make_ree(DataType::Int64),
-<a href=#1188 id=1188 data-nosnippet>1188</a> PrimitiveType::TimestampNs => make_ree(DataType::Int64),
-<a href=#1189 id=1189 data-nosnippet>1189</a> PrimitiveType::TimestamptzNs => make_ree(DataType::Int64),
-<a href=#1190 id=1190 data-nosnippet>1190</a> PrimitiveType::String => make_ree(DataType::Utf8),
-<a href=#1191 id=1191 data-nosnippet>1191</a> PrimitiveType::Uuid => make_ree(DataType::Binary),
-<a href=#1192 id=1192 data-nosnippet>1192</a> PrimitiveType::Fixed(<span class="kw">_</span>) => make_ree(DataType::Binary),
-<a href=#1193 id=1193 data-nosnippet>1193</a> PrimitiveType::Binary => make_ree(DataType::Binary),
-<a href=#1194 id=1194 data-nosnippet>1194</a> PrimitiveType::Decimal { precision, scale } => {
-<a href=#1195 id=1195 data-nosnippet>1195</a> make_ree(DataType::Decimal128(<span class="kw-2">*</span>precision <span class="kw">as </span>u8, <span class="kw-2">*</span>scale <span class="kw">as </span>i8))
-<a href=#1196 id=1196 data-nosnippet>1196</a> }
-<a href=#1197 id=1197 data-nosnippet>1197</a> }
-<a href=#1198 id=1198 data-nosnippet>1198</a>}
-<a href=#1199 id=1199 data-nosnippet>1199</a>
-<a href=#1200 id=1200 data-nosnippet>1200</a><span class="doccomment">/// A visitor that strips metadata from an Arrow schema.
-<a href=#1201 id=1201 data-nosnippet>1201</a>///
-<a href=#1202 id=1202 data-nosnippet>1202</a>/// This visitor recursively removes all metadata from fields at every level of the schema,
-<a href=#1203 id=1203 data-nosnippet>1203</a>/// including nested struct, list, and map fields. This is useful for schema comparison
-<a href=#1204 id=1204 data-nosnippet>1204</a>/// where metadata differences should be ignored.
-<a href=#1205 id=1205 data-nosnippet>1205</a></span><span class="kw">struct </span>MetadataStripVisitor {
-<a href=#1206 id=1206 data-nosnippet>1206</a> <span class="doccomment">/// Fields whose types are still being visited, innermost last
-<a href=#1207 id=1207 data-nosnippet>1207</a> </span>pending_fields: Vec<PendingField>,
-<a href=#1208 id=1208 data-nosnippet>1208</a>}
-<a href=#1209 id=1209 data-nosnippet>1209</a>
-<a href=#1210 id=1210 data-nosnippet>1210</a><span class="doccomment">/// What `MetadataStripVisitor` keeps of a field until its type is visited
-<a href=#1211 id=1211 data-nosnippet>1211</a></span><span class="kw">struct </span>PendingField {
-<a href=#1212 id=1212 data-nosnippet>1212</a> name: String,
-<a href=#1213 id=1213 data-nosnippet>1213</a> nullable: bool,
-<a href=#1214 id=1214 data-nosnippet>1214</a>}
-<a href=#1215 id=1215 data-nosnippet>1215</a>
-<a href=#1216 id=1216 data-nosnippet>1216</a><span class="kw">impl </span>MetadataStripVisitor {
-<a href=#1217 id=1217 data-nosnippet>1217</a> <span class="kw">fn </span>new() -> <span class="self">Self </span>{
-<a href=#1218 id=1218 data-nosnippet>1218</a> <span class="self">Self </span>{
-<a href=#1219 id=1219 data-nosnippet>1219</a> pending_fields: Vec::new(),
-<a href=#1220 id=1220 data-nosnippet>1220</a> }
-<a href=#1221 id=1221 data-nosnippet>1221</a> }
-<a href=#1222 id=1222 data-nosnippet>1222</a>
-<a href=#1223 id=1223 data-nosnippet>1223</a> <span class="doccomment">/// Records a field whose type is about to be visited.
-<a href=#1224 id=1224 data-nosnippet>1224</a> </span><span class="kw">fn </span>start_field(<span class="kw-2">&mut </span><span class="self">self</span>, name: <span class="kw-2">&</span>str, nullable: bool) -> <span class="prelude-ty">Result</span><()> {
-<a href=#1225 id=1225 data-nosnippet>1225</a> <span class="self">self</span>.pending_fields.push(PendingField {
-<a href=#1226 id=1226 data-nosnippet>1226</a> name: name.to_string(),
-<a href=#1227 id=1227 data-nosnippet>1227</a> nullable,
-<a href=#1228 id=1228 data-nosnippet>1228</a> });
-<a href=#1229 id=1229 data-nosnippet>1229</a> <span class="prelude-val">Ok</span>(())
-<a href=#1230 id=1230 data-nosnippet>1230</a> }
-<a href=#1231 id=1231 data-nosnippet>1231</a>
-<a href=#1232 id=1232 data-nosnippet>1232</a> <span class="doccomment">/// Builds the innermost pending field with `data_type` and no metadata.
-<a href=#1233 id=1233 data-nosnippet>1233</a> /// `kind` names the type in the error for an unbalanced stack.
-<a href=#1234 id=1234 data-nosnippet>1234</a> </span><span class="kw">fn </span>finish_field(<span class="kw-2">&mut </span><span class="self">self</span>, data_type: DataType, kind: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Field> {
-<a href=#1235 id=1235 data-nosnippet>1235</a> <span class="kw">let </span>PendingField { name, nullable } = <span class="self">self</span>.pending_fields.pop().ok_or_else(|| {
-<a href=#1236 id=1236 data-nosnippet>1236</a> Error::new(
-<a href=#1237 id=1237 data-nosnippet>1237</a> ErrorKind::Unexpected,
-<a href=#1238 id=1238 data-nosnippet>1238</a> <span class="macro">format!</span>(<span class="string">"Field stack underflow in {kind}"</span>),
-<a href=#1239 id=1239 data-nosnippet>1239</a> )
-<a href=#1240 id=1240 data-nosnippet>1240</a> })<span class="question-mark">?</span>;
-<a href=#1241 id=1241 data-nosnippet>1241</a> <span class="prelude-val">Ok</span>(Field::new(name, data_type, nullable))
+<a href=#1112 id=1112 data-nosnippet>1112</a> (PrimitiveType::Fixed(len), Statistics::FixedLenByteArray(stat)) => {
+<a href=#1113 id=1113 data-nosnippet>1113</a> <span class="kw">let </span><span class="prelude-val">Some</span>(bytes) = stat.max_bytes_opt() <span class="kw">else </span>{
+<a href=#1114 id=1114 data-nosnippet>1114</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1115 id=1115 data-nosnippet>1115</a> };
+<a href=#1116 id=1116 data-nosnippet>1116</a> <span class="kw">if </span>bytes.len() != <span class="kw-2">*</span>len <span class="kw">as </span>usize {
+<a href=#1117 id=1117 data-nosnippet>1117</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1118 id=1118 data-nosnippet>1118</a> ErrorKind::Unexpected,
+<a href=#1119 id=1119 data-nosnippet>1119</a> <span class="string">"Invalid length of fixed bytes."</span>,
+<a href=#1120 id=1120 data-nosnippet>1120</a> ));
+<a href=#1121 id=1121 data-nosnippet>1121</a> }
+<a href=#1122 id=1122 data-nosnippet>1122</a> <span class="prelude-val">Some</span>(Datum::fixed(bytes.to_vec()))
+<a href=#1123 id=1123 data-nosnippet>1123</a> }
+<a href=#1124 id=1124 data-nosnippet>1124</a> (PrimitiveType::Binary, Statistics::ByteArray(stat)) => {
+<a href=#1125 id=1125 data-nosnippet>1125</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(stat
+<a href=#1126 id=1126 data-nosnippet>1126</a> .max_bytes_opt()
+<a href=#1127 id=1127 data-nosnippet>1127</a> .map(|bytes| Datum::binary(bytes.to_vec())));
+<a href=#1128 id=1128 data-nosnippet>1128</a> }
+<a href=#1129 id=1129 data-nosnippet>1129</a> <span class="kw">_ </span>=> {
+<a href=#1130 id=1130 data-nosnippet>1130</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+<a href=#1131 id=1131 data-nosnippet>1131</a> }
+<a href=#1132 id=1132 data-nosnippet>1132</a> })
+<a href=#1133 id=1133 data-nosnippet>1133</a>}
+<a href=#1134 id=1134 data-nosnippet>1134</a>
+<a href=#1135 id=1135 data-nosnippet>1135</a><span class="kw">impl </span>TryFrom<<span class="kw-2">&</span>ArrowSchema> <span class="kw">for </span>Schema {
+<a href=#1136 id=1136 data-nosnippet>1136</a> <span class="kw">type </span>Error = Error;
+<a href=#1137 id=1137 data-nosnippet>1137</a>
+<a href=#1138 id=1138 data-nosnippet>1138</a> <span class="kw">fn </span>try_from(schema: <span class="kw-2">&</span>ArrowSchema) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1139 id=1139 data-nosnippet>1139</a> arrow_schema_to_schema(schema)
+<a href=#1140 id=1140 data-nosnippet>1140</a> }
+<a href=#1141 id=1141 data-nosnippet>1141</a>}
+<a href=#1142 id=1142 data-nosnippet>1142</a>
+<a href=#1143 id=1143 data-nosnippet>1143</a><span class="kw">impl </span>TryFrom<<span class="kw-2">&</span>Schema> <span class="kw">for </span>ArrowSchema {
+<a href=#1144 id=1144 data-nosnippet>1144</a> <span class="kw">type </span>Error = Error;
+<a href=#1145 id=1145 data-nosnippet>1145</a>
+<a href=#1146 id=1146 data-nosnippet>1146</a> <span class="kw">fn </span>try_from(schema: <span class="kw-2">&</span>Schema) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1147 id=1147 data-nosnippet>1147</a> schema_to_arrow_schema(schema)
+<a href=#1148 id=1148 data-nosnippet>1148</a> }
+<a href=#1149 id=1149 data-nosnippet>1149</a>}
+<a href=#1150 id=1150 data-nosnippet>1150</a>
+<a href=#1151 id=1151 data-nosnippet>1151</a><span class="doccomment">/// Converts a Datum (Iceberg type + primitive literal) to its corresponding Arrow DataType
+<a href=#1152 id=1152 data-nosnippet>1152</a>/// with Run-End Encoding (REE).
+<a href=#1153 id=1153 data-nosnippet>1153</a>///
+<a href=#1154 id=1154 data-nosnippet>1154</a>/// This function is used for constant fields in record batches, where all values are the same.
+<a href=#1155 id=1155 data-nosnippet>1155</a>/// Run-End Encoding provides efficient storage for such constant columns.
+<a href=#1156 id=1156 data-nosnippet>1156</a>///
+<a href=#1157 id=1157 data-nosnippet>1157</a>/// # Arguments
+<a href=#1158 id=1158 data-nosnippet>1158</a>/// * `datum` - The Datum to convert, which contains both type and value information
+<a href=#1159 id=1159 data-nosnippet>1159</a>///
+<a href=#1160 id=1160 data-nosnippet>1160</a>/// # Returns
+<a href=#1161 id=1161 data-nosnippet>1161</a>/// Arrow DataType with Run-End Encoding applied
+<a href=#1162 id=1162 data-nosnippet>1162</a>///
+<a href=#1163 id=1163 data-nosnippet>1163</a>/// # Example
+<a href=#1164 id=1164 data-nosnippet>1164</a>/// ```
+<a href=#1165 id=1165 data-nosnippet>1165</a>/// use iceberg::arrow::datum_to_arrow_type_with_ree;
+<a href=#1166 id=1166 data-nosnippet>1166</a>/// use iceberg::spec::Datum;
+<a href=#1167 id=1167 data-nosnippet>1167</a>///
+<a href=#1168 id=1168 data-nosnippet>1168</a>/// let datum = Datum::string("test_file.parquet");
+<a href=#1169 id=1169 data-nosnippet>1169</a>/// let ree_type = datum_to_arrow_type_with_ree(&datum);
+<a href=#1170 id=1170 data-nosnippet>1170</a>/// // Returns: RunEndEncoded(Int32, Utf8)
+<a href=#1171 id=1171 data-nosnippet>1171</a>/// ```
+<a href=#1172 id=1172 data-nosnippet>1172</a></span><span class="kw">pub fn </span>datum_to_arrow_type_with_ree(datum: <span class="kw-2">&</span>Datum) -> DataType {
+<a href=#1173 id=1173 data-nosnippet>1173</a> primitive_type_to_arrow_type_with_ree(datum.data_type())
+<a href=#1174 id=1174 data-nosnippet>1174</a>}
+<a href=#1175 id=1175 data-nosnippet>1175</a>
+<a href=#1176 id=1176 data-nosnippet>1176</a><span class="doccomment">/// Returns the run-end-encoded Arrow type used to materialize a per-file constant
+<a href=#1177 id=1177 data-nosnippet>1177</a>/// column of the given Iceberg primitive type. Shared by both the value and the
+<a href=#1178 id=1178 data-nosnippet>1178</a>/// all-null constant paths so a column keeps one Arrow type across files.
+<a href=#1179 id=1179 data-nosnippet>1179</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>primitive_type_to_arrow_type_with_ree(primitive_type: <span class="kw-2">&</span>PrimitiveType) -> DataType {
+<a href=#1180 id=1180 data-nosnippet>1180</a> <span class="comment">// Helper to create REE type with the given values type.
+<a href=#1181 id=1181 data-nosnippet>1181</a> // Note: values field is nullable as Arrow expects this when building the
+<a href=#1182 id=1182 data-nosnippet>1182</a> // final Arrow schema with `RunArray::try_new`.
+<a href=#1183 id=1183 data-nosnippet>1183</a> </span><span class="kw">let </span>make_ree = |values_type: DataType| -> DataType {
+<a href=#1184 id=1184 data-nosnippet>1184</a> <span class="kw">let </span>run_ends_field = Arc::new(Field::new(<span class="string">"run_ends"</span>, DataType::Int32, <span class="bool-val">false</span>));
+<a href=#1185 id=1185 data-nosnippet>1185</a> <span class="kw">let </span>values_field = Arc::new(Field::new(<span class="string">"values"</span>, values_type, <span class="bool-val">true</span>));
+<a href=#1186 id=1186 data-nosnippet>1186</a> DataType::RunEndEncoded(run_ends_field, values_field)
+<a href=#1187 id=1187 data-nosnippet>1187</a> };
+<a href=#1188 id=1188 data-nosnippet>1188</a>
+<a href=#1189 id=1189 data-nosnippet>1189</a> <span class="kw">match </span>primitive_type {
+<a href=#1190 id=1190 data-nosnippet>1190</a> PrimitiveType::Unknown => make_ree(DataType::Null),
+<a href=#1191 id=1191 data-nosnippet>1191</a> PrimitiveType::Boolean => make_ree(DataType::Boolean),
+<a href=#1192 id=1192 data-nosnippet>1192</a> PrimitiveType::Int => make_ree(DataType::Int32),
+<a href=#1193 id=1193 data-nosnippet>1193</a> PrimitiveType::Long => make_ree(DataType::Int64),
+<a href=#1194 id=1194 data-nosnippet>1194</a> PrimitiveType::Float => make_ree(DataType::Float32),
+<a href=#1195 id=1195 data-nosnippet>1195</a> PrimitiveType::Double => make_ree(DataType::Float64),
+<a href=#1196 id=1196 data-nosnippet>1196</a> PrimitiveType::Date => make_ree(DataType::Date32),
+<a href=#1197 id=1197 data-nosnippet>1197</a> PrimitiveType::Time => make_ree(DataType::Int64),
+<a href=#1198 id=1198 data-nosnippet>1198</a> PrimitiveType::Timestamp => make_ree(DataType::Int64),
+<a href=#1199 id=1199 data-nosnippet>1199</a> PrimitiveType::Timestamptz => make_ree(DataType::Int64),
+<a href=#1200 id=1200 data-nosnippet>1200</a> PrimitiveType::TimestampNs => make_ree(DataType::Int64),
+<a href=#1201 id=1201 data-nosnippet>1201</a> PrimitiveType::TimestamptzNs => make_ree(DataType::Int64),
+<a href=#1202 id=1202 data-nosnippet>1202</a> PrimitiveType::String => make_ree(DataType::Utf8),
+<a href=#1203 id=1203 data-nosnippet>1203</a> PrimitiveType::Uuid => make_ree(DataType::Binary),
+<a href=#1204 id=1204 data-nosnippet>1204</a> PrimitiveType::Fixed(<span class="kw">_</span>) => make_ree(DataType::Binary),
+<a href=#1205 id=1205 data-nosnippet>1205</a> PrimitiveType::Binary => make_ree(DataType::Binary),
+<a href=#1206 id=1206 data-nosnippet>1206</a> PrimitiveType::Decimal { precision, scale } => {
+<a href=#1207 id=1207 data-nosnippet>1207</a> make_ree(DataType::Decimal128(<span class="kw-2">*</span>precision <span class="kw">as </span>u8, <span class="kw-2">*</span>scale <span class="kw">as </span>i8))
+<a href=#1208 id=1208 data-nosnippet>1208</a> }
+<a href=#1209 id=1209 data-nosnippet>1209</a> }
+<a href=#1210 id=1210 data-nosnippet>1210</a>}
+<a href=#1211 id=1211 data-nosnippet>1211</a>
+<a href=#1212 id=1212 data-nosnippet>1212</a><span class="doccomment">/// A visitor that strips metadata from an Arrow schema.
+<a href=#1213 id=1213 data-nosnippet>1213</a>///
+<a href=#1214 id=1214 data-nosnippet>1214</a>/// This visitor recursively removes all metadata from fields at every level of the schema,
+<a href=#1215 id=1215 data-nosnippet>1215</a>/// including nested struct, list, and map fields. This is useful for schema comparison
+<a href=#1216 id=1216 data-nosnippet>1216</a>/// where metadata differences should be ignored.
+<a href=#1217 id=1217 data-nosnippet>1217</a></span><span class="kw">struct </span>MetadataStripVisitor {
+<a href=#1218 id=1218 data-nosnippet>1218</a> <span class="doccomment">/// Fields whose types are still being visited, innermost last
+<a href=#1219 id=1219 data-nosnippet>1219</a> </span>pending_fields: Vec<PendingField>,
+<a href=#1220 id=1220 data-nosnippet>1220</a>}
+<a href=#1221 id=1221 data-nosnippet>1221</a>
+<a href=#1222 id=1222 data-nosnippet>1222</a><span class="doccomment">/// What `MetadataStripVisitor` keeps of a field until its type is visited
+<a href=#1223 id=1223 data-nosnippet>1223</a></span><span class="kw">struct </span>PendingField {
+<a href=#1224 id=1224 data-nosnippet>1224</a> name: String,
+<a href=#1225 id=1225 data-nosnippet>1225</a> nullable: bool,
+<a href=#1226 id=1226 data-nosnippet>1226</a>}
+<a href=#1227 id=1227 data-nosnippet>1227</a>
+<a href=#1228 id=1228 data-nosnippet>1228</a><span class="kw">impl </span>MetadataStripVisitor {
+<a href=#1229 id=1229 data-nosnippet>1229</a> <span class="kw">fn </span>new() -> <span class="self">Self </span>{
+<a href=#1230 id=1230 data-nosnippet>1230</a> <span class="self">Self </span>{
+<a href=#1231 id=1231 data-nosnippet>1231</a> pending_fields: Vec::new(),
+<a href=#1232 id=1232 data-nosnippet>1232</a> }
+<a href=#1233 id=1233 data-nosnippet>1233</a> }
+<a href=#1234 id=1234 data-nosnippet>1234</a>
+<a href=#1235 id=1235 data-nosnippet>1235</a> <span class="doccomment">/// Records a field whose type is about to be visited.
+<a href=#1236 id=1236 data-nosnippet>1236</a> </span><span class="kw">fn </span>start_field(<span class="kw-2">&mut </span><span class="self">self</span>, name: <span class="kw-2">&</span>str, nullable: bool) -> <span class="prelude-ty">Result</span><()> {
+<a href=#1237 id=1237 data-nosnippet>1237</a> <span class="self">self</span>.pending_fields.push(PendingField {
+<a href=#1238 id=1238 data-nosnippet>1238</a> name: name.to_string(),
+<a href=#1239 id=1239 data-nosnippet>1239</a> nullable,
+<a href=#1240 id=1240 data-nosnippet>1240</a> });
+<a href=#1241 id=1241 data-nosnippet>1241</a> <span class="prelude-val">Ok</span>(())
<a href=#1242 id=1242 data-nosnippet>1242</a> }
-<a href=#1243 id=1243 data-nosnippet>1243</a>}
-<a href=#1244 id=1244 data-nosnippet>1244</a>
-<a href=#1245 id=1245 data-nosnippet>1245</a><span class="kw">impl </span>ArrowSchemaVisitor <span class="kw">for </span>MetadataStripVisitor {
-<a href=#1246 id=1246 data-nosnippet>1246</a> <span class="kw">type </span>T = Field;
-<a href=#1247 id=1247 data-nosnippet>1247</a> <span class="kw">type </span>U = ArrowSchema;
-<a href=#1248 id=1248 data-nosnippet>1248</a>
-<a href=#1249 id=1249 data-nosnippet>1249</a> <span class="kw">fn </span>before_field(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
-<a href=#1250 id=1250 data-nosnippet>1250</a> <span class="self">self</span>.start_field(field.name(), field.is_nullable())
-<a href=#1251 id=1251 data-nosnippet>1251</a> }
-<a href=#1252 id=1252 data-nosnippet>1252</a>
-<a href=#1253 id=1253 data-nosnippet>1253</a> <span class="kw">fn </span>before_list_element(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
-<a href=#1254 id=1254 data-nosnippet>1254</a> <span class="self">self</span>.start_field(LIST_FIELD_NAME, field.is_nullable())
-<a href=#1255 id=1255 data-nosnippet>1255</a> }
+<a href=#1243 id=1243 data-nosnippet>1243</a>
+<a href=#1244 id=1244 data-nosnippet>1244</a> <span class="doccomment">/// Builds the innermost pending field with `data_type` and no metadata.
+<a href=#1245 id=1245 data-nosnippet>1245</a> /// `kind` names the type in the error for an unbalanced stack.
+<a href=#1246 id=1246 data-nosnippet>1246</a> </span><span class="kw">fn </span>finish_field(<span class="kw-2">&mut </span><span class="self">self</span>, data_type: DataType, kind: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Field> {
+<a href=#1247 id=1247 data-nosnippet>1247</a> <span class="kw">let </span>PendingField { name, nullable } = <span class="self">self</span>.pending_fields.pop().ok_or_else(|| {
+<a href=#1248 id=1248 data-nosnippet>1248</a> Error::new(
+<a href=#1249 id=1249 data-nosnippet>1249</a> ErrorKind::Unexpected,
+<a href=#1250 id=1250 data-nosnippet>1250</a> <span class="macro">format!</span>(<span class="string">"Field stack underflow in {kind}"</span>),
+<a href=#1251 id=1251 data-nosnippet>1251</a> )
+<a href=#1252 id=1252 data-nosnippet>1252</a> })<span class="question-mark">?</span>;
+<a href=#1253 id=1253 data-nosnippet>1253</a> <span class="prelude-val">Ok</span>(Field::new(name, data_type, nullable))
+<a href=#1254 id=1254 data-nosnippet>1254</a> }
+<a href=#1255 id=1255 data-nosnippet>1255</a>}
<a href=#1256 id=1256 data-nosnippet>1256</a>
-<a href=#1257 id=1257 data-nosnippet>1257</a> <span class="kw">fn </span>before_map_key(<span class="kw-2">&mut </span><span class="self">self</span>, _field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
-<a href=#1258 id=1258 data-nosnippet>1258</a> <span class="comment">// Map keys are always required, as `schema_to_arrow_schema` builds them.
-<a href=#1259 id=1259 data-nosnippet>1259</a> </span><span class="self">self</span>.start_field(MAP_KEY_FIELD_NAME, <span class="bool-val">false</span>)
-<a href=#1260 id=1260 data-nosnippet>1260</a> }
-<a href=#1261 id=1261 data-nosnippet>1261</a>
-<a href=#1262 id=1262 data-nosnippet>1262</a> <span class="kw">fn </span>before_map_value(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
-<a href=#1263 id=1263 data-nosnippet>1263</a> <span class="self">self</span>.start_field(MAP_VALUE_FIELD_NAME, field.is_nullable())
-<a href=#1264 id=1264 data-nosnippet>1264</a> }
-<a href=#1265 id=1265 data-nosnippet>1265</a>
-<a href=#1266 id=1266 data-nosnippet>1266</a> <span class="kw">fn </span>schema(<span class="kw-2">&mut </span><span class="self">self</span>, _schema: <span class="kw-2">&</span>ArrowSchema, values: Vec<<span class="self">Self</span>::T>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::U> {
-<a href=#1267 id=1267 data-nosnippet>1267</a> <span class="kw">if </span>!<span class="self">self</span>.pending_fields.is_empty() {
-<a href=#1268 id=1268 data-nosnippet>1268</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1269 id=1269 data-nosnippet>1269</a> ErrorKind::Unexpected,
-<a href=#1270 id=1270 data-nosnippet>1270</a> <span class="macro">format!</span>(
-<a href=#1271 id=1271 data-nosnippet>1271</a> <span class="string">"{} fields left on the field stack after traversal"</span>,
-<a href=#1272 id=1272 data-nosnippet>1272</a> <span class="self">self</span>.pending_fields.len()
-<a href=#1273 id=1273 data-nosnippet>1273</a> ),
-<a href=#1274 id=1274 data-nosnippet>1274</a> ));
-<a href=#1275 id=1275 data-nosnippet>1275</a> }
-<a href=#1276 id=1276 data-nosnippet>1276</a> <span class="prelude-val">Ok</span>(ArrowSchema::new(values))
-<a href=#1277 id=1277 data-nosnippet>1277</a> }
-<a href=#1278 id=1278 data-nosnippet>1278</a>
-<a href=#1279 id=1279 data-nosnippet>1279</a> <span class="kw">fn </span>r#struct(<span class="kw-2">&mut </span><span class="self">self</span>, _fields: <span class="kw-2">&</span>Fields, results: Vec<<span class="self">Self</span>::T>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
-<a href=#1280 id=1280 data-nosnippet>1280</a> <span class="self">self</span>.finish_field(DataType::Struct(Fields::from(results)), <span class="string">"struct"</span>)
-<a href=#1281 id=1281 data-nosnippet>1281</a> }
-<a href=#1282 id=1282 data-nosnippet>1282</a>
-<a href=#1283 id=1283 data-nosnippet>1283</a> <span class="kw">fn </span>list(<span class="kw-2">&mut </span><span class="self">self</span>, list: <span class="kw-2">&</span>DataType, value: <span class="self">Self</span>::T) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
-<a href=#1284 id=1284 data-nosnippet>1284</a> <span class="kw">let </span>list_type = <span class="kw">match </span>list {
-<a href=#1285 id=1285 data-nosnippet>1285</a> DataType::List(<span class="kw">_</span>) => DataType::List(Arc::new(value)),
-<a href=#1286 id=1286 data-nosnippet>1286</a> DataType::LargeList(<span class="kw">_</span>) => DataType::LargeList(Arc::new(value)),
-<a href=#1287 id=1287 data-nosnippet>1287</a> DataType::FixedSizeList(<span class="kw">_</span>, size) => DataType::FixedSizeList(Arc::new(value), <span class="kw-2">*</span>size),
-<a href=#1288 id=1288 data-nosnippet>1288</a> <span class="kw">_ </span>=> {
-<a href=#1289 id=1289 data-nosnippet>1289</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1290 id=1290 data-nosnippet>1290</a> ErrorKind::Unexpected,
-<a href=#1291 id=1291 data-nosnippet>1291</a> <span class="macro">format!</span>(<span class="string">"Expected list type, got {list}"</span>),
-<a href=#1292 id=1292 data-nosnippet>1292</a> ));
-<a href=#1293 id=1293 data-nosnippet>1293</a> }
-<a href=#1294 id=1294 data-nosnippet>1294</a> };
-<a href=#1295 id=1295 data-nosnippet>1295</a>
-<a href=#1296 id=1296 data-nosnippet>1296</a> <span class="self">self</span>.finish_field(list_type, <span class="string">"list"</span>)
-<a href=#1297 id=1297 data-nosnippet>1297</a> }
-<a href=#1298 id=1298 data-nosnippet>1298</a>
-<a href=#1299 id=1299 data-nosnippet>1299</a> <span class="kw">fn </span>map(<span class="kw-2">&mut </span><span class="self">self</span>, map: <span class="kw-2">&</span>DataType, key_value: <span class="self">Self</span>::T, value: <span class="self">Self</span>::T) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
-<a href=#1300 id=1300 data-nosnippet>1300</a> <span class="comment">// Reconstruct the map's struct field (contains key and value)
-<a href=#1301 id=1301 data-nosnippet>1301</a> </span><span class="kw">let </span>struct_field = Field::new(
-<a href=#1302 id=1302 data-nosnippet>1302</a> DEFAULT_MAP_FIELD_NAME,
-<a href=#1303 id=1303 data-nosnippet>1303</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[key_value, value])),
-<a href=#1304 id=1304 data-nosnippet>1304</a> <span class="bool-val">false</span>,
-<a href=#1305 id=1305 data-nosnippet>1305</a> );
-<a href=#1306 id=1306 data-nosnippet>1306</a>
-<a href=#1307 id=1307 data-nosnippet>1307</a> <span class="comment">// Get the sorted flag from the original map type
-<a href=#1308 id=1308 data-nosnippet>1308</a> </span><span class="kw">let </span>sorted = <span class="kw">match </span>map {
-<a href=#1309 id=1309 data-nosnippet>1309</a> DataType::Map(<span class="kw">_</span>, sorted) => <span class="kw-2">*</span>sorted,
-<a href=#1310 id=1310 data-nosnippet>1310</a> <span class="kw">_ </span>=> {
-<a href=#1311 id=1311 data-nosnippet>1311</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1312 id=1312 data-nosnippet>1312</a> ErrorKind::Unexpected,
-<a href=#1313 id=1313 data-nosnippet>1313</a> <span class="macro">format!</span>(<span class="string">"Expected map type, got {map}"</span>),
-<a href=#1314 id=1314 data-nosnippet>1314</a> ));
-<a href=#1315 id=1315 data-nosnippet>1315</a> }
-<a href=#1316 id=1316 data-nosnippet>1316</a> };
-<a href=#1317 id=1317 data-nosnippet>1317</a>
-<a href=#1318 id=1318 data-nosnippet>1318</a> <span class="self">self</span>.finish_field(DataType::Map(Arc::new(struct_field), sorted), <span class="string">"map"</span>)
-<a href=#1319 id=1319 data-nosnippet>1319</a> }
-<a href=#1320 id=1320 data-nosnippet>1320</a>
-<a href=#1321 id=1321 data-nosnippet>1321</a> <span class="kw">fn </span>primitive(<span class="kw-2">&mut </span><span class="self">self</span>, p: <span class="kw-2">&</span>DataType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
-<a href=#1322 id=1322 data-nosnippet>1322</a> <span class="self">self</span>.finish_field(p.clone(), <span class="string">"primitive"</span>)
-<a href=#1323 id=1323 data-nosnippet>1323</a> }
-<a href=#1324 id=1324 data-nosnippet>1324</a>}
-<a href=#1325 id=1325 data-nosnippet>1325</a>
-<a href=#1326 id=1326 data-nosnippet>1326</a><span class="doccomment">/// Strips all metadata from an Arrow schema and its nested fields.
-<a href=#1327 id=1327 data-nosnippet>1327</a>///
-<a href=#1328 id=1328 data-nosnippet>1328</a>/// This function recursively removes metadata from all fields at every level of the schema,
-<a href=#1329 id=1329 data-nosnippet>1329</a>/// including nested struct, list, and map fields. This is useful for schema comparison
-<a href=#1330 id=1330 data-nosnippet>1330</a>/// where metadata differences should be ignored.
-<a href=#1331 id=1331 data-nosnippet>1331</a>///
-<a href=#1332 id=1332 data-nosnippet>1332</a>/// Some other differences are normalized away too, so that schemas that differ only in
-<a href=#1333 id=1333 data-nosnippet>1333</a>/// them compare equal once stripped. The fields inside lists and maps are renamed as
-<a href=#1334 id=1334 data-nosnippet>1334</a>/// [`schema_to_arrow_schema`] names them, and dictionaries are unwrapped:
-<a href=#1335 id=1335 data-nosnippet>1335</a>/// - A list's element field is renamed to [`LIST_FIELD_NAME`], so `item` (the arrow-rs
-<a href=#1336 id=1336 data-nosnippet>1336</a>/// default) becomes `element`.
-<a href=#1337 id=1337 data-nosnippet>1337</a>/// - A map's entries field is renamed to [`DEFAULT_MAP_FIELD_NAME`] and made non-nullable.
-<a href=#1338 id=1338 data-nosnippet>1338</a>/// - A map's key and value fields are renamed to [`MAP_KEY_FIELD_NAME`] and
-<a href=#1339 id=1339 data-nosnippet>1339</a>/// [`MAP_VALUE_FIELD_NAME`], so `keys` and `values` (the arrow-rs `MapBuilder` default)
-<a href=#1340 id=1340 data-nosnippet>1340</a>/// become `key` and `value`, and the key is made non-nullable.
-<a href=#1341 id=1341 data-nosnippet>1341</a>/// - A dictionary-encoded field becomes a field of the dictionary's value type.
-<a href=#1342 id=1342 data-nosnippet>1342</a>///
-<a href=#1343 id=1343 data-nosnippet>1343</a>/// The names of the schema's fields and of struct fields are kept. Extension type
-<a href=#1344 id=1344 data-nosnippet>1344</a>/// metadata (`ARROW:extension:*`) is dropped with the rest, so a variant field becomes a
-<a href=#1345 id=1345 data-nosnippet>1345</a>/// plain struct of its `metadata` and `value` fields.
-<a href=#1346 id=1346 data-nosnippet>1346</a>///
-<a href=#1347 id=1347 data-nosnippet>1347</a>/// # Arguments
-<a href=#1348 id=1348 data-nosnippet>1348</a>/// * `schema` - The Arrow schema to strip metadata from
-<a href=#1349 id=1349 data-nosnippet>1349</a>///
-<a href=#1350 id=1350 data-nosnippet>1350</a>/// # Returns
-<a href=#1351 id=1351 data-nosnippet>1351</a>/// A new Arrow schema with all metadata removed, or an error if the schema structure
-<a href=#1352 id=1352 data-nosnippet>1352</a>/// is invalid.
-<a href=#1353 id=1353 data-nosnippet>1353</a>///
-<a href=#1354 id=1354 data-nosnippet>1354</a>/// # Example
-<a href=#1355 id=1355 data-nosnippet>1355</a>/// ```
-<a href=#1356 id=1356 data-nosnippet>1356</a>/// use std::collections::HashMap;
-<a href=#1357 id=1357 data-nosnippet>1357</a>///
-<a href=#1358 id=1358 data-nosnippet>1358</a>/// use arrow_schema::{DataType, Field, Schema as ArrowSchema};
-<a href=#1359 id=1359 data-nosnippet>1359</a>/// use iceberg::arrow::strip_metadata_from_schema;
-<a href=#1360 id=1360 data-nosnippet>1360</a>///
-<a href=#1361 id=1361 data-nosnippet>1361</a>/// let mut metadata = HashMap::new();
-<a href=#1362 id=1362 data-nosnippet>1362</a>/// metadata.insert("key".to_string(), "value".to_string());
-<a href=#1363 id=1363 data-nosnippet>1363</a>///
-<a href=#1364 id=1364 data-nosnippet>1364</a>/// let field = Field::new("col1", DataType::Int32, false).with_metadata(metadata);
-<a href=#1365 id=1365 data-nosnippet>1365</a>/// let schema = ArrowSchema::new(vec![field]);
-<a href=#1366 id=1366 data-nosnippet>1366</a>///
-<a href=#1367 id=1367 data-nosnippet>1367</a>/// let stripped = strip_metadata_from_schema(&schema).unwrap();
-<a href=#1368 id=1368 data-nosnippet>1368</a>/// assert!(stripped.field(0).metadata().is_empty());
-<a href=#1369 id=1369 data-nosnippet>1369</a>/// ```
-<a href=#1370 id=1370 data-nosnippet>1370</a></span><span class="kw">pub fn </span>strip_metadata_from_schema(schema: <span class="kw-2">&</span>ArrowSchema) -> <span class="prelude-ty">Result</span><ArrowSchema> {
-<a href=#1371 id=1371 data-nosnippet>1371</a> <span class="kw">let </span><span class="kw-2">mut </span>visitor = MetadataStripVisitor::new();
-<a href=#1372 id=1372 data-nosnippet>1372</a> visit_schema(schema, <span class="kw-2">&mut </span>visitor)
-<a href=#1373 id=1373 data-nosnippet>1373</a>}
-<a href=#1374 id=1374 data-nosnippet>1374</a>
-<a href=#1375 id=1375 data-nosnippet>1375</a><span class="attr">#[cfg(test)]
-<a href=#1376 id=1376 data-nosnippet>1376</a></span><span class="kw">mod </span>tests {
-<a href=#1377 id=1377 data-nosnippet>1377</a> <span class="kw">use </span>std::collections::HashMap;
-<a href=#1378 id=1378 data-nosnippet>1378</a> <span class="kw">use </span>std::sync::Arc;
-<a href=#1379 id=1379 data-nosnippet>1379</a>
-<a href=#1380 id=1380 data-nosnippet>1380</a> <span class="kw">use </span>arrow_schema::{DataType, Field, Schema <span class="kw">as </span>ArrowSchema, TimeUnit};
-<a href=#1381 id=1381 data-nosnippet>1381</a>
-<a href=#1382 id=1382 data-nosnippet>1382</a> <span class="kw">use </span>super::<span class="kw-2">*</span>;
-<a href=#1383 id=1383 data-nosnippet>1383</a> <span class="kw">use </span><span class="kw">crate</span>::spec::decimal_utils::decimal_new;
-<a href=#1384 id=1384 data-nosnippet>1384</a> <span class="kw">use </span><span class="kw">crate</span>::spec::{Literal, Schema};
-<a href=#1385 id=1385 data-nosnippet>1385</a>
-<a href=#1386 id=1386 data-nosnippet>1386</a> <span class="doccomment">/// Create a simple field with metadata.
-<a href=#1387 id=1387 data-nosnippet>1387</a> </span><span class="kw">fn </span>simple_field(name: <span class="kw-2">&</span>str, ty: DataType, nullable: bool, value: <span class="kw-2">&</span>str) -> Field {
-<a href=#1388 id=1388 data-nosnippet>1388</a> Field::new(name, ty, nullable).with_metadata(HashMap::from([(
-<a href=#1389 id=1389 data-nosnippet>1389</a> PARQUET_FIELD_ID_META_KEY.to_string(),
-<a href=#1390 id=1390 data-nosnippet>1390</a> value.to_string(),
-<a href=#1391 id=1391 data-nosnippet>1391</a> )]))
-<a href=#1392 id=1392 data-nosnippet>1392</a> }
+<a href=#1257 id=1257 data-nosnippet>1257</a><span class="kw">impl </span>ArrowSchemaVisitor <span class="kw">for </span>MetadataStripVisitor {
+<a href=#1258 id=1258 data-nosnippet>1258</a> <span class="kw">type </span>T = Field;
+<a href=#1259 id=1259 data-nosnippet>1259</a> <span class="kw">type </span>U = ArrowSchema;
+<a href=#1260 id=1260 data-nosnippet>1260</a>
+<a href=#1261 id=1261 data-nosnippet>1261</a> <span class="kw">fn </span>before_field(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
+<a href=#1262 id=1262 data-nosnippet>1262</a> <span class="self">self</span>.start_field(field.name(), field.is_nullable())
+<a href=#1263 id=1263 data-nosnippet>1263</a> }
+<a href=#1264 id=1264 data-nosnippet>1264</a>
+<a href=#1265 id=1265 data-nosnippet>1265</a> <span class="kw">fn </span>before_list_element(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
+<a href=#1266 id=1266 data-nosnippet>1266</a> <span class="self">self</span>.start_field(LIST_FIELD_NAME, field.is_nullable())
+<a href=#1267 id=1267 data-nosnippet>1267</a> }
+<a href=#1268 id=1268 data-nosnippet>1268</a>
+<a href=#1269 id=1269 data-nosnippet>1269</a> <span class="kw">fn </span>before_map_key(<span class="kw-2">&mut </span><span class="self">self</span>, _field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
+<a href=#1270 id=1270 data-nosnippet>1270</a> <span class="comment">// Map keys are always required, as `schema_to_arrow_schema` builds them.
+<a href=#1271 id=1271 data-nosnippet>1271</a> </span><span class="self">self</span>.start_field(MAP_KEY_FIELD_NAME, <span class="bool-val">false</span>)
+<a href=#1272 id=1272 data-nosnippet>1272</a> }
+<a href=#1273 id=1273 data-nosnippet>1273</a>
+<a href=#1274 id=1274 data-nosnippet>1274</a> <span class="kw">fn </span>before_map_value(<span class="kw-2">&mut </span><span class="self">self</span>, field: <span class="kw-2">&</span>FieldRef) -> <span class="prelude-ty">Result</span><()> {
+<a href=#1275 id=1275 data-nosnippet>1275</a> <span class="self">self</span>.start_field(MAP_VALUE_FIELD_NAME, field.is_nullable())
+<a href=#1276 id=1276 data-nosnippet>1276</a> }
+<a href=#1277 id=1277 data-nosnippet>1277</a>
+<a href=#1278 id=1278 data-nosnippet>1278</a> <span class="kw">fn </span>schema(<span class="kw-2">&mut </span><span class="self">self</span>, _schema: <span class="kw-2">&</span>ArrowSchema, values: Vec<<span class="self">Self</span>::T>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::U> {
+<a href=#1279 id=1279 data-nosnippet>1279</a> <span class="kw">if </span>!<span class="self">self</span>.pending_fields.is_empty() {
+<a href=#1280 id=1280 data-nosnippet>1280</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1281 id=1281 data-nosnippet>1281</a> ErrorKind::Unexpected,
+<a href=#1282 id=1282 data-nosnippet>1282</a> <span class="macro">format!</span>(
+<a href=#1283 id=1283 data-nosnippet>1283</a> <span class="string">"{} fields left on the field stack after traversal"</span>,
+<a href=#1284 id=1284 data-nosnippet>1284</a> <span class="self">self</span>.pending_fields.len()
+<a href=#1285 id=1285 data-nosnippet>1285</a> ),
+<a href=#1286 id=1286 data-nosnippet>1286</a> ));
+<a href=#1287 id=1287 data-nosnippet>1287</a> }
+<a href=#1288 id=1288 data-nosnippet>1288</a> <span class="prelude-val">Ok</span>(ArrowSchema::new(values))
+<a href=#1289 id=1289 data-nosnippet>1289</a> }
+<a href=#1290 id=1290 data-nosnippet>1290</a>
+<a href=#1291 id=1291 data-nosnippet>1291</a> <span class="kw">fn </span>r#struct(<span class="kw-2">&mut </span><span class="self">self</span>, _fields: <span class="kw-2">&</span>Fields, results: Vec<<span class="self">Self</span>::T>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
+<a href=#1292 id=1292 data-nosnippet>1292</a> <span class="self">self</span>.finish_field(DataType::Struct(Fields::from(results)), <span class="string">"struct"</span>)
+<a href=#1293 id=1293 data-nosnippet>1293</a> }
+<a href=#1294 id=1294 data-nosnippet>1294</a>
+<a href=#1295 id=1295 data-nosnippet>1295</a> <span class="kw">fn </span>list(<span class="kw-2">&mut </span><span class="self">self</span>, list: <span class="kw-2">&</span>DataType, value: <span class="self">Self</span>::T) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
+<a href=#1296 id=1296 data-nosnippet>1296</a> <span class="kw">let </span>list_type = <span class="kw">match </span>list {
+<a href=#1297 id=1297 data-nosnippet>1297</a> DataType::List(<span class="kw">_</span>) => DataType::List(Arc::new(value)),
+<a href=#1298 id=1298 data-nosnippet>1298</a> DataType::LargeList(<span class="kw">_</span>) => DataType::LargeList(Arc::new(value)),
+<a href=#1299 id=1299 data-nosnippet>1299</a> DataType::FixedSizeList(<span class="kw">_</span>, size) => DataType::FixedSizeList(Arc::new(value), <span class="kw-2">*</span>size),
+<a href=#1300 id=1300 data-nosnippet>1300</a> <span class="kw">_ </span>=> {
+<a href=#1301 id=1301 data-nosnippet>1301</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1302 id=1302 data-nosnippet>1302</a> ErrorKind::Unexpected,
+<a href=#1303 id=1303 data-nosnippet>1303</a> <span class="macro">format!</span>(<span class="string">"Expected list type, got {list}"</span>),
+<a href=#1304 id=1304 data-nosnippet>1304</a> ));
+<a href=#1305 id=1305 data-nosnippet>1305</a> }
+<a href=#1306 id=1306 data-nosnippet>1306</a> };
+<a href=#1307 id=1307 data-nosnippet>1307</a>
+<a href=#1308 id=1308 data-nosnippet>1308</a> <span class="self">self</span>.finish_field(list_type, <span class="string">"list"</span>)
+<a href=#1309 id=1309 data-nosnippet>1309</a> }
+<a href=#1310 id=1310 data-nosnippet>1310</a>
+<a href=#1311 id=1311 data-nosnippet>1311</a> <span class="kw">fn </span>map(<span class="kw-2">&mut </span><span class="self">self</span>, map: <span class="kw-2">&</span>DataType, key_value: <span class="self">Self</span>::T, value: <span class="self">Self</span>::T) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
+<a href=#1312 id=1312 data-nosnippet>1312</a> <span class="comment">// Reconstruct the map's struct field (contains key and value)
+<a href=#1313 id=1313 data-nosnippet>1313</a> </span><span class="kw">let </span>struct_field = Field::new(
+<a href=#1314 id=1314 data-nosnippet>1314</a> DEFAULT_MAP_FIELD_NAME,
+<a href=#1315 id=1315 data-nosnippet>1315</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[key_value, value])),
+<a href=#1316 id=1316 data-nosnippet>1316</a> <span class="bool-val">false</span>,
+<a href=#1317 id=1317 data-nosnippet>1317</a> );
+<a href=#1318 id=1318 data-nosnippet>1318</a>
+<a href=#1319 id=1319 data-nosnippet>1319</a> <span class="comment">// Get the sorted flag from the original map type
+<a href=#1320 id=1320 data-nosnippet>1320</a> </span><span class="kw">let </span>sorted = <span class="kw">match </span>map {
+<a href=#1321 id=1321 data-nosnippet>1321</a> DataType::Map(<span class="kw">_</span>, sorted) => <span class="kw-2">*</span>sorted,
+<a href=#1322 id=1322 data-nosnippet>1322</a> <span class="kw">_ </span>=> {
+<a href=#1323 id=1323 data-nosnippet>1323</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1324 id=1324 data-nosnippet>1324</a> ErrorKind::Unexpected,
+<a href=#1325 id=1325 data-nosnippet>1325</a> <span class="macro">format!</span>(<span class="string">"Expected map type, got {map}"</span>),
+<a href=#1326 id=1326 data-nosnippet>1326</a> ));
+<a href=#1327 id=1327 data-nosnippet>1327</a> }
+<a href=#1328 id=1328 data-nosnippet>1328</a> };
+<a href=#1329 id=1329 data-nosnippet>1329</a>
+<a href=#1330 id=1330 data-nosnippet>1330</a> <span class="self">self</span>.finish_field(DataType::Map(Arc::new(struct_field), sorted), <span class="string">"map"</span>)
+<a href=#1331 id=1331 data-nosnippet>1331</a> }
+<a href=#1332 id=1332 data-nosnippet>1332</a>
+<a href=#1333 id=1333 data-nosnippet>1333</a> <span class="kw">fn </span>primitive(<span class="kw-2">&mut </span><span class="self">self</span>, p: <span class="kw-2">&</span>DataType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::T> {
+<a href=#1334 id=1334 data-nosnippet>1334</a> <span class="self">self</span>.finish_field(p.clone(), <span class="string">"primitive"</span>)
+<a href=#1335 id=1335 data-nosnippet>1335</a> }
+<a href=#1336 id=1336 data-nosnippet>1336</a>}
+<a href=#1337 id=1337 data-nosnippet>1337</a>
+<a href=#1338 id=1338 data-nosnippet>1338</a><span class="doccomment">/// Strips all metadata from an Arrow schema and its nested fields.
+<a href=#1339 id=1339 data-nosnippet>1339</a>///
+<a href=#1340 id=1340 data-nosnippet>1340</a>/// This function recursively removes metadata from all fields at every level of the schema,
+<a href=#1341 id=1341 data-nosnippet>1341</a>/// including nested struct, list, and map fields. This is useful for schema comparison
+<a href=#1342 id=1342 data-nosnippet>1342</a>/// where metadata differences should be ignored.
+<a href=#1343 id=1343 data-nosnippet>1343</a>///
+<a href=#1344 id=1344 data-nosnippet>1344</a>/// Some other differences are normalized away too, so that schemas that differ only in
+<a href=#1345 id=1345 data-nosnippet>1345</a>/// them compare equal once stripped. The fields inside lists and maps are renamed as
+<a href=#1346 id=1346 data-nosnippet>1346</a>/// [`schema_to_arrow_schema`] names them, and dictionaries are unwrapped:
+<a href=#1347 id=1347 data-nosnippet>1347</a>/// - A list's element field is renamed to [`LIST_FIELD_NAME`], so `item` (the arrow-rs
+<a href=#1348 id=1348 data-nosnippet>1348</a>/// default) becomes `element`.
+<a href=#1349 id=1349 data-nosnippet>1349</a>/// - A map's entries field is renamed to [`DEFAULT_MAP_FIELD_NAME`] and made non-nullable.
+<a href=#1350 id=1350 data-nosnippet>1350</a>/// - A map's key and value fields are renamed to [`MAP_KEY_FIELD_NAME`] and
+<a href=#1351 id=1351 data-nosnippet>1351</a>/// [`MAP_VALUE_FIELD_NAME`], so `keys` and `values` (the arrow-rs `MapBuilder` default)
+<a href=#1352 id=1352 data-nosnippet>1352</a>/// become `key` and `value`, and the key is made non-nullable.
+<a href=#1353 id=1353 data-nosnippet>1353</a>/// - A dictionary-encoded field becomes a field of the dictionary's value type.
+<a href=#1354 id=1354 data-nosnippet>1354</a>///
+<a href=#1355 id=1355 data-nosnippet>1355</a>/// The names of the schema's fields and of struct fields are kept. Extension type
+<a href=#1356 id=1356 data-nosnippet>1356</a>/// metadata (`ARROW:extension:*`) is dropped with the rest, so a variant field becomes a
+<a href=#1357 id=1357 data-nosnippet>1357</a>/// plain struct of its `metadata` and `value` fields.
+<a href=#1358 id=1358 data-nosnippet>1358</a>///
+<a href=#1359 id=1359 data-nosnippet>1359</a>/// # Arguments
+<a href=#1360 id=1360 data-nosnippet>1360</a>/// * `schema` - The Arrow schema to strip metadata from
+<a href=#1361 id=1361 data-nosnippet>1361</a>///
+<a href=#1362 id=1362 data-nosnippet>1362</a>/// # Returns
+<a href=#1363 id=1363 data-nosnippet>1363</a>/// A new Arrow schema with all metadata removed, or an error if the schema structure
+<a href=#1364 id=1364 data-nosnippet>1364</a>/// is invalid.
+<a href=#1365 id=1365 data-nosnippet>1365</a>///
+<a href=#1366 id=1366 data-nosnippet>1366</a>/// # Example
+<a href=#1367 id=1367 data-nosnippet>1367</a>/// ```
+<a href=#1368 id=1368 data-nosnippet>1368</a>/// use std::collections::HashMap;
+<a href=#1369 id=1369 data-nosnippet>1369</a>///
+<a href=#1370 id=1370 data-nosnippet>1370</a>/// use arrow_schema::{DataType, Field, Schema as ArrowSchema};
+<a href=#1371 id=1371 data-nosnippet>1371</a>/// use iceberg::arrow::strip_metadata_from_schema;
+<a href=#1372 id=1372 data-nosnippet>1372</a>///
+<a href=#1373 id=1373 data-nosnippet>1373</a>/// let mut metadata = HashMap::new();
+<a href=#1374 id=1374 data-nosnippet>1374</a>/// metadata.insert("key".to_string(), "value".to_string());
+<a href=#1375 id=1375 data-nosnippet>1375</a>///
+<a href=#1376 id=1376 data-nosnippet>1376</a>/// let field = Field::new("col1", DataType::Int32, false).with_metadata(metadata);
+<a href=#1377 id=1377 data-nosnippet>1377</a>/// let schema = ArrowSchema::new(vec![field]);
+<a href=#1378 id=1378 data-nosnippet>1378</a>///
+<a href=#1379 id=1379 data-nosnippet>1379</a>/// let stripped = strip_metadata_from_schema(&schema).unwrap();
+<a href=#1380 id=1380 data-nosnippet>1380</a>/// assert!(stripped.field(0).metadata().is_empty());
+<a href=#1381 id=1381 data-nosnippet>1381</a>/// ```
+<a href=#1382 id=1382 data-nosnippet>1382</a></span><span class="kw">pub fn </span>strip_metadata_from_schema(schema: <span class="kw-2">&</span>ArrowSchema) -> <span class="prelude-ty">Result</span><ArrowSchema> {
+<a href=#1383 id=1383 data-nosnippet>1383</a> <span class="kw">let </span><span class="kw-2">mut </span>visitor = MetadataStripVisitor::new();
+<a href=#1384 id=1384 data-nosnippet>1384</a> visit_schema(schema, <span class="kw-2">&mut </span>visitor)
+<a href=#1385 id=1385 data-nosnippet>1385</a>}
+<a href=#1386 id=1386 data-nosnippet>1386</a>
+<a href=#1387 id=1387 data-nosnippet>1387</a><span class="attr">#[cfg(test)]
+<a href=#1388 id=1388 data-nosnippet>1388</a></span><span class="kw">mod </span>tests {
+<a href=#1389 id=1389 data-nosnippet>1389</a> <span class="kw">use </span>std::collections::HashMap;
+<a href=#1390 id=1390 data-nosnippet>1390</a> <span class="kw">use </span>std::sync::Arc;
+<a href=#1391 id=1391 data-nosnippet>1391</a>
+<a href=#1392 id=1392 data-nosnippet>1392</a> <span class="kw">use </span>arrow_schema::{DataType, Field, Schema <span class="kw">as </span>ArrowSchema, TimeUnit};
<a href=#1393 id=1393 data-nosnippet>1393</a>
-<a href=#1394 id=1394 data-nosnippet>1394</a> <span class="kw">fn </span>arrow_schema_for_arrow_schema_to_schema_test() -> ArrowSchema {
-<a href=#1395 id=1395 data-nosnippet>1395</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
-<a href=#1396 id=1396 data-nosnippet>1396</a> simple_field(<span class="string">"key"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"28"</span>),
-<a href=#1397 id=1397 data-nosnippet>1397</a> simple_field(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"29"</span>),
-<a href=#1398 id=1398 data-nosnippet>1398</a> ]);
-<a href=#1399 id=1399 data-nosnippet>1399</a>
-<a href=#1400 id=1400 data-nosnippet>1400</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
-<a href=#1401 id=1401 data-nosnippet>1401</a> <span class="kw">let </span>map = DataType::Map(
-<a href=#1402 id=1402 data-nosnippet>1402</a> Arc::new(simple_field(DEFAULT_MAP_FIELD_NAME, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>)),
-<a href=#1403 id=1403 data-nosnippet>1403</a> <span class="bool-val">false</span>,
-<a href=#1404 id=1404 data-nosnippet>1404</a> );
-<a href=#1405 id=1405 data-nosnippet>1405</a> <span class="kw">let </span>dictionary = DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8));
-<a href=#1406 id=1406 data-nosnippet>1406</a>
+<a href=#1394 id=1394 data-nosnippet>1394</a> <span class="kw">use </span>super::<span class="kw-2">*</span>;
+<a href=#1395 id=1395 data-nosnippet>1395</a> <span class="kw">use </span><span class="kw">crate</span>::spec::decimal_utils::decimal_new;
+<a href=#1396 id=1396 data-nosnippet>1396</a> <span class="kw">use </span><span class="kw">crate</span>::spec::{Literal, Schema};
+<a href=#1397 id=1397 data-nosnippet>1397</a>
+<a href=#1398 id=1398 data-nosnippet>1398</a> <span class="doccomment">/// Create a simple field with metadata.
+<a href=#1399 id=1399 data-nosnippet>1399</a> </span><span class="kw">fn </span>simple_field(name: <span class="kw-2">&</span>str, ty: DataType, nullable: bool, value: <span class="kw-2">&</span>str) -> Field {
+<a href=#1400 id=1400 data-nosnippet>1400</a> Field::new(name, ty, nullable).with_metadata(HashMap::from([(
+<a href=#1401 id=1401 data-nosnippet>1401</a> PARQUET_FIELD_ID_META_KEY.to_string(),
+<a href=#1402 id=1402 data-nosnippet>1402</a> value.to_string(),
+<a href=#1403 id=1403 data-nosnippet>1403</a> )]))
+<a href=#1404 id=1404 data-nosnippet>1404</a> }
+<a href=#1405 id=1405 data-nosnippet>1405</a>
+<a href=#1406 id=1406 data-nosnippet>1406</a> <span class="kw">fn </span>arrow_schema_for_arrow_schema_to_schema_test() -> ArrowSchema {
<a href=#1407 id=1407 data-nosnippet>1407</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
-<a href=#1408 id=1408 data-nosnippet>1408</a> simple_field(<span class="string">"aa"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"18"</span>),
-<a href=#1409 id=1409 data-nosnippet>1409</a> simple_field(<span class="string">"bb"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"19"</span>),
-<a href=#1410 id=1410 data-nosnippet>1410</a> simple_field(
-<a href=#1411 id=1411 data-nosnippet>1411</a> <span class="string">"cc"</span>,
-<a href=#1412 id=1412 data-nosnippet>1412</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
-<a href=#1413 id=1413 data-nosnippet>1413</a> <span class="bool-val">false</span>,
-<a href=#1414 id=1414 data-nosnippet>1414</a> <span class="string">"20"</span>,
-<a href=#1415 id=1415 data-nosnippet>1415</a> ),
-<a href=#1416 id=1416 data-nosnippet>1416</a> ]);
-<a href=#1417 id=1417 data-nosnippet>1417</a>
-<a href=#1418 id=1418 data-nosnippet>1418</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
-<a href=#1419 id=1419 data-nosnippet>1419</a>
-<a href=#1420 id=1420 data-nosnippet>1420</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#1421 id=1421 data-nosnippet>1421</a> simple_field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"2"</span>),
-<a href=#1422 id=1422 data-nosnippet>1422</a> simple_field(<span class="string">"b"</span>, DataType::Int64, <span class="bool-val">false</span>, <span class="string">"1"</span>),
-<a href=#1423 id=1423 data-nosnippet>1423</a> simple_field(<span class="string">"c"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"3"</span>),
-<a href=#1424 id=1424 data-nosnippet>1424</a> simple_field(<span class="string">"n"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"21"</span>),
-<a href=#1425 id=1425 data-nosnippet>1425</a> simple_field(
-<a href=#1426 id=1426 data-nosnippet>1426</a> <span class="string">"d"</span>,
-<a href=#1427 id=1427 data-nosnippet>1427</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
-<a href=#1428 id=1428 data-nosnippet>1428</a> <span class="bool-val">true</span>,
-<a href=#1429 id=1429 data-nosnippet>1429</a> <span class="string">"4"</span>,
-<a href=#1430 id=1430 data-nosnippet>1430</a> ),
-<a href=#1431 id=1431 data-nosnippet>1431</a> simple_field(<span class="string">"e"</span>, DataType::Boolean, <span class="bool-val">true</span>, <span class="string">"6"</span>),
-<a href=#1432 id=1432 data-nosnippet>1432</a> simple_field(<span class="string">"f"</span>, DataType::Float32, <span class="bool-val">false</span>, <span class="string">"5"</span>),
-<a href=#1433 id=1433 data-nosnippet>1433</a> simple_field(<span class="string">"g"</span>, DataType::Float64, <span class="bool-val">false</span>, <span class="string">"7"</span>),
-<a href=#1434 id=1434 data-nosnippet>1434</a> simple_field(<span class="string">"p"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>, <span class="string">"27"</span>),
-<a href=#1435 id=1435 data-nosnippet>1435</a> simple_field(<span class="string">"h"</span>, DataType::Date32, <span class="bool-val">false</span>, <span class="string">"8"</span>),
-<a href=#1436 id=1436 data-nosnippet>1436</a> simple_field(<span class="string">"i"</span>, DataType::Time64(TimeUnit::Microsecond), <span class="bool-val">false</span>, <span class="string">"9"</span>),
+<a href=#1408 id=1408 data-nosnippet>1408</a> simple_field(<span class="string">"key"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"28"</span>),
+<a href=#1409 id=1409 data-nosnippet>1409</a> simple_field(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"29"</span>),
+<a href=#1410 id=1410 data-nosnippet>1410</a> ]);
+<a href=#1411 id=1411 data-nosnippet>1411</a>
+<a href=#1412 id=1412 data-nosnippet>1412</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
+<a href=#1413 id=1413 data-nosnippet>1413</a> <span class="kw">let </span>map = DataType::Map(
+<a href=#1414 id=1414 data-nosnippet>1414</a> Arc::new(simple_field(DEFAULT_MAP_FIELD_NAME, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>)),
+<a href=#1415 id=1415 data-nosnippet>1415</a> <span class="bool-val">false</span>,
+<a href=#1416 id=1416 data-nosnippet>1416</a> );
+<a href=#1417 id=1417 data-nosnippet>1417</a> <span class="kw">let </span>dictionary = DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8));
+<a href=#1418 id=1418 data-nosnippet>1418</a>
+<a href=#1419 id=1419 data-nosnippet>1419</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
+<a href=#1420 id=1420 data-nosnippet>1420</a> simple_field(<span class="string">"aa"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"18"</span>),
+<a href=#1421 id=1421 data-nosnippet>1421</a> simple_field(<span class="string">"bb"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"19"</span>),
+<a href=#1422 id=1422 data-nosnippet>1422</a> simple_field(
+<a href=#1423 id=1423 data-nosnippet>1423</a> <span class="string">"cc"</span>,
+<a href=#1424 id=1424 data-nosnippet>1424</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
+<a href=#1425 id=1425 data-nosnippet>1425</a> <span class="bool-val">false</span>,
+<a href=#1426 id=1426 data-nosnippet>1426</a> <span class="string">"20"</span>,
+<a href=#1427 id=1427 data-nosnippet>1427</a> ),
+<a href=#1428 id=1428 data-nosnippet>1428</a> ]);
+<a href=#1429 id=1429 data-nosnippet>1429</a>
+<a href=#1430 id=1430 data-nosnippet>1430</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
+<a href=#1431 id=1431 data-nosnippet>1431</a>
+<a href=#1432 id=1432 data-nosnippet>1432</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#1433 id=1433 data-nosnippet>1433</a> simple_field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"2"</span>),
+<a href=#1434 id=1434 data-nosnippet>1434</a> simple_field(<span class="string">"b"</span>, DataType::Int64, <span class="bool-val">false</span>, <span class="string">"1"</span>),
+<a href=#1435 id=1435 data-nosnippet>1435</a> simple_field(<span class="string">"c"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"3"</span>),
+<a href=#1436 id=1436 data-nosnippet>1436</a> simple_field(<span class="string">"n"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"21"</span>),
<a href=#1437 id=1437 data-nosnippet>1437</a> simple_field(
-<a href=#1438 id=1438 data-nosnippet>1438</a> <span class="string">"j"</span>,
-<a href=#1439 id=1439 data-nosnippet>1439</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"UTC"</span>.into())),
-<a href=#1440 id=1440 data-nosnippet>1440</a> <span class="bool-val">false</span>,
-<a href=#1441 id=1441 data-nosnippet>1441</a> <span class="string">"10"</span>,
+<a href=#1438 id=1438 data-nosnippet>1438</a> <span class="string">"d"</span>,
+<a href=#1439 id=1439 data-nosnippet>1439</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
+<a href=#1440 id=1440 data-nosnippet>1440</a> <span class="bool-val">true</span>,
+<a href=#1441 id=1441 data-nosnippet>1441</a> <span class="string">"4"</span>,
<a href=#1442 id=1442 data-nosnippet>1442</a> ),
-<a href=#1443 id=1443 data-nosnippet>1443</a> simple_field(
-<a href=#1444 id=1444 data-nosnippet>1444</a> <span class="string">"k"</span>,
-<a href=#1445 id=1445 data-nosnippet>1445</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
-<a href=#1446 id=1446 data-nosnippet>1446</a> <span class="bool-val">false</span>,
-<a href=#1447 id=1447 data-nosnippet>1447</a> <span class="string">"12"</span>,
-<a href=#1448 id=1448 data-nosnippet>1448</a> ),
-<a href=#1449 id=1449 data-nosnippet>1449</a> simple_field(<span class="string">"l"</span>, DataType::Binary, <span class="bool-val">false</span>, <span class="string">"13"</span>),
-<a href=#1450 id=1450 data-nosnippet>1450</a> simple_field(<span class="string">"o"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"22"</span>),
-<a href=#1451 id=1451 data-nosnippet>1451</a> simple_field(<span class="string">"m"</span>, DataType::FixedSizeBinary(<span class="number">10</span>), <span class="bool-val">false</span>, <span class="string">"11"</span>),
-<a href=#1452 id=1452 data-nosnippet>1452</a> simple_field(
-<a href=#1453 id=1453 data-nosnippet>1453</a> <span class="string">"list"</span>,
-<a href=#1454 id=1454 data-nosnippet>1454</a> DataType::List(Arc::new(simple_field(
-<a href=#1455 id=1455 data-nosnippet>1455</a> <span class="string">"element"</span>,
-<a href=#1456 id=1456 data-nosnippet>1456</a> DataType::Int32,
-<a href=#1457 id=1457 data-nosnippet>1457</a> <span class="bool-val">false</span>,
-<a href=#1458 id=1458 data-nosnippet>1458</a> <span class="string">"15"</span>,
-<a href=#1459 id=1459 data-nosnippet>1459</a> ))),
-<a href=#1460 id=1460 data-nosnippet>1460</a> <span class="bool-val">true</span>,
-<a href=#1461 id=1461 data-nosnippet>1461</a> <span class="string">"14"</span>,
-<a href=#1462 id=1462 data-nosnippet>1462</a> ),
-<a href=#1463 id=1463 data-nosnippet>1463</a> simple_field(
-<a href=#1464 id=1464 data-nosnippet>1464</a> <span class="string">"large_list"</span>,
-<a href=#1465 id=1465 data-nosnippet>1465</a> DataType::LargeList(Arc::new(simple_field(
-<a href=#1466 id=1466 data-nosnippet>1466</a> <span class="string">"element"</span>,
-<a href=#1467 id=1467 data-nosnippet>1467</a> DataType::Utf8,
-<a href=#1468 id=1468 data-nosnippet>1468</a> <span class="bool-val">false</span>,
-<a href=#1469 id=1469 data-nosnippet>1469</a> <span class="string">"23"</span>,
-<a href=#1470 id=1470 data-nosnippet>1470</a> ))),
-<a href=#1471 id=1471 data-nosnippet>1471</a> <span class="bool-val">true</span>,
-<a href=#1472 id=1472 data-nosnippet>1472</a> <span class="string">"24"</span>,
-<a href=#1473 id=1473 data-nosnippet>1473</a> ),
-<a href=#1474 id=1474 data-nosnippet>1474</a> simple_field(
-<a href=#1475 id=1475 data-nosnippet>1475</a> <span class="string">"fixed_list"</span>,
-<a href=#1476 id=1476 data-nosnippet>1476</a> DataType::FixedSizeList(
-<a href=#1477 id=1477 data-nosnippet>1477</a> Arc::new(simple_field(<span class="string">"element"</span>, DataType::Binary, <span class="bool-val">false</span>, <span class="string">"26"</span>)),
-<a href=#1478 id=1478 data-nosnippet>1478</a> <span class="number">10</span>,
-<a href=#1479 id=1479 data-nosnippet>1479</a> ),
-<a href=#1480 id=1480 data-nosnippet>1480</a> <span class="bool-val">true</span>,
-<a href=#1481 id=1481 data-nosnippet>1481</a> <span class="string">"25"</span>,
-<a href=#1482 id=1482 data-nosnippet>1482</a> ),
-<a href=#1483 id=1483 data-nosnippet>1483</a> simple_field(<span class="string">"map"</span>, map, <span class="bool-val">false</span>, <span class="string">"16"</span>),
-<a href=#1484 id=1484 data-nosnippet>1484</a> simple_field(<span class="string">"struct"</span>, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>),
-<a href=#1485 id=1485 data-nosnippet>1485</a> simple_field(<span class="string">"dictionary"</span>, dictionary, <span class="bool-val">false</span>, <span class="string">"30"</span>),
-<a href=#1486 id=1486 data-nosnippet>1486</a> ])
-<a href=#1487 id=1487 data-nosnippet>1487</a> }
-<a href=#1488 id=1488 data-nosnippet>1488</a>
-<a href=#1489 id=1489 data-nosnippet>1489</a> <span class="kw">fn </span>iceberg_schema_for_arrow_schema_to_schema_test() -> Schema {
-<a href=#1490 id=1490 data-nosnippet>1490</a> <span class="kw">let </span>schema_json = <span class="string">r#"{
-<a href=#1491 id=1491 data-nosnippet>1491</a> "type":"struct",
-<a href=#1492 id=1492 data-nosnippet>1492</a> "schema-id":0,
-<a href=#1493 id=1493 data-nosnippet>1493</a> "fields":[
-<a href=#1494 id=1494 data-nosnippet>1494</a> {
-<a href=#1495 id=1495 data-nosnippet>1495</a> "id":2,
-<a href=#1496 id=1496 data-nosnippet>1496</a> "name":"a",
-<a href=#1497 id=1497 data-nosnippet>1497</a> "required":true,
-<a href=#1498 id=1498 data-nosnippet>1498</a> "type":"int"
-<a href=#1499 id=1499 data-nosnippet>1499</a> },
-<a href=#1500 id=1500 data-nosnippet>1500</a> {
-<a href=#1501 id=1501 data-nosnippet>1501</a> "id":1,
-<a href=#1502 id=1502 data-nosnippet>1502</a> "name":"b",
-<a href=#1503 id=1503 data-nosnippet>1503</a> "required":true,
-<a href=#1504 id=1504 data-nosnippet>1504</a> "type":"long"
-<a href=#1505 id=1505 data-nosnippet>1505</a> },
+<a href=#1443 id=1443 data-nosnippet>1443</a> simple_field(<span class="string">"e"</span>, DataType::Boolean, <span class="bool-val">true</span>, <span class="string">"6"</span>),
+<a href=#1444 id=1444 data-nosnippet>1444</a> simple_field(<span class="string">"f"</span>, DataType::Float32, <span class="bool-val">false</span>, <span class="string">"5"</span>),
+<a href=#1445 id=1445 data-nosnippet>1445</a> simple_field(<span class="string">"g"</span>, DataType::Float64, <span class="bool-val">false</span>, <span class="string">"7"</span>),
+<a href=#1446 id=1446 data-nosnippet>1446</a> simple_field(<span class="string">"p"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>, <span class="string">"27"</span>),
+<a href=#1447 id=1447 data-nosnippet>1447</a> simple_field(<span class="string">"h"</span>, DataType::Date32, <span class="bool-val">false</span>, <span class="string">"8"</span>),
+<a href=#1448 id=1448 data-nosnippet>1448</a> simple_field(<span class="string">"i"</span>, DataType::Time64(TimeUnit::Microsecond), <span class="bool-val">false</span>, <span class="string">"9"</span>),
+<a href=#1449 id=1449 data-nosnippet>1449</a> simple_field(
+<a href=#1450 id=1450 data-nosnippet>1450</a> <span class="string">"j"</span>,
+<a href=#1451 id=1451 data-nosnippet>1451</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"UTC"</span>.into())),
+<a href=#1452 id=1452 data-nosnippet>1452</a> <span class="bool-val">false</span>,
+<a href=#1453 id=1453 data-nosnippet>1453</a> <span class="string">"10"</span>,
+<a href=#1454 id=1454 data-nosnippet>1454</a> ),
+<a href=#1455 id=1455 data-nosnippet>1455</a> simple_field(
+<a href=#1456 id=1456 data-nosnippet>1456</a> <span class="string">"k"</span>,
+<a href=#1457 id=1457 data-nosnippet>1457</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
+<a href=#1458 id=1458 data-nosnippet>1458</a> <span class="bool-val">false</span>,
+<a href=#1459 id=1459 data-nosnippet>1459</a> <span class="string">"12"</span>,
+<a href=#1460 id=1460 data-nosnippet>1460</a> ),
+<a href=#1461 id=1461 data-nosnippet>1461</a> simple_field(<span class="string">"l"</span>, DataType::Binary, <span class="bool-val">false</span>, <span class="string">"13"</span>),
+<a href=#1462 id=1462 data-nosnippet>1462</a> simple_field(<span class="string">"o"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"22"</span>),
+<a href=#1463 id=1463 data-nosnippet>1463</a> simple_field(<span class="string">"m"</span>, DataType::FixedSizeBinary(<span class="number">10</span>), <span class="bool-val">false</span>, <span class="string">"11"</span>),
+<a href=#1464 id=1464 data-nosnippet>1464</a> simple_field(
+<a href=#1465 id=1465 data-nosnippet>1465</a> <span class="string">"list"</span>,
+<a href=#1466 id=1466 data-nosnippet>1466</a> DataType::List(Arc::new(simple_field(
+<a href=#1467 id=1467 data-nosnippet>1467</a> <span class="string">"element"</span>,
+<a href=#1468 id=1468 data-nosnippet>1468</a> DataType::Int32,
+<a href=#1469 id=1469 data-nosnippet>1469</a> <span class="bool-val">false</span>,
+<a href=#1470 id=1470 data-nosnippet>1470</a> <span class="string">"15"</span>,
+<a href=#1471 id=1471 data-nosnippet>1471</a> ))),
+<a href=#1472 id=1472 data-nosnippet>1472</a> <span class="bool-val">true</span>,
+<a href=#1473 id=1473 data-nosnippet>1473</a> <span class="string">"14"</span>,
+<a href=#1474 id=1474 data-nosnippet>1474</a> ),
+<a href=#1475 id=1475 data-nosnippet>1475</a> simple_field(
+<a href=#1476 id=1476 data-nosnippet>1476</a> <span class="string">"large_list"</span>,
+<a href=#1477 id=1477 data-nosnippet>1477</a> DataType::LargeList(Arc::new(simple_field(
+<a href=#1478 id=1478 data-nosnippet>1478</a> <span class="string">"element"</span>,
+<a href=#1479 id=1479 data-nosnippet>1479</a> DataType::Utf8,
+<a href=#1480 id=1480 data-nosnippet>1480</a> <span class="bool-val">false</span>,
+<a href=#1481 id=1481 data-nosnippet>1481</a> <span class="string">"23"</span>,
+<a href=#1482 id=1482 data-nosnippet>1482</a> ))),
+<a href=#1483 id=1483 data-nosnippet>1483</a> <span class="bool-val">true</span>,
+<a href=#1484 id=1484 data-nosnippet>1484</a> <span class="string">"24"</span>,
+<a href=#1485 id=1485 data-nosnippet>1485</a> ),
+<a href=#1486 id=1486 data-nosnippet>1486</a> simple_field(
+<a href=#1487 id=1487 data-nosnippet>1487</a> <span class="string">"fixed_list"</span>,
+<a href=#1488 id=1488 data-nosnippet>1488</a> DataType::FixedSizeList(
+<a href=#1489 id=1489 data-nosnippet>1489</a> Arc::new(simple_field(<span class="string">"element"</span>, DataType::Binary, <span class="bool-val">false</span>, <span class="string">"26"</span>)),
+<a href=#1490 id=1490 data-nosnippet>1490</a> <span class="number">10</span>,
+<a href=#1491 id=1491 data-nosnippet>1491</a> ),
+<a href=#1492 id=1492 data-nosnippet>1492</a> <span class="bool-val">true</span>,
+<a href=#1493 id=1493 data-nosnippet>1493</a> <span class="string">"25"</span>,
+<a href=#1494 id=1494 data-nosnippet>1494</a> ),
+<a href=#1495 id=1495 data-nosnippet>1495</a> simple_field(<span class="string">"map"</span>, map, <span class="bool-val">false</span>, <span class="string">"16"</span>),
+<a href=#1496 id=1496 data-nosnippet>1496</a> simple_field(<span class="string">"struct"</span>, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>),
+<a href=#1497 id=1497 data-nosnippet>1497</a> simple_field(<span class="string">"dictionary"</span>, dictionary, <span class="bool-val">false</span>, <span class="string">"30"</span>),
+<a href=#1498 id=1498 data-nosnippet>1498</a> ])
+<a href=#1499 id=1499 data-nosnippet>1499</a> }
+<a href=#1500 id=1500 data-nosnippet>1500</a>
+<a href=#1501 id=1501 data-nosnippet>1501</a> <span class="kw">fn </span>iceberg_schema_for_arrow_schema_to_schema_test() -> Schema {
+<a href=#1502 id=1502 data-nosnippet>1502</a> <span class="kw">let </span>schema_json = <span class="string">r#"{
+<a href=#1503 id=1503 data-nosnippet>1503</a> "type":"struct",
+<a href=#1504 id=1504 data-nosnippet>1504</a> "schema-id":0,
+<a href=#1505 id=1505 data-nosnippet>1505</a> "fields":[
<a href=#1506 id=1506 data-nosnippet>1506</a> {
-<a href=#1507 id=1507 data-nosnippet>1507</a> "id":3,
-<a href=#1508 id=1508 data-nosnippet>1508</a> "name":"c",
+<a href=#1507 id=1507 data-nosnippet>1507</a> "id":2,
+<a href=#1508 id=1508 data-nosnippet>1508</a> "name":"a",
<a href=#1509 id=1509 data-nosnippet>1509</a> "required":true,
-<a href=#1510 id=1510 data-nosnippet>1510</a> "type":"string"
+<a href=#1510 id=1510 data-nosnippet>1510</a> "type":"int"
<a href=#1511 id=1511 data-nosnippet>1511</a> },
<a href=#1512 id=1512 data-nosnippet>1512</a> {
-<a href=#1513 id=1513 data-nosnippet>1513</a> "id":21,
-<a href=#1514 id=1514 data-nosnippet>1514</a> "name":"n",
+<a href=#1513 id=1513 data-nosnippet>1513</a> "id":1,
+<a href=#1514 id=1514 data-nosnippet>1514</a> "name":"b",
<a href=#1515 id=1515 data-nosnippet>1515</a> "required":true,
-<a href=#1516 id=1516 data-nosnippet>1516</a> "type":"string"
+<a href=#1516 id=1516 data-nosnippet>1516</a> "type":"long"
<a href=#1517 id=1517 data-nosnippet>1517</a> },
<a href=#1518 id=1518 data-nosnippet>1518</a> {
-<a href=#1519 id=1519 data-nosnippet>1519</a> "id":4,
-<a href=#1520 id=1520 data-nosnippet>1520</a> "name":"d",
-<a href=#1521 id=1521 data-nosnippet>1521</a> "required":false,
-<a href=#1522 id=1522 data-nosnippet>1522</a> "type":"timestamp"
+<a href=#1519 id=1519 data-nosnippet>1519</a> "id":3,
+<a href=#1520 id=1520 data-nosnippet>1520</a> "name":"c",
+<a href=#1521 id=1521 data-nosnippet>1521</a> "required":true,
+<a href=#1522 id=1522 data-nosnippet>1522</a> "type":"string"
<a href=#1523 id=1523 data-nosnippet>1523</a> },
<a href=#1524 id=1524 data-nosnippet>1524</a> {
-<a href=#1525 id=1525 data-nosnippet>1525</a> "id":6,
-<a href=#1526 id=1526 data-nosnippet>1526</a> "name":"e",
-<a href=#1527 id=1527 data-nosnippet>1527</a> "required":false,
-<a href=#1528 id=1528 data-nosnippet>1528</a> "type":"boolean"
+<a href=#1525 id=1525 data-nosnippet>1525</a> "id":21,
+<a href=#1526 id=1526 data-nosnippet>1526</a> "name":"n",
+<a href=#1527 id=1527 data-nosnippet>1527</a> "required":true,
+<a href=#1528 id=1528 data-nosnippet>1528</a> "type":"string"
<a href=#1529 id=1529 data-nosnippet>1529</a> },
<a href=#1530 id=1530 data-nosnippet>1530</a> {
-<a href=#1531 id=1531 data-nosnippet>1531</a> "id":5,
-<a href=#1532 id=1532 data-nosnippet>1532</a> "name":"f",
-<a href=#1533 id=1533 data-nosnippet>1533</a> "required":true,
-<a href=#1534 id=1534 data-nosnippet>1534</a> "type":"float"
+<a href=#1531 id=1531 data-nosnippet>1531</a> "id":4,
+<a href=#1532 id=1532 data-nosnippet>1532</a> "name":"d",
+<a href=#1533 id=1533 data-nosnippet>1533</a> "required":false,
+<a href=#1534 id=1534 data-nosnippet>1534</a> "type":"timestamp"
<a href=#1535 id=1535 data-nosnippet>1535</a> },
<a href=#1536 id=1536 data-nosnippet>1536</a> {
-<a href=#1537 id=1537 data-nosnippet>1537</a> "id":7,
-<a href=#1538 id=1538 data-nosnippet>1538</a> "name":"g",
-<a href=#1539 id=1539 data-nosnippet>1539</a> "required":true,
-<a href=#1540 id=1540 data-nosnippet>1540</a> "type":"double"
+<a href=#1537 id=1537 data-nosnippet>1537</a> "id":6,
+<a href=#1538 id=1538 data-nosnippet>1538</a> "name":"e",
+<a href=#1539 id=1539 data-nosnippet>1539</a> "required":false,
+<a href=#1540 id=1540 data-nosnippet>1540</a> "type":"boolean"
<a href=#1541 id=1541 data-nosnippet>1541</a> },
<a href=#1542 id=1542 data-nosnippet>1542</a> {
-<a href=#1543 id=1543 data-nosnippet>1543</a> "id":27,
-<a href=#1544 id=1544 data-nosnippet>1544</a> "name":"p",
+<a href=#1543 id=1543 data-nosnippet>1543</a> "id":5,
+<a href=#1544 id=1544 data-nosnippet>1544</a> "name":"f",
<a href=#1545 id=1545 data-nosnippet>1545</a> "required":true,
-<a href=#1546 id=1546 data-nosnippet>1546</a> "type":"decimal(10,2)"
+<a href=#1546 id=1546 data-nosnippet>1546</a> "type":"float"
<a href=#1547 id=1547 data-nosnippet>1547</a> },
<a href=#1548 id=1548 data-nosnippet>1548</a> {
-<a href=#1549 id=1549 data-nosnippet>1549</a> "id":8,
-<a href=#1550 id=1550 data-nosnippet>1550</a> "name":"h",
+<a href=#1549 id=1549 data-nosnippet>1549</a> "id":7,
+<a href=#1550 id=1550 data-nosnippet>1550</a> "name":"g",
<a href=#1551 id=1551 data-nosnippet>1551</a> "required":true,
-<a href=#1552 id=1552 data-nosnippet>1552</a> "type":"date"
+<a href=#1552 id=1552 data-nosnippet>1552</a> "type":"double"
<a href=#1553 id=1553 data-nosnippet>1553</a> },
<a href=#1554 id=1554 data-nosnippet>1554</a> {
-<a href=#1555 id=1555 data-nosnippet>1555</a> "id":9,
-<a href=#1556 id=1556 data-nosnippet>1556</a> "name":"i",
+<a href=#1555 id=1555 data-nosnippet>1555</a> "id":27,
+<a href=#1556 id=1556 data-nosnippet>1556</a> "name":"p",
<a href=#1557 id=1557 data-nosnippet>1557</a> "required":true,
-<a href=#1558 id=1558 data-nosnippet>1558</a> "type":"time"
+<a href=#1558 id=1558 data-nosnippet>1558</a> "type":"decimal(10,2)"
<a href=#1559 id=1559 data-nosnippet>1559</a> },
<a href=#1560 id=1560 data-nosnippet>1560</a> {
-<a href=#1561 id=1561 data-nosnippet>1561</a> "id":10,
-<a href=#1562 id=1562 data-nosnippet>1562</a> "name":"j",
+<a href=#1561 id=1561 data-nosnippet>1561</a> "id":8,
+<a href=#1562 id=1562 data-nosnippet>1562</a> "name":"h",
<a href=#1563 id=1563 data-nosnippet>1563</a> "required":true,
-<a href=#1564 id=1564 data-nosnippet>1564</a> "type":"timestamptz"
+<a href=#1564 id=1564 data-nosnippet>1564</a> "type":"date"
<a href=#1565 id=1565 data-nosnippet>1565</a> },
<a href=#1566 id=1566 data-nosnippet>1566</a> {
-<a href=#1567 id=1567 data-nosnippet>1567</a> "id":12,
-<a href=#1568 id=1568 data-nosnippet>1568</a> "name":"k",
+<a href=#1567 id=1567 data-nosnippet>1567</a> "id":9,
+<a href=#1568 id=1568 data-nosnippet>1568</a> "name":"i",
<a href=#1569 id=1569 data-nosnippet>1569</a> "required":true,
-<a href=#1570 id=1570 data-nosnippet>1570</a> "type":"timestamptz"
+<a href=#1570 id=1570 data-nosnippet>1570</a> "type":"time"
<a href=#1571 id=1571 data-nosnippet>1571</a> },
<a href=#1572 id=1572 data-nosnippet>1572</a> {
-<a href=#1573 id=1573 data-nosnippet>1573</a> "id":13,
-<a href=#1574 id=1574 data-nosnippet>1574</a> "name":"l",
+<a href=#1573 id=1573 data-nosnippet>1573</a> "id":10,
+<a href=#1574 id=1574 data-nosnippet>1574</a> "name":"j",
<a href=#1575 id=1575 data-nosnippet>1575</a> "required":true,
-<a href=#1576 id=1576 data-nosnippet>1576</a> "type":"binary"
+<a href=#1576 id=1576 data-nosnippet>1576</a> "type":"timestamptz"
<a href=#1577 id=1577 data-nosnippet>1577</a> },
<a href=#1578 id=1578 data-nosnippet>1578</a> {
-<a href=#1579 id=1579 data-nosnippet>1579</a> "id":22,
-<a href=#1580 id=1580 data-nosnippet>1580</a> "name":"o",
+<a href=#1579 id=1579 data-nosnippet>1579</a> "id":12,
+<a href=#1580 id=1580 data-nosnippet>1580</a> "name":"k",
<a href=#1581 id=1581 data-nosnippet>1581</a> "required":true,
-<a href=#1582 id=1582 data-nosnippet>1582</a> "type":"binary"
+<a href=#1582 id=1582 data-nosnippet>1582</a> "type":"timestamptz"
<a href=#1583 id=1583 data-nosnippet>1583</a> },
<a href=#1584 id=1584 data-nosnippet>1584</a> {
-<a href=#1585 id=1585 data-nosnippet>1585</a> "id":11,
-<a href=#1586 id=1586 data-nosnippet>1586</a> "name":"m",
+<a href=#1585 id=1585 data-nosnippet>1585</a> "id":13,
+<a href=#1586 id=1586 data-nosnippet>1586</a> "name":"l",
<a href=#1587 id=1587 data-nosnippet>1587</a> "required":true,
-<a href=#1588 id=1588 data-nosnippet>1588</a> "type":"fixed[10]"
+<a href=#1588 id=1588 data-nosnippet>1588</a> "type":"binary"
<a href=#1589 id=1589 data-nosnippet>1589</a> },
<a href=#1590 id=1590 data-nosnippet>1590</a> {
-<a href=#1591 id=1591 data-nosnippet>1591</a> "id":14,
-<a href=#1592 id=1592 data-nosnippet>1592</a> "name":"list",
-<a href=#1593 id=1593 data-nosnippet>1593</a> "required": false,
-<a href=#1594 id=1594 data-nosnippet>1594</a> "type": {
-<a href=#1595 id=1595 data-nosnippet>1595</a> "type": "list",
-<a href=#1596 id=1596 data-nosnippet>1596</a> "element-id": 15,
-<a href=#1597 id=1597 data-nosnippet>1597</a> "element-required": true,
-<a href=#1598 id=1598 data-nosnippet>1598</a> "element": "int"
-<a href=#1599 id=1599 data-nosnippet>1599</a> }
-<a href=#1600 id=1600 data-nosnippet>1600</a> },
-<a href=#1601 id=1601 data-nosnippet>1601</a> {
-<a href=#1602 id=1602 data-nosnippet>1602</a> "id":24,
-<a href=#1603 id=1603 data-nosnippet>1603</a> "name":"large_list",
-<a href=#1604 id=1604 data-nosnippet>1604</a> "required": false,
-<a href=#1605 id=1605 data-nosnippet>1605</a> "type": {
-<a href=#1606 id=1606 data-nosnippet>1606</a> "type": "list",
-<a href=#1607 id=1607 data-nosnippet>1607</a> "element-id": 23,
-<a href=#1608 id=1608 data-nosnippet>1608</a> "element-required": true,
-<a href=#1609 id=1609 data-nosnippet>1609</a> "element": "string"
-<a href=#1610 id=1610 data-nosnippet>1610</a> }
-<a href=#1611 id=1611 data-nosnippet>1611</a> },
-<a href=#1612 id=1612 data-nosnippet>1612</a> {
-<a href=#1613 id=1613 data-nosnippet>1613</a> "id":25,
-<a href=#1614 id=1614 data-nosnippet>1614</a> "name":"fixed_list",
-<a href=#1615 id=1615 data-nosnippet>1615</a> "required": false,
-<a href=#1616 id=1616 data-nosnippet>1616</a> "type": {
-<a href=#1617 id=1617 data-nosnippet>1617</a> "type": "list",
-<a href=#1618 id=1618 data-nosnippet>1618</a> "element-id": 26,
-<a href=#1619 id=1619 data-nosnippet>1619</a> "element-required": true,
-<a href=#1620 id=1620 data-nosnippet>1620</a> "element": "binary"
-<a href=#1621 id=1621 data-nosnippet>1621</a> }
-<a href=#1622 id=1622 data-nosnippet>1622</a> },
-<a href=#1623 id=1623 data-nosnippet>1623</a> {
-<a href=#1624 id=1624 data-nosnippet>1624</a> "id":16,
-<a href=#1625 id=1625 data-nosnippet>1625</a> "name":"map",
-<a href=#1626 id=1626 data-nosnippet>1626</a> "required": true,
-<a href=#1627 id=1627 data-nosnippet>1627</a> "type": {
-<a href=#1628 id=1628 data-nosnippet>1628</a> "type": "map",
-<a href=#1629 id=1629 data-nosnippet>1629</a> "key-id": 28,
-<a href=#1630 id=1630 data-nosnippet>1630</a> "key": "int",
-<a href=#1631 id=1631 data-nosnippet>1631</a> "value-id": 29,
-<a href=#1632 id=1632 data-nosnippet>1632</a> "value-required": false,
-<a href=#1633 id=1633 data-nosnippet>1633</a> "value": "string"
-<a href=#1634 id=1634 data-nosnippet>1634</a> }
-<a href=#1635 id=1635 data-nosnippet>1635</a> },
-<a href=#1636 id=1636 data-nosnippet>1636</a> {
-<a href=#1637 id=1637 data-nosnippet>1637</a> "id":17,
-<a href=#1638 id=1638 data-nosnippet>1638</a> "name":"struct",
-<a href=#1639 id=1639 data-nosnippet>1639</a> "required": true,
-<a href=#1640 id=1640 data-nosnippet>1640</a> "type": {
-<a href=#1641 id=1641 data-nosnippet>1641</a> "type": "struct",
-<a href=#1642 id=1642 data-nosnippet>1642</a> "fields": [
-<a href=#1643 id=1643 data-nosnippet>1643</a> {
-<a href=#1644 id=1644 data-nosnippet>1644</a> "id":18,
-<a href=#1645 id=1645 data-nosnippet>1645</a> "name":"aa",
-<a href=#1646 id=1646 data-nosnippet>1646</a> "required":true,
-<a href=#1647 id=1647 data-nosnippet>1647</a> "type":"int"
-<a href=#1648 id=1648 data-nosnippet>1648</a> },
-<a href=#1649 id=1649 data-nosnippet>1649</a> {
-<a href=#1650 id=1650 data-nosnippet>1650</a> "id":19,
-<a href=#1651 id=1651 data-nosnippet>1651</a> "name":"bb",
-<a href=#1652 id=1652 data-nosnippet>1652</a> "required":false,
-<a href=#1653 id=1653 data-nosnippet>1653</a> "type":"string"
-<a href=#1654 id=1654 data-nosnippet>1654</a> },
+<a href=#1591 id=1591 data-nosnippet>1591</a> "id":22,
+<a href=#1592 id=1592 data-nosnippet>1592</a> "name":"o",
+<a href=#1593 id=1593 data-nosnippet>1593</a> "required":true,
+<a href=#1594 id=1594 data-nosnippet>1594</a> "type":"binary"
+<a href=#1595 id=1595 data-nosnippet>1595</a> },
+<a href=#1596 id=1596 data-nosnippet>1596</a> {
+<a href=#1597 id=1597 data-nosnippet>1597</a> "id":11,
+<a href=#1598 id=1598 data-nosnippet>1598</a> "name":"m",
+<a href=#1599 id=1599 data-nosnippet>1599</a> "required":true,
+<a href=#1600 id=1600 data-nosnippet>1600</a> "type":"fixed[10]"
+<a href=#1601 id=1601 data-nosnippet>1601</a> },
+<a href=#1602 id=1602 data-nosnippet>1602</a> {
+<a href=#1603 id=1603 data-nosnippet>1603</a> "id":14,
+<a href=#1604 id=1604 data-nosnippet>1604</a> "name":"list",
+<a href=#1605 id=1605 data-nosnippet>1605</a> "required": false,
+<a href=#1606 id=1606 data-nosnippet>1606</a> "type": {
+<a href=#1607 id=1607 data-nosnippet>1607</a> "type": "list",
+<a href=#1608 id=1608 data-nosnippet>1608</a> "element-id": 15,
+<a href=#1609 id=1609 data-nosnippet>1609</a> "element-required": true,
+<a href=#1610 id=1610 data-nosnippet>1610</a> "element": "int"
+<a href=#1611 id=1611 data-nosnippet>1611</a> }
+<a href=#1612 id=1612 data-nosnippet>1612</a> },
+<a href=#1613 id=1613 data-nosnippet>1613</a> {
+<a href=#1614 id=1614 data-nosnippet>1614</a> "id":24,
+<a href=#1615 id=1615 data-nosnippet>1615</a> "name":"large_list",
+<a href=#1616 id=1616 data-nosnippet>1616</a> "required": false,
+<a href=#1617 id=1617 data-nosnippet>1617</a> "type": {
+<a href=#1618 id=1618 data-nosnippet>1618</a> "type": "list",
+<a href=#1619 id=1619 data-nosnippet>1619</a> "element-id": 23,
+<a href=#1620 id=1620 data-nosnippet>1620</a> "element-required": true,
+<a href=#1621 id=1621 data-nosnippet>1621</a> "element": "string"
+<a href=#1622 id=1622 data-nosnippet>1622</a> }
+<a href=#1623 id=1623 data-nosnippet>1623</a> },
+<a href=#1624 id=1624 data-nosnippet>1624</a> {
+<a href=#1625 id=1625 data-nosnippet>1625</a> "id":25,
+<a href=#1626 id=1626 data-nosnippet>1626</a> "name":"fixed_list",
+<a href=#1627 id=1627 data-nosnippet>1627</a> "required": false,
+<a href=#1628 id=1628 data-nosnippet>1628</a> "type": {
+<a href=#1629 id=1629 data-nosnippet>1629</a> "type": "list",
+<a href=#1630 id=1630 data-nosnippet>1630</a> "element-id": 26,
+<a href=#1631 id=1631 data-nosnippet>1631</a> "element-required": true,
+<a href=#1632 id=1632 data-nosnippet>1632</a> "element": "binary"
+<a href=#1633 id=1633 data-nosnippet>1633</a> }
+<a href=#1634 id=1634 data-nosnippet>1634</a> },
+<a href=#1635 id=1635 data-nosnippet>1635</a> {
+<a href=#1636 id=1636 data-nosnippet>1636</a> "id":16,
+<a href=#1637 id=1637 data-nosnippet>1637</a> "name":"map",
+<a href=#1638 id=1638 data-nosnippet>1638</a> "required": true,
+<a href=#1639 id=1639 data-nosnippet>1639</a> "type": {
+<a href=#1640 id=1640 data-nosnippet>1640</a> "type": "map",
+<a href=#1641 id=1641 data-nosnippet>1641</a> "key-id": 28,
+<a href=#1642 id=1642 data-nosnippet>1642</a> "key": "int",
+<a href=#1643 id=1643 data-nosnippet>1643</a> "value-id": 29,
+<a href=#1644 id=1644 data-nosnippet>1644</a> "value-required": false,
+<a href=#1645 id=1645 data-nosnippet>1645</a> "value": "string"
+<a href=#1646 id=1646 data-nosnippet>1646</a> }
+<a href=#1647 id=1647 data-nosnippet>1647</a> },
+<a href=#1648 id=1648 data-nosnippet>1648</a> {
+<a href=#1649 id=1649 data-nosnippet>1649</a> "id":17,
+<a href=#1650 id=1650 data-nosnippet>1650</a> "name":"struct",
+<a href=#1651 id=1651 data-nosnippet>1651</a> "required": true,
+<a href=#1652 id=1652 data-nosnippet>1652</a> "type": {
+<a href=#1653 id=1653 data-nosnippet>1653</a> "type": "struct",
+<a href=#1654 id=1654 data-nosnippet>1654</a> "fields": [
<a href=#1655 id=1655 data-nosnippet>1655</a> {
-<a href=#1656 id=1656 data-nosnippet>1656</a> "id":20,
-<a href=#1657 id=1657 data-nosnippet>1657</a> "name":"cc",
+<a href=#1656 id=1656 data-nosnippet>1656</a> "id":18,
+<a href=#1657 id=1657 data-nosnippet>1657</a> "name":"aa",
<a href=#1658 id=1658 data-nosnippet>1658</a> "required":true,
-<a href=#1659 id=1659 data-nosnippet>1659</a> "type":"timestamp"
-<a href=#1660 id=1660 data-nosnippet>1660</a> }
-<a href=#1661 id=1661 data-nosnippet>1661</a> ]
-<a href=#1662 id=1662 data-nosnippet>1662</a> }
-<a href=#1663 id=1663 data-nosnippet>1663</a> },
-<a href=#1664 id=1664 data-nosnippet>1664</a> {
-<a href=#1665 id=1665 data-nosnippet>1665</a> "id":30,
-<a href=#1666 id=1666 data-nosnippet>1666</a> "name":"dictionary",
-<a href=#1667 id=1667 data-nosnippet>1667</a> "required":true,
-<a href=#1668 id=1668 data-nosnippet>1668</a> "type":"string"
-<a href=#1669 id=1669 data-nosnippet>1669</a> }
-<a href=#1670 id=1670 data-nosnippet>1670</a> ],
-<a href=#1671 id=1671 data-nosnippet>1671</a> "identifier-field-ids":[]
-<a href=#1672 id=1672 data-nosnippet>1672</a> }"#</span>;
-<a href=#1673 id=1673 data-nosnippet>1673</a>
-<a href=#1674 id=1674 data-nosnippet>1674</a> <span class="kw">let </span>schema: Schema = serde_json::from_str(schema_json).unwrap();
-<a href=#1675 id=1675 data-nosnippet>1675</a> schema
-<a href=#1676 id=1676 data-nosnippet>1676</a> }
-<a href=#1677 id=1677 data-nosnippet>1677</a>
-<a href=#1678 id=1678 data-nosnippet>1678</a> <span class="attr">#[test]
-<a href=#1679 id=1679 data-nosnippet>1679</a> </span><span class="kw">fn </span>test_arrow_schema_to_schema() {
-<a href=#1680 id=1680 data-nosnippet>1680</a> <span class="kw">let </span>arrow_schema = arrow_schema_for_arrow_schema_to_schema_test();
-<a href=#1681 id=1681 data-nosnippet>1681</a> <span class="kw">let </span>schema = iceberg_schema_for_arrow_schema_to_schema_test();
-<a href=#1682 id=1682 data-nosnippet>1682</a> <span class="kw">let </span>converted_schema = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#1683 id=1683 data-nosnippet>1683</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted_schema, schema);
-<a href=#1684 id=1684 data-nosnippet>1684</a> }
+<a href=#1659 id=1659 data-nosnippet>1659</a> "type":"int"
+<a href=#1660 id=1660 data-nosnippet>1660</a> },
+<a href=#1661 id=1661 data-nosnippet>1661</a> {
+<a href=#1662 id=1662 data-nosnippet>1662</a> "id":19,
+<a href=#1663 id=1663 data-nosnippet>1663</a> "name":"bb",
+<a href=#1664 id=1664 data-nosnippet>1664</a> "required":false,
+<a href=#1665 id=1665 data-nosnippet>1665</a> "type":"string"
+<a href=#1666 id=1666 data-nosnippet>1666</a> },
+<a href=#1667 id=1667 data-nosnippet>1667</a> {
+<a href=#1668 id=1668 data-nosnippet>1668</a> "id":20,
+<a href=#1669 id=1669 data-nosnippet>1669</a> "name":"cc",
+<a href=#1670 id=1670 data-nosnippet>1670</a> "required":true,
+<a href=#1671 id=1671 data-nosnippet>1671</a> "type":"timestamp"
+<a href=#1672 id=1672 data-nosnippet>1672</a> }
+<a href=#1673 id=1673 data-nosnippet>1673</a> ]
+<a href=#1674 id=1674 data-nosnippet>1674</a> }
+<a href=#1675 id=1675 data-nosnippet>1675</a> },
+<a href=#1676 id=1676 data-nosnippet>1676</a> {
+<a href=#1677 id=1677 data-nosnippet>1677</a> "id":30,
+<a href=#1678 id=1678 data-nosnippet>1678</a> "name":"dictionary",
+<a href=#1679 id=1679 data-nosnippet>1679</a> "required":true,
+<a href=#1680 id=1680 data-nosnippet>1680</a> "type":"string"
+<a href=#1681 id=1681 data-nosnippet>1681</a> }
+<a href=#1682 id=1682 data-nosnippet>1682</a> ],
+<a href=#1683 id=1683 data-nosnippet>1683</a> "identifier-field-ids":[]
+<a href=#1684 id=1684 data-nosnippet>1684</a> }"#</span>;
<a href=#1685 id=1685 data-nosnippet>1685</a>
-<a href=#1686 id=1686 data-nosnippet>1686</a> <span class="kw">fn </span>arrow_schema_for_schema_to_arrow_schema_test() -> ArrowSchema {
-<a href=#1687 id=1687 data-nosnippet>1687</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
-<a href=#1688 id=1688 data-nosnippet>1688</a> simple_field(<span class="string">"key"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"28"</span>),
-<a href=#1689 id=1689 data-nosnippet>1689</a> simple_field(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"29"</span>),
-<a href=#1690 id=1690 data-nosnippet>1690</a> ]);
-<a href=#1691 id=1691 data-nosnippet>1691</a>
-<a href=#1692 id=1692 data-nosnippet>1692</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
-<a href=#1693 id=1693 data-nosnippet>1693</a> <span class="kw">let </span>map = DataType::Map(
-<a href=#1694 id=1694 data-nosnippet>1694</a> Arc::new(Field::new(DEFAULT_MAP_FIELD_NAME, r#struct, <span class="bool-val">false</span>)),
-<a href=#1695 id=1695 data-nosnippet>1695</a> <span class="bool-val">false</span>,
-<a href=#1696 id=1696 data-nosnippet>1696</a> );
+<a href=#1686 id=1686 data-nosnippet>1686</a> <span class="kw">let </span>schema: Schema = serde_json::from_str(schema_json).unwrap();
+<a href=#1687 id=1687 data-nosnippet>1687</a> schema
+<a href=#1688 id=1688 data-nosnippet>1688</a> }
+<a href=#1689 id=1689 data-nosnippet>1689</a>
+<a href=#1690 id=1690 data-nosnippet>1690</a> <span class="attr">#[test]
+<a href=#1691 id=1691 data-nosnippet>1691</a> </span><span class="kw">fn </span>test_arrow_schema_to_schema() {
+<a href=#1692 id=1692 data-nosnippet>1692</a> <span class="kw">let </span>arrow_schema = arrow_schema_for_arrow_schema_to_schema_test();
+<a href=#1693 id=1693 data-nosnippet>1693</a> <span class="kw">let </span>schema = iceberg_schema_for_arrow_schema_to_schema_test();
+<a href=#1694 id=1694 data-nosnippet>1694</a> <span class="kw">let </span>converted_schema = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#1695 id=1695 data-nosnippet>1695</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted_schema, schema);
+<a href=#1696 id=1696 data-nosnippet>1696</a> }
<a href=#1697 id=1697 data-nosnippet>1697</a>
-<a href=#1698 id=1698 data-nosnippet>1698</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
-<a href=#1699 id=1699 data-nosnippet>1699</a> simple_field(<span class="string">"aa"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"18"</span>),
-<a href=#1700 id=1700 data-nosnippet>1700</a> simple_field(<span class="string">"bb"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"19"</span>),
-<a href=#1701 id=1701 data-nosnippet>1701</a> simple_field(
-<a href=#1702 id=1702 data-nosnippet>1702</a> <span class="string">"cc"</span>,
-<a href=#1703 id=1703 data-nosnippet>1703</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
-<a href=#1704 id=1704 data-nosnippet>1704</a> <span class="bool-val">false</span>,
-<a href=#1705 id=1705 data-nosnippet>1705</a> <span class="string">"20"</span>,
-<a href=#1706 id=1706 data-nosnippet>1706</a> ),
-<a href=#1707 id=1707 data-nosnippet>1707</a> ]);
-<a href=#1708 id=1708 data-nosnippet>1708</a>
-<a href=#1709 id=1709 data-nosnippet>1709</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
-<a href=#1710 id=1710 data-nosnippet>1710</a>
-<a href=#1711 id=1711 data-nosnippet>1711</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#1712 id=1712 data-nosnippet>1712</a> simple_field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"2"</span>),
-<a href=#1713 id=1713 data-nosnippet>1713</a> simple_field(<span class="string">"b"</span>, DataType::Int64, <span class="bool-val">false</span>, <span class="string">"1"</span>),
-<a href=#1714 id=1714 data-nosnippet>1714</a> simple_field(<span class="string">"c"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"3"</span>),
-<a href=#1715 id=1715 data-nosnippet>1715</a> simple_field(<span class="string">"n"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"21"</span>),
-<a href=#1716 id=1716 data-nosnippet>1716</a> simple_field(
-<a href=#1717 id=1717 data-nosnippet>1717</a> <span class="string">"d"</span>,
-<a href=#1718 id=1718 data-nosnippet>1718</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
-<a href=#1719 id=1719 data-nosnippet>1719</a> <span class="bool-val">true</span>,
-<a href=#1720 id=1720 data-nosnippet>1720</a> <span class="string">"4"</span>,
-<a href=#1721 id=1721 data-nosnippet>1721</a> ),
-<a href=#1722 id=1722 data-nosnippet>1722</a> simple_field(<span class="string">"e"</span>, DataType::Boolean, <span class="bool-val">true</span>, <span class="string">"6"</span>),
-<a href=#1723 id=1723 data-nosnippet>1723</a> simple_field(<span class="string">"f"</span>, DataType::Float32, <span class="bool-val">false</span>, <span class="string">"5"</span>),
-<a href=#1724 id=1724 data-nosnippet>1724</a> simple_field(<span class="string">"g"</span>, DataType::Float64, <span class="bool-val">false</span>, <span class="string">"7"</span>),
-<a href=#1725 id=1725 data-nosnippet>1725</a> simple_field(<span class="string">"p"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>, <span class="string">"27"</span>),
-<a href=#1726 id=1726 data-nosnippet>1726</a> simple_field(<span class="string">"h"</span>, DataType::Date32, <span class="bool-val">false</span>, <span class="string">"8"</span>),
-<a href=#1727 id=1727 data-nosnippet>1727</a> simple_field(<span class="string">"i"</span>, DataType::Time64(TimeUnit::Microsecond), <span class="bool-val">false</span>, <span class="string">"9"</span>),
+<a href=#1698 id=1698 data-nosnippet>1698</a> <span class="kw">fn </span>arrow_schema_for_schema_to_arrow_schema_test() -> ArrowSchema {
+<a href=#1699 id=1699 data-nosnippet>1699</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
+<a href=#1700 id=1700 data-nosnippet>1700</a> simple_field(<span class="string">"key"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"28"</span>),
+<a href=#1701 id=1701 data-nosnippet>1701</a> simple_field(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"29"</span>),
+<a href=#1702 id=1702 data-nosnippet>1702</a> ]);
+<a href=#1703 id=1703 data-nosnippet>1703</a>
+<a href=#1704 id=1704 data-nosnippet>1704</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
+<a href=#1705 id=1705 data-nosnippet>1705</a> <span class="kw">let </span>map = DataType::Map(
+<a href=#1706 id=1706 data-nosnippet>1706</a> Arc::new(Field::new(DEFAULT_MAP_FIELD_NAME, r#struct, <span class="bool-val">false</span>)),
+<a href=#1707 id=1707 data-nosnippet>1707</a> <span class="bool-val">false</span>,
+<a href=#1708 id=1708 data-nosnippet>1708</a> );
+<a href=#1709 id=1709 data-nosnippet>1709</a>
+<a href=#1710 id=1710 data-nosnippet>1710</a> <span class="kw">let </span>fields = Fields::from(<span class="macro">vec!</span>[
+<a href=#1711 id=1711 data-nosnippet>1711</a> simple_field(<span class="string">"aa"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"18"</span>),
+<a href=#1712 id=1712 data-nosnippet>1712</a> simple_field(<span class="string">"bb"</span>, DataType::Utf8, <span class="bool-val">true</span>, <span class="string">"19"</span>),
+<a href=#1713 id=1713 data-nosnippet>1713</a> simple_field(
+<a href=#1714 id=1714 data-nosnippet>1714</a> <span class="string">"cc"</span>,
+<a href=#1715 id=1715 data-nosnippet>1715</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
+<a href=#1716 id=1716 data-nosnippet>1716</a> <span class="bool-val">false</span>,
+<a href=#1717 id=1717 data-nosnippet>1717</a> <span class="string">"20"</span>,
+<a href=#1718 id=1718 data-nosnippet>1718</a> ),
+<a href=#1719 id=1719 data-nosnippet>1719</a> ]);
+<a href=#1720 id=1720 data-nosnippet>1720</a>
+<a href=#1721 id=1721 data-nosnippet>1721</a> <span class="kw">let </span>r#struct = DataType::Struct(fields);
+<a href=#1722 id=1722 data-nosnippet>1722</a>
+<a href=#1723 id=1723 data-nosnippet>1723</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#1724 id=1724 data-nosnippet>1724</a> simple_field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">false</span>, <span class="string">"2"</span>),
+<a href=#1725 id=1725 data-nosnippet>1725</a> simple_field(<span class="string">"b"</span>, DataType::Int64, <span class="bool-val">false</span>, <span class="string">"1"</span>),
+<a href=#1726 id=1726 data-nosnippet>1726</a> simple_field(<span class="string">"c"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"3"</span>),
+<a href=#1727 id=1727 data-nosnippet>1727</a> simple_field(<span class="string">"n"</span>, DataType::Utf8, <span class="bool-val">false</span>, <span class="string">"21"</span>),
<a href=#1728 id=1728 data-nosnippet>1728</a> simple_field(
-<a href=#1729 id=1729 data-nosnippet>1729</a> <span class="string">"j"</span>,
-<a href=#1730 id=1730 data-nosnippet>1730</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
-<a href=#1731 id=1731 data-nosnippet>1731</a> <span class="bool-val">false</span>,
-<a href=#1732 id=1732 data-nosnippet>1732</a> <span class="string">"10"</span>,
+<a href=#1729 id=1729 data-nosnippet>1729</a> <span class="string">"d"</span>,
+<a href=#1730 id=1730 data-nosnippet>1730</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">None</span>),
+<a href=#1731 id=1731 data-nosnippet>1731</a> <span class="bool-val">true</span>,
+<a href=#1732 id=1732 data-nosnippet>1732</a> <span class="string">"4"</span>,
<a href=#1733 id=1733 data-nosnippet>1733</a> ),
-<a href=#1734 id=1734 data-nosnippet>1734</a> simple_field(
-<a href=#1735 id=1735 data-nosnippet>1735</a> <span class="string">"k"</span>,
-<a href=#1736 id=1736 data-nosnippet>1736</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
-<a href=#1737 id=1737 data-nosnippet>1737</a> <span class="bool-val">false</span>,
-<a href=#1738 id=1738 data-nosnippet>1738</a> <span class="string">"12"</span>,
-<a href=#1739 id=1739 data-nosnippet>1739</a> ),
-<a href=#1740 id=1740 data-nosnippet>1740</a> simple_field(<span class="string">"l"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"13"</span>),
-<a href=#1741 id=1741 data-nosnippet>1741</a> simple_field(<span class="string">"o"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"22"</span>),
-<a href=#1742 id=1742 data-nosnippet>1742</a> simple_field(<span class="string">"m"</span>, DataType::FixedSizeBinary(<span class="number">10</span>), <span class="bool-val">false</span>, <span class="string">"11"</span>),
-<a href=#1743 id=1743 data-nosnippet>1743</a> simple_field(
-<a href=#1744 id=1744 data-nosnippet>1744</a> <span class="string">"list"</span>,
-<a href=#1745 id=1745 data-nosnippet>1745</a> DataType::List(Arc::new(simple_field(
-<a href=#1746 id=1746 data-nosnippet>1746</a> <span class="string">"element"</span>,
-<a href=#1747 id=1747 data-nosnippet>1747</a> DataType::Int32,
-<a href=#1748 id=1748 data-nosnippet>1748</a> <span class="bool-val">false</span>,
-<a href=#1749 id=1749 data-nosnippet>1749</a> <span class="string">"15"</span>,
-<a href=#1750 id=1750 data-nosnippet>1750</a> ))),
-<a href=#1751 id=1751 data-nosnippet>1751</a> <span class="bool-val">true</span>,
-<a href=#1752 id=1752 data-nosnippet>1752</a> <span class="string">"14"</span>,
-<a href=#1753 id=1753 data-nosnippet>1753</a> ),
-<a href=#1754 id=1754 data-nosnippet>1754</a> simple_field(
-<a href=#1755 id=1755 data-nosnippet>1755</a> <span class="string">"large_list"</span>,
-<a href=#1756 id=1756 data-nosnippet>1756</a> DataType::List(Arc::new(simple_field(
-<a href=#1757 id=1757 data-nosnippet>1757</a> <span class="string">"element"</span>,
-<a href=#1758 id=1758 data-nosnippet>1758</a> DataType::Utf8,
-<a href=#1759 id=1759 data-nosnippet>1759</a> <span class="bool-val">false</span>,
-<a href=#1760 id=1760 data-nosnippet>1760</a> <span class="string">"23"</span>,
-<a href=#1761 id=1761 data-nosnippet>1761</a> ))),
-<a href=#1762 id=1762 data-nosnippet>1762</a> <span class="bool-val">true</span>,
-<a href=#1763 id=1763 data-nosnippet>1763</a> <span class="string">"24"</span>,
-<a href=#1764 id=1764 data-nosnippet>1764</a> ),
-<a href=#1765 id=1765 data-nosnippet>1765</a> simple_field(
-<a href=#1766 id=1766 data-nosnippet>1766</a> <span class="string">"fixed_list"</span>,
-<a href=#1767 id=1767 data-nosnippet>1767</a> DataType::List(Arc::new(simple_field(
-<a href=#1768 id=1768 data-nosnippet>1768</a> <span class="string">"element"</span>,
-<a href=#1769 id=1769 data-nosnippet>1769</a> DataType::LargeBinary,
-<a href=#1770 id=1770 data-nosnippet>1770</a> <span class="bool-val">false</span>,
-<a href=#1771 id=1771 data-nosnippet>1771</a> <span class="string">"26"</span>,
-<a href=#1772 id=1772 data-nosnippet>1772</a> ))),
-<a href=#1773 id=1773 data-nosnippet>1773</a> <span class="bool-val">true</span>,
-<a href=#1774 id=1774 data-nosnippet>1774</a> <span class="string">"25"</span>,
-<a href=#1775 id=1775 data-nosnippet>1775</a> ),
-<a href=#1776 id=1776 data-nosnippet>1776</a> simple_field(<span class="string">"map"</span>, map, <span class="bool-val">false</span>, <span class="string">"16"</span>),
-<a href=#1777 id=1777 data-nosnippet>1777</a> simple_field(<span class="string">"struct"</span>, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>),
-<a href=#1778 id=1778 data-nosnippet>1778</a> simple_field(<span class="string">"uuid"</span>, DataType::FixedSizeBinary(<span class="number">16</span>), <span class="bool-val">false</span>, <span class="string">"30"</span>),
-<a href=#1779 id=1779 data-nosnippet>1779</a> Field::new(
-<a href=#1780 id=1780 data-nosnippet>1780</a> <span class="string">"v"</span>,
-<a href=#1781 id=1781 data-nosnippet>1781</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#1782 id=1782 data-nosnippet>1782</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
-<a href=#1783 id=1783 data-nosnippet>1783</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
-<a href=#1784 id=1784 data-nosnippet>1784</a> ])),
+<a href=#1734 id=1734 data-nosnippet>1734</a> simple_field(<span class="string">"e"</span>, DataType::Boolean, <span class="bool-val">true</span>, <span class="string">"6"</span>),
+<a href=#1735 id=1735 data-nosnippet>1735</a> simple_field(<span class="string">"f"</span>, DataType::Float32, <span class="bool-val">false</span>, <span class="string">"5"</span>),
+<a href=#1736 id=1736 data-nosnippet>1736</a> simple_field(<span class="string">"g"</span>, DataType::Float64, <span class="bool-val">false</span>, <span class="string">"7"</span>),
+<a href=#1737 id=1737 data-nosnippet>1737</a> simple_field(<span class="string">"p"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>, <span class="string">"27"</span>),
+<a href=#1738 id=1738 data-nosnippet>1738</a> simple_field(<span class="string">"h"</span>, DataType::Date32, <span class="bool-val">false</span>, <span class="string">"8"</span>),
+<a href=#1739 id=1739 data-nosnippet>1739</a> simple_field(<span class="string">"i"</span>, DataType::Time64(TimeUnit::Microsecond), <span class="bool-val">false</span>, <span class="string">"9"</span>),
+<a href=#1740 id=1740 data-nosnippet>1740</a> simple_field(
+<a href=#1741 id=1741 data-nosnippet>1741</a> <span class="string">"j"</span>,
+<a href=#1742 id=1742 data-nosnippet>1742</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
+<a href=#1743 id=1743 data-nosnippet>1743</a> <span class="bool-val">false</span>,
+<a href=#1744 id=1744 data-nosnippet>1744</a> <span class="string">"10"</span>,
+<a href=#1745 id=1745 data-nosnippet>1745</a> ),
+<a href=#1746 id=1746 data-nosnippet>1746</a> simple_field(
+<a href=#1747 id=1747 data-nosnippet>1747</a> <span class="string">"k"</span>,
+<a href=#1748 id=1748 data-nosnippet>1748</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
+<a href=#1749 id=1749 data-nosnippet>1749</a> <span class="bool-val">false</span>,
+<a href=#1750 id=1750 data-nosnippet>1750</a> <span class="string">"12"</span>,
+<a href=#1751 id=1751 data-nosnippet>1751</a> ),
+<a href=#1752 id=1752 data-nosnippet>1752</a> simple_field(<span class="string">"l"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"13"</span>),
+<a href=#1753 id=1753 data-nosnippet>1753</a> simple_field(<span class="string">"o"</span>, DataType::LargeBinary, <span class="bool-val">false</span>, <span class="string">"22"</span>),
+<a href=#1754 id=1754 data-nosnippet>1754</a> simple_field(<span class="string">"m"</span>, DataType::FixedSizeBinary(<span class="number">10</span>), <span class="bool-val">false</span>, <span class="string">"11"</span>),
+<a href=#1755 id=1755 data-nosnippet>1755</a> simple_field(
+<a href=#1756 id=1756 data-nosnippet>1756</a> <span class="string">"list"</span>,
+<a href=#1757 id=1757 data-nosnippet>1757</a> DataType::List(Arc::new(simple_field(
+<a href=#1758 id=1758 data-nosnippet>1758</a> <span class="string">"element"</span>,
+<a href=#1759 id=1759 data-nosnippet>1759</a> DataType::Int32,
+<a href=#1760 id=1760 data-nosnippet>1760</a> <span class="bool-val">false</span>,
+<a href=#1761 id=1761 data-nosnippet>1761</a> <span class="string">"15"</span>,
+<a href=#1762 id=1762 data-nosnippet>1762</a> ))),
+<a href=#1763 id=1763 data-nosnippet>1763</a> <span class="bool-val">true</span>,
+<a href=#1764 id=1764 data-nosnippet>1764</a> <span class="string">"14"</span>,
+<a href=#1765 id=1765 data-nosnippet>1765</a> ),
+<a href=#1766 id=1766 data-nosnippet>1766</a> simple_field(
+<a href=#1767 id=1767 data-nosnippet>1767</a> <span class="string">"large_list"</span>,
+<a href=#1768 id=1768 data-nosnippet>1768</a> DataType::List(Arc::new(simple_field(
+<a href=#1769 id=1769 data-nosnippet>1769</a> <span class="string">"element"</span>,
+<a href=#1770 id=1770 data-nosnippet>1770</a> DataType::Utf8,
+<a href=#1771 id=1771 data-nosnippet>1771</a> <span class="bool-val">false</span>,
+<a href=#1772 id=1772 data-nosnippet>1772</a> <span class="string">"23"</span>,
+<a href=#1773 id=1773 data-nosnippet>1773</a> ))),
+<a href=#1774 id=1774 data-nosnippet>1774</a> <span class="bool-val">true</span>,
+<a href=#1775 id=1775 data-nosnippet>1775</a> <span class="string">"24"</span>,
+<a href=#1776 id=1776 data-nosnippet>1776</a> ),
+<a href=#1777 id=1777 data-nosnippet>1777</a> simple_field(
+<a href=#1778 id=1778 data-nosnippet>1778</a> <span class="string">"fixed_list"</span>,
+<a href=#1779 id=1779 data-nosnippet>1779</a> DataType::List(Arc::new(simple_field(
+<a href=#1780 id=1780 data-nosnippet>1780</a> <span class="string">"element"</span>,
+<a href=#1781 id=1781 data-nosnippet>1781</a> DataType::LargeBinary,
+<a href=#1782 id=1782 data-nosnippet>1782</a> <span class="bool-val">false</span>,
+<a href=#1783 id=1783 data-nosnippet>1783</a> <span class="string">"26"</span>,
+<a href=#1784 id=1784 data-nosnippet>1784</a> ))),
<a href=#1785 id=1785 data-nosnippet>1785</a> <span class="bool-val">true</span>,
-<a href=#1786 id=1786 data-nosnippet>1786</a> )
-<a href=#1787 id=1787 data-nosnippet>1787</a> .with_metadata(HashMap::from([
-<a href=#1788 id=1788 data-nosnippet>1788</a> (PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"31"</span>.to_string()),
-<a href=#1789 id=1789 data-nosnippet>1789</a> (
-<a href=#1790 id=1790 data-nosnippet>1790</a> arrow_schema::extension::EXTENSION_TYPE_NAME_KEY.to_string(),
-<a href=#1791 id=1791 data-nosnippet>1791</a> <span class="string">"arrow.parquet.variant"</span>.to_string(),
-<a href=#1792 id=1792 data-nosnippet>1792</a> ),
-<a href=#1793 id=1793 data-nosnippet>1793</a> ])),
-<a href=#1794 id=1794 data-nosnippet>1794</a> ])
-<a href=#1795 id=1795 data-nosnippet>1795</a> }
-<a href=#1796 id=1796 data-nosnippet>1796</a>
-<a href=#1797 id=1797 data-nosnippet>1797</a> <span class="kw">fn </span>iceberg_schema_for_schema_to_arrow_schema() -> Schema {
-<a href=#1798 id=1798 data-nosnippet>1798</a> <span class="kw">let </span>schema_json = <span class="string">r#"{
-<a href=#1799 id=1799 data-nosnippet>1799</a> "type":"struct",
-<a href=#1800 id=1800 data-nosnippet>1800</a> "schema-id":0,
-<a href=#1801 id=1801 data-nosnippet>1801</a> "fields":[
-<a href=#1802 id=1802 data-nosnippet>1802</a> {
-<a href=#1803 id=1803 data-nosnippet>1803</a> "id":2,
-<a href=#1804 id=1804 data-nosnippet>1804</a> "name":"a",
-<a href=#1805 id=1805 data-nosnippet>1805</a> "required":true,
-<a href=#1806 id=1806 data-nosnippet>1806</a> "type":"int"
-<a href=#1807 id=1807 data-nosnippet>1807</a> },
-<a href=#1808 id=1808 data-nosnippet>1808</a> {
-<a href=#1809 id=1809 data-nosnippet>1809</a> "id":1,
-<a href=#1810 id=1810 data-nosnippet>1810</a> "name":"b",
-<a href=#1811 id=1811 data-nosnippet>1811</a> "required":true,
-<a href=#1812 id=1812 data-nosnippet>1812</a> "type":"long"
-<a href=#1813 id=1813 data-nosnippet>1813</a> },
+<a href=#1786 id=1786 data-nosnippet>1786</a> <span class="string">"25"</span>,
+<a href=#1787 id=1787 data-nosnippet>1787</a> ),
+<a href=#1788 id=1788 data-nosnippet>1788</a> simple_field(<span class="string">"map"</span>, map, <span class="bool-val">false</span>, <span class="string">"16"</span>),
+<a href=#1789 id=1789 data-nosnippet>1789</a> simple_field(<span class="string">"struct"</span>, r#struct, <span class="bool-val">false</span>, <span class="string">"17"</span>),
+<a href=#1790 id=1790 data-nosnippet>1790</a> simple_field(<span class="string">"uuid"</span>, DataType::FixedSizeBinary(<span class="number">16</span>), <span class="bool-val">false</span>, <span class="string">"30"</span>),
+<a href=#1791 id=1791 data-nosnippet>1791</a> Field::new(
+<a href=#1792 id=1792 data-nosnippet>1792</a> <span class="string">"v"</span>,
+<a href=#1793 id=1793 data-nosnippet>1793</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#1794 id=1794 data-nosnippet>1794</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
+<a href=#1795 id=1795 data-nosnippet>1795</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
+<a href=#1796 id=1796 data-nosnippet>1796</a> ])),
+<a href=#1797 id=1797 data-nosnippet>1797</a> <span class="bool-val">true</span>,
+<a href=#1798 id=1798 data-nosnippet>1798</a> )
+<a href=#1799 id=1799 data-nosnippet>1799</a> .with_metadata(HashMap::from([
+<a href=#1800 id=1800 data-nosnippet>1800</a> (PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"31"</span>.to_string()),
+<a href=#1801 id=1801 data-nosnippet>1801</a> (
+<a href=#1802 id=1802 data-nosnippet>1802</a> arrow_schema::extension::EXTENSION_TYPE_NAME_KEY.to_string(),
+<a href=#1803 id=1803 data-nosnippet>1803</a> <span class="string">"arrow.parquet.variant"</span>.to_string(),
+<a href=#1804 id=1804 data-nosnippet>1804</a> ),
+<a href=#1805 id=1805 data-nosnippet>1805</a> ])),
+<a href=#1806 id=1806 data-nosnippet>1806</a> ])
+<a href=#1807 id=1807 data-nosnippet>1807</a> }
+<a href=#1808 id=1808 data-nosnippet>1808</a>
+<a href=#1809 id=1809 data-nosnippet>1809</a> <span class="kw">fn </span>iceberg_schema_for_schema_to_arrow_schema() -> Schema {
+<a href=#1810 id=1810 data-nosnippet>1810</a> <span class="kw">let </span>schema_json = <span class="string">r#"{
+<a href=#1811 id=1811 data-nosnippet>1811</a> "type":"struct",
+<a href=#1812 id=1812 data-nosnippet>1812</a> "schema-id":0,
+<a href=#1813 id=1813 data-nosnippet>1813</a> "fields":[
<a href=#1814 id=1814 data-nosnippet>1814</a> {
-<a href=#1815 id=1815 data-nosnippet>1815</a> "id":3,
-<a href=#1816 id=1816 data-nosnippet>1816</a> "name":"c",
+<a href=#1815 id=1815 data-nosnippet>1815</a> "id":2,
+<a href=#1816 id=1816 data-nosnippet>1816</a> "name":"a",
<a href=#1817 id=1817 data-nosnippet>1817</a> "required":true,
-<a href=#1818 id=1818 data-nosnippet>1818</a> "type":"string"
+<a href=#1818 id=1818 data-nosnippet>1818</a> "type":"int"
<a href=#1819 id=1819 data-nosnippet>1819</a> },
<a href=#1820 id=1820 data-nosnippet>1820</a> {
-<a href=#1821 id=1821 data-nosnippet>1821</a> "id":21,
-<a href=#1822 id=1822 data-nosnippet>1822</a> "name":"n",
+<a href=#1821 id=1821 data-nosnippet>1821</a> "id":1,
+<a href=#1822 id=1822 data-nosnippet>1822</a> "name":"b",
<a href=#1823 id=1823 data-nosnippet>1823</a> "required":true,
-<a href=#1824 id=1824 data-nosnippet>1824</a> "type":"string"
+<a href=#1824 id=1824 data-nosnippet>1824</a> "type":"long"
<a href=#1825 id=1825 data-nosnippet>1825</a> },
<a href=#1826 id=1826 data-nosnippet>1826</a> {
-<a href=#1827 id=1827 data-nosnippet>1827</a> "id":4,
-<a href=#1828 id=1828 data-nosnippet>1828</a> "name":"d",
-<a href=#1829 id=1829 data-nosnippet>1829</a> "required":false,
-<a href=#1830 id=1830 data-nosnippet>1830</a> "type":"timestamp"
+<a href=#1827 id=1827 data-nosnippet>1827</a> "id":3,
+<a href=#1828 id=1828 data-nosnippet>1828</a> "name":"c",
+<a href=#1829 id=1829 data-nosnippet>1829</a> "required":true,
+<a href=#1830 id=1830 data-nosnippet>1830</a> "type":"string"
<a href=#1831 id=1831 data-nosnippet>1831</a> },
<a href=#1832 id=1832 data-nosnippet>1832</a> {
-<a href=#1833 id=1833 data-nosnippet>1833</a> "id":6,
-<a href=#1834 id=1834 data-nosnippet>1834</a> "name":"e",
-<a href=#1835 id=1835 data-nosnippet>1835</a> "required":false,
-<a href=#1836 id=1836 data-nosnippet>1836</a> "type":"boolean"
+<a href=#1833 id=1833 data-nosnippet>1833</a> "id":21,
+<a href=#1834 id=1834 data-nosnippet>1834</a> "name":"n",
+<a href=#1835 id=1835 data-nosnippet>1835</a> "required":true,
+<a href=#1836 id=1836 data-nosnippet>1836</a> "type":"string"
<a href=#1837 id=1837 data-nosnippet>1837</a> },
<a href=#1838 id=1838 data-nosnippet>1838</a> {
-<a href=#1839 id=1839 data-nosnippet>1839</a> "id":5,
-<a href=#1840 id=1840 data-nosnippet>1840</a> "name":"f",
-<a href=#1841 id=1841 data-nosnippet>1841</a> "required":true,
-<a href=#1842 id=1842 data-nosnippet>1842</a> "type":"float"
+<a href=#1839 id=1839 data-nosnippet>1839</a> "id":4,
+<a href=#1840 id=1840 data-nosnippet>1840</a> "name":"d",
+<a href=#1841 id=1841 data-nosnippet>1841</a> "required":false,
+<a href=#1842 id=1842 data-nosnippet>1842</a> "type":"timestamp"
<a href=#1843 id=1843 data-nosnippet>1843</a> },
<a href=#1844 id=1844 data-nosnippet>1844</a> {
-<a href=#1845 id=1845 data-nosnippet>1845</a> "id":7,
-<a href=#1846 id=1846 data-nosnippet>1846</a> "name":"g",
-<a href=#1847 id=1847 data-nosnippet>1847</a> "required":true,
-<a href=#1848 id=1848 data-nosnippet>1848</a> "type":"double"
+<a href=#1845 id=1845 data-nosnippet>1845</a> "id":6,
+<a href=#1846 id=1846 data-nosnippet>1846</a> "name":"e",
+<a href=#1847 id=1847 data-nosnippet>1847</a> "required":false,
+<a href=#1848 id=1848 data-nosnippet>1848</a> "type":"boolean"
<a href=#1849 id=1849 data-nosnippet>1849</a> },
<a href=#1850 id=1850 data-nosnippet>1850</a> {
-<a href=#1851 id=1851 data-nosnippet>1851</a> "id":27,
-<a href=#1852 id=1852 data-nosnippet>1852</a> "name":"p",
+<a href=#1851 id=1851 data-nosnippet>1851</a> "id":5,
+<a href=#1852 id=1852 data-nosnippet>1852</a> "name":"f",
<a href=#1853 id=1853 data-nosnippet>1853</a> "required":true,
-<a href=#1854 id=1854 data-nosnippet>1854</a> "type":"decimal(10,2)"
+<a href=#1854 id=1854 data-nosnippet>1854</a> "type":"float"
<a href=#1855 id=1855 data-nosnippet>1855</a> },
<a href=#1856 id=1856 data-nosnippet>1856</a> {
-<a href=#1857 id=1857 data-nosnippet>1857</a> "id":8,
-<a href=#1858 id=1858 data-nosnippet>1858</a> "name":"h",
+<a href=#1857 id=1857 data-nosnippet>1857</a> "id":7,
+<a href=#1858 id=1858 data-nosnippet>1858</a> "name":"g",
<a href=#1859 id=1859 data-nosnippet>1859</a> "required":true,
-<a href=#1860 id=1860 data-nosnippet>1860</a> "type":"date"
+<a href=#1860 id=1860 data-nosnippet>1860</a> "type":"double"
<a href=#1861 id=1861 data-nosnippet>1861</a> },
<a href=#1862 id=1862 data-nosnippet>1862</a> {
-<a href=#1863 id=1863 data-nosnippet>1863</a> "id":9,
-<a href=#1864 id=1864 data-nosnippet>1864</a> "name":"i",
+<a href=#1863 id=1863 data-nosnippet>1863</a> "id":27,
+<a href=#1864 id=1864 data-nosnippet>1864</a> "name":"p",
<a href=#1865 id=1865 data-nosnippet>1865</a> "required":true,
-<a href=#1866 id=1866 data-nosnippet>1866</a> "type":"time"
+<a href=#1866 id=1866 data-nosnippet>1866</a> "type":"decimal(10,2)"
<a href=#1867 id=1867 data-nosnippet>1867</a> },
<a href=#1868 id=1868 data-nosnippet>1868</a> {
-<a href=#1869 id=1869 data-nosnippet>1869</a> "id":10,
-<a href=#1870 id=1870 data-nosnippet>1870</a> "name":"j",
+<a href=#1869 id=1869 data-nosnippet>1869</a> "id":8,
+<a href=#1870 id=1870 data-nosnippet>1870</a> "name":"h",
<a href=#1871 id=1871 data-nosnippet>1871</a> "required":true,
-<a href=#1872 id=1872 data-nosnippet>1872</a> "type":"timestamptz"
+<a href=#1872 id=1872 data-nosnippet>1872</a> "type":"date"
<a href=#1873 id=1873 data-nosnippet>1873</a> },
<a href=#1874 id=1874 data-nosnippet>1874</a> {
-<a href=#1875 id=1875 data-nosnippet>1875</a> "id":12,
-<a href=#1876 id=1876 data-nosnippet>1876</a> "name":"k",
+<a href=#1875 id=1875 data-nosnippet>1875</a> "id":9,
+<a href=#1876 id=1876 data-nosnippet>1876</a> "name":"i",
<a href=#1877 id=1877 data-nosnippet>1877</a> "required":true,
-<a href=#1878 id=1878 data-nosnippet>1878</a> "type":"timestamptz"
+<a href=#1878 id=1878 data-nosnippet>1878</a> "type":"time"
<a href=#1879 id=1879 data-nosnippet>1879</a> },
<a href=#1880 id=1880 data-nosnippet>1880</a> {
-<a href=#1881 id=1881 data-nosnippet>1881</a> "id":13,
-<a href=#1882 id=1882 data-nosnippet>1882</a> "name":"l",
+<a href=#1881 id=1881 data-nosnippet>1881</a> "id":10,
+<a href=#1882 id=1882 data-nosnippet>1882</a> "name":"j",
<a href=#1883 id=1883 data-nosnippet>1883</a> "required":true,
-<a href=#1884 id=1884 data-nosnippet>1884</a> "type":"binary"
+<a href=#1884 id=1884 data-nosnippet>1884</a> "type":"timestamptz"
<a href=#1885 id=1885 data-nosnippet>1885</a> },
<a href=#1886 id=1886 data-nosnippet>1886</a> {
-<a href=#1887 id=1887 data-nosnippet>1887</a> "id":22,
-<a href=#1888 id=1888 data-nosnippet>1888</a> "name":"o",
+<a href=#1887 id=1887 data-nosnippet>1887</a> "id":12,
+<a href=#1888 id=1888 data-nosnippet>1888</a> "name":"k",
<a href=#1889 id=1889 data-nosnippet>1889</a> "required":true,
-<a href=#1890 id=1890 data-nosnippet>1890</a> "type":"binary"
+<a href=#1890 id=1890 data-nosnippet>1890</a> "type":"timestamptz"
<a href=#1891 id=1891 data-nosnippet>1891</a> },
<a href=#1892 id=1892 data-nosnippet>1892</a> {
-<a href=#1893 id=1893 data-nosnippet>1893</a> "id":11,
-<a href=#1894 id=1894 data-nosnippet>1894</a> "name":"m",
+<a href=#1893 id=1893 data-nosnippet>1893</a> "id":13,
+<a href=#1894 id=1894 data-nosnippet>1894</a> "name":"l",
<a href=#1895 id=1895 data-nosnippet>1895</a> "required":true,
-<a href=#1896 id=1896 data-nosnippet>1896</a> "type":"fixed[10]"
+<a href=#1896 id=1896 data-nosnippet>1896</a> "type":"binary"
<a href=#1897 id=1897 data-nosnippet>1897</a> },
<a href=#1898 id=1898 data-nosnippet>1898</a> {
-<a href=#1899 id=1899 data-nosnippet>1899</a> "id":14,
-<a href=#1900 id=1900 data-nosnippet>1900</a> "name":"list",
-<a href=#1901 id=1901 data-nosnippet>1901</a> "required": false,
-<a href=#1902 id=1902 data-nosnippet>1902</a> "type": {
-<a href=#1903 id=1903 data-nosnippet>1903</a> "type": "list",
-<a href=#1904 id=1904 data-nosnippet>1904</a> "element-id": 15,
-<a href=#1905 id=1905 data-nosnippet>1905</a> "element-required": true,
-<a href=#1906 id=1906 data-nosnippet>1906</a> "element": "int"
-<a href=#1907 id=1907 data-nosnippet>1907</a> }
-<a href=#1908 id=1908 data-nosnippet>1908</a> },
-<a href=#1909 id=1909 data-nosnippet>1909</a> {
-<a href=#1910 id=1910 data-nosnippet>1910</a> "id":24,
-<a href=#1911 id=1911 data-nosnippet>1911</a> "name":"large_list",
-<a href=#1912 id=1912 data-nosnippet>1912</a> "required": false,
-<a href=#1913 id=1913 data-nosnippet>1913</a> "type": {
-<a href=#1914 id=1914 data-nosnippet>1914</a> "type": "list",
-<a href=#1915 id=1915 data-nosnippet>1915</a> "element-id": 23,
-<a href=#1916 id=1916 data-nosnippet>1916</a> "element-required": true,
-<a href=#1917 id=1917 data-nosnippet>1917</a> "element": "string"
-<a href=#1918 id=1918 data-nosnippet>1918</a> }
-<a href=#1919 id=1919 data-nosnippet>1919</a> },
-<a href=#1920 id=1920 data-nosnippet>1920</a> {
-<a href=#1921 id=1921 data-nosnippet>1921</a> "id":25,
-<a href=#1922 id=1922 data-nosnippet>1922</a> "name":"fixed_list",
-<a href=#1923 id=1923 data-nosnippet>1923</a> "required": false,
-<a href=#1924 id=1924 data-nosnippet>1924</a> "type": {
-<a href=#1925 id=1925 data-nosnippet>1925</a> "type": "list",
-<a href=#1926 id=1926 data-nosnippet>1926</a> "element-id": 26,
-<a href=#1927 id=1927 data-nosnippet>1927</a> "element-required": true,
-<a href=#1928 id=1928 data-nosnippet>1928</a> "element": "binary"
-<a href=#1929 id=1929 data-nosnippet>1929</a> }
-<a href=#1930 id=1930 data-nosnippet>1930</a> },
-<a href=#1931 id=1931 data-nosnippet>1931</a> {
-<a href=#1932 id=1932 data-nosnippet>1932</a> "id":16,
-<a href=#1933 id=1933 data-nosnippet>1933</a> "name":"map",
-<a href=#1934 id=1934 data-nosnippet>1934</a> "required": true,
-<a href=#1935 id=1935 data-nosnippet>1935</a> "type": {
-<a href=#1936 id=1936 data-nosnippet>1936</a> "type": "map",
-<a href=#1937 id=1937 data-nosnippet>1937</a> "key-id": 28,
-<a href=#1938 id=1938 data-nosnippet>1938</a> "key": "int",
-<a href=#1939 id=1939 data-nosnippet>1939</a> "value-id": 29,
-<a href=#1940 id=1940 data-nosnippet>1940</a> "value-required": false,
-<a href=#1941 id=1941 data-nosnippet>1941</a> "value": "string"
-<a href=#1942 id=1942 data-nosnippet>1942</a> }
-<a href=#1943 id=1943 data-nosnippet>1943</a> },
-<a href=#1944 id=1944 data-nosnippet>1944</a> {
-<a href=#1945 id=1945 data-nosnippet>1945</a> "id":17,
-<a href=#1946 id=1946 data-nosnippet>1946</a> "name":"struct",
-<a href=#1947 id=1947 data-nosnippet>1947</a> "required": true,
-<a href=#1948 id=1948 data-nosnippet>1948</a> "type": {
-<a href=#1949 id=1949 data-nosnippet>1949</a> "type": "struct",
-<a href=#1950 id=1950 data-nosnippet>1950</a> "fields": [
-<a href=#1951 id=1951 data-nosnippet>1951</a> {
-<a href=#1952 id=1952 data-nosnippet>1952</a> "id":18,
-<a href=#1953 id=1953 data-nosnippet>1953</a> "name":"aa",
-<a href=#1954 id=1954 data-nosnippet>1954</a> "required":true,
-<a href=#1955 id=1955 data-nosnippet>1955</a> "type":"int"
-<a href=#1956 id=1956 data-nosnippet>1956</a> },
-<a href=#1957 id=1957 data-nosnippet>1957</a> {
-<a href=#1958 id=1958 data-nosnippet>1958</a> "id":19,
-<a href=#1959 id=1959 data-nosnippet>1959</a> "name":"bb",
-<a href=#1960 id=1960 data-nosnippet>1960</a> "required":false,
-<a href=#1961 id=1961 data-nosnippet>1961</a> "type":"string"
-<a href=#1962 id=1962 data-nosnippet>1962</a> },
+<a href=#1899 id=1899 data-nosnippet>1899</a> "id":22,
+<a href=#1900 id=1900 data-nosnippet>1900</a> "name":"o",
+<a href=#1901 id=1901 data-nosnippet>1901</a> "required":true,
+<a href=#1902 id=1902 data-nosnippet>1902</a> "type":"binary"
+<a href=#1903 id=1903 data-nosnippet>1903</a> },
+<a href=#1904 id=1904 data-nosnippet>1904</a> {
+<a href=#1905 id=1905 data-nosnippet>1905</a> "id":11,
+<a href=#1906 id=1906 data-nosnippet>1906</a> "name":"m",
+<a href=#1907 id=1907 data-nosnippet>1907</a> "required":true,
+<a href=#1908 id=1908 data-nosnippet>1908</a> "type":"fixed[10]"
+<a href=#1909 id=1909 data-nosnippet>1909</a> },
+<a href=#1910 id=1910 data-nosnippet>1910</a> {
+<a href=#1911 id=1911 data-nosnippet>1911</a> "id":14,
+<a href=#1912 id=1912 data-nosnippet>1912</a> "name":"list",
+<a href=#1913 id=1913 data-nosnippet>1913</a> "required": false,
+<a href=#1914 id=1914 data-nosnippet>1914</a> "type": {
+<a href=#1915 id=1915 data-nosnippet>1915</a> "type": "list",
+<a href=#1916 id=1916 data-nosnippet>1916</a> "element-id": 15,
+<a href=#1917 id=1917 data-nosnippet>1917</a> "element-required": true,
+<a href=#1918 id=1918 data-nosnippet>1918</a> "element": "int"
+<a href=#1919 id=1919 data-nosnippet>1919</a> }
+<a href=#1920 id=1920 data-nosnippet>1920</a> },
+<a href=#1921 id=1921 data-nosnippet>1921</a> {
+<a href=#1922 id=1922 data-nosnippet>1922</a> "id":24,
+<a href=#1923 id=1923 data-nosnippet>1923</a> "name":"large_list",
+<a href=#1924 id=1924 data-nosnippet>1924</a> "required": false,
+<a href=#1925 id=1925 data-nosnippet>1925</a> "type": {
+<a href=#1926 id=1926 data-nosnippet>1926</a> "type": "list",
+<a href=#1927 id=1927 data-nosnippet>1927</a> "element-id": 23,
+<a href=#1928 id=1928 data-nosnippet>1928</a> "element-required": true,
+<a href=#1929 id=1929 data-nosnippet>1929</a> "element": "string"
+<a href=#1930 id=1930 data-nosnippet>1930</a> }
+<a href=#1931 id=1931 data-nosnippet>1931</a> },
+<a href=#1932 id=1932 data-nosnippet>1932</a> {
+<a href=#1933 id=1933 data-nosnippet>1933</a> "id":25,
+<a href=#1934 id=1934 data-nosnippet>1934</a> "name":"fixed_list",
+<a href=#1935 id=1935 data-nosnippet>1935</a> "required": false,
+<a href=#1936 id=1936 data-nosnippet>1936</a> "type": {
+<a href=#1937 id=1937 data-nosnippet>1937</a> "type": "list",
+<a href=#1938 id=1938 data-nosnippet>1938</a> "element-id": 26,
+<a href=#1939 id=1939 data-nosnippet>1939</a> "element-required": true,
+<a href=#1940 id=1940 data-nosnippet>1940</a> "element": "binary"
+<a href=#1941 id=1941 data-nosnippet>1941</a> }
+<a href=#1942 id=1942 data-nosnippet>1942</a> },
+<a href=#1943 id=1943 data-nosnippet>1943</a> {
+<a href=#1944 id=1944 data-nosnippet>1944</a> "id":16,
+<a href=#1945 id=1945 data-nosnippet>1945</a> "name":"map",
+<a href=#1946 id=1946 data-nosnippet>1946</a> "required": true,
+<a href=#1947 id=1947 data-nosnippet>1947</a> "type": {
+<a href=#1948 id=1948 data-nosnippet>1948</a> "type": "map",
+<a href=#1949 id=1949 data-nosnippet>1949</a> "key-id": 28,
+<a href=#1950 id=1950 data-nosnippet>1950</a> "key": "int",
+<a href=#1951 id=1951 data-nosnippet>1951</a> "value-id": 29,
+<a href=#1952 id=1952 data-nosnippet>1952</a> "value-required": false,
+<a href=#1953 id=1953 data-nosnippet>1953</a> "value": "string"
+<a href=#1954 id=1954 data-nosnippet>1954</a> }
+<a href=#1955 id=1955 data-nosnippet>1955</a> },
+<a href=#1956 id=1956 data-nosnippet>1956</a> {
+<a href=#1957 id=1957 data-nosnippet>1957</a> "id":17,
+<a href=#1958 id=1958 data-nosnippet>1958</a> "name":"struct",
+<a href=#1959 id=1959 data-nosnippet>1959</a> "required": true,
+<a href=#1960 id=1960 data-nosnippet>1960</a> "type": {
+<a href=#1961 id=1961 data-nosnippet>1961</a> "type": "struct",
+<a href=#1962 id=1962 data-nosnippet>1962</a> "fields": [
<a href=#1963 id=1963 data-nosnippet>1963</a> {
-<a href=#1964 id=1964 data-nosnippet>1964</a> "id":20,
-<a href=#1965 id=1965 data-nosnippet>1965</a> "name":"cc",
+<a href=#1964 id=1964 data-nosnippet>1964</a> "id":18,
+<a href=#1965 id=1965 data-nosnippet>1965</a> "name":"aa",
<a href=#1966 id=1966 data-nosnippet>1966</a> "required":true,
-<a href=#1967 id=1967 data-nosnippet>1967</a> "type":"timestamp"
-<a href=#1968 id=1968 data-nosnippet>1968</a> }
-<a href=#1969 id=1969 data-nosnippet>1969</a> ]
-<a href=#1970 id=1970 data-nosnippet>1970</a> }
-<a href=#1971 id=1971 data-nosnippet>1971</a> },
-<a href=#1972 id=1972 data-nosnippet>1972</a> {
-<a href=#1973 id=1973 data-nosnippet>1973</a> "id":30,
-<a href=#1974 id=1974 data-nosnippet>1974</a> "name":"uuid",
-<a href=#1975 id=1975 data-nosnippet>1975</a> "required":true,
-<a href=#1976 id=1976 data-nosnippet>1976</a> "type":"uuid"
-<a href=#1977 id=1977 data-nosnippet>1977</a> },
-<a href=#1978 id=1978 data-nosnippet>1978</a> {
-<a href=#1979 id=1979 data-nosnippet>1979</a> "id":31,
-<a href=#1980 id=1980 data-nosnippet>1980</a> "name":"v",
-<a href=#1981 id=1981 data-nosnippet>1981</a> "required":false,
-<a href=#1982 id=1982 data-nosnippet>1982</a> "type":"variant"
-<a href=#1983 id=1983 data-nosnippet>1983</a> }
-<a href=#1984 id=1984 data-nosnippet>1984</a> ],
-<a href=#1985 id=1985 data-nosnippet>1985</a> "identifier-field-ids":[]
-<a href=#1986 id=1986 data-nosnippet>1986</a> }"#</span>;
-<a href=#1987 id=1987 data-nosnippet>1987</a>
-<a href=#1988 id=1988 data-nosnippet>1988</a> <span class="kw">let </span>schema: Schema = serde_json::from_str(schema_json).unwrap();
-<a href=#1989 id=1989 data-nosnippet>1989</a> schema
-<a href=#1990 id=1990 data-nosnippet>1990</a> }
-<a href=#1991 id=1991 data-nosnippet>1991</a>
-<a href=#1992 id=1992 data-nosnippet>1992</a> <span class="attr">#[test]
-<a href=#1993 id=1993 data-nosnippet>1993</a> </span><span class="kw">fn </span>test_schema_to_arrow_schema() {
-<a href=#1994 id=1994 data-nosnippet>1994</a> <span class="kw">let </span>arrow_schema = arrow_schema_for_schema_to_arrow_schema_test();
-<a href=#1995 id=1995 data-nosnippet>1995</a> <span class="kw">let </span>schema = iceberg_schema_for_schema_to_arrow_schema();
-<a href=#1996 id=1996 data-nosnippet>1996</a> <span class="kw">let </span>converted_arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
-<a href=#1997 id=1997 data-nosnippet>1997</a> <span class="macro">assert_eq!</span>(converted_arrow_schema, arrow_schema);
-<a href=#1998 id=1998 data-nosnippet>1998</a> }
+<a href=#1967 id=1967 data-nosnippet>1967</a> "type":"int"
+<a href=#1968 id=1968 data-nosnippet>1968</a> },
+<a href=#1969 id=1969 data-nosnippet>1969</a> {
+<a href=#1970 id=1970 data-nosnippet>1970</a> "id":19,
+<a href=#1971 id=1971 data-nosnippet>1971</a> "name":"bb",
+<a href=#1972 id=1972 data-nosnippet>1972</a> "required":false,
+<a href=#1973 id=1973 data-nosnippet>1973</a> "type":"string"
+<a href=#1974 id=1974 data-nosnippet>1974</a> },
+<a href=#1975 id=1975 data-nosnippet>1975</a> {
+<a href=#1976 id=1976 data-nosnippet>1976</a> "id":20,
+<a href=#1977 id=1977 data-nosnippet>1977</a> "name":"cc",
+<a href=#1978 id=1978 data-nosnippet>1978</a> "required":true,
+<a href=#1979 id=1979 data-nosnippet>1979</a> "type":"timestamp"
+<a href=#1980 id=1980 data-nosnippet>1980</a> }
+<a href=#1981 id=1981 data-nosnippet>1981</a> ]
+<a href=#1982 id=1982 data-nosnippet>1982</a> }
+<a href=#1983 id=1983 data-nosnippet>1983</a> },
+<a href=#1984 id=1984 data-nosnippet>1984</a> {
+<a href=#1985 id=1985 data-nosnippet>1985</a> "id":30,
+<a href=#1986 id=1986 data-nosnippet>1986</a> "name":"uuid",
+<a href=#1987 id=1987 data-nosnippet>1987</a> "required":true,
+<a href=#1988 id=1988 data-nosnippet>1988</a> "type":"uuid"
+<a href=#1989 id=1989 data-nosnippet>1989</a> },
+<a href=#1990 id=1990 data-nosnippet>1990</a> {
+<a href=#1991 id=1991 data-nosnippet>1991</a> "id":31,
+<a href=#1992 id=1992 data-nosnippet>1992</a> "name":"v",
+<a href=#1993 id=1993 data-nosnippet>1993</a> "required":false,
+<a href=#1994 id=1994 data-nosnippet>1994</a> "type":"variant"
+<a href=#1995 id=1995 data-nosnippet>1995</a> }
+<a href=#1996 id=1996 data-nosnippet>1996</a> ],
+<a href=#1997 id=1997 data-nosnippet>1997</a> "identifier-field-ids":[]
+<a href=#1998 id=1998 data-nosnippet>1998</a> }"#</span>;
<a href=#1999 id=1999 data-nosnippet>1999</a>
-<a href=#2000 id=2000 data-nosnippet>2000</a> <span class="attr">#[test]
-<a href=#2001 id=2001 data-nosnippet>2001</a> </span><span class="kw">fn </span>test_variant_type_to_arrow_type() {
-<a href=#2002 id=2002 data-nosnippet>2002</a> <span class="comment">// Variant maps to a struct with a required `metadata` and a nullable `value` binary
-<a href=#2003 id=2003 data-nosnippet>2003</a> // field, with no field ids on the sub-fields, matching the Parquet BINARY layout.
-<a href=#2004 id=2004 data-nosnippet>2004</a> </span><span class="kw">let </span>arrow_type = type_to_arrow_type(<span class="kw-2">&</span>Type::Variant(VariantType)).unwrap();
-<a href=#2005 id=2005 data-nosnippet>2005</a> <span class="macro">assert_eq!</span>(
-<a href=#2006 id=2006 data-nosnippet>2006</a> arrow_type,
-<a href=#2007 id=2007 data-nosnippet>2007</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2008 id=2008 data-nosnippet>2008</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
-<a href=#2009 id=2009 data-nosnippet>2009</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
-<a href=#2010 id=2010 data-nosnippet>2010</a> ]))
-<a href=#2011 id=2011 data-nosnippet>2011</a> );
-<a href=#2012 id=2012 data-nosnippet>2012</a> }
-<a href=#2013 id=2013 data-nosnippet>2013</a>
-<a href=#2014 id=2014 data-nosnippet>2014</a> <span class="attr">#[test]
-<a href=#2015 id=2015 data-nosnippet>2015</a> </span><span class="kw">fn </span>test_variant_field_carries_arrow_extension_type() {
-<a href=#2016 id=2016 data-nosnippet>2016</a> <span class="comment">// Converting a schema with a variant column tags the column's field with the
-<a href=#2017 id=2017 data-nosnippet>2017</a> // canonical `arrow.parquet.variant` extension type (the struct storage stays as-is).
-<a href=#2018 id=2018 data-nosnippet>2018</a> </span><span class="kw">let </span>schema = Schema::builder()
-<a href=#2019 id=2019 data-nosnippet>2019</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2020 id=2020 data-nosnippet>2020</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
-<a href=#2021 id=2021 data-nosnippet>2021</a> ])
-<a href=#2022 id=2022 data-nosnippet>2022</a> .build()
-<a href=#2023 id=2023 data-nosnippet>2023</a> .unwrap();
-<a href=#2024 id=2024 data-nosnippet>2024</a>
-<a href=#2025 id=2025 data-nosnippet>2025</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
-<a href=#2026 id=2026 data-nosnippet>2026</a> <span class="kw">let </span>field = arrow_schema.field_with_name(<span class="string">"v"</span>).unwrap();
-<a href=#2027 id=2027 data-nosnippet>2027</a>
-<a href=#2028 id=2028 data-nosnippet>2028</a> <span class="macro">assert_eq!</span>(field.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
-<a href=#2029 id=2029 data-nosnippet>2029</a> <span class="comment">// Attaching the extension type must not clobber the Iceberg field id.
-<a href=#2030 id=2030 data-nosnippet>2030</a> </span><span class="macro">assert_eq!</span>(
-<a href=#2031 id=2031 data-nosnippet>2031</a> field.metadata().get(PARQUET_FIELD_ID_META_KEY),
-<a href=#2032 id=2032 data-nosnippet>2032</a> <span class="prelude-val">Some</span>(<span class="kw-2">&</span><span class="string">"1"</span>.to_string())
-<a href=#2033 id=2033 data-nosnippet>2033</a> );
-<a href=#2034 id=2034 data-nosnippet>2034</a> <span class="macro">assert_eq!</span>(
-<a href=#2035 id=2035 data-nosnippet>2035</a> field.data_type(),
-<a href=#2036 id=2036 data-nosnippet>2036</a> <span class="kw-2">&</span>DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2037 id=2037 data-nosnippet>2037</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
-<a href=#2038 id=2038 data-nosnippet>2038</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
-<a href=#2039 id=2039 data-nosnippet>2039</a> ]))
-<a href=#2040 id=2040 data-nosnippet>2040</a> );
-<a href=#2041 id=2041 data-nosnippet>2041</a> }
-<a href=#2042 id=2042 data-nosnippet>2042</a>
-<a href=#2043 id=2043 data-nosnippet>2043</a> <span class="attr">#[test]
-<a href=#2044 id=2044 data-nosnippet>2044</a> </span><span class="kw">fn </span>test_variant_nested_in_list_and_map_carries_arrow_extension_type() {
-<a href=#2045 id=2045 data-nosnippet>2045</a> <span class="comment">// A variant nested in a list element or map value keeps the arrow.parquet.variant
-<a href=#2046 id=2046 data-nosnippet>2046</a> // extension type. Regression guard: the list converter must not overwrite the
-<a href=#2047 id=2047 data-nosnippet>2047</a> // element field's metadata (which would drop the extension type).
-<a href=#2048 id=2048 data-nosnippet>2048</a> </span><span class="kw">let </span>schema = Schema::builder()
-<a href=#2049 id=2049 data-nosnippet>2049</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2050 id=2050 data-nosnippet>2050</a> NestedField::optional(
-<a href=#2051 id=2051 data-nosnippet>2051</a> <span class="number">1</span>,
-<a href=#2052 id=2052 data-nosnippet>2052</a> <span class="string">"l"</span>,
-<a href=#2053 id=2053 data-nosnippet>2053</a> Type::List(ListType::new(
-<a href=#2054 id=2054 data-nosnippet>2054</a> NestedField::optional(<span class="number">2</span>, <span class="string">"element"</span>, Type::Variant(VariantType)).into(),
-<a href=#2055 id=2055 data-nosnippet>2055</a> )),
-<a href=#2056 id=2056 data-nosnippet>2056</a> )
-<a href=#2057 id=2057 data-nosnippet>2057</a> .into(),
-<a href=#2058 id=2058 data-nosnippet>2058</a> NestedField::optional(
-<a href=#2059 id=2059 data-nosnippet>2059</a> <span class="number">3</span>,
-<a href=#2060 id=2060 data-nosnippet>2060</a> <span class="string">"m"</span>,
-<a href=#2061 id=2061 data-nosnippet>2061</a> Type::Map(MapType::new(
-<a href=#2062 id=2062 data-nosnippet>2062</a> NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String))
-<a href=#2063 id=2063 data-nosnippet>2063</a> .into(),
-<a href=#2064 id=2064 data-nosnippet>2064</a> NestedField::map_value_element(<span class="number">5</span>, Type::Variant(VariantType), <span class="bool-val">false</span>).into(),
-<a href=#2065 id=2065 data-nosnippet>2065</a> )),
-<a href=#2066 id=2066 data-nosnippet>2066</a> )
-<a href=#2067 id=2067 data-nosnippet>2067</a> .into(),
-<a href=#2068 id=2068 data-nosnippet>2068</a> ])
-<a href=#2069 id=2069 data-nosnippet>2069</a> .build()
-<a href=#2070 id=2070 data-nosnippet>2070</a> .unwrap();
-<a href=#2071 id=2071 data-nosnippet>2071</a>
-<a href=#2072 id=2072 data-nosnippet>2072</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
-<a href=#2073 id=2073 data-nosnippet>2073</a>
-<a href=#2074 id=2074 data-nosnippet>2074</a> <span class="kw">let </span>DataType::List(element) = arrow_schema.field_with_name(<span class="string">"l"</span>).unwrap().data_type() <span class="kw">else </span>{
-<a href=#2075 id=2075 data-nosnippet>2075</a> <span class="macro">panic!</span>(<span class="string">"expected a list"</span>);
-<a href=#2076 id=2076 data-nosnippet>2076</a> };
-<a href=#2077 id=2077 data-nosnippet>2077</a> <span class="macro">assert_eq!</span>(element.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
-<a href=#2078 id=2078 data-nosnippet>2078</a>
-<a href=#2079 id=2079 data-nosnippet>2079</a> <span class="kw">let </span>DataType::Map(entries, <span class="kw">_</span>) = arrow_schema.field_with_name(<span class="string">"m"</span>).unwrap().data_type()
-<a href=#2080 id=2080 data-nosnippet>2080</a> <span class="kw">else </span>{
-<a href=#2081 id=2081 data-nosnippet>2081</a> <span class="macro">panic!</span>(<span class="string">"expected a map"</span>);
-<a href=#2082 id=2082 data-nosnippet>2082</a> };
-<a href=#2083 id=2083 data-nosnippet>2083</a> <span class="kw">let </span>DataType::Struct(kv) = entries.data_type() <span class="kw">else </span>{
-<a href=#2084 id=2084 data-nosnippet>2084</a> <span class="macro">panic!</span>(<span class="string">"expected a key_value struct"</span>);
-<a href=#2085 id=2085 data-nosnippet>2085</a> };
-<a href=#2086 id=2086 data-nosnippet>2086</a> <span class="kw">let </span>value = kv.iter().find(|f| f.name() == <span class="string">"value"</span>).unwrap();
-<a href=#2087 id=2087 data-nosnippet>2087</a> <span class="macro">assert_eq!</span>(value.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
-<a href=#2088 id=2088 data-nosnippet>2088</a> }
-<a href=#2089 id=2089 data-nosnippet>2089</a>
-<a href=#2090 id=2090 data-nosnippet>2090</a> <span class="doccomment">/// The unshredded Arrow storage of a variant: `metadata` (required) + `value`
-<a href=#2091 id=2091 data-nosnippet>2091</a> /// (nullable) binary, with no field ids on the sub-fields.
-<a href=#2092 id=2092 data-nosnippet>2092</a> </span><span class="kw">fn </span>variant_storage() -> DataType {
-<a href=#2093 id=2093 data-nosnippet>2093</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2094 id=2094 data-nosnippet>2094</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
-<a href=#2095 id=2095 data-nosnippet>2095</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
-<a href=#2096 id=2096 data-nosnippet>2096</a> ]))
-<a href=#2097 id=2097 data-nosnippet>2097</a> }
-<a href=#2098 id=2098 data-nosnippet>2098</a>
-<a href=#2099 id=2099 data-nosnippet>2099</a> <span class="attr">#[test]
-<a href=#2100 id=2100 data-nosnippet>2100</a> </span><span class="kw">fn </span>test_variant_arrow_field_folds_to_iceberg_variant() {
-<a href=#2101 id=2101 data-nosnippet>2101</a> <span class="comment">// A field tagged with the arrow.parquet.variant extension is folded into an
-<a href=#2102 id=2102 data-nosnippet>2102</a> // atomic Type::Variant; its storage sub-fields (which carry no field id) are
-<a href=#2103 id=2103 data-nosnippet>2103</a> // never descended into.
-<a href=#2104 id=2104 data-nosnippet>2104</a> </span><span class="kw">let </span>field = simple_field(<span class="string">"v"</span>, variant_storage(), <span class="bool-val">true</span>, <span class="string">"1"</span>)
-<a href=#2105 id=2105 data-nosnippet>2105</a> .with_extension_type(VariantExtensionType);
-<a href=#2106 id=2106 data-nosnippet>2106</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
-<a href=#2107 id=2107 data-nosnippet>2107</a>
-<a href=#2108 id=2108 data-nosnippet>2108</a> <span class="kw">let </span>converted = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#2109 id=2109 data-nosnippet>2109</a> <span class="kw">let </span>expected = Schema::builder()
-<a href=#2110 id=2110 data-nosnippet>2110</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2111 id=2111 data-nosnippet>2111</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
-<a href=#2112 id=2112 data-nosnippet>2112</a> ])
-<a href=#2113 id=2113 data-nosnippet>2113</a> .build()
-<a href=#2114 id=2114 data-nosnippet>2114</a> .unwrap();
-<a href=#2115 id=2115 data-nosnippet>2115</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted, expected);
-<a href=#2116 id=2116 data-nosnippet>2116</a> }
-<a href=#2117 id=2117 data-nosnippet>2117</a>
-<a href=#2118 id=2118 data-nosnippet>2118</a> <span class="attr">#[test]
-<a href=#2119 id=2119 data-nosnippet>2119</a> </span><span class="kw">fn </span>test_variant_schema_round_trips() {
-<a href=#2120 id=2120 data-nosnippet>2120</a> <span class="comment">// Iceberg -> Arrow -> Iceberg is the identity for variants at every position:
-<a href=#2121 id=2121 data-nosnippet>2121</a> // top-level, nested in a struct, as a list element, and as a map value.
-<a href=#2122 id=2122 data-nosnippet>2122</a> </span><span class="kw">let </span>schema = Schema::builder()
-<a href=#2123 id=2123 data-nosnippet>2123</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2124 id=2124 data-nosnippet>2124</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
-<a href=#2125 id=2125 data-nosnippet>2125</a> NestedField::optional(
-<a href=#2126 id=2126 data-nosnippet>2126</a> <span class="number">2</span>,
-<a href=#2127 id=2127 data-nosnippet>2127</a> <span class="string">"s"</span>,
-<a href=#2128 id=2128 data-nosnippet>2128</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#2129 id=2129 data-nosnippet>2129</a> NestedField::optional(<span class="number">3</span>, <span class="string">"sv"</span>, Type::Variant(VariantType)).into(),
-<a href=#2130 id=2130 data-nosnippet>2130</a> ])),
-<a href=#2131 id=2131 data-nosnippet>2131</a> )
-<a href=#2132 id=2132 data-nosnippet>2132</a> .into(),
-<a href=#2133 id=2133 data-nosnippet>2133</a> NestedField::optional(
-<a href=#2134 id=2134 data-nosnippet>2134</a> <span class="number">4</span>,
-<a href=#2135 id=2135 data-nosnippet>2135</a> <span class="string">"l"</span>,
-<a href=#2136 id=2136 data-nosnippet>2136</a> Type::List(ListType::new(
-<a href=#2137 id=2137 data-nosnippet>2137</a> NestedField::optional(<span class="number">5</span>, <span class="string">"element"</span>, Type::Variant(VariantType)).into(),
-<a href=#2138 id=2138 data-nosnippet>2138</a> )),
-<a href=#2139 id=2139 data-nosnippet>2139</a> )
-<a href=#2140 id=2140 data-nosnippet>2140</a> .into(),
-<a href=#2141 id=2141 data-nosnippet>2141</a> NestedField::optional(
-<a href=#2142 id=2142 data-nosnippet>2142</a> <span class="number">6</span>,
-<a href=#2143 id=2143 data-nosnippet>2143</a> <span class="string">"m"</span>,
-<a href=#2144 id=2144 data-nosnippet>2144</a> Type::Map(MapType::new(
-<a href=#2145 id=2145 data-nosnippet>2145</a> NestedField::map_key_element(<span class="number">7</span>, Type::Primitive(PrimitiveType::String))
-<a href=#2146 id=2146 data-nosnippet>2146</a> .into(),
-<a href=#2147 id=2147 data-nosnippet>2147</a> NestedField::map_value_element(<span class="number">8</span>, Type::Variant(VariantType), <span class="bool-val">false</span>).into(),
-<a href=#2148 id=2148 data-nosnippet>2148</a> )),
-<a href=#2149 id=2149 data-nosnippet>2149</a> )
-<a href=#2150 id=2150 data-nosnippet>2150</a> .into(),
-<a href=#2151 id=2151 data-nosnippet>2151</a> ])
-<a href=#2152 id=2152 data-nosnippet>2152</a> .build()
-<a href=#2153 id=2153 data-nosnippet>2153</a> .unwrap();
-<a href=#2154 id=2154 data-nosnippet>2154</a>
-<a href=#2155 id=2155 data-nosnippet>2155</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
-<a href=#2156 id=2156 data-nosnippet>2156</a> <span class="kw">let </span>round_tripped = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#2157 id=2157 data-nosnippet>2157</a> <span class="macro">pretty_assertions::assert_eq!</span>(round_tripped, schema);
-<a href=#2158 id=2158 data-nosnippet>2158</a> }
-<a href=#2159 id=2159 data-nosnippet>2159</a>
-<a href=#2160 id=2160 data-nosnippet>2160</a> <span class="attr">#[test]
-<a href=#2161 id=2161 data-nosnippet>2161</a> </span><span class="kw">fn </span>test_variant_recognized_with_auto_assigned_ids() {
-<a href=#2162 id=2162 data-nosnippet>2162</a> <span class="comment">// Recognition also works when the Arrow schema has no field ids: the variant
-<a href=#2163 id=2163 data-nosnippet>2163</a> // field gets an auto-assigned id and its storage is still not descended into.
-<a href=#2164 id=2164 data-nosnippet>2164</a> </span><span class="kw">let </span>field =
-<a href=#2165 id=2165 data-nosnippet>2165</a> Field::new(<span class="string">"v"</span>, variant_storage(), <span class="bool-val">true</span>).with_extension_type(VariantExtensionType);
-<a href=#2166 id=2166 data-nosnippet>2166</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
-<a href=#2167 id=2167 data-nosnippet>2167</a>
-<a href=#2168 id=2168 data-nosnippet>2168</a> <span class="kw">let </span>converted = arrow_schema_to_schema_auto_assign_ids(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#2169 id=2169 data-nosnippet>2169</a> <span class="kw">let </span>expected = Schema::builder()
-<a href=#2170 id=2170 data-nosnippet>2170</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2171 id=2171 data-nosnippet>2171</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
-<a href=#2172 id=2172 data-nosnippet>2172</a> ])
-<a href=#2173 id=2173 data-nosnippet>2173</a> .build()
-<a href=#2174 id=2174 data-nosnippet>2174</a> .unwrap();
-<a href=#2175 id=2175 data-nosnippet>2175</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted, expected);
-<a href=#2176 id=2176 data-nosnippet>2176</a> }
-<a href=#2177 id=2177 data-nosnippet>2177</a>
-<a href=#2178 id=2178 data-nosnippet>2178</a> <span class="attr">#[test]
-<a href=#2179 id=2179 data-nosnippet>2179</a> </span><span class="kw">fn </span>test_variant_extension_on_non_struct_storage_is_rejected() {
-<a href=#2180 id=2180 data-nosnippet>2180</a> <span class="comment">// The extension may only sit on struct storage. A hand-injected tag on a
-<a href=#2181 id=2181 data-nosnippet>2181</a> // non-struct field is rejected rather than silently reinterpreted as a variant.
-<a href=#2182 id=2182 data-nosnippet>2182</a> </span><span class="kw">let </span>field = Field::new(<span class="string">"v"</span>, DataType::Int32, <span class="bool-val">true</span>).with_metadata(HashMap::from([
-<a href=#2183 id=2183 data-nosnippet>2183</a> (PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string()),
-<a href=#2184 id=2184 data-nosnippet>2184</a> (
-<a href=#2185 id=2185 data-nosnippet>2185</a> arrow_schema::extension::EXTENSION_TYPE_NAME_KEY.to_string(),
-<a href=#2186 id=2186 data-nosnippet>2186</a> VariantExtensionType::NAME.to_string(),
-<a href=#2187 id=2187 data-nosnippet>2187</a> ),
-<a href=#2188 id=2188 data-nosnippet>2188</a> ]));
-<a href=#2189 id=2189 data-nosnippet>2189</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
-<a href=#2190 id=2190 data-nosnippet>2190</a>
-<a href=#2191 id=2191 data-nosnippet>2191</a> <span class="kw">let </span>err = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap_err();
-<a href=#2192 id=2192 data-nosnippet>2192</a> <span class="macro">assert!</span>(
-<a href=#2193 id=2193 data-nosnippet>2193</a> err.to_string().contains(<span class="string">"requires Struct storage"</span>),
-<a href=#2194 id=2194 data-nosnippet>2194</a> <span class="string">"unexpected error: {err}"
-<a href=#2195 id=2195 data-nosnippet>2195</a> </span>);
-<a href=#2196 id=2196 data-nosnippet>2196</a> }
-<a href=#2197 id=2197 data-nosnippet>2197</a>
-<a href=#2198 id=2198 data-nosnippet>2198</a> <span class="attr">#[test]
-<a href=#2199 id=2199 data-nosnippet>2199</a> </span><span class="kw">fn </span>test_type_conversion() {
-<a href=#2200 id=2200 data-nosnippet>2200</a> <span class="comment">// test primitive type
-<a href=#2201 id=2201 data-nosnippet>2201</a> </span>{
-<a href=#2202 id=2202 data-nosnippet>2202</a> <span class="kw">let </span>arrow_type = DataType::Int32;
-<a href=#2203 id=2203 data-nosnippet>2203</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Int);
-<a href=#2204 id=2204 data-nosnippet>2204</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
-<a href=#2205 id=2205 data-nosnippet>2205</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
-<a href=#2206 id=2206 data-nosnippet>2206</a> }
-<a href=#2207 id=2207 data-nosnippet>2207</a>
-<a href=#2208 id=2208 data-nosnippet>2208</a> {
-<a href=#2209 id=2209 data-nosnippet>2209</a> <span class="kw">let </span>arrow_type = DataType::Null;
-<a href=#2210 id=2210 data-nosnippet>2210</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Unknown);
-<a href=#2211 id=2211 data-nosnippet>2211</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
-<a href=#2212 id=2212 data-nosnippet>2212</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
-<a href=#2213 id=2213 data-nosnippet>2213</a> }
-<a href=#2214 id=2214 data-nosnippet>2214</a>
-<a href=#2215 id=2215 data-nosnippet>2215</a> <span class="comment">// test struct type
-<a href=#2216 id=2216 data-nosnippet>2216</a> </span>{
-<a href=#2217 id=2217 data-nosnippet>2217</a> <span class="comment">// no metadata will cause error
-<a href=#2218 id=2218 data-nosnippet>2218</a> </span><span class="kw">let </span>arrow_type = DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2219 id=2219 data-nosnippet>2219</a> Field::new(<span class="string">"a"</span>, DataType::Int64, <span class="bool-val">false</span>),
-<a href=#2220 id=2220 data-nosnippet>2220</a> Field::new(<span class="string">"b"</span>, DataType::Utf8, <span class="bool-val">true</span>),
-<a href=#2221 id=2221 data-nosnippet>2221</a> ]));
-<a href=#2222 id=2222 data-nosnippet>2222</a> <span class="macro">assert_eq!</span>(
-<a href=#2223 id=2223 data-nosnippet>2223</a> <span class="kw-2">&</span>arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap_err().to_string(),
-<a href=#2224 id=2224 data-nosnippet>2224</a> <span class="string">"DataInvalid => Field id not found in metadata"
-<a href=#2225 id=2225 data-nosnippet>2225</a> </span>);
+<a href=#2000 id=2000 data-nosnippet>2000</a> <span class="kw">let </span>schema: Schema = serde_json::from_str(schema_json).unwrap();
+<a href=#2001 id=2001 data-nosnippet>2001</a> schema
+<a href=#2002 id=2002 data-nosnippet>2002</a> }
+<a href=#2003 id=2003 data-nosnippet>2003</a>
+<a href=#2004 id=2004 data-nosnippet>2004</a> <span class="attr">#[test]
+<a href=#2005 id=2005 data-nosnippet>2005</a> </span><span class="kw">fn </span>test_schema_to_arrow_schema() {
+<a href=#2006 id=2006 data-nosnippet>2006</a> <span class="kw">let </span>arrow_schema = arrow_schema_for_schema_to_arrow_schema_test();
+<a href=#2007 id=2007 data-nosnippet>2007</a> <span class="kw">let </span>schema = iceberg_schema_for_schema_to_arrow_schema();
+<a href=#2008 id=2008 data-nosnippet>2008</a> <span class="kw">let </span>converted_arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
+<a href=#2009 id=2009 data-nosnippet>2009</a> <span class="macro">assert_eq!</span>(converted_arrow_schema, arrow_schema);
+<a href=#2010 id=2010 data-nosnippet>2010</a> }
+<a href=#2011 id=2011 data-nosnippet>2011</a>
+<a href=#2012 id=2012 data-nosnippet>2012</a> <span class="attr">#[test]
+<a href=#2013 id=2013 data-nosnippet>2013</a> </span><span class="kw">fn </span>test_variant_type_to_arrow_type() {
+<a href=#2014 id=2014 data-nosnippet>2014</a> <span class="comment">// Variant maps to a struct with a required `metadata` and a nullable `value` binary
+<a href=#2015 id=2015 data-nosnippet>2015</a> // field, with no field ids on the sub-fields, matching the Parquet BINARY layout.
+<a href=#2016 id=2016 data-nosnippet>2016</a> </span><span class="kw">let </span>arrow_type = type_to_arrow_type(<span class="kw-2">&</span>Type::Variant(VariantType)).unwrap();
+<a href=#2017 id=2017 data-nosnippet>2017</a> <span class="macro">assert_eq!</span>(
+<a href=#2018 id=2018 data-nosnippet>2018</a> arrow_type,
+<a href=#2019 id=2019 data-nosnippet>2019</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2020 id=2020 data-nosnippet>2020</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
+<a href=#2021 id=2021 data-nosnippet>2021</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
+<a href=#2022 id=2022 data-nosnippet>2022</a> ]))
+<a href=#2023 id=2023 data-nosnippet>2023</a> );
+<a href=#2024 id=2024 data-nosnippet>2024</a> }
+<a href=#2025 id=2025 data-nosnippet>2025</a>
+<a href=#2026 id=2026 data-nosnippet>2026</a> <span class="attr">#[test]
+<a href=#2027 id=2027 data-nosnippet>2027</a> </span><span class="kw">fn </span>test_variant_field_carries_arrow_extension_type() {
+<a href=#2028 id=2028 data-nosnippet>2028</a> <span class="comment">// Converting a schema with a variant column tags the column's field with the
+<a href=#2029 id=2029 data-nosnippet>2029</a> // canonical `arrow.parquet.variant` extension type (the struct storage stays as-is).
+<a href=#2030 id=2030 data-nosnippet>2030</a> </span><span class="kw">let </span>schema = Schema::builder()
+<a href=#2031 id=2031 data-nosnippet>2031</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2032 id=2032 data-nosnippet>2032</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
+<a href=#2033 id=2033 data-nosnippet>2033</a> ])
+<a href=#2034 id=2034 data-nosnippet>2034</a> .build()
+<a href=#2035 id=2035 data-nosnippet>2035</a> .unwrap();
+<a href=#2036 id=2036 data-nosnippet>2036</a>
+<a href=#2037 id=2037 data-nosnippet>2037</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
+<a href=#2038 id=2038 data-nosnippet>2038</a> <span class="kw">let </span>field = arrow_schema.field_with_name(<span class="string">"v"</span>).unwrap();
+<a href=#2039 id=2039 data-nosnippet>2039</a>
+<a href=#2040 id=2040 data-nosnippet>2040</a> <span class="macro">assert_eq!</span>(field.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
+<a href=#2041 id=2041 data-nosnippet>2041</a> <span class="comment">// Attaching the extension type must not clobber the Iceberg field id.
+<a href=#2042 id=2042 data-nosnippet>2042</a> </span><span class="macro">assert_eq!</span>(
+<a href=#2043 id=2043 data-nosnippet>2043</a> field.metadata().get(PARQUET_FIELD_ID_META_KEY),
+<a href=#2044 id=2044 data-nosnippet>2044</a> <span class="prelude-val">Some</span>(<span class="kw-2">&</span><span class="string">"1"</span>.to_string())
+<a href=#2045 id=2045 data-nosnippet>2045</a> );
+<a href=#2046 id=2046 data-nosnippet>2046</a> <span class="macro">assert_eq!</span>(
+<a href=#2047 id=2047 data-nosnippet>2047</a> field.data_type(),
+<a href=#2048 id=2048 data-nosnippet>2048</a> <span class="kw-2">&</span>DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2049 id=2049 data-nosnippet>2049</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
+<a href=#2050 id=2050 data-nosnippet>2050</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
+<a href=#2051 id=2051 data-nosnippet>2051</a> ]))
+<a href=#2052 id=2052 data-nosnippet>2052</a> );
+<a href=#2053 id=2053 data-nosnippet>2053</a> }
+<a href=#2054 id=2054 data-nosnippet>2054</a>
+<a href=#2055 id=2055 data-nosnippet>2055</a> <span class="attr">#[test]
+<a href=#2056 id=2056 data-nosnippet>2056</a> </span><span class="kw">fn </span>test_variant_nested_in_list_and_map_carries_arrow_extension_type() {
+<a href=#2057 id=2057 data-nosnippet>2057</a> <span class="comment">// A variant nested in a list element or map value keeps the arrow.parquet.variant
+<a href=#2058 id=2058 data-nosnippet>2058</a> // extension type. Regression guard: the list converter must not overwrite the
+<a href=#2059 id=2059 data-nosnippet>2059</a> // element field's metadata (which would drop the extension type).
+<a href=#2060 id=2060 data-nosnippet>2060</a> </span><span class="kw">let </span>schema = Schema::builder()
+<a href=#2061 id=2061 data-nosnippet>2061</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2062 id=2062 data-nosnippet>2062</a> NestedField::optional(
+<a href=#2063 id=2063 data-nosnippet>2063</a> <span class="number">1</span>,
+<a href=#2064 id=2064 data-nosnippet>2064</a> <span class="string">"l"</span>,
+<a href=#2065 id=2065 data-nosnippet>2065</a> Type::List(ListType::new(
+<a href=#2066 id=2066 data-nosnippet>2066</a> NestedField::optional(<span class="number">2</span>, <span class="string">"element"</span>, Type::Variant(VariantType)).into(),
+<a href=#2067 id=2067 data-nosnippet>2067</a> )),
+<a href=#2068 id=2068 data-nosnippet>2068</a> )
+<a href=#2069 id=2069 data-nosnippet>2069</a> .into(),
+<a href=#2070 id=2070 data-nosnippet>2070</a> NestedField::optional(
+<a href=#2071 id=2071 data-nosnippet>2071</a> <span class="number">3</span>,
+<a href=#2072 id=2072 data-nosnippet>2072</a> <span class="string">"m"</span>,
+<a href=#2073 id=2073 data-nosnippet>2073</a> Type::Map(MapType::new(
+<a href=#2074 id=2074 data-nosnippet>2074</a> NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String))
+<a href=#2075 id=2075 data-nosnippet>2075</a> .into(),
+<a href=#2076 id=2076 data-nosnippet>2076</a> NestedField::map_value_element(<span class="number">5</span>, Type::Variant(VariantType), <span class="bool-val">false</span>).into(),
+<a href=#2077 id=2077 data-nosnippet>2077</a> )),
+<a href=#2078 id=2078 data-nosnippet>2078</a> )
+<a href=#2079 id=2079 data-nosnippet>2079</a> .into(),
+<a href=#2080 id=2080 data-nosnippet>2080</a> ])
+<a href=#2081 id=2081 data-nosnippet>2081</a> .build()
+<a href=#2082 id=2082 data-nosnippet>2082</a> .unwrap();
+<a href=#2083 id=2083 data-nosnippet>2083</a>
+<a href=#2084 id=2084 data-nosnippet>2084</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
+<a href=#2085 id=2085 data-nosnippet>2085</a>
+<a href=#2086 id=2086 data-nosnippet>2086</a> <span class="kw">let </span>DataType::List(element) = arrow_schema.field_with_name(<span class="string">"l"</span>).unwrap().data_type() <span class="kw">else </span>{
+<a href=#2087 id=2087 data-nosnippet>2087</a> <span class="macro">panic!</span>(<span class="string">"expected a list"</span>);
+<a href=#2088 id=2088 data-nosnippet>2088</a> };
+<a href=#2089 id=2089 data-nosnippet>2089</a> <span class="macro">assert_eq!</span>(element.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
+<a href=#2090 id=2090 data-nosnippet>2090</a>
+<a href=#2091 id=2091 data-nosnippet>2091</a> <span class="kw">let </span>DataType::Map(entries, <span class="kw">_</span>) = arrow_schema.field_with_name(<span class="string">"m"</span>).unwrap().data_type()
+<a href=#2092 id=2092 data-nosnippet>2092</a> <span class="kw">else </span>{
+<a href=#2093 id=2093 data-nosnippet>2093</a> <span class="macro">panic!</span>(<span class="string">"expected a map"</span>);
+<a href=#2094 id=2094 data-nosnippet>2094</a> };
+<a href=#2095 id=2095 data-nosnippet>2095</a> <span class="kw">let </span>DataType::Struct(kv) = entries.data_type() <span class="kw">else </span>{
+<a href=#2096 id=2096 data-nosnippet>2096</a> <span class="macro">panic!</span>(<span class="string">"expected a key_value struct"</span>);
+<a href=#2097 id=2097 data-nosnippet>2097</a> };
+<a href=#2098 id=2098 data-nosnippet>2098</a> <span class="kw">let </span>value = kv.iter().find(|f| f.name() == <span class="string">"value"</span>).unwrap();
+<a href=#2099 id=2099 data-nosnippet>2099</a> <span class="macro">assert_eq!</span>(value.extension_type_name(), <span class="prelude-val">Some</span>(<span class="string">"arrow.parquet.variant"</span>));
+<a href=#2100 id=2100 data-nosnippet>2100</a> }
+<a href=#2101 id=2101 data-nosnippet>2101</a>
+<a href=#2102 id=2102 data-nosnippet>2102</a> <span class="doccomment">/// The unshredded Arrow storage of a variant: `metadata` (required) + `value`
+<a href=#2103 id=2103 data-nosnippet>2103</a> /// (nullable) binary, with no field ids on the sub-fields.
+<a href=#2104 id=2104 data-nosnippet>2104</a> </span><span class="kw">fn </span>variant_storage() -> DataType {
+<a href=#2105 id=2105 data-nosnippet>2105</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2106 id=2106 data-nosnippet>2106</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
+<a href=#2107 id=2107 data-nosnippet>2107</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
+<a href=#2108 id=2108 data-nosnippet>2108</a> ]))
+<a href=#2109 id=2109 data-nosnippet>2109</a> }
+<a href=#2110 id=2110 data-nosnippet>2110</a>
+<a href=#2111 id=2111 data-nosnippet>2111</a> <span class="attr">#[test]
+<a href=#2112 id=2112 data-nosnippet>2112</a> </span><span class="kw">fn </span>test_variant_arrow_field_folds_to_iceberg_variant() {
+<a href=#2113 id=2113 data-nosnippet>2113</a> <span class="comment">// A field tagged with the arrow.parquet.variant extension is folded into an
+<a href=#2114 id=2114 data-nosnippet>2114</a> // atomic Type::Variant; its storage sub-fields (which carry no field id) are
+<a href=#2115 id=2115 data-nosnippet>2115</a> // never descended into.
+<a href=#2116 id=2116 data-nosnippet>2116</a> </span><span class="kw">let </span>field = simple_field(<span class="string">"v"</span>, variant_storage(), <span class="bool-val">true</span>, <span class="string">"1"</span>)
+<a href=#2117 id=2117 data-nosnippet>2117</a> .with_extension_type(VariantExtensionType);
+<a href=#2118 id=2118 data-nosnippet>2118</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
+<a href=#2119 id=2119 data-nosnippet>2119</a>
+<a href=#2120 id=2120 data-nosnippet>2120</a> <span class="kw">let </span>converted = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#2121 id=2121 data-nosnippet>2121</a> <span class="kw">let </span>expected = Schema::builder()
+<a href=#2122 id=2122 data-nosnippet>2122</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2123 id=2123 data-nosnippet>2123</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
+<a href=#2124 id=2124 data-nosnippet>2124</a> ])
+<a href=#2125 id=2125 data-nosnippet>2125</a> .build()
+<a href=#2126 id=2126 data-nosnippet>2126</a> .unwrap();
+<a href=#2127 id=2127 data-nosnippet>2127</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted, expected);
+<a href=#2128 id=2128 data-nosnippet>2128</a> }
+<a href=#2129 id=2129 data-nosnippet>2129</a>
+<a href=#2130 id=2130 data-nosnippet>2130</a> <span class="attr">#[test]
+<a href=#2131 id=2131 data-nosnippet>2131</a> </span><span class="kw">fn </span>test_variant_schema_round_trips() {
+<a href=#2132 id=2132 data-nosnippet>2132</a> <span class="comment">// Iceberg -> Arrow -> Iceberg is the identity for variants at every position:
+<a href=#2133 id=2133 data-nosnippet>2133</a> // top-level, nested in a struct, as a list element, and as a map value.
+<a href=#2134 id=2134 data-nosnippet>2134</a> </span><span class="kw">let </span>schema = Schema::builder()
+<a href=#2135 id=2135 data-nosnippet>2135</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2136 id=2136 data-nosnippet>2136</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
+<a href=#2137 id=2137 data-nosnippet>2137</a> NestedField::optional(
+<a href=#2138 id=2138 data-nosnippet>2138</a> <span class="number">2</span>,
+<a href=#2139 id=2139 data-nosnippet>2139</a> <span class="string">"s"</span>,
+<a href=#2140 id=2140 data-nosnippet>2140</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#2141 id=2141 data-nosnippet>2141</a> NestedField::optional(<span class="number">3</span>, <span class="string">"sv"</span>, Type::Variant(VariantType)).into(),
+<a href=#2142 id=2142 data-nosnippet>2142</a> ])),
+<a href=#2143 id=2143 data-nosnippet>2143</a> )
+<a href=#2144 id=2144 data-nosnippet>2144</a> .into(),
+<a href=#2145 id=2145 data-nosnippet>2145</a> NestedField::optional(
+<a href=#2146 id=2146 data-nosnippet>2146</a> <span class="number">4</span>,
+<a href=#2147 id=2147 data-nosnippet>2147</a> <span class="string">"l"</span>,
+<a href=#2148 id=2148 data-nosnippet>2148</a> Type::List(ListType::new(
+<a href=#2149 id=2149 data-nosnippet>2149</a> NestedField::optional(<span class="number">5</span>, <span class="string">"element"</span>, Type::Variant(VariantType)).into(),
+<a href=#2150 id=2150 data-nosnippet>2150</a> )),
+<a href=#2151 id=2151 data-nosnippet>2151</a> )
+<a href=#2152 id=2152 data-nosnippet>2152</a> .into(),
+<a href=#2153 id=2153 data-nosnippet>2153</a> NestedField::optional(
+<a href=#2154 id=2154 data-nosnippet>2154</a> <span class="number">6</span>,
+<a href=#2155 id=2155 data-nosnippet>2155</a> <span class="string">"m"</span>,
+<a href=#2156 id=2156 data-nosnippet>2156</a> Type::Map(MapType::new(
+<a href=#2157 id=2157 data-nosnippet>2157</a> NestedField::map_key_element(<span class="number">7</span>, Type::Primitive(PrimitiveType::String))
+<a href=#2158 id=2158 data-nosnippet>2158</a> .into(),
+<a href=#2159 id=2159 data-nosnippet>2159</a> NestedField::map_value_element(<span class="number">8</span>, Type::Variant(VariantType), <span class="bool-val">false</span>).into(),
+<a href=#2160 id=2160 data-nosnippet>2160</a> )),
+<a href=#2161 id=2161 data-nosnippet>2161</a> )
+<a href=#2162 id=2162 data-nosnippet>2162</a> .into(),
+<a href=#2163 id=2163 data-nosnippet>2163</a> ])
+<a href=#2164 id=2164 data-nosnippet>2164</a> .build()
+<a href=#2165 id=2165 data-nosnippet>2165</a> .unwrap();
+<a href=#2166 id=2166 data-nosnippet>2166</a>
+<a href=#2167 id=2167 data-nosnippet>2167</a> <span class="kw">let </span>arrow_schema = schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap();
+<a href=#2168 id=2168 data-nosnippet>2168</a> <span class="kw">let </span>round_tripped = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#2169 id=2169 data-nosnippet>2169</a> <span class="macro">pretty_assertions::assert_eq!</span>(round_tripped, schema);
+<a href=#2170 id=2170 data-nosnippet>2170</a> }
+<a href=#2171 id=2171 data-nosnippet>2171</a>
+<a href=#2172 id=2172 data-nosnippet>2172</a> <span class="attr">#[test]
+<a href=#2173 id=2173 data-nosnippet>2173</a> </span><span class="kw">fn </span>test_variant_recognized_with_auto_assigned_ids() {
+<a href=#2174 id=2174 data-nosnippet>2174</a> <span class="comment">// Recognition also works when the Arrow schema has no field ids: the variant
+<a href=#2175 id=2175 data-nosnippet>2175</a> // field gets an auto-assigned id and its storage is still not descended into.
+<a href=#2176 id=2176 data-nosnippet>2176</a> </span><span class="kw">let </span>field =
+<a href=#2177 id=2177 data-nosnippet>2177</a> Field::new(<span class="string">"v"</span>, variant_storage(), <span class="bool-val">true</span>).with_extension_type(VariantExtensionType);
+<a href=#2178 id=2178 data-nosnippet>2178</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
+<a href=#2179 id=2179 data-nosnippet>2179</a>
+<a href=#2180 id=2180 data-nosnippet>2180</a> <span class="kw">let </span>converted = arrow_schema_to_schema_auto_assign_ids(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#2181 id=2181 data-nosnippet>2181</a> <span class="kw">let </span>expected = Schema::builder()
+<a href=#2182 id=2182 data-nosnippet>2182</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2183 id=2183 data-nosnippet>2183</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, Type::Variant(VariantType)).into(),
+<a href=#2184 id=2184 data-nosnippet>2184</a> ])
+<a href=#2185 id=2185 data-nosnippet>2185</a> .build()
+<a href=#2186 id=2186 data-nosnippet>2186</a> .unwrap();
+<a href=#2187 id=2187 data-nosnippet>2187</a> <span class="macro">pretty_assertions::assert_eq!</span>(converted, expected);
+<a href=#2188 id=2188 data-nosnippet>2188</a> }
+<a href=#2189 id=2189 data-nosnippet>2189</a>
+<a href=#2190 id=2190 data-nosnippet>2190</a> <span class="attr">#[test]
+<a href=#2191 id=2191 data-nosnippet>2191</a> </span><span class="kw">fn </span>test_variant_extension_on_non_struct_storage_is_rejected() {
+<a href=#2192 id=2192 data-nosnippet>2192</a> <span class="comment">// The extension may only sit on struct storage. A hand-injected tag on a
+<a href=#2193 id=2193 data-nosnippet>2193</a> // non-struct field is rejected rather than silently reinterpreted as a variant.
+<a href=#2194 id=2194 data-nosnippet>2194</a> </span><span class="kw">let </span>field = Field::new(<span class="string">"v"</span>, DataType::Int32, <span class="bool-val">true</span>).with_metadata(HashMap::from([
+<a href=#2195 id=2195 data-nosnippet>2195</a> (PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string()),
+<a href=#2196 id=2196 data-nosnippet>2196</a> (
+<a href=#2197 id=2197 data-nosnippet>2197</a> arrow_schema::extension::EXTENSION_TYPE_NAME_KEY.to_string(),
+<a href=#2198 id=2198 data-nosnippet>2198</a> VariantExtensionType::NAME.to_string(),
+<a href=#2199 id=2199 data-nosnippet>2199</a> ),
+<a href=#2200 id=2200 data-nosnippet>2200</a> ]));
+<a href=#2201 id=2201 data-nosnippet>2201</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[field]);
+<a href=#2202 id=2202 data-nosnippet>2202</a>
+<a href=#2203 id=2203 data-nosnippet>2203</a> <span class="kw">let </span>err = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap_err();
+<a href=#2204 id=2204 data-nosnippet>2204</a> <span class="macro">assert!</span>(
+<a href=#2205 id=2205 data-nosnippet>2205</a> err.to_string().contains(<span class="string">"requires Struct storage"</span>),
+<a href=#2206 id=2206 data-nosnippet>2206</a> <span class="string">"unexpected error: {err}"
+<a href=#2207 id=2207 data-nosnippet>2207</a> </span>);
+<a href=#2208 id=2208 data-nosnippet>2208</a> }
+<a href=#2209 id=2209 data-nosnippet>2209</a>
+<a href=#2210 id=2210 data-nosnippet>2210</a> <span class="attr">#[test]
+<a href=#2211 id=2211 data-nosnippet>2211</a> </span><span class="kw">fn </span>test_type_conversion() {
+<a href=#2212 id=2212 data-nosnippet>2212</a> <span class="comment">// test primitive type
+<a href=#2213 id=2213 data-nosnippet>2213</a> </span>{
+<a href=#2214 id=2214 data-nosnippet>2214</a> <span class="kw">let </span>arrow_type = DataType::Int32;
+<a href=#2215 id=2215 data-nosnippet>2215</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Int);
+<a href=#2216 id=2216 data-nosnippet>2216</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
+<a href=#2217 id=2217 data-nosnippet>2217</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
+<a href=#2218 id=2218 data-nosnippet>2218</a> }
+<a href=#2219 id=2219 data-nosnippet>2219</a>
+<a href=#2220 id=2220 data-nosnippet>2220</a> {
+<a href=#2221 id=2221 data-nosnippet>2221</a> <span class="kw">let </span>arrow_type = DataType::Null;
+<a href=#2222 id=2222 data-nosnippet>2222</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Unknown);
+<a href=#2223 id=2223 data-nosnippet>2223</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
+<a href=#2224 id=2224 data-nosnippet>2224</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
+<a href=#2225 id=2225 data-nosnippet>2225</a> }
<a href=#2226 id=2226 data-nosnippet>2226</a>
-<a href=#2227 id=2227 data-nosnippet>2227</a> <span class="kw">let </span>arrow_type = DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2228 id=2228 data-nosnippet>2228</a> Field::new(<span class="string">"a"</span>, DataType::Int64, <span class="bool-val">false</span>).with_metadata(HashMap::from_iter([(
-<a href=#2229 id=2229 data-nosnippet>2229</a> PARQUET_FIELD_ID_META_KEY.to_string(),
-<a href=#2230 id=2230 data-nosnippet>2230</a> <span class="number">1</span>.to_string(),
-<a href=#2231 id=2231 data-nosnippet>2231</a> )])),
-<a href=#2232 id=2232 data-nosnippet>2232</a> Field::new(<span class="string">"b"</span>, DataType::Utf8, <span class="bool-val">true</span>).with_metadata(HashMap::from_iter([(
-<a href=#2233 id=2233 data-nosnippet>2233</a> PARQUET_FIELD_ID_META_KEY.to_string(),
-<a href=#2234 id=2234 data-nosnippet>2234</a> <span class="number">2</span>.to_string(),
-<a href=#2235 id=2235 data-nosnippet>2235</a> )])),
-<a href=#2236 id=2236 data-nosnippet>2236</a> ]));
-<a href=#2237 id=2237 data-nosnippet>2237</a> <span class="kw">let </span>iceberg_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#2238 id=2238 data-nosnippet>2238</a> NestedField {
-<a href=#2239 id=2239 data-nosnippet>2239</a> id: <span class="number">1</span>,
-<a href=#2240 id=2240 data-nosnippet>2240</a> doc: <span class="prelude-val">None</span>,
-<a href=#2241 id=2241 data-nosnippet>2241</a> name: <span class="string">"a"</span>.to_string(),
-<a href=#2242 id=2242 data-nosnippet>2242</a> required: <span class="bool-val">true</span>,
-<a href=#2243 id=2243 data-nosnippet>2243</a> field_type: Box::new(Type::Primitive(PrimitiveType::Long)),
-<a href=#2244 id=2244 data-nosnippet>2244</a> initial_default: <span class="prelude-val">None</span>,
-<a href=#2245 id=2245 data-nosnippet>2245</a> write_default: <span class="prelude-val">None</span>,
-<a href=#2246 id=2246 data-nosnippet>2246</a> }
-<a href=#2247 id=2247 data-nosnippet>2247</a> .into(),
-<a href=#2248 id=2248 data-nosnippet>2248</a> NestedField {
-<a href=#2249 id=2249 data-nosnippet>2249</a> id: <span class="number">2</span>,
-<a href=#2250 id=2250 data-nosnippet>2250</a> doc: <span class="prelude-val">None</span>,
-<a href=#2251 id=2251 data-nosnippet>2251</a> name: <span class="string">"b"</span>.to_string(),
-<a href=#2252 id=2252 data-nosnippet>2252</a> required: <span class="bool-val">false</span>,
-<a href=#2253 id=2253 data-nosnippet>2253</a> field_type: Box::new(Type::Primitive(PrimitiveType::String)),
-<a href=#2254 id=2254 data-nosnippet>2254</a> initial_default: <span class="prelude-val">None</span>,
-<a href=#2255 id=2255 data-nosnippet>2255</a> write_default: <span class="prelude-val">None</span>,
-<a href=#2256 id=2256 data-nosnippet>2256</a> }
-<a href=#2257 id=2257 data-nosnippet>2257</a> .into(),
-<a href=#2258 id=2258 data-nosnippet>2258</a> ]));
-<a href=#2259 id=2259 data-nosnippet>2259</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
-<a href=#2260 id=2260 data-nosnippet>2260</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
-<a href=#2261 id=2261 data-nosnippet>2261</a>
-<a href=#2262 id=2262 data-nosnippet>2262</a> <span class="comment">// initial_default and write_default is ignored
-<a href=#2263 id=2263 data-nosnippet>2263</a> </span><span class="kw">let </span>iceberg_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#2264 id=2264 data-nosnippet>2264</a> NestedField {
-<a href=#2265 id=2265 data-nosnippet>2265</a> id: <span class="number">1</span>,
-<a href=#2266 id=2266 data-nosnippet>2266</a> doc: <span class="prelude-val">None</span>,
-<a href=#2267 id=2267 data-nosnippet>2267</a> name: <span class="string">"a"</span>.to_string(),
-<a href=#2268 id=2268 data-nosnippet>2268</a> required: <span class="bool-val">true</span>,
-<a href=#2269 id=2269 data-nosnippet>2269</a> field_type: Box::new(Type::Primitive(PrimitiveType::Long)),
-<a href=#2270 id=2270 data-nosnippet>2270</a> initial_default: <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">114514</span>))),
-<a href=#2271 id=2271 data-nosnippet>2271</a> write_default: <span class="prelude-val">None</span>,
-<a href=#2272 id=2272 data-nosnippet>2272</a> }
-<a href=#2273 id=2273 data-nosnippet>2273</a> .into(),
-<a href=#2274 id=2274 data-nosnippet>2274</a> NestedField {
-<a href=#2275 id=2275 data-nosnippet>2275</a> id: <span class="number">2</span>,
-<a href=#2276 id=2276 data-nosnippet>2276</a> doc: <span class="prelude-val">None</span>,
-<a href=#2277 id=2277 data-nosnippet>2277</a> name: <span class="string">"b"</span>.to_string(),
-<a href=#2278 id=2278 data-nosnippet>2278</a> required: <span class="bool-val">false</span>,
-<a href=#2279 id=2279 data-nosnippet>2279</a> field_type: Box::new(Type::Primitive(PrimitiveType::String)),
-<a href=#2280 id=2280 data-nosnippet>2280</a> initial_default: <span class="prelude-val">None</span>,
-<a href=#2281 id=2281 data-nosnippet>2281</a> write_default: <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#2282 id=2282 data-nosnippet>2282</a> <span class="string">"514"</span>.to_string(),
-<a href=#2283 id=2283 data-nosnippet>2283</a> ))),
+<a href=#2227 id=2227 data-nosnippet>2227</a> <span class="comment">// test struct type
+<a href=#2228 id=2228 data-nosnippet>2228</a> </span>{
+<a href=#2229 id=2229 data-nosnippet>2229</a> <span class="comment">// no metadata will cause error
+<a href=#2230 id=2230 data-nosnippet>2230</a> </span><span class="kw">let </span>arrow_type = DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2231 id=2231 data-nosnippet>2231</a> Field::new(<span class="string">"a"</span>, DataType::Int64, <span class="bool-val">false</span>),
+<a href=#2232 id=2232 data-nosnippet>2232</a> Field::new(<span class="string">"b"</span>, DataType::Utf8, <span class="bool-val">true</span>),
+<a href=#2233 id=2233 data-nosnippet>2233</a> ]));
+<a href=#2234 id=2234 data-nosnippet>2234</a> <span class="macro">assert_eq!</span>(
+<a href=#2235 id=2235 data-nosnippet>2235</a> <span class="kw-2">&</span>arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap_err().to_string(),
+<a href=#2236 id=2236 data-nosnippet>2236</a> <span class="string">"DataInvalid => Field id not found in metadata"
+<a href=#2237 id=2237 data-nosnippet>2237</a> </span>);
+<a href=#2238 id=2238 data-nosnippet>2238</a>
+<a href=#2239 id=2239 data-nosnippet>2239</a> <span class="kw">let </span>arrow_type = DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2240 id=2240 data-nosnippet>2240</a> Field::new(<span class="string">"a"</span>, DataType::Int64, <span class="bool-val">false</span>).with_metadata(HashMap::from_iter([(
+<a href=#2241 id=2241 data-nosnippet>2241</a> PARQUET_FIELD_ID_META_KEY.to_string(),
+<a href=#2242 id=2242 data-nosnippet>2242</a> <span class="number">1</span>.to_string(),
+<a href=#2243 id=2243 data-nosnippet>2243</a> )])),
+<a href=#2244 id=2244 data-nosnippet>2244</a> Field::new(<span class="string">"b"</span>, DataType::Utf8, <span class="bool-val">true</span>).with_metadata(HashMap::from_iter([(
+<a href=#2245 id=2245 data-nosnippet>2245</a> PARQUET_FIELD_ID_META_KEY.to_string(),
+<a href=#2246 id=2246 data-nosnippet>2246</a> <span class="number">2</span>.to_string(),
+<a href=#2247 id=2247 data-nosnippet>2247</a> )])),
+<a href=#2248 id=2248 data-nosnippet>2248</a> ]));
+<a href=#2249 id=2249 data-nosnippet>2249</a> <span class="kw">let </span>iceberg_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#2250 id=2250 data-nosnippet>2250</a> NestedField {
+<a href=#2251 id=2251 data-nosnippet>2251</a> id: <span class="number">1</span>,
+<a href=#2252 id=2252 data-nosnippet>2252</a> doc: <span class="prelude-val">None</span>,
+<a href=#2253 id=2253 data-nosnippet>2253</a> name: <span class="string">"a"</span>.to_string(),
+<a href=#2254 id=2254 data-nosnippet>2254</a> required: <span class="bool-val">true</span>,
+<a href=#2255 id=2255 data-nosnippet>2255</a> field_type: Box::new(Type::Primitive(PrimitiveType::Long)),
+<a href=#2256 id=2256 data-nosnippet>2256</a> initial_default: <span class="prelude-val">None</span>,
+<a href=#2257 id=2257 data-nosnippet>2257</a> write_default: <span class="prelude-val">None</span>,
+<a href=#2258 id=2258 data-nosnippet>2258</a> }
+<a href=#2259 id=2259 data-nosnippet>2259</a> .into(),
+<a href=#2260 id=2260 data-nosnippet>2260</a> NestedField {
+<a href=#2261 id=2261 data-nosnippet>2261</a> id: <span class="number">2</span>,
+<a href=#2262 id=2262 data-nosnippet>2262</a> doc: <span class="prelude-val">None</span>,
+<a href=#2263 id=2263 data-nosnippet>2263</a> name: <span class="string">"b"</span>.to_string(),
+<a href=#2264 id=2264 data-nosnippet>2264</a> required: <span class="bool-val">false</span>,
+<a href=#2265 id=2265 data-nosnippet>2265</a> field_type: Box::new(Type::Primitive(PrimitiveType::String)),
+<a href=#2266 id=2266 data-nosnippet>2266</a> initial_default: <span class="prelude-val">None</span>,
+<a href=#2267 id=2267 data-nosnippet>2267</a> write_default: <span class="prelude-val">None</span>,
+<a href=#2268 id=2268 data-nosnippet>2268</a> }
+<a href=#2269 id=2269 data-nosnippet>2269</a> .into(),
+<a href=#2270 id=2270 data-nosnippet>2270</a> ]));
+<a href=#2271 id=2271 data-nosnippet>2271</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
+<a href=#2272 id=2272 data-nosnippet>2272</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
+<a href=#2273 id=2273 data-nosnippet>2273</a>
+<a href=#2274 id=2274 data-nosnippet>2274</a> <span class="comment">// initial_default and write_default is ignored
+<a href=#2275 id=2275 data-nosnippet>2275</a> </span><span class="kw">let </span>iceberg_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#2276 id=2276 data-nosnippet>2276</a> NestedField {
+<a href=#2277 id=2277 data-nosnippet>2277</a> id: <span class="number">1</span>,
+<a href=#2278 id=2278 data-nosnippet>2278</a> doc: <span class="prelude-val">None</span>,
+<a href=#2279 id=2279 data-nosnippet>2279</a> name: <span class="string">"a"</span>.to_string(),
+<a href=#2280 id=2280 data-nosnippet>2280</a> required: <span class="bool-val">true</span>,
+<a href=#2281 id=2281 data-nosnippet>2281</a> field_type: Box::new(Type::Primitive(PrimitiveType::Long)),
+<a href=#2282 id=2282 data-nosnippet>2282</a> initial_default: <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">114514</span>))),
+<a href=#2283 id=2283 data-nosnippet>2283</a> write_default: <span class="prelude-val">None</span>,
<a href=#2284 id=2284 data-nosnippet>2284</a> }
<a href=#2285 id=2285 data-nosnippet>2285</a> .into(),
-<a href=#2286 id=2286 data-nosnippet>2286</a> ]));
-<a href=#2287 id=2287 data-nosnippet>2287</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
-<a href=#2288 id=2288 data-nosnippet>2288</a> }
-<a href=#2289 id=2289 data-nosnippet>2289</a>
-<a href=#2290 id=2290 data-nosnippet>2290</a> <span class="comment">// test dictionary type
-<a href=#2291 id=2291 data-nosnippet>2291</a> </span>{
-<a href=#2292 id=2292 data-nosnippet>2292</a> <span class="kw">let </span>arrow_type =
-<a href=#2293 id=2293 data-nosnippet>2293</a> DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Int8));
-<a href=#2294 id=2294 data-nosnippet>2294</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Int);
-<a href=#2295 id=2295 data-nosnippet>2295</a> <span class="macro">assert_eq!</span>(
-<a href=#2296 id=2296 data-nosnippet>2296</a> iceberg_type,
-<a href=#2297 id=2297 data-nosnippet>2297</a> arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap(),
-<a href=#2298 id=2298 data-nosnippet>2298</a> <span class="string">"Expected dictionary conversion to use the contained value"
-<a href=#2299 id=2299 data-nosnippet>2299</a> </span>);
-<a href=#2300 id=2300 data-nosnippet>2300</a>
-<a href=#2301 id=2301 data-nosnippet>2301</a> <span class="kw">let </span>arrow_type =
-<a href=#2302 id=2302 data-nosnippet>2302</a> DataType::Dictionary(Box::new(DataType::Utf8), Box::new(DataType::Boolean));
-<a href=#2303 id=2303 data-nosnippet>2303</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Boolean);
-<a href=#2304 id=2304 data-nosnippet>2304</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
-<a href=#2305 id=2305 data-nosnippet>2305</a> }
-<a href=#2306 id=2306 data-nosnippet>2306</a> }
-<a href=#2307 id=2307 data-nosnippet>2307</a>
-<a href=#2308 id=2308 data-nosnippet>2308</a> <span class="attr">#[test]
-<a href=#2309 id=2309 data-nosnippet>2309</a> </span><span class="kw">fn </span>test_unsigned_integer_type_conversion() {
-<a href=#2310 id=2310 data-nosnippet>2310</a> <span class="kw">let </span>test_cases = <span class="macro">vec!</span>[
-<a href=#2311 id=2311 data-nosnippet>2311</a> (DataType::UInt8, PrimitiveType::Int),
-<a href=#2312 id=2312 data-nosnippet>2312</a> (DataType::UInt16, PrimitiveType::Int),
-<a href=#2313 id=2313 data-nosnippet>2313</a> (DataType::UInt32, PrimitiveType::Long),
-<a href=#2314 id=2314 data-nosnippet>2314</a> ];
-<a href=#2315 id=2315 data-nosnippet>2315</a>
-<a href=#2316 id=2316 data-nosnippet>2316</a> <span class="kw">for </span>(arrow_type, expected_iceberg_type) <span class="kw">in </span>test_cases {
-<a href=#2317 id=2317 data-nosnippet>2317</a> <span class="kw">let </span>arrow_field = Field::new(<span class="string">"test"</span>, arrow_type.clone(), <span class="bool-val">false</span>).with_metadata(
-<a href=#2318 id=2318 data-nosnippet>2318</a> HashMap::from([(PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string())]),
-<a href=#2319 id=2319 data-nosnippet>2319</a> );
-<a href=#2320 id=2320 data-nosnippet>2320</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[arrow_field]);
-<a href=#2321 id=2321 data-nosnippet>2321</a>
-<a href=#2322 id=2322 data-nosnippet>2322</a> <span class="kw">let </span>iceberg_schema = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#2323 id=2323 data-nosnippet>2323</a> <span class="kw">let </span>iceberg_field = iceberg_schema.as_struct().fields().first().unwrap();
-<a href=#2324 id=2324 data-nosnippet>2324</a>
-<a href=#2325 id=2325 data-nosnippet>2325</a> <span class="macro">assert!</span>(
-<a href=#2326 id=2326 data-nosnippet>2326</a> <span class="macro">matches!</span>(iceberg_field.field_type.as_ref(), Type::Primitive(t) <span class="kw">if </span><span class="kw-2">*</span>t == expected_iceberg_type),
-<a href=#2327 id=2327 data-nosnippet>2327</a> <span class="string">"Expected {arrow_type:?} to map to {expected_iceberg_type:?}"
-<a href=#2328 id=2328 data-nosnippet>2328</a> </span>);
-<a href=#2329 id=2329 data-nosnippet>2329</a> }
-<a href=#2330 id=2330 data-nosnippet>2330</a>
-<a href=#2331 id=2331 data-nosnippet>2331</a> <span class="comment">// Test UInt64 blocking
-<a href=#2332 id=2332 data-nosnippet>2332</a> </span>{
-<a href=#2333 id=2333 data-nosnippet>2333</a> <span class="kw">let </span>arrow_field = Field::new(<span class="string">"test"</span>, DataType::UInt64, <span class="bool-val">false</span>).with_metadata(
-<a href=#2334 id=2334 data-nosnippet>2334</a> HashMap::from([(PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string())]),
-<a href=#2335 id=2335 data-nosnippet>2335</a> );
-<a href=#2336 id=2336 data-nosnippet>2336</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[arrow_field]);
-<a href=#2337 id=2337 data-nosnippet>2337</a>
-<a href=#2338 id=2338 data-nosnippet>2338</a> <span class="kw">let </span>result = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema);
-<a href=#2339 id=2339 data-nosnippet>2339</a> <span class="macro">assert!</span>(result.is_err());
-<a href=#2340 id=2340 data-nosnippet>2340</a> <span class="macro">assert!</span>(
-<a href=#2341 id=2341 data-nosnippet>2341</a> result
-<a href=#2342 id=2342 data-nosnippet>2342</a> .unwrap_err()
-<a href=#2343 id=2343 data-nosnippet>2343</a> .to_string()
-<a href=#2344 id=2344 data-nosnippet>2344</a> .contains(<span class="string">"UInt64 is not supported"</span>)
-<a href=#2345 id=2345 data-nosnippet>2345</a> );
-<a href=#2346 id=2346 data-nosnippet>2346</a> }
-<a href=#2347 id=2347 data-nosnippet>2347</a> }
-<a href=#2348 id=2348 data-nosnippet>2348</a>
-<a href=#2349 id=2349 data-nosnippet>2349</a> <span class="attr">#[test]
-<a href=#2350 id=2350 data-nosnippet>2350</a> </span><span class="kw">fn </span>test_datum_conversion() {
-<a href=#2351 id=2351 data-nosnippet>2351</a> {
-<a href=#2352 id=2352 data-nosnippet>2352</a> <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
-<a href=#2353 id=2353 data-nosnippet>2353</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2354 id=2354 data-nosnippet>2354</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2355 id=2355 data-nosnippet>2355</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<BooleanArray>().unwrap();
-<a href=#2356 id=2356 data-nosnippet>2356</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2357 id=2357 data-nosnippet>2357</a> <span class="macro">assert!</span>(array.value(<span class="number">0</span>));
+<a href=#2286 id=2286 data-nosnippet>2286</a> NestedField {
+<a href=#2287 id=2287 data-nosnippet>2287</a> id: <span class="number">2</span>,
+<a href=#2288 id=2288 data-nosnippet>2288</a> doc: <span class="prelude-val">None</span>,
+<a href=#2289 id=2289 data-nosnippet>2289</a> name: <span class="string">"b"</span>.to_string(),
+<a href=#2290 id=2290 data-nosnippet>2290</a> required: <span class="bool-val">false</span>,
+<a href=#2291 id=2291 data-nosnippet>2291</a> field_type: Box::new(Type::Primitive(PrimitiveType::String)),
+<a href=#2292 id=2292 data-nosnippet>2292</a> initial_default: <span class="prelude-val">None</span>,
+<a href=#2293 id=2293 data-nosnippet>2293</a> write_default: <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#2294 id=2294 data-nosnippet>2294</a> <span class="string">"514"</span>.to_string(),
+<a href=#2295 id=2295 data-nosnippet>2295</a> ))),
+<a href=#2296 id=2296 data-nosnippet>2296</a> }
+<a href=#2297 id=2297 data-nosnippet>2297</a> .into(),
+<a href=#2298 id=2298 data-nosnippet>2298</a> ]));
+<a href=#2299 id=2299 data-nosnippet>2299</a> <span class="macro">assert_eq!</span>(arrow_type, type_to_arrow_type(<span class="kw-2">&</span>iceberg_type).unwrap());
+<a href=#2300 id=2300 data-nosnippet>2300</a> }
+<a href=#2301 id=2301 data-nosnippet>2301</a>
+<a href=#2302 id=2302 data-nosnippet>2302</a> <span class="comment">// test dictionary type
+<a href=#2303 id=2303 data-nosnippet>2303</a> </span>{
+<a href=#2304 id=2304 data-nosnippet>2304</a> <span class="kw">let </span>arrow_type =
+<a href=#2305 id=2305 data-nosnippet>2305</a> DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Int8));
+<a href=#2306 id=2306 data-nosnippet>2306</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Int);
+<a href=#2307 id=2307 data-nosnippet>2307</a> <span class="macro">assert_eq!</span>(
+<a href=#2308 id=2308 data-nosnippet>2308</a> iceberg_type,
+<a href=#2309 id=2309 data-nosnippet>2309</a> arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap(),
+<a href=#2310 id=2310 data-nosnippet>2310</a> <span class="string">"Expected dictionary conversion to use the contained value"
+<a href=#2311 id=2311 data-nosnippet>2311</a> </span>);
+<a href=#2312 id=2312 data-nosnippet>2312</a>
+<a href=#2313 id=2313 data-nosnippet>2313</a> <span class="kw">let </span>arrow_type =
+<a href=#2314 id=2314 data-nosnippet>2314</a> DataType::Dictionary(Box::new(DataType::Utf8), Box::new(DataType::Boolean));
+<a href=#2315 id=2315 data-nosnippet>2315</a> <span class="kw">let </span>iceberg_type = Type::Primitive(PrimitiveType::Boolean);
+<a href=#2316 id=2316 data-nosnippet>2316</a> <span class="macro">assert_eq!</span>(iceberg_type, arrow_type_to_type(<span class="kw-2">&</span>arrow_type).unwrap());
+<a href=#2317 id=2317 data-nosnippet>2317</a> }
+<a href=#2318 id=2318 data-nosnippet>2318</a> }
+<a href=#2319 id=2319 data-nosnippet>2319</a>
+<a href=#2320 id=2320 data-nosnippet>2320</a> <span class="attr">#[test]
+<a href=#2321 id=2321 data-nosnippet>2321</a> </span><span class="kw">fn </span>test_unsigned_integer_type_conversion() {
+<a href=#2322 id=2322 data-nosnippet>2322</a> <span class="kw">let </span>test_cases = <span class="macro">vec!</span>[
+<a href=#2323 id=2323 data-nosnippet>2323</a> (DataType::UInt8, PrimitiveType::Int),
+<a href=#2324 id=2324 data-nosnippet>2324</a> (DataType::UInt16, PrimitiveType::Int),
+<a href=#2325 id=2325 data-nosnippet>2325</a> (DataType::UInt32, PrimitiveType::Long),
+<a href=#2326 id=2326 data-nosnippet>2326</a> ];
+<a href=#2327 id=2327 data-nosnippet>2327</a>
+<a href=#2328 id=2328 data-nosnippet>2328</a> <span class="kw">for </span>(arrow_type, expected_iceberg_type) <span class="kw">in </span>test_cases {
+<a href=#2329 id=2329 data-nosnippet>2329</a> <span class="kw">let </span>arrow_field = Field::new(<span class="string">"test"</span>, arrow_type.clone(), <span class="bool-val">false</span>).with_metadata(
+<a href=#2330 id=2330 data-nosnippet>2330</a> HashMap::from([(PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string())]),
+<a href=#2331 id=2331 data-nosnippet>2331</a> );
+<a href=#2332 id=2332 data-nosnippet>2332</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[arrow_field]);
+<a href=#2333 id=2333 data-nosnippet>2333</a>
+<a href=#2334 id=2334 data-nosnippet>2334</a> <span class="kw">let </span>iceberg_schema = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#2335 id=2335 data-nosnippet>2335</a> <span class="kw">let </span>iceberg_field = iceberg_schema.as_struct().fields().first().unwrap();
+<a href=#2336 id=2336 data-nosnippet>2336</a>
+<a href=#2337 id=2337 data-nosnippet>2337</a> <span class="macro">assert!</span>(
+<a href=#2338 id=2338 data-nosnippet>2338</a> <span class="macro">matches!</span>(iceberg_field.field_type.as_ref(), Type::Primitive(t) <span class="kw">if </span><span class="kw-2">*</span>t == expected_iceberg_type),
+<a href=#2339 id=2339 data-nosnippet>2339</a> <span class="string">"Expected {arrow_type:?} to map to {expected_iceberg_type:?}"
+<a href=#2340 id=2340 data-nosnippet>2340</a> </span>);
+<a href=#2341 id=2341 data-nosnippet>2341</a> }
+<a href=#2342 id=2342 data-nosnippet>2342</a>
+<a href=#2343 id=2343 data-nosnippet>2343</a> <span class="comment">// Test UInt64 blocking
+<a href=#2344 id=2344 data-nosnippet>2344</a> </span>{
+<a href=#2345 id=2345 data-nosnippet>2345</a> <span class="kw">let </span>arrow_field = Field::new(<span class="string">"test"</span>, DataType::UInt64, <span class="bool-val">false</span>).with_metadata(
+<a href=#2346 id=2346 data-nosnippet>2346</a> HashMap::from([(PARQUET_FIELD_ID_META_KEY.to_string(), <span class="string">"1"</span>.to_string())]),
+<a href=#2347 id=2347 data-nosnippet>2347</a> );
+<a href=#2348 id=2348 data-nosnippet>2348</a> <span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[arrow_field]);
+<a href=#2349 id=2349 data-nosnippet>2349</a>
+<a href=#2350 id=2350 data-nosnippet>2350</a> <span class="kw">let </span>result = arrow_schema_to_schema(<span class="kw-2">&</span>arrow_schema);
+<a href=#2351 id=2351 data-nosnippet>2351</a> <span class="macro">assert!</span>(result.is_err());
+<a href=#2352 id=2352 data-nosnippet>2352</a> <span class="macro">assert!</span>(
+<a href=#2353 id=2353 data-nosnippet>2353</a> result
+<a href=#2354 id=2354 data-nosnippet>2354</a> .unwrap_err()
+<a href=#2355 id=2355 data-nosnippet>2355</a> .to_string()
+<a href=#2356 id=2356 data-nosnippet>2356</a> .contains(<span class="string">"UInt64 is not supported"</span>)
+<a href=#2357 id=2357 data-nosnippet>2357</a> );
<a href=#2358 id=2358 data-nosnippet>2358</a> }
-<a href=#2359 id=2359 data-nosnippet>2359</a> {
-<a href=#2360 id=2360 data-nosnippet>2360</a> <span class="kw">let </span>datum = Datum::int(<span class="number">42</span>);
-<a href=#2361 id=2361 data-nosnippet>2361</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2362 id=2362 data-nosnippet>2362</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2363 id=2363 data-nosnippet>2363</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Int32Array>().unwrap();
-<a href=#2364 id=2364 data-nosnippet>2364</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2365 id=2365 data-nosnippet>2365</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
-<a href=#2366 id=2366 data-nosnippet>2366</a> }
-<a href=#2367 id=2367 data-nosnippet>2367</a> {
-<a href=#2368 id=2368 data-nosnippet>2368</a> <span class="kw">let </span>datum = Datum::long(<span class="number">42</span>);
-<a href=#2369 id=2369 data-nosnippet>2369</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2370 id=2370 data-nosnippet>2370</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2371 id=2371 data-nosnippet>2371</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Int64Array>().unwrap();
-<a href=#2372 id=2372 data-nosnippet>2372</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2373 id=2373 data-nosnippet>2373</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
-<a href=#2374 id=2374 data-nosnippet>2374</a> }
-<a href=#2375 id=2375 data-nosnippet>2375</a> {
-<a href=#2376 id=2376 data-nosnippet>2376</a> <span class="kw">let </span>datum = Datum::float(<span class="number">42.42_f32</span>);
-<a href=#2377 id=2377 data-nosnippet>2377</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2378 id=2378 data-nosnippet>2378</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2379 id=2379 data-nosnippet>2379</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Float32Array>().unwrap();
-<a href=#2380 id=2380 data-nosnippet>2380</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2381 id=2381 data-nosnippet>2381</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42.42</span>);
-<a href=#2382 id=2382 data-nosnippet>2382</a> }
-<a href=#2383 id=2383 data-nosnippet>2383</a> {
-<a href=#2384 id=2384 data-nosnippet>2384</a> <span class="kw">let </span>datum = Datum::double(<span class="number">42.42</span>);
-<a href=#2385 id=2385 data-nosnippet>2385</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2386 id=2386 data-nosnippet>2386</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2387 id=2387 data-nosnippet>2387</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Float64Array>().unwrap();
-<a href=#2388 id=2388 data-nosnippet>2388</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2389 id=2389 data-nosnippet>2389</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42.42</span>);
-<a href=#2390 id=2390 data-nosnippet>2390</a> }
-<a href=#2391 id=2391 data-nosnippet>2391</a> {
-<a href=#2392 id=2392 data-nosnippet>2392</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"abc"</span>);
-<a href=#2393 id=2393 data-nosnippet>2393</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2394 id=2394 data-nosnippet>2394</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2395 id=2395 data-nosnippet>2395</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<StringArray>().unwrap();
-<a href=#2396 id=2396 data-nosnippet>2396</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2397 id=2397 data-nosnippet>2397</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="string">"abc"</span>);
-<a href=#2398 id=2398 data-nosnippet>2398</a> }
-<a href=#2399 id=2399 data-nosnippet>2399</a> {
-<a href=#2400 id=2400 data-nosnippet>2400</a> <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]);
-<a href=#2401 id=2401 data-nosnippet>2401</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2402 id=2402 data-nosnippet>2402</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2403 id=2403 data-nosnippet>2403</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<BinaryArray>().unwrap();
-<a href=#2404 id=2404 data-nosnippet>2404</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2405 id=2405 data-nosnippet>2405</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]);
-<a href=#2406 id=2406 data-nosnippet>2406</a> }
-<a href=#2407 id=2407 data-nosnippet>2407</a> {
-<a href=#2408 id=2408 data-nosnippet>2408</a> <span class="kw">let </span>datum = Datum::date(<span class="number">42</span>);
-<a href=#2409 id=2409 data-nosnippet>2409</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2410 id=2410 data-nosnippet>2410</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2411 id=2411 data-nosnippet>2411</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Date32Array>().unwrap();
-<a href=#2412 id=2412 data-nosnippet>2412</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2413 id=2413 data-nosnippet>2413</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
-<a href=#2414 id=2414 data-nosnippet>2414</a> }
-<a href=#2415 id=2415 data-nosnippet>2415</a> {
-<a href=#2416 id=2416 data-nosnippet>2416</a> <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">42</span>);
-<a href=#2417 id=2417 data-nosnippet>2417</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2418 id=2418 data-nosnippet>2418</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2419 id=2419 data-nosnippet>2419</a> <span class="kw">let </span>array = array
-<a href=#2420 id=2420 data-nosnippet>2420</a> .as_any()
-<a href=#2421 id=2421 data-nosnippet>2421</a> .downcast_ref::<TimestampMicrosecondArray>()
-<a href=#2422 id=2422 data-nosnippet>2422</a> .unwrap();
-<a href=#2423 id=2423 data-nosnippet>2423</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2424 id=2424 data-nosnippet>2424</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
-<a href=#2425 id=2425 data-nosnippet>2425</a> }
-<a href=#2426 id=2426 data-nosnippet>2426</a> {
-<a href=#2427 id=2427 data-nosnippet>2427</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">42</span>);
-<a href=#2428 id=2428 data-nosnippet>2428</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2429 id=2429 data-nosnippet>2429</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2430 id=2430 data-nosnippet>2430</a> <span class="kw">let </span>array = array
-<a href=#2431 id=2431 data-nosnippet>2431</a> .as_any()
-<a href=#2432 id=2432 data-nosnippet>2432</a> .downcast_ref::<TimestampMicrosecondArray>()
-<a href=#2433 id=2433 data-nosnippet>2433</a> .unwrap();
-<a href=#2434 id=2434 data-nosnippet>2434</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2435 id=2435 data-nosnippet>2435</a> <span class="macro">assert_eq!</span>(array.timezone(), <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>));
+<a href=#2359 id=2359 data-nosnippet>2359</a> }
+<a href=#2360 id=2360 data-nosnippet>2360</a>
+<a href=#2361 id=2361 data-nosnippet>2361</a> <span class="attr">#[test]
+<a href=#2362 id=2362 data-nosnippet>2362</a> </span><span class="kw">fn </span>test_datum_conversion() {
+<a href=#2363 id=2363 data-nosnippet>2363</a> {
+<a href=#2364 id=2364 data-nosnippet>2364</a> <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
+<a href=#2365 id=2365 data-nosnippet>2365</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2366 id=2366 data-nosnippet>2366</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2367 id=2367 data-nosnippet>2367</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<BooleanArray>().unwrap();
+<a href=#2368 id=2368 data-nosnippet>2368</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2369 id=2369 data-nosnippet>2369</a> <span class="macro">assert!</span>(array.value(<span class="number">0</span>));
+<a href=#2370 id=2370 data-nosnippet>2370</a> }
+<a href=#2371 id=2371 data-nosnippet>2371</a> {
+<a href=#2372 id=2372 data-nosnippet>2372</a> <span class="kw">let </span>datum = Datum::int(<span class="number">42</span>);
+<a href=#2373 id=2373 data-nosnippet>2373</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2374 id=2374 data-nosnippet>2374</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2375 id=2375 data-nosnippet>2375</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Int32Array>().unwrap();
+<a href=#2376 id=2376 data-nosnippet>2376</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2377 id=2377 data-nosnippet>2377</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
+<a href=#2378 id=2378 data-nosnippet>2378</a> }
+<a href=#2379 id=2379 data-nosnippet>2379</a> {
+<a href=#2380 id=2380 data-nosnippet>2380</a> <span class="kw">let </span>datum = Datum::long(<span class="number">42</span>);
+<a href=#2381 id=2381 data-nosnippet>2381</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2382 id=2382 data-nosnippet>2382</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2383 id=2383 data-nosnippet>2383</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Int64Array>().unwrap();
+<a href=#2384 id=2384 data-nosnippet>2384</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2385 id=2385 data-nosnippet>2385</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
+<a href=#2386 id=2386 data-nosnippet>2386</a> }
+<a href=#2387 id=2387 data-nosnippet>2387</a> {
+<a href=#2388 id=2388 data-nosnippet>2388</a> <span class="kw">let </span>datum = Datum::float(<span class="number">42.42_f32</span>);
+<a href=#2389 id=2389 data-nosnippet>2389</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2390 id=2390 data-nosnippet>2390</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2391 id=2391 data-nosnippet>2391</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Float32Array>().unwrap();
+<a href=#2392 id=2392 data-nosnippet>2392</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2393 id=2393 data-nosnippet>2393</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42.42</span>);
+<a href=#2394 id=2394 data-nosnippet>2394</a> }
+<a href=#2395 id=2395 data-nosnippet>2395</a> {
+<a href=#2396 id=2396 data-nosnippet>2396</a> <span class="kw">let </span>datum = Datum::double(<span class="number">42.42</span>);
+<a href=#2397 id=2397 data-nosnippet>2397</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2398 id=2398 data-nosnippet>2398</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2399 id=2399 data-nosnippet>2399</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Float64Array>().unwrap();
+<a href=#2400 id=2400 data-nosnippet>2400</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2401 id=2401 data-nosnippet>2401</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42.42</span>);
+<a href=#2402 id=2402 data-nosnippet>2402</a> }
+<a href=#2403 id=2403 data-nosnippet>2403</a> {
+<a href=#2404 id=2404 data-nosnippet>2404</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"abc"</span>);
+<a href=#2405 id=2405 data-nosnippet>2405</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2406 id=2406 data-nosnippet>2406</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2407 id=2407 data-nosnippet>2407</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<StringArray>().unwrap();
+<a href=#2408 id=2408 data-nosnippet>2408</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2409 id=2409 data-nosnippet>2409</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="string">"abc"</span>);
+<a href=#2410 id=2410 data-nosnippet>2410</a> }
+<a href=#2411 id=2411 data-nosnippet>2411</a> {
+<a href=#2412 id=2412 data-nosnippet>2412</a> <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]);
+<a href=#2413 id=2413 data-nosnippet>2413</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2414 id=2414 data-nosnippet>2414</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2415 id=2415 data-nosnippet>2415</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<BinaryArray>().unwrap();
+<a href=#2416 id=2416 data-nosnippet>2416</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2417 id=2417 data-nosnippet>2417</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]);
+<a href=#2418 id=2418 data-nosnippet>2418</a> }
+<a href=#2419 id=2419 data-nosnippet>2419</a> {
+<a href=#2420 id=2420 data-nosnippet>2420</a> <span class="kw">let </span>datum = Datum::date(<span class="number">42</span>);
+<a href=#2421 id=2421 data-nosnippet>2421</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2422 id=2422 data-nosnippet>2422</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2423 id=2423 data-nosnippet>2423</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Date32Array>().unwrap();
+<a href=#2424 id=2424 data-nosnippet>2424</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2425 id=2425 data-nosnippet>2425</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
+<a href=#2426 id=2426 data-nosnippet>2426</a> }
+<a href=#2427 id=2427 data-nosnippet>2427</a> {
+<a href=#2428 id=2428 data-nosnippet>2428</a> <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">42</span>);
+<a href=#2429 id=2429 data-nosnippet>2429</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2430 id=2430 data-nosnippet>2430</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2431 id=2431 data-nosnippet>2431</a> <span class="kw">let </span>array = array
+<a href=#2432 id=2432 data-nosnippet>2432</a> .as_any()
+<a href=#2433 id=2433 data-nosnippet>2433</a> .downcast_ref::<TimestampMicrosecondArray>()
+<a href=#2434 id=2434 data-nosnippet>2434</a> .unwrap();
+<a href=#2435 id=2435 data-nosnippet>2435</a> <span class="macro">assert!</span>(is_scalar);
<a href=#2436 id=2436 data-nosnippet>2436</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
<a href=#2437 id=2437 data-nosnippet>2437</a> }
<a href=#2438 id=2438 data-nosnippet>2438</a> {
-<a href=#2439 id=2439 data-nosnippet>2439</a> <span class="kw">let </span>datum = Datum::decimal_with_precision(decimal_new(<span class="number">123</span>, <span class="number">2</span>), <span class="number">30</span>).unwrap();
+<a href=#2439 id=2439 data-nosnippet>2439</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">42</span>);
<a href=#2440 id=2440 data-nosnippet>2440</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
<a href=#2441 id=2441 data-nosnippet>2441</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2442 id=2442 data-nosnippet>2442</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Decimal128Array>().unwrap();
-<a href=#2443 id=2443 data-nosnippet>2443</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2444 id=2444 data-nosnippet>2444</a> <span class="macro">assert_eq!</span>(array.precision(), <span class="number">30</span>);
-<a href=#2445 id=2445 data-nosnippet>2445</a> <span class="macro">assert_eq!</span>(array.scale(), <span class="number">2</span>);
-<a href=#2446 id=2446 data-nosnippet>2446</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">123</span>);
-<a href=#2447 id=2447 data-nosnippet>2447</a> }
-<a href=#2448 id=2448 data-nosnippet>2448</a> {
-<a href=#2449 id=2449 data-nosnippet>2449</a> <span class="kw">let </span>datum = Datum::uuid_from_str(<span class="string">"42424242-4242-4242-4242-424242424242"</span>).unwrap();
-<a href=#2450 id=2450 data-nosnippet>2450</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2451 id=2451 data-nosnippet>2451</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2452 id=2452 data-nosnippet>2452</a> <span class="kw">let </span>array = array
-<a href=#2453 id=2453 data-nosnippet>2453</a> .as_any()
-<a href=#2454 id=2454 data-nosnippet>2454</a> .downcast_ref::<FixedSizeBinaryArray>()
-<a href=#2455 id=2455 data-nosnippet>2455</a> .unwrap();
-<a href=#2456 id=2456 data-nosnippet>2456</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2457 id=2457 data-nosnippet>2457</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), [<span class="number">66u8</span>; <span class="number">16</span>]);
-<a href=#2458 id=2458 data-nosnippet>2458</a> }
-<a href=#2459 id=2459 data-nosnippet>2459</a> {
-<a href=#2460 id=2460 data-nosnippet>2460</a> <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>]);
-<a href=#2461 id=2461 data-nosnippet>2461</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
-<a href=#2462 id=2462 data-nosnippet>2462</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
-<a href=#2463 id=2463 data-nosnippet>2463</a> <span class="kw">let </span>array = array
-<a href=#2464 id=2464 data-nosnippet>2464</a> .as_any()
-<a href=#2465 id=2465 data-nosnippet>2465</a> .downcast_ref::<FixedSizeBinaryArray>()
-<a href=#2466 id=2466 data-nosnippet>2466</a> .unwrap();
-<a href=#2467 id=2467 data-nosnippet>2467</a> <span class="macro">assert!</span>(is_scalar);
-<a href=#2468 id=2468 data-nosnippet>2468</a> <span class="macro">assert_eq!</span>(array.value_length(), <span class="number">8</span>);
-<a href=#2469 id=2469 data-nosnippet>2469</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="kw-2">&</span>[<span class="number">1u8</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>]);
+<a href=#2442 id=2442 data-nosnippet>2442</a> <span class="kw">let </span>array = array
+<a href=#2443 id=2443 data-nosnippet>2443</a> .as_any()
+<a href=#2444 id=2444 data-nosnippet>2444</a> .downcast_ref::<TimestampMicrosecondArray>()
+<a href=#2445 id=2445 data-nosnippet>2445</a> .unwrap();
+<a href=#2446 id=2446 data-nosnippet>2446</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2447 id=2447 data-nosnippet>2447</a> <span class="macro">assert_eq!</span>(array.timezone(), <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>));
+<a href=#2448 id=2448 data-nosnippet>2448</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">42</span>);
+<a href=#2449 id=2449 data-nosnippet>2449</a> }
+<a href=#2450 id=2450 data-nosnippet>2450</a> {
+<a href=#2451 id=2451 data-nosnippet>2451</a> <span class="kw">let </span>datum = Datum::decimal_with_precision(decimal_new(<span class="number">123</span>, <span class="number">2</span>), <span class="number">30</span>).unwrap();
+<a href=#2452 id=2452 data-nosnippet>2452</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2453 id=2453 data-nosnippet>2453</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2454 id=2454 data-nosnippet>2454</a> <span class="kw">let </span>array = array.as_any().downcast_ref::<Decimal128Array>().unwrap();
+<a href=#2455 id=2455 data-nosnippet>2455</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2456 id=2456 data-nosnippet>2456</a> <span class="macro">assert_eq!</span>(array.precision(), <span class="number">30</span>);
+<a href=#2457 id=2457 data-nosnippet>2457</a> <span class="macro">assert_eq!</span>(array.scale(), <span class="number">2</span>);
+<a href=#2458 id=2458 data-nosnippet>2458</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="number">123</span>);
+<a href=#2459 id=2459 data-nosnippet>2459</a> }
+<a href=#2460 id=2460 data-nosnippet>2460</a> {
+<a href=#2461 id=2461 data-nosnippet>2461</a> <span class="kw">let </span>datum = Datum::uuid_from_str(<span class="string">"42424242-4242-4242-4242-424242424242"</span>).unwrap();
+<a href=#2462 id=2462 data-nosnippet>2462</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2463 id=2463 data-nosnippet>2463</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2464 id=2464 data-nosnippet>2464</a> <span class="kw">let </span>array = array
+<a href=#2465 id=2465 data-nosnippet>2465</a> .as_any()
+<a href=#2466 id=2466 data-nosnippet>2466</a> .downcast_ref::<FixedSizeBinaryArray>()
+<a href=#2467 id=2467 data-nosnippet>2467</a> .unwrap();
+<a href=#2468 id=2468 data-nosnippet>2468</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2469 id=2469 data-nosnippet>2469</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), [<span class="number">66u8</span>; <span class="number">16</span>]);
<a href=#2470 id=2470 data-nosnippet>2470</a> }
-<a href=#2471 id=2471 data-nosnippet>2471</a> }
-<a href=#2472 id=2472 data-nosnippet>2472</a>
-<a href=#2473 id=2473 data-nosnippet>2473</a> <span class="attr">#[test]
-<a href=#2474 id=2474 data-nosnippet>2474</a> </span><span class="kw">fn </span>test_arrow_schema_to_schema_with_field_id() {
-<a href=#2475 id=2475 data-nosnippet>2475</a> <span class="comment">// Create a complex Arrow schema without field ID metadata
-<a href=#2476 id=2476 data-nosnippet>2476</a> // Including: primitives, list, nested struct, map, and nested list of structs
-<a href=#2477 id=2477 data-nosnippet>2477</a> </span><span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2478 id=2478 data-nosnippet>2478</a> Field::new(<span class="string">"id"</span>, DataType::Int64, <span class="bool-val">false</span>),
-<a href=#2479 id=2479 data-nosnippet>2479</a> Field::new(<span class="string">"name"</span>, DataType::Utf8, <span class="bool-val">true</span>),
-<a href=#2480 id=2480 data-nosnippet>2480</a> Field::new(<span class="string">"price"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>),
-<a href=#2481 id=2481 data-nosnippet>2481</a> Field::new(
-<a href=#2482 id=2482 data-nosnippet>2482</a> <span class="string">"created_at"</span>,
-<a href=#2483 id=2483 data-nosnippet>2483</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
-<a href=#2484 id=2484 data-nosnippet>2484</a> <span class="bool-val">true</span>,
-<a href=#2485 id=2485 data-nosnippet>2485</a> ),
-<a href=#2486 id=2486 data-nosnippet>2486</a> Field::new(
-<a href=#2487 id=2487 data-nosnippet>2487</a> <span class="string">"tags"</span>,
-<a href=#2488 id=2488 data-nosnippet>2488</a> DataType::List(Arc::new(Field::new(<span class="string">"item"</span>, DataType::Utf8, <span class="bool-val">true</span>))),
-<a href=#2489 id=2489 data-nosnippet>2489</a> <span class="bool-val">true</span>,
-<a href=#2490 id=2490 data-nosnippet>2490</a> ),
-<a href=#2491 id=2491 data-nosnippet>2491</a> Field::new(
-<a href=#2492 id=2492 data-nosnippet>2492</a> <span class="string">"address"</span>,
-<a href=#2493 id=2493 data-nosnippet>2493</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2494 id=2494 data-nosnippet>2494</a> Field::new(<span class="string">"street"</span>, DataType::Utf8, <span class="bool-val">true</span>),
-<a href=#2495 id=2495 data-nosnippet>2495</a> Field::new(<span class="string">"city"</span>, DataType::Utf8, <span class="bool-val">false</span>),
-<a href=#2496 id=2496 data-nosnippet>2496</a> Field::new(<span class="string">"zip"</span>, DataType::Int32, <span class="bool-val">true</span>),
-<a href=#2497 id=2497 data-nosnippet>2497</a> ])),
-<a href=#2498 id=2498 data-nosnippet>2498</a> <span class="bool-val">true</span>,
-<a href=#2499 id=2499 data-nosnippet>2499</a> ),
-<a href=#2500 id=2500 data-nosnippet>2500</a> Field::new(
-<a href=#2501 id=2501 data-nosnippet>2501</a> <span class="string">"attributes"</span>,
-<a href=#2502 id=2502 data-nosnippet>2502</a> DataType::Map(
-<a href=#2503 id=2503 data-nosnippet>2503</a> Arc::new(Field::new(
-<a href=#2504 id=2504 data-nosnippet>2504</a> DEFAULT_MAP_FIELD_NAME,
-<a href=#2505 id=2505 data-nosnippet>2505</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2506 id=2506 data-nosnippet>2506</a> Field::new(<span class="string">"key"</span>, DataType::Utf8, <span class="bool-val">false</span>),
-<a href=#2507 id=2507 data-nosnippet>2507</a> Field::new(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>),
-<a href=#2508 id=2508 data-nosnippet>2508</a> ])),
-<a href=#2509 id=2509 data-nosnippet>2509</a> <span class="bool-val">false</span>,
-<a href=#2510 id=2510 data-nosnippet>2510</a> )),
-<a href=#2511 id=2511 data-nosnippet>2511</a> <span class="bool-val">false</span>,
-<a href=#2512 id=2512 data-nosnippet>2512</a> ),
-<a href=#2513 id=2513 data-nosnippet>2513</a> <span class="bool-val">true</span>,
-<a href=#2514 id=2514 data-nosnippet>2514</a> ),
-<a href=#2515 id=2515 data-nosnippet>2515</a> Field::new(
-<a href=#2516 id=2516 data-nosnippet>2516</a> <span class="string">"orders"</span>,
-<a href=#2517 id=2517 data-nosnippet>2517</a> DataType::List(Arc::new(Field::new(
-<a href=#2518 id=2518 data-nosnippet>2518</a> <span class="string">"element"</span>,
-<a href=#2519 id=2519 data-nosnippet>2519</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2520 id=2520 data-nosnippet>2520</a> Field::new(<span class="string">"order_id"</span>, DataType::Int64, <span class="bool-val">false</span>),
-<a href=#2521 id=2521 data-nosnippet>2521</a> Field::new(<span class="string">"amount"</span>, DataType::Float64, <span class="bool-val">false</span>),
-<a href=#2522 id=2522 data-nosnippet>2522</a> ])),
-<a href=#2523 id=2523 data-nosnippet>2523</a> <span class="bool-val">true</span>,
-<a href=#2524 id=2524 data-nosnippet>2524</a> ))),
+<a href=#2471 id=2471 data-nosnippet>2471</a> {
+<a href=#2472 id=2472 data-nosnippet>2472</a> <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>]);
+<a href=#2473 id=2473 data-nosnippet>2473</a> <span class="kw">let </span>arrow_datum = get_arrow_datum(<span class="kw-2">&</span>datum).unwrap();
+<a href=#2474 id=2474 data-nosnippet>2474</a> <span class="kw">let </span>(array, is_scalar) = arrow_datum.get();
+<a href=#2475 id=2475 data-nosnippet>2475</a> <span class="kw">let </span>array = array
+<a href=#2476 id=2476 data-nosnippet>2476</a> .as_any()
+<a href=#2477 id=2477 data-nosnippet>2477</a> .downcast_ref::<FixedSizeBinaryArray>()
+<a href=#2478 id=2478 data-nosnippet>2478</a> .unwrap();
+<a href=#2479 id=2479 data-nosnippet>2479</a> <span class="macro">assert!</span>(is_scalar);
+<a href=#2480 id=2480 data-nosnippet>2480</a> <span class="macro">assert_eq!</span>(array.value_length(), <span class="number">8</span>);
+<a href=#2481 id=2481 data-nosnippet>2481</a> <span class="macro">assert_eq!</span>(array.value(<span class="number">0</span>), <span class="kw-2">&</span>[<span class="number">1u8</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>]);
+<a href=#2482 id=2482 data-nosnippet>2482</a> }
+<a href=#2483 id=2483 data-nosnippet>2483</a> }
+<a href=#2484 id=2484 data-nosnippet>2484</a>
+<a href=#2485 id=2485 data-nosnippet>2485</a> <span class="attr">#[test]
+<a href=#2486 id=2486 data-nosnippet>2486</a> </span><span class="kw">fn </span>test_arrow_schema_to_schema_with_field_id() {
+<a href=#2487 id=2487 data-nosnippet>2487</a> <span class="comment">// Create a complex Arrow schema without field ID metadata
+<a href=#2488 id=2488 data-nosnippet>2488</a> // Including: primitives, list, nested struct, map, and nested list of structs
+<a href=#2489 id=2489 data-nosnippet>2489</a> </span><span class="kw">let </span>arrow_schema = ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2490 id=2490 data-nosnippet>2490</a> Field::new(<span class="string">"id"</span>, DataType::Int64, <span class="bool-val">false</span>),
+<a href=#2491 id=2491 data-nosnippet>2491</a> Field::new(<span class="string">"name"</span>, DataType::Utf8, <span class="bool-val">true</span>),
+<a href=#2492 id=2492 data-nosnippet>2492</a> Field::new(<span class="string">"price"</span>, DataType::Decimal128(<span class="number">10</span>, <span class="number">2</span>), <span class="bool-val">false</span>),
+<a href=#2493 id=2493 data-nosnippet>2493</a> Field::new(
+<a href=#2494 id=2494 data-nosnippet>2494</a> <span class="string">"created_at"</span>,
+<a href=#2495 id=2495 data-nosnippet>2495</a> DataType::Timestamp(TimeUnit::Microsecond, <span class="prelude-val">Some</span>(<span class="string">"+00:00"</span>.into())),
+<a href=#2496 id=2496 data-nosnippet>2496</a> <span class="bool-val">true</span>,
+<a href=#2497 id=2497 data-nosnippet>2497</a> ),
+<a href=#2498 id=2498 data-nosnippet>2498</a> Field::new(
+<a href=#2499 id=2499 data-nosnippet>2499</a> <span class="string">"tags"</span>,
+<a href=#2500 id=2500 data-nosnippet>2500</a> DataType::List(Arc::new(Field::new(<span class="string">"item"</span>, DataType::Utf8, <span class="bool-val">true</span>))),
+<a href=#2501 id=2501 data-nosnippet>2501</a> <span class="bool-val">true</span>,
+<a href=#2502 id=2502 data-nosnippet>2502</a> ),
+<a href=#2503 id=2503 data-nosnippet>2503</a> Field::new(
+<a href=#2504 id=2504 data-nosnippet>2504</a> <span class="string">"address"</span>,
+<a href=#2505 id=2505 data-nosnippet>2505</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2506 id=2506 data-nosnippet>2506</a> Field::new(<span class="string">"street"</span>, DataType::Utf8, <span class="bool-val">true</span>),
+<a href=#2507 id=2507 data-nosnippet>2507</a> Field::new(<span class="string">"city"</span>, DataType::Utf8, <span class="bool-val">false</span>),
+<a href=#2508 id=2508 data-nosnippet>2508</a> Field::new(<span class="string">"zip"</span>, DataType::Int32, <span class="bool-val">true</span>),
+<a href=#2509 id=2509 data-nosnippet>2509</a> ])),
+<a href=#2510 id=2510 data-nosnippet>2510</a> <span class="bool-val">true</span>,
+<a href=#2511 id=2511 data-nosnippet>2511</a> ),
+<a href=#2512 id=2512 data-nosnippet>2512</a> Field::new(
+<a href=#2513 id=2513 data-nosnippet>2513</a> <span class="string">"attributes"</span>,
+<a href=#2514 id=2514 data-nosnippet>2514</a> DataType::Map(
+<a href=#2515 id=2515 data-nosnippet>2515</a> Arc::new(Field::new(
+<a href=#2516 id=2516 data-nosnippet>2516</a> DEFAULT_MAP_FIELD_NAME,
+<a href=#2517 id=2517 data-nosnippet>2517</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2518 id=2518 data-nosnippet>2518</a> Field::new(<span class="string">"key"</span>, DataType::Utf8, <span class="bool-val">false</span>),
+<a href=#2519 id=2519 data-nosnippet>2519</a> Field::new(<span class="string">"value"</span>, DataType::Utf8, <span class="bool-val">true</span>),
+<a href=#2520 id=2520 data-nosnippet>2520</a> ])),
+<a href=#2521 id=2521 data-nosnippet>2521</a> <span class="bool-val">false</span>,
+<a href=#2522 id=2522 data-nosnippet>2522</a> )),
+<a href=#2523 id=2523 data-nosnippet>2523</a> <span class="bool-val">false</span>,
+<a href=#2524 id=2524 data-nosnippet>2524</a> ),
<a href=#2525 id=2525 data-nosnippet>2525</a> <span class="bool-val">true</span>,
<a href=#2526 id=2526 data-nosnippet>2526</a> ),
-<a href=#2527 id=2527 data-nosnippet>2527</a> ]);
-<a href=#2528 id=2528 data-nosnippet>2528</a>
-<a href=#2529 id=2529 data-nosnippet>2529</a> <span class="kw">let </span>schema = arrow_schema_to_schema_auto_assign_ids(<span class="kw-2">&</span>arrow_schema).unwrap();
-<a href=#2530 id=2530 data-nosnippet>2530</a>
-<a href=#2531 id=2531 data-nosnippet>2531</a> <span class="comment">// Build expected schema with exact field IDs following level-order assignment:
-<a href=#2532 id=2532 data-nosnippet>2532</a> // Level 0: id=1, name=2, price=3, created_at=4, tags=5, address=6, attributes=7, orders=8
-<a href=#2533 id=2533 data-nosnippet>2533</a> // Level 1: tags.element=9, address.{street=10,city=11,zip=12}, attributes.{key=13,value=14}, orders.element=15
-<a href=#2534 id=2534 data-nosnippet>2534</a> // Level 2: orders.element.{order_id=16,amount=17}
-<a href=#2535 id=2535 data-nosnippet>2535</a> </span><span class="kw">let </span>expected = Schema::builder()
-<a href=#2536 id=2536 data-nosnippet>2536</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2537 id=2537 data-nosnippet>2537</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Long)).into(),
-<a href=#2538 id=2538 data-nosnippet>2538</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#2539 id=2539 data-nosnippet>2539</a> NestedField::required(
-<a href=#2540 id=2540 data-nosnippet>2540</a> <span class="number">3</span>,
-<a href=#2541 id=2541 data-nosnippet>2541</a> <span class="string">"price"</span>,
-<a href=#2542 id=2542 data-nosnippet>2542</a> Type::Primitive(PrimitiveType::Decimal {
-<a href=#2543 id=2543 data-nosnippet>2543</a> precision: <span class="number">10</span>,
-<a href=#2544 id=2544 data-nosnippet>2544</a> scale: <span class="number">2</span>,
-<a href=#2545 id=2545 data-nosnippet>2545</a> }),
-<a href=#2546 id=2546 data-nosnippet>2546</a> )
-<a href=#2547 id=2547 data-nosnippet>2547</a> .into(),
-<a href=#2548 id=2548 data-nosnippet>2548</a> NestedField::optional(<span class="number">4</span>, <span class="string">"created_at"</span>, Type::Primitive(PrimitiveType::Timestamptz))
-<a href=#2549 id=2549 data-nosnippet>2549</a> .into(),
-<a href=#2550 id=2550 data-nosnippet>2550</a> NestedField::optional(
-<a href=#2551 id=2551 data-nosnippet>2551</a> <span class="number">5</span>,
-<a href=#2552 id=2552 data-nosnippet>2552</a> <span class="string">"tags"</span>,
-<a href=#2553 id=2553 data-nosnippet>2553</a> Type::List(ListType {
-<a href=#2554 id=2554 data-nosnippet>2554</a> element_field: NestedField::list_element(
-<a href=#2555 id=2555 data-nosnippet>2555</a> <span class="number">9</span>,
-<a href=#2556 id=2556 data-nosnippet>2556</a> Type::Primitive(PrimitiveType::String),
-<a href=#2557 id=2557 data-nosnippet>2557</a> <span class="bool-val">false</span>,
-<a href=#2558 id=2558 data-nosnippet>2558</a> )
-<a href=#2559 id=2559 data-nosnippet>2559</a> .into(),
-<a href=#2560 id=2560 data-nosnippet>2560</a> }),
-<a href=#2561 id=2561 data-nosnippet>2561</a> )
-<a href=#2562 id=2562 data-nosnippet>2562</a> .into(),
-<a href=#2563 id=2563 data-nosnippet>2563</a> NestedField::optional(
-<a href=#2564 id=2564 data-nosnippet>2564</a> <span class="number">6</span>,
-<a href=#2565 id=2565 data-nosnippet>2565</a> <span class="string">"address"</span>,
-<a href=#2566 id=2566 data-nosnippet>2566</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#2567 id=2567 data-nosnippet>2567</a> NestedField::optional(<span class="number">10</span>, <span class="string">"street"</span>, Type::Primitive(PrimitiveType::String))
-<a href=#2568 id=2568 data-nosnippet>2568</a> .into(),
-<a href=#2569 id=2569 data-nosnippet>2569</a> NestedField::required(<span class="number">11</span>, <span class="string">"city"</span>, Type::Primitive(PrimitiveType::String))
-<a href=#2570 id=2570 data-nosnippet>2570</a> .into(),
-<a href=#2571 id=2571 data-nosnippet>2571</a> NestedField::optional(<span class="number">12</span>, <span class="string">"zip"</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#2572 id=2572 data-nosnippet>2572</a> .into(),
-<a href=#2573 id=2573 data-nosnippet>2573</a> ])),
-<a href=#2574 id=2574 data-nosnippet>2574</a> )
-<a href=#2575 id=2575 data-nosnippet>2575</a> .into(),
-<a href=#2576 id=2576 data-nosnippet>2576</a> NestedField::optional(
-<a href=#2577 id=2577 data-nosnippet>2577</a> <span class="number">7</span>,
-<a href=#2578 id=2578 data-nosnippet>2578</a> <span class="string">"attributes"</span>,
-<a href=#2579 id=2579 data-nosnippet>2579</a> Type::Map(MapType {
-<a href=#2580 id=2580 data-nosnippet>2580</a> key_field: NestedField::map_key_element(
-<a href=#2581 id=2581 data-nosnippet>2581</a> <span class="number">13</span>,
-<a href=#2582 id=2582 data-nosnippet>2582</a> Type::Primitive(PrimitiveType::String),
-<a href=#2583 id=2583 data-nosnippet>2583</a> )
-<a href=#2584 id=2584 data-nosnippet>2584</a> .into(),
-<a href=#2585 id=2585 data-nosnippet>2585</a> value_field: NestedField::map_value_element(
-<a href=#2586 id=2586 data-nosnippet>2586</a> <span class="number">14</span>,
-<a href=#2587 id=2587 data-nosnippet>2587</a> Type::Primitive(PrimitiveType::String),
-<a href=#2588 id=2588 data-nosnippet>2588</a> <span class="bool-val">false</span>,
-<a href=#2589 id=2589 data-nosnippet>2589</a> )
-<a href=#2590 id=2590 data-nosnippet>2590</a> .into(),
-<a href=#2591 id=2591 data-nosnippet>2591</a> }),
-<a href=#2592 id=2592 data-nosnippet>2592</a> )
-<a href=#2593 id=2593 data-nosnippet>2593</a> .into(),
-<a href=#2594 id=2594 data-nosnippet>2594</a> NestedField::optional(
-<a href=#2595 id=2595 data-nosnippet>2595</a> <span class="number">8</span>,
-<a href=#2596 id=2596 data-nosnippet>2596</a> <span class="string">"orders"</span>,
-<a href=#2597 id=2597 data-nosnippet>2597</a> Type::List(ListType {
-<a href=#2598 id=2598 data-nosnippet>2598</a> element_field: NestedField::list_element(
-<a href=#2599 id=2599 data-nosnippet>2599</a> <span class="number">15</span>,
-<a href=#2600 id=2600 data-nosnippet>2600</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#2601 id=2601 data-nosnippet>2601</a> NestedField::required(
-<a href=#2602 id=2602 data-nosnippet>2602</a> <span class="number">16</span>,
-<a href=#2603 id=2603 data-nosnippet>2603</a> <span class="string">"order_id"</span>,
-<a href=#2604 id=2604 data-nosnippet>2604</a> Type::Primitive(PrimitiveType::Long),
-<a href=#2605 id=2605 data-nosnippet>2605</a> )
-<a href=#2606 id=2606 data-nosnippet>2606</a> .into(),
-<a href=#2607 id=2607 data-nosnippet>2607</a> NestedField::required(
-<a href=#2608 id=2608 data-nosnippet>2608</a> <span class="number">17</span>,
-<a href=#2609 id=2609 data-nosnippet>2609</a> <span class="string">"amount"</span>,
-<a href=#2610 id=2610 data-nosnippet>2610</a> Type::Primitive(PrimitiveType::Double),
-<a href=#2611 id=2611 data-nosnippet>2611</a> )
-<a href=#2612 id=2612 data-nosnippet>2612</a> .into(),
-<a href=#2613 id=2613 data-nosnippet>2613</a> ])),
-<a href=#2614 id=2614 data-nosnippet>2614</a> <span class="bool-val">false</span>,
-<a href=#2615 id=2615 data-nosnippet>2615</a> )
-<a href=#2616 id=2616 data-nosnippet>2616</a> .into(),
-<a href=#2617 id=2617 data-nosnippet>2617</a> }),
-<a href=#2618 id=2618 data-nosnippet>2618</a> )
-<a href=#2619 id=2619 data-nosnippet>2619</a> .into(),
-<a href=#2620 id=2620 data-nosnippet>2620</a> ])
-<a href=#2621 id=2621 data-nosnippet>2621</a> .build()
-<a href=#2622 id=2622 data-nosnippet>2622</a> .unwrap();
-<a href=#2623 id=2623 data-nosnippet>2623</a>
-<a href=#2624 id=2624 data-nosnippet>2624</a> <span class="macro">pretty_assertions::assert_eq!</span>(schema, expected);
-<a href=#2625 id=2625 data-nosnippet>2625</a> <span class="macro">assert_eq!</span>(schema.highest_field_id(), <span class="number">17</span>);
-<a href=#2626 id=2626 data-nosnippet>2626</a> }
-<a href=#2627 id=2627 data-nosnippet>2627</a>
-<a href=#2628 id=2628 data-nosnippet>2628</a> <span class="doccomment">/// Every field is rebuilt without metadata, at any depth and inside any
-<a href=#2629 id=2629 data-nosnippet>2629</a> /// container. Fields are rebuilt in nesting order rather than looked up by
-<a href=#2630 id=2630 data-nosnippet>2630</a> /// name, so a path that repeats names (`a.b.a.b`) keeps each level's name
-<a href=#2631 id=2631 data-nosnippet>2631</a> /// and nullability.
-<a href=#2632 id=2632 data-nosnippet>2632</a> </span><span class="attr">#[test]
-<a href=#2633 id=2633 data-nosnippet>2633</a> </span><span class="kw">fn </span>test_strip_metadata_from_nested_schema() {
-<a href=#2634 id=2634 data-nosnippet>2634</a> <span class="comment">// The same schema, built with and without metadata on the schema and every field.
-<a href=#2635 id=2635 data-nosnippet>2635</a> </span><span class="kw">let </span>schema = |with_metadata: bool| {
-<a href=#2636 id=2636 data-nosnippet>2636</a> <span class="kw">let </span>metadata = |value: <span class="kw-2">&</span>str| {
-<a href=#2637 id=2637 data-nosnippet>2637</a> <span class="kw">if </span>with_metadata {
-<a href=#2638 id=2638 data-nosnippet>2638</a> HashMap::from([(<span class="string">"k"</span>.to_string(), value.to_string())])
-<a href=#2639 id=2639 data-nosnippet>2639</a> } <span class="kw">else </span>{
-<a href=#2640 id=2640 data-nosnippet>2640</a> HashMap::new()
-<a href=#2641 id=2641 data-nosnippet>2641</a> }
-<a href=#2642 id=2642 data-nosnippet>2642</a> };
-<a href=#2643 id=2643 data-nosnippet>2643</a> <span class="kw">let </span>field = |name: <span class="kw-2">&</span>str, ty: DataType, nullable: bool| {
-<a href=#2644 id=2644 data-nosnippet>2644</a> Field::new(name, ty, nullable).with_metadata(metadata(name))
-<a href=#2645 id=2645 data-nosnippet>2645</a> };
-<a href=#2646 id=2646 data-nosnippet>2646</a> <span class="kw">let </span>element = |ty: DataType| Arc::new(field(LIST_FIELD_NAME, ty, <span class="bool-val">false</span>));
-<a href=#2647 id=2647 data-nosnippet>2647</a> <span class="kw">let </span>ints = || DataType::List(element(DataType::Int32));
-<a href=#2648 id=2648 data-nosnippet>2648</a> <span class="kw">let </span>map = |value: DataType, sorted: bool| {
-<a href=#2649 id=2649 data-nosnippet>2649</a> <span class="kw">let </span>entries = Fields::from(<span class="macro">vec!</span>[
-<a href=#2650 id=2650 data-nosnippet>2650</a> field(MAP_KEY_FIELD_NAME, DataType::Utf8, <span class="bool-val">false</span>),
-<a href=#2651 id=2651 data-nosnippet>2651</a> field(MAP_VALUE_FIELD_NAME, value, <span class="bool-val">true</span>),
-<a href=#2652 id=2652 data-nosnippet>2652</a> ]);
-<a href=#2653 id=2653 data-nosnippet>2653</a> <span class="kw">let </span>entries = field(DEFAULT_MAP_FIELD_NAME, DataType::Struct(entries), <span class="bool-val">false</span>);
-<a href=#2654 id=2654 data-nosnippet>2654</a> DataType::Map(Arc::new(entries), sorted)
-<a href=#2655 id=2655 data-nosnippet>2655</a> };
-<a href=#2656 id=2656 data-nosnippet>2656</a> <span class="kw">let </span>struct_of = |fields: Vec<Field>| DataType::Struct(Fields::from(fields));
-<a href=#2657 id=2657 data-nosnippet>2657</a>
-<a href=#2658 id=2658 data-nosnippet>2658</a> <span class="kw">let </span>a_b_a_b = struct_of(<span class="macro">vec!</span>[field(
-<a href=#2659 id=2659 data-nosnippet>2659</a> <span class="string">"b"</span>,
-<a href=#2660 id=2660 data-nosnippet>2660</a> struct_of(<span class="macro">vec!</span>[field(
-<a href=#2661 id=2661 data-nosnippet>2661</a> <span class="string">"a"</span>,
-<a href=#2662 id=2662 data-nosnippet>2662</a> struct_of(<span class="macro">vec!</span>[field(<span class="string">"b"</span>, DataType::Int32, <span class="bool-val">true</span>)]),
-<a href=#2663 id=2663 data-nosnippet>2663</a> <span class="bool-val">false</span>,
-<a href=#2664 id=2664 data-nosnippet>2664</a> )]),
-<a href=#2665 id=2665 data-nosnippet>2665</a> <span class="bool-val">false</span>,
-<a href=#2666 id=2666 data-nosnippet>2666</a> )]);
-<a href=#2667 id=2667 data-nosnippet>2667</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2668 id=2668 data-nosnippet>2668</a> field(<span class="string">"list"</span>, ints(), <span class="bool-val">true</span>),
-<a href=#2669 id=2669 data-nosnippet>2669</a> field(
-<a href=#2670 id=2670 data-nosnippet>2670</a> <span class="string">"large_list"</span>,
-<a href=#2671 id=2671 data-nosnippet>2671</a> DataType::LargeList(element(DataType::Int32)),
-<a href=#2672 id=2672 data-nosnippet>2672</a> <span class="bool-val">false</span>,
-<a href=#2673 id=2673 data-nosnippet>2673</a> ),
-<a href=#2674 id=2674 data-nosnippet>2674</a> field(
-<a href=#2675 id=2675 data-nosnippet>2675</a> <span class="string">"fixed_list"</span>,
-<a href=#2676 id=2676 data-nosnippet>2676</a> DataType::FixedSizeList(element(DataType::Int32), <span class="number">2</span>),
-<a href=#2677 id=2677 data-nosnippet>2677</a> <span class="bool-val">true</span>,
-<a href=#2678 id=2678 data-nosnippet>2678</a> ),
-<a href=#2679 id=2679 data-nosnippet>2679</a> field(<span class="string">"list_of_list"</span>, DataType::List(element(ints())), <span class="bool-val">false</span>),
-<a href=#2680 id=2680 data-nosnippet>2680</a> field(<span class="string">"sorted_map"</span>, map(ints(), <span class="bool-val">true</span>), <span class="bool-val">false</span>),
-<a href=#2681 id=2681 data-nosnippet>2681</a> field(
-<a href=#2682 id=2682 data-nosnippet>2682</a> <span class="string">"map_of_struct"</span>,
-<a href=#2683 id=2683 data-nosnippet>2683</a> map(
-<a href=#2684 id=2684 data-nosnippet>2684</a> struct_of(<span class="macro">vec!</span>[
-<a href=#2685 id=2685 data-nosnippet>2685</a> field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">true</span>),
-<a href=#2686 id=2686 data-nosnippet>2686</a> field(<span class="string">"b"</span>, ints(), <span class="bool-val">false</span>),
-<a href=#2687 id=2687 data-nosnippet>2687</a> ]),
-<a href=#2688 id=2688 data-nosnippet>2688</a> <span class="bool-val">false</span>,
-<a href=#2689 id=2689 data-nosnippet>2689</a> ),
-<a href=#2690 id=2690 data-nosnippet>2690</a> <span class="bool-val">true</span>,
-<a href=#2691 id=2691 data-nosnippet>2691</a> ),
-<a href=#2692 id=2692 data-nosnippet>2692</a> field(
-<a href=#2693 id=2693 data-nosnippet>2693</a> <span class="string">"list_of_struct"</span>,
-<a href=#2694 id=2694 data-nosnippet>2694</a> DataType::List(element(struct_of(<span class="macro">vec!</span>[field(
-<a href=#2695 id=2695 data-nosnippet>2695</a> <span class="string">"m"</span>,
-<a href=#2696 id=2696 data-nosnippet>2696</a> map(ints(), <span class="bool-val">false</span>),
-<a href=#2697 id=2697 data-nosnippet>2697</a> <span class="bool-val">true</span>,
-<a href=#2698 id=2698 data-nosnippet>2698</a> )]))),
-<a href=#2699 id=2699 data-nosnippet>2699</a> <span class="bool-val">true</span>,
-<a href=#2700 id=2700 data-nosnippet>2700</a> ),
-<a href=#2701 id=2701 data-nosnippet>2701</a> field(<span class="string">"a"</span>, a_b_a_b, <span class="bool-val">true</span>),
-<a href=#2702 id=2702 data-nosnippet>2702</a> ])
-<a href=#2703 id=2703 data-nosnippet>2703</a> .with_metadata(metadata(<span class="string">"schema"</span>))
-<a href=#2704 id=2704 data-nosnippet>2704</a> };
-<a href=#2705 id=2705 data-nosnippet>2705</a>
-<a href=#2706 id=2706 data-nosnippet>2706</a> <span class="kw">let </span>(input, expected) = (schema(<span class="bool-val">true</span>), schema(<span class="bool-val">false</span>));
-<a href=#2707 id=2707 data-nosnippet>2707</a> <span class="comment">// Otherwise a builder that stopped adding metadata would pass trivially.
-<a href=#2708 id=2708 data-nosnippet>2708</a> </span><span class="macro">assert_ne!</span>(input, expected);
-<a href=#2709 id=2709 data-nosnippet>2709</a> <span class="macro">pretty_assertions::assert_eq!</span>(strip_metadata_from_schema(<span class="kw-2">&</span>input).unwrap(), expected);
-<a href=#2710 id=2710 data-nosnippet>2710</a> }
-<a href=#2711 id=2711 data-nosnippet>2711</a>
-<a href=#2712 id=2712 data-nosnippet>2712</a> <span class="doccomment">/// arrow-rs names a list's element `item`, and an arrow-rs `MapBuilder` names
-<a href=#2713 id=2713 data-nosnippet>2713</a> /// a map's fields `entries`, `keys` and `values`. Once stripped, a schema
-<a href=#2714 id=2714 data-nosnippet>2714</a> /// using those names, with a nullable map key, compares equal to the same
-<a href=#2715 id=2715 data-nosnippet>2715</a> /// schema from `schema_to_arrow_schema`.
-<a href=#2716 id=2716 data-nosnippet>2716</a> </span><span class="attr">#[test]
-<a href=#2717 id=2717 data-nosnippet>2717</a> </span><span class="kw">fn </span>test_strip_metadata_normalizes_container_field_names() {
-<a href=#2718 id=2718 data-nosnippet>2718</a> <span class="comment">// A list of ints and a map from string to a list of ints, with the given
-<a href=#2719 id=2719 data-nosnippet>2719</a> // names for the list elements and the map's entries, key and value.
-<a href=#2720 id=2720 data-nosnippet>2720</a> </span><span class="kw">let </span>schema = |[element, entries, key, value]: [<span class="kw-2">&</span>str; <span class="number">4</span>], key_nullable: bool| {
-<a href=#2721 id=2721 data-nosnippet>2721</a> <span class="kw">let </span>ints =
-<a href=#2722 id=2722 data-nosnippet>2722</a> |nullable| DataType::List(Arc::new(Field::new(element, DataType::Int32, nullable)));
-<a href=#2723 id=2723 data-nosnippet>2723</a> <span class="kw">let </span>key_value = Fields::from(<span class="macro">vec!</span>[
-<a href=#2724 id=2724 data-nosnippet>2724</a> Field::new(key, DataType::Utf8, key_nullable),
-<a href=#2725 id=2725 data-nosnippet>2725</a> Field::new(value, ints(<span class="bool-val">false</span>), <span class="bool-val">true</span>),
-<a href=#2726 id=2726 data-nosnippet>2726</a> ]);
-<a href=#2727 id=2727 data-nosnippet>2727</a> <span class="kw">let </span>entries = Field::new(entries, DataType::Struct(key_value), <span class="bool-val">false</span>);
-<a href=#2728 id=2728 data-nosnippet>2728</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2729 id=2729 data-nosnippet>2729</a> Field::new(<span class="string">"l"</span>, ints(<span class="bool-val">true</span>), <span class="bool-val">true</span>),
-<a href=#2730 id=2730 data-nosnippet>2730</a> Field::new(<span class="string">"m"</span>, DataType::Map(Arc::new(entries), <span class="bool-val">false</span>), <span class="bool-val">true</span>),
-<a href=#2731 id=2731 data-nosnippet>2731</a> ])
-<a href=#2732 id=2732 data-nosnippet>2732</a> };
-<a href=#2733 id=2733 data-nosnippet>2733</a> <span class="kw">let </span>arrow_rs = schema([<span class="string">"item"</span>, <span class="string">"entries"</span>, <span class="string">"keys"</span>, <span class="string">"values"</span>], <span class="bool-val">true</span>);
-<a href=#2734 id=2734 data-nosnippet>2734</a> <span class="kw">let </span>expected = schema(
-<a href=#2735 id=2735 data-nosnippet>2735</a> [
-<a href=#2736 id=2736 data-nosnippet>2736</a> LIST_FIELD_NAME,
-<a href=#2737 id=2737 data-nosnippet>2737</a> DEFAULT_MAP_FIELD_NAME,
-<a href=#2738 id=2738 data-nosnippet>2738</a> MAP_KEY_FIELD_NAME,
-<a href=#2739 id=2739 data-nosnippet>2739</a> MAP_VALUE_FIELD_NAME,
-<a href=#2740 id=2740 data-nosnippet>2740</a> ],
-<a href=#2741 id=2741 data-nosnippet>2741</a> <span class="bool-val">false</span>,
-<a href=#2742 id=2742 data-nosnippet>2742</a> );
-<a href=#2743 id=2743 data-nosnippet>2743</a>
-<a href=#2744 id=2744 data-nosnippet>2744</a> <span class="comment">// The same schema as an Iceberg table's.
-<a href=#2745 id=2745 data-nosnippet>2745</a> </span><span class="kw">let </span>int_list = |id, required| {
-<a href=#2746 id=2746 data-nosnippet>2746</a> <span class="kw">let </span>int = Type::Primitive(PrimitiveType::Int);
-<a href=#2747 id=2747 data-nosnippet>2747</a> Type::List(ListType::new(
-<a href=#2748 id=2748 data-nosnippet>2748</a> NestedField::list_element(id, int, required).into(),
-<a href=#2749 id=2749 data-nosnippet>2749</a> ))
-<a href=#2750 id=2750 data-nosnippet>2750</a> };
-<a href=#2751 id=2751 data-nosnippet>2751</a> <span class="kw">let </span>string_to_int_list = MapType::new(
-<a href=#2752 id=2752 data-nosnippet>2752</a> NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#2753 id=2753 data-nosnippet>2753</a> NestedField::map_value_element(<span class="number">5</span>, int_list(<span class="number">6</span>, <span class="bool-val">true</span>), <span class="bool-val">false</span>).into(),
-<a href=#2754 id=2754 data-nosnippet>2754</a> );
-<a href=#2755 id=2755 data-nosnippet>2755</a> <span class="kw">let </span>iceberg = Schema::builder()
-<a href=#2756 id=2756 data-nosnippet>2756</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2757 id=2757 data-nosnippet>2757</a> NestedField::optional(<span class="number">1</span>, <span class="string">"l"</span>, int_list(<span class="number">2</span>, <span class="bool-val">false</span>)).into(),
-<a href=#2758 id=2758 data-nosnippet>2758</a> NestedField::optional(<span class="number">3</span>, <span class="string">"m"</span>, Type::Map(string_to_int_list)).into(),
-<a href=#2759 id=2759 data-nosnippet>2759</a> ])
-<a href=#2760 id=2760 data-nosnippet>2760</a> .build()
-<a href=#2761 id=2761 data-nosnippet>2761</a> .unwrap();
-<a href=#2762 id=2762 data-nosnippet>2762</a>
-<a href=#2763 id=2763 data-nosnippet>2763</a> <span class="macro">pretty_assertions::assert_eq!</span>(strip_metadata_from_schema(<span class="kw-2">&</span>arrow_rs).unwrap(), expected);
-<a href=#2764 id=2764 data-nosnippet>2764</a> <span class="macro">pretty_assertions::assert_eq!</span>(
-<a href=#2765 id=2765 data-nosnippet>2765</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema_to_arrow_schema(<span class="kw-2">&</span>iceberg).unwrap()).unwrap(),
-<a href=#2766 id=2766 data-nosnippet>2766</a> expected
-<a href=#2767 id=2767 data-nosnippet>2767</a> );
-<a href=#2768 id=2768 data-nosnippet>2768</a> }
-<a href=#2769 id=2769 data-nosnippet>2769</a>
-<a href=#2770 id=2770 data-nosnippet>2770</a> <span class="doccomment">/// Names and nullability that `schema_to_arrow_schema` doesn't fix, such as a
-<a href=#2771 id=2771 data-nosnippet>2771</a> /// struct field's name or a list element's nullability, still tell schemas apart.
-<a href=#2772 id=2772 data-nosnippet>2772</a> </span><span class="attr">#[test]
-<a href=#2773 id=2773 data-nosnippet>2773</a> </span><span class="kw">fn </span>test_strip_metadata_keeps_other_differences() {
-<a href=#2774 id=2774 data-nosnippet>2774</a> <span class="kw">let </span>schema = |child: <span class="kw-2">&</span>str, element_nullable: bool| {
-<a href=#2775 id=2775 data-nosnippet>2775</a> <span class="kw">let </span>child = Field::new(child, DataType::Int32, <span class="bool-val">true</span>);
-<a href=#2776 id=2776 data-nosnippet>2776</a> <span class="kw">let </span>element = Field::new(<span class="string">"item"</span>, DataType::Int32, element_nullable);
-<a href=#2777 id=2777 data-nosnippet>2777</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2778 id=2778 data-nosnippet>2778</a> Field::new(<span class="string">"s"</span>, DataType::Struct(Fields::from(<span class="macro">vec!</span>[child])), <span class="bool-val">true</span>),
-<a href=#2779 id=2779 data-nosnippet>2779</a> Field::new(<span class="string">"l"</span>, DataType::List(Arc::new(element)), <span class="bool-val">true</span>),
-<a href=#2780 id=2780 data-nosnippet>2780</a> ])
-<a href=#2781 id=2781 data-nosnippet>2781</a> };
-<a href=#2782 id=2782 data-nosnippet>2782</a> <span class="kw">let </span>strip = |schema: ArrowSchema| strip_metadata_from_schema(<span class="kw-2">&</span>schema).unwrap();
-<a href=#2783 id=2783 data-nosnippet>2783</a>
-<a href=#2784 id=2784 data-nosnippet>2784</a> <span class="macro">assert_ne!</span>(strip(schema(<span class="string">"a"</span>, <span class="bool-val">true</span>)), strip(schema(<span class="string">"b"</span>, <span class="bool-val">true</span>)));
-<a href=#2785 id=2785 data-nosnippet>2785</a> <span class="macro">assert_ne!</span>(strip(schema(<span class="string">"a"</span>, <span class="bool-val">true</span>)), strip(schema(<span class="string">"a"</span>, <span class="bool-val">false</span>)));
-<a href=#2786 id=2786 data-nosnippet>2786</a> }
-<a href=#2787 id=2787 data-nosnippet>2787</a>
-<a href=#2788 id=2788 data-nosnippet>2788</a> <span class="doccomment">/// Stripping drops the `arrow.parquet.variant` extension type with the rest of
-<a href=#2789 id=2789 data-nosnippet>2789</a> /// the metadata, so a variant becomes a plain struct, in a list or map too.
-<a href=#2790 id=2790 data-nosnippet>2790</a> </span><span class="attr">#[test]
-<a href=#2791 id=2791 data-nosnippet>2791</a> </span><span class="kw">fn </span>test_strip_metadata_turns_variants_into_structs() {
-<a href=#2792 id=2792 data-nosnippet>2792</a> <span class="kw">let </span>variant = || Type::Variant(VariantType);
-<a href=#2793 id=2793 data-nosnippet>2793</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#2794 id=2794 data-nosnippet>2794</a> .with_fields(<span class="macro">vec!</span>[
-<a href=#2795 id=2795 data-nosnippet>2795</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, variant()).into(),
-<a href=#2796 id=2796 data-nosnippet>2796</a> NestedField::optional(
-<a href=#2797 id=2797 data-nosnippet>2797</a> <span class="number">2</span>,
-<a href=#2798 id=2798 data-nosnippet>2798</a> <span class="string">"l"</span>,
-<a href=#2799 id=2799 data-nosnippet>2799</a> Type::List(ListType::new(
-<a href=#2800 id=2800 data-nosnippet>2800</a> NestedField::list_element(<span class="number">3</span>, variant(), <span class="bool-val">false</span>).into(),
-<a href=#2801 id=2801 data-nosnippet>2801</a> )),
-<a href=#2802 id=2802 data-nosnippet>2802</a> )
-<a href=#2803 id=2803 data-nosnippet>2803</a> .into(),
-<a href=#2804 id=2804 data-nosnippet>2804</a> NestedField::optional(
-<a href=#2805 id=2805 data-nosnippet>2805</a> <span class="number">4</span>,
-<a href=#2806 id=2806 data-nosnippet>2806</a> <span class="string">"m"</span>,
-<a href=#2807 id=2807 data-nosnippet>2807</a> Type::Map(MapType::new(
-<a href=#2808 id=2808 data-nosnippet>2808</a> NestedField::map_key_element(<span class="number">5</span>, Type::Primitive(PrimitiveType::String))
-<a href=#2809 id=2809 data-nosnippet>2809</a> .into(),
-<a href=#2810 id=2810 data-nosnippet>2810</a> NestedField::map_value_element(<span class="number">6</span>, variant(), <span class="bool-val">false</span>).into(),
-<a href=#2811 id=2811 data-nosnippet>2811</a> )),
-<a href=#2812 id=2812 data-nosnippet>2812</a> )
-<a href=#2813 id=2813 data-nosnippet>2813</a> .into(),
-<a href=#2814 id=2814 data-nosnippet>2814</a> ])
-<a href=#2815 id=2815 data-nosnippet>2815</a> .build()
-<a href=#2816 id=2816 data-nosnippet>2816</a> .unwrap();
-<a href=#2817 id=2817 data-nosnippet>2817</a>
-<a href=#2818 id=2818 data-nosnippet>2818</a> <span class="kw">let </span>storage = || {
-<a href=#2819 id=2819 data-nosnippet>2819</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
-<a href=#2820 id=2820 data-nosnippet>2820</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
-<a href=#2821 id=2821 data-nosnippet>2821</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
-<a href=#2822 id=2822 data-nosnippet>2822</a> ]))
+<a href=#2527 id=2527 data-nosnippet>2527</a> Field::new(
+<a href=#2528 id=2528 data-nosnippet>2528</a> <span class="string">"orders"</span>,
+<a href=#2529 id=2529 data-nosnippet>2529</a> DataType::List(Arc::new(Field::new(
+<a href=#2530 id=2530 data-nosnippet>2530</a> <span class="string">"element"</span>,
+<a href=#2531 id=2531 data-nosnippet>2531</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2532 id=2532 data-nosnippet>2532</a> Field::new(<span class="string">"order_id"</span>, DataType::Int64, <span class="bool-val">false</span>),
+<a href=#2533 id=2533 data-nosnippet>2533</a> Field::new(<span class="string">"amount"</span>, DataType::Float64, <span class="bool-val">false</span>),
+<a href=#2534 id=2534 data-nosnippet>2534</a> ])),
+<a href=#2535 id=2535 data-nosnippet>2535</a> <span class="bool-val">true</span>,
+<a href=#2536 id=2536 data-nosnippet>2536</a> ))),
+<a href=#2537 id=2537 data-nosnippet>2537</a> <span class="bool-val">true</span>,
+<a href=#2538 id=2538 data-nosnippet>2538</a> ),
+<a href=#2539 id=2539 data-nosnippet>2539</a> ]);
+<a href=#2540 id=2540 data-nosnippet>2540</a>
+<a href=#2541 id=2541 data-nosnippet>2541</a> <span class="kw">let </span>schema = arrow_schema_to_schema_auto_assign_ids(<span class="kw-2">&</span>arrow_schema).unwrap();
+<a href=#2542 id=2542 data-nosnippet>2542</a>
+<a href=#2543 id=2543 data-nosnippet>2543</a> <span class="comment">// Build expected schema with exact field IDs following level-order assignment:
+<a href=#2544 id=2544 data-nosnippet>2544</a> // Level 0: id=1, name=2, price=3, created_at=4, tags=5, address=6, attributes=7, orders=8
+<a href=#2545 id=2545 data-nosnippet>2545</a> // Level 1: tags.element=9, address.{street=10,city=11,zip=12}, attributes.{key=13,value=14}, orders.element=15
+<a href=#2546 id=2546 data-nosnippet>2546</a> // Level 2: orders.element.{order_id=16,amount=17}
+<a href=#2547 id=2547 data-nosnippet>2547</a> </span><span class="kw">let </span>expected = Schema::builder()
+<a href=#2548 id=2548 data-nosnippet>2548</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2549 id=2549 data-nosnippet>2549</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Long)).into(),
+<a href=#2550 id=2550 data-nosnippet>2550</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#2551 id=2551 data-nosnippet>2551</a> NestedField::required(
+<a href=#2552 id=2552 data-nosnippet>2552</a> <span class="number">3</span>,
+<a href=#2553 id=2553 data-nosnippet>2553</a> <span class="string">"price"</span>,
+<a href=#2554 id=2554 data-nosnippet>2554</a> Type::Primitive(PrimitiveType::Decimal {
+<a href=#2555 id=2555 data-nosnippet>2555</a> precision: <span class="number">10</span>,
+<a href=#2556 id=2556 data-nosnippet>2556</a> scale: <span class="number">2</span>,
+<a href=#2557 id=2557 data-nosnippet>2557</a> }),
+<a href=#2558 id=2558 data-nosnippet>2558</a> )
+<a href=#2559 id=2559 data-nosnippet>2559</a> .into(),
+<a href=#2560 id=2560 data-nosnippet>2560</a> NestedField::optional(<span class="number">4</span>, <span class="string">"created_at"</span>, Type::Primitive(PrimitiveType::Timestamptz))
+<a href=#2561 id=2561 data-nosnippet>2561</a> .into(),
+<a href=#2562 id=2562 data-nosnippet>2562</a> NestedField::optional(
+<a href=#2563 id=2563 data-nosnippet>2563</a> <span class="number">5</span>,
+<a href=#2564 id=2564 data-nosnippet>2564</a> <span class="string">"tags"</span>,
+<a href=#2565 id=2565 data-nosnippet>2565</a> Type::List(ListType {
+<a href=#2566 id=2566 data-nosnippet>2566</a> element_field: NestedField::list_element(
+<a href=#2567 id=2567 data-nosnippet>2567</a> <span class="number">9</span>,
+<a href=#2568 id=2568 data-nosnippet>2568</a> Type::Primitive(PrimitiveType::String),
+<a href=#2569 id=2569 data-nosnippet>2569</a> <span class="bool-val">false</span>,
+<a href=#2570 id=2570 data-nosnippet>2570</a> )
+<a href=#2571 id=2571 data-nosnippet>2571</a> .into(),
+<a href=#2572 id=2572 data-nosnippet>2572</a> }),
+<a href=#2573 id=2573 data-nosnippet>2573</a> )
+<a href=#2574 id=2574 data-nosnippet>2574</a> .into(),
+<a href=#2575 id=2575 data-nosnippet>2575</a> NestedField::optional(
+<a href=#2576 id=2576 data-nosnippet>2576</a> <span class="number">6</span>,
+<a href=#2577 id=2577 data-nosnippet>2577</a> <span class="string">"address"</span>,
+<a href=#2578 id=2578 data-nosnippet>2578</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#2579 id=2579 data-nosnippet>2579</a> NestedField::optional(<span class="number">10</span>, <span class="string">"street"</span>, Type::Primitive(PrimitiveType::String))
+<a href=#2580 id=2580 data-nosnippet>2580</a> .into(),
+<a href=#2581 id=2581 data-nosnippet>2581</a> NestedField::required(<span class="number">11</span>, <span class="string">"city"</span>, Type::Primitive(PrimitiveType::String))
+<a href=#2582 id=2582 data-nosnippet>2582</a> .into(),
+<a href=#2583 id=2583 data-nosnippet>2583</a> NestedField::optional(<span class="number">12</span>, <span class="string">"zip"</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#2584 id=2584 data-nosnippet>2584</a> .into(),
+<a href=#2585 id=2585 data-nosnippet>2585</a> ])),
+<a href=#2586 id=2586 data-nosnippet>2586</a> )
+<a href=#2587 id=2587 data-nosnippet>2587</a> .into(),
+<a href=#2588 id=2588 data-nosnippet>2588</a> NestedField::optional(
+<a href=#2589 id=2589 data-nosnippet>2589</a> <span class="number">7</span>,
+<a href=#2590 id=2590 data-nosnippet>2590</a> <span class="string">"attributes"</span>,
+<a href=#2591 id=2591 data-nosnippet>2591</a> Type::Map(MapType {
+<a href=#2592 id=2592 data-nosnippet>2592</a> key_field: NestedField::map_key_element(
+<a href=#2593 id=2593 data-nosnippet>2593</a> <span class="number">13</span>,
+<a href=#2594 id=2594 data-nosnippet>2594</a> Type::Primitive(PrimitiveType::String),
+<a href=#2595 id=2595 data-nosnippet>2595</a> )
+<a href=#2596 id=2596 data-nosnippet>2596</a> .into(),
+<a href=#2597 id=2597 data-nosnippet>2597</a> value_field: NestedField::map_value_element(
+<a href=#2598 id=2598 data-nosnippet>2598</a> <span class="number">14</span>,
+<a href=#2599 id=2599 data-nosnippet>2599</a> Type::Primitive(PrimitiveType::String),
+<a href=#2600 id=2600 data-nosnippet>2600</a> <span class="bool-val">false</span>,
+<a href=#2601 id=2601 data-nosnippet>2601</a> )
+<a href=#2602 id=2602 data-nosnippet>2602</a> .into(),
+<a href=#2603 id=2603 data-nosnippet>2603</a> }),
+<a href=#2604 id=2604 data-nosnippet>2604</a> )
+<a href=#2605 id=2605 data-nosnippet>2605</a> .into(),
+<a href=#2606 id=2606 data-nosnippet>2606</a> NestedField::optional(
+<a href=#2607 id=2607 data-nosnippet>2607</a> <span class="number">8</span>,
+<a href=#2608 id=2608 data-nosnippet>2608</a> <span class="string">"orders"</span>,
+<a href=#2609 id=2609 data-nosnippet>2609</a> Type::List(ListType {
+<a href=#2610 id=2610 data-nosnippet>2610</a> element_field: NestedField::list_element(
+<a href=#2611 id=2611 data-nosnippet>2611</a> <span class="number">15</span>,
+<a href=#2612 id=2612 data-nosnippet>2612</a> Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#2613 id=2613 data-nosnippet>2613</a> NestedField::required(
+<a href=#2614 id=2614 data-nosnippet>2614</a> <span class="number">16</span>,
+<a href=#2615 id=2615 data-nosnippet>2615</a> <span class="string">"order_id"</span>,
+<a href=#2616 id=2616 data-nosnippet>2616</a> Type::Primitive(PrimitiveType::Long),
+<a href=#2617 id=2617 data-nosnippet>2617</a> )
+<a href=#2618 id=2618 data-nosnippet>2618</a> .into(),
+<a href=#2619 id=2619 data-nosnippet>2619</a> NestedField::required(
+<a href=#2620 id=2620 data-nosnippet>2620</a> <span class="number">17</span>,
+<a href=#2621 id=2621 data-nosnippet>2621</a> <span class="string">"amount"</span>,
+<a href=#2622 id=2622 data-nosnippet>2622</a> Type::Primitive(PrimitiveType::Double),
+<a href=#2623 id=2623 data-nosnippet>2623</a> )
+<a href=#2624 id=2624 data-nosnippet>2624</a> .into(),
+<a href=#2625 id=2625 data-nosnippet>2625</a> ])),
+<a href=#2626 id=2626 data-nosnippet>2626</a> <span class="bool-val">false</span>,
+<a href=#2627 id=2627 data-nosnippet>2627</a> )
+<a href=#2628 id=2628 data-nosnippet>2628</a> .into(),
+<a href=#2629 id=2629 data-nosnippet>2629</a> }),
+<a href=#2630 id=2630 data-nosnippet>2630</a> )
+<a href=#2631 id=2631 data-nosnippet>2631</a> .into(),
+<a href=#2632 id=2632 data-nosnippet>2632</a> ])
+<a href=#2633 id=2633 data-nosnippet>2633</a> .build()
+<a href=#2634 id=2634 data-nosnippet>2634</a> .unwrap();
+<a href=#2635 id=2635 data-nosnippet>2635</a>
+<a href=#2636 id=2636 data-nosnippet>2636</a> <span class="macro">pretty_assertions::assert_eq!</span>(schema, expected);
+<a href=#2637 id=2637 data-nosnippet>2637</a> <span class="macro">assert_eq!</span>(schema.highest_field_id(), <span class="number">17</span>);
+<a href=#2638 id=2638 data-nosnippet>2638</a> }
+<a href=#2639 id=2639 data-nosnippet>2639</a>
+<a href=#2640 id=2640 data-nosnippet>2640</a> <span class="kw">fn </span>decimal_byte_array_stats(min: Vec<u8>, max: Vec<u8>) -> Statistics {
+<a href=#2641 id=2641 data-nosnippet>2641</a> Statistics::byte_array(
+<a href=#2642 id=2642 data-nosnippet>2642</a> <span class="prelude-val">Some</span>(parquet::data_type::ByteArray::from(min)),
+<a href=#2643 id=2643 data-nosnippet>2643</a> <span class="prelude-val">Some</span>(parquet::data_type::ByteArray::from(max)),
+<a href=#2644 id=2644 data-nosnippet>2644</a> <span class="prelude-val">None</span>,
+<a href=#2645 id=2645 data-nosnippet>2645</a> <span class="prelude-val">Some</span>(<span class="number">0</span>),
+<a href=#2646 id=2646 data-nosnippet>2646</a> <span class="bool-val">false</span>,
+<a href=#2647 id=2647 data-nosnippet>2647</a> )
+<a href=#2648 id=2648 data-nosnippet>2648</a> }
+<a href=#2649 id=2649 data-nosnippet>2649</a>
+<a href=#2650 id=2650 data-nosnippet>2650</a> <span class="kw">fn </span>decimal_bounds(stats: <span class="kw-2">&</span>Statistics) -> <span class="prelude-ty">Result</span><(<span class="prelude-ty">Option</span><Datum>, <span class="prelude-ty">Option</span><Datum>)> {
+<a href=#2651 id=2651 data-nosnippet>2651</a> <span class="kw">let </span>ty = PrimitiveType::Decimal {
+<a href=#2652 id=2652 data-nosnippet>2652</a> precision: <span class="number">38</span>,
+<a href=#2653 id=2653 data-nosnippet>2653</a> scale: <span class="number">2</span>,
+<a href=#2654 id=2654 data-nosnippet>2654</a> };
+<a href=#2655 id=2655 data-nosnippet>2655</a> <span class="prelude-val">Ok</span>((
+<a href=#2656 id=2656 data-nosnippet>2656</a> get_parquet_stat_min_as_datum(<span class="kw-2">&</span>ty, stats)<span class="question-mark">?</span>,
+<a href=#2657 id=2657 data-nosnippet>2657</a> get_parquet_stat_max_as_datum(<span class="kw-2">&</span>ty, stats)<span class="question-mark">?</span>,
+<a href=#2658 id=2658 data-nosnippet>2658</a> ))
+<a href=#2659 id=2659 data-nosnippet>2659</a> }
+<a href=#2660 id=2660 data-nosnippet>2660</a>
+<a href=#2661 id=2661 data-nosnippet>2661</a> <span class="kw">fn </span>decimal_datum(value: i128) -> Datum {
+<a href=#2662 id=2662 data-nosnippet>2662</a> Datum::new(
+<a href=#2663 id=2663 data-nosnippet>2663</a> PrimitiveType::Decimal {
+<a href=#2664 id=2664 data-nosnippet>2664</a> precision: <span class="number">38</span>,
+<a href=#2665 id=2665 data-nosnippet>2665</a> scale: <span class="number">2</span>,
+<a href=#2666 id=2666 data-nosnippet>2666</a> },
+<a href=#2667 id=2667 data-nosnippet>2667</a> PrimitiveLiteral::Int128(value),
+<a href=#2668 id=2668 data-nosnippet>2668</a> )
+<a href=#2669 id=2669 data-nosnippet>2669</a> }
+<a href=#2670 id=2670 data-nosnippet>2670</a>
+<a href=#2671 id=2671 data-nosnippet>2671</a> <span class="attr">#[test]
+<a href=#2672 id=2672 data-nosnippet>2672</a> </span><span class="kw">fn </span>test_byte_array_decimal_stats_short_bounds() {
+<a href=#2673 id=2673 data-nosnippet>2673</a> <span class="comment">// Minimal-length big-endian two's-complement: -1234 and 1234.
+<a href=#2674 id=2674 data-nosnippet>2674</a> </span><span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[<span class="number">0xFB</span>, <span class="number">0x2E</span>], <span class="macro">vec!</span>[<span class="number">0x04</span>, <span class="number">0xD2</span>]);
+<a href=#2675 id=2675 data-nosnippet>2675</a> <span class="kw">let </span>(min, max) = decimal_bounds(<span class="kw-2">&</span>stats).unwrap();
+<a href=#2676 id=2676 data-nosnippet>2676</a> <span class="macro">assert_eq!</span>(min, <span class="prelude-val">Some</span>(decimal_datum(-<span class="number">1234</span>)));
+<a href=#2677 id=2677 data-nosnippet>2677</a> <span class="macro">assert_eq!</span>(max, <span class="prelude-val">Some</span>(decimal_datum(<span class="number">1234</span>)));
+<a href=#2678 id=2678 data-nosnippet>2678</a>
+<a href=#2679 id=2679 data-nosnippet>2679</a> <span class="comment">// Single-byte bounds: sign bit set must sign-extend, not zero-extend.
+<a href=#2680 id=2680 data-nosnippet>2680</a> </span><span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[<span class="number">0x80</span>], <span class="macro">vec!</span>[<span class="number">0x7F</span>]);
+<a href=#2681 id=2681 data-nosnippet>2681</a> <span class="kw">let </span>(min, max) = decimal_bounds(<span class="kw-2">&</span>stats).unwrap();
+<a href=#2682 id=2682 data-nosnippet>2682</a> <span class="macro">assert_eq!</span>(min, <span class="prelude-val">Some</span>(decimal_datum(-<span class="number">128</span>)));
+<a href=#2683 id=2683 data-nosnippet>2683</a> <span class="macro">assert_eq!</span>(max, <span class="prelude-val">Some</span>(decimal_datum(<span class="number">127</span>)));
+<a href=#2684 id=2684 data-nosnippet>2684</a> }
+<a href=#2685 id=2685 data-nosnippet>2685</a>
+<a href=#2686 id=2686 data-nosnippet>2686</a> <span class="attr">#[test]
+<a href=#2687 id=2687 data-nosnippet>2687</a> </span><span class="kw">fn </span>test_byte_array_decimal_stats_full_width_bounds() {
+<a href=#2688 id=2688 data-nosnippet>2688</a> <span class="kw">let </span>stats = decimal_byte_array_stats(
+<a href=#2689 id=2689 data-nosnippet>2689</a> i128::MIN.to_be_bytes().to_vec(),
+<a href=#2690 id=2690 data-nosnippet>2690</a> i128::MAX.to_be_bytes().to_vec(),
+<a href=#2691 id=2691 data-nosnippet>2691</a> );
+<a href=#2692 id=2692 data-nosnippet>2692</a> <span class="kw">let </span>(min, max) = decimal_bounds(<span class="kw-2">&</span>stats).unwrap();
+<a href=#2693 id=2693 data-nosnippet>2693</a> <span class="macro">assert_eq!</span>(min, <span class="prelude-val">Some</span>(decimal_datum(i128::MIN)));
+<a href=#2694 id=2694 data-nosnippet>2694</a> <span class="macro">assert_eq!</span>(max, <span class="prelude-val">Some</span>(decimal_datum(i128::MAX)));
+<a href=#2695 id=2695 data-nosnippet>2695</a> }
+<a href=#2696 id=2696 data-nosnippet>2696</a>
+<a href=#2697 id=2697 data-nosnippet>2697</a> <span class="attr">#[test]
+<a href=#2698 id=2698 data-nosnippet>2698</a> </span><span class="kw">fn </span>test_byte_array_decimal_stats_empty_bound_errors() {
+<a href=#2699 id=2699 data-nosnippet>2699</a> <span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[], <span class="macro">vec!</span>[<span class="number">0x01</span>]);
+<a href=#2700 id=2700 data-nosnippet>2700</a> <span class="kw">let </span>err = decimal_bounds(<span class="kw-2">&</span>stats).unwrap_err();
+<a href=#2701 id=2701 data-nosnippet>2701</a> <span class="macro">assert_eq!</span>(err.kind(), ErrorKind::DataInvalid);
+<a href=#2702 id=2702 data-nosnippet>2702</a>
+<a href=#2703 id=2703 data-nosnippet>2703</a> <span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[<span class="number">0x01</span>], <span class="macro">vec!</span>[]);
+<a href=#2704 id=2704 data-nosnippet>2704</a> <span class="kw">let </span>err = decimal_bounds(<span class="kw-2">&</span>stats).unwrap_err();
+<a href=#2705 id=2705 data-nosnippet>2705</a> <span class="macro">assert_eq!</span>(err.kind(), ErrorKind::DataInvalid);
+<a href=#2706 id=2706 data-nosnippet>2706</a> }
+<a href=#2707 id=2707 data-nosnippet>2707</a>
+<a href=#2708 id=2708 data-nosnippet>2708</a> <span class="attr">#[test]
+<a href=#2709 id=2709 data-nosnippet>2709</a> </span><span class="kw">fn </span>test_byte_array_decimal_stats_oversized_bound_errors() {
+<a href=#2710 id=2710 data-nosnippet>2710</a> <span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">17</span>], <span class="macro">vec!</span>[<span class="number">0x01</span>]);
+<a href=#2711 id=2711 data-nosnippet>2711</a> <span class="kw">let </span>err = decimal_bounds(<span class="kw-2">&</span>stats).unwrap_err();
+<a href=#2712 id=2712 data-nosnippet>2712</a> <span class="macro">assert_eq!</span>(err.kind(), ErrorKind::DataInvalid);
+<a href=#2713 id=2713 data-nosnippet>2713</a>
+<a href=#2714 id=2714 data-nosnippet>2714</a> <span class="kw">let </span>stats = decimal_byte_array_stats(<span class="macro">vec!</span>[<span class="number">0x01</span>], <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">17</span>]);
+<a href=#2715 id=2715 data-nosnippet>2715</a> <span class="kw">let </span>err = decimal_bounds(<span class="kw-2">&</span>stats).unwrap_err();
+<a href=#2716 id=2716 data-nosnippet>2716</a> <span class="macro">assert_eq!</span>(err.kind(), ErrorKind::DataInvalid);
+<a href=#2717 id=2717 data-nosnippet>2717</a> }
+<a href=#2718 id=2718 data-nosnippet>2718</a>
+<a href=#2719 id=2719 data-nosnippet>2719</a> <span class="doccomment">/// Every field is rebuilt without metadata, at any depth and inside any
+<a href=#2720 id=2720 data-nosnippet>2720</a> /// container. Fields are rebuilt in nesting order rather than looked up by
+<a href=#2721 id=2721 data-nosnippet>2721</a> /// name, so a path that repeats names (`a.b.a.b`) keeps each level's name
+<a href=#2722 id=2722 data-nosnippet>2722</a> /// and nullability.
+<a href=#2723 id=2723 data-nosnippet>2723</a> </span><span class="attr">#[test]
+<a href=#2724 id=2724 data-nosnippet>2724</a> </span><span class="kw">fn </span>test_strip_metadata_from_nested_schema() {
+<a href=#2725 id=2725 data-nosnippet>2725</a> <span class="comment">// The same schema, built with and without metadata on the schema and every field.
+<a href=#2726 id=2726 data-nosnippet>2726</a> </span><span class="kw">let </span>schema = |with_metadata: bool| {
+<a href=#2727 id=2727 data-nosnippet>2727</a> <span class="kw">let </span>metadata = |value: <span class="kw-2">&</span>str| {
+<a href=#2728 id=2728 data-nosnippet>2728</a> <span class="kw">if </span>with_metadata {
+<a href=#2729 id=2729 data-nosnippet>2729</a> HashMap::from([(<span class="string">"k"</span>.to_string(), value.to_string())])
+<a href=#2730 id=2730 data-nosnippet>2730</a> } <span class="kw">else </span>{
+<a href=#2731 id=2731 data-nosnippet>2731</a> HashMap::new()
+<a href=#2732 id=2732 data-nosnippet>2732</a> }
+<a href=#2733 id=2733 data-nosnippet>2733</a> };
+<a href=#2734 id=2734 data-nosnippet>2734</a> <span class="kw">let </span>field = |name: <span class="kw-2">&</span>str, ty: DataType, nullable: bool| {
+<a href=#2735 id=2735 data-nosnippet>2735</a> Field::new(name, ty, nullable).with_metadata(metadata(name))
+<a href=#2736 id=2736 data-nosnippet>2736</a> };
+<a href=#2737 id=2737 data-nosnippet>2737</a> <span class="kw">let </span>element = |ty: DataType| Arc::new(field(LIST_FIELD_NAME, ty, <span class="bool-val">false</span>));
+<a href=#2738 id=2738 data-nosnippet>2738</a> <span class="kw">let </span>ints = || DataType::List(element(DataType::Int32));
+<a href=#2739 id=2739 data-nosnippet>2739</a> <span class="kw">let </span>map = |value: DataType, sorted: bool| {
+<a href=#2740 id=2740 data-nosnippet>2740</a> <span class="kw">let </span>entries = Fields::from(<span class="macro">vec!</span>[
+<a href=#2741 id=2741 data-nosnippet>2741</a> field(MAP_KEY_FIELD_NAME, DataType::Utf8, <span class="bool-val">false</span>),
+<a href=#2742 id=2742 data-nosnippet>2742</a> field(MAP_VALUE_FIELD_NAME, value, <span class="bool-val">true</span>),
+<a href=#2743 id=2743 data-nosnippet>2743</a> ]);
+<a href=#2744 id=2744 data-nosnippet>2744</a> <span class="kw">let </span>entries = field(DEFAULT_MAP_FIELD_NAME, DataType::Struct(entries), <span class="bool-val">false</span>);
+<a href=#2745 id=2745 data-nosnippet>2745</a> DataType::Map(Arc::new(entries), sorted)
+<a href=#2746 id=2746 data-nosnippet>2746</a> };
+<a href=#2747 id=2747 data-nosnippet>2747</a> <span class="kw">let </span>struct_of = |fields: Vec<Field>| DataType::Struct(Fields::from(fields));
+<a href=#2748 id=2748 data-nosnippet>2748</a>
+<a href=#2749 id=2749 data-nosnippet>2749</a> <span class="kw">let </span>a_b_a_b = struct_of(<span class="macro">vec!</span>[field(
+<a href=#2750 id=2750 data-nosnippet>2750</a> <span class="string">"b"</span>,
+<a href=#2751 id=2751 data-nosnippet>2751</a> struct_of(<span class="macro">vec!</span>[field(
+<a href=#2752 id=2752 data-nosnippet>2752</a> <span class="string">"a"</span>,
+<a href=#2753 id=2753 data-nosnippet>2753</a> struct_of(<span class="macro">vec!</span>[field(<span class="string">"b"</span>, DataType::Int32, <span class="bool-val">true</span>)]),
+<a href=#2754 id=2754 data-nosnippet>2754</a> <span class="bool-val">false</span>,
+<a href=#2755 id=2755 data-nosnippet>2755</a> )]),
+<a href=#2756 id=2756 data-nosnippet>2756</a> <span class="bool-val">false</span>,
+<a href=#2757 id=2757 data-nosnippet>2757</a> )]);
+<a href=#2758 id=2758 data-nosnippet>2758</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2759 id=2759 data-nosnippet>2759</a> field(<span class="string">"list"</span>, ints(), <span class="bool-val">true</span>),
+<a href=#2760 id=2760 data-nosnippet>2760</a> field(
+<a href=#2761 id=2761 data-nosnippet>2761</a> <span class="string">"large_list"</span>,
+<a href=#2762 id=2762 data-nosnippet>2762</a> DataType::LargeList(element(DataType::Int32)),
+<a href=#2763 id=2763 data-nosnippet>2763</a> <span class="bool-val">false</span>,
+<a href=#2764 id=2764 data-nosnippet>2764</a> ),
+<a href=#2765 id=2765 data-nosnippet>2765</a> field(
+<a href=#2766 id=2766 data-nosnippet>2766</a> <span class="string">"fixed_list"</span>,
+<a href=#2767 id=2767 data-nosnippet>2767</a> DataType::FixedSizeList(element(DataType::Int32), <span class="number">2</span>),
+<a href=#2768 id=2768 data-nosnippet>2768</a> <span class="bool-val">true</span>,
+<a href=#2769 id=2769 data-nosnippet>2769</a> ),
+<a href=#2770 id=2770 data-nosnippet>2770</a> field(<span class="string">"list_of_list"</span>, DataType::List(element(ints())), <span class="bool-val">false</span>),
+<a href=#2771 id=2771 data-nosnippet>2771</a> field(<span class="string">"sorted_map"</span>, map(ints(), <span class="bool-val">true</span>), <span class="bool-val">false</span>),
+<a href=#2772 id=2772 data-nosnippet>2772</a> field(
+<a href=#2773 id=2773 data-nosnippet>2773</a> <span class="string">"map_of_struct"</span>,
+<a href=#2774 id=2774 data-nosnippet>2774</a> map(
+<a href=#2775 id=2775 data-nosnippet>2775</a> struct_of(<span class="macro">vec!</span>[
+<a href=#2776 id=2776 data-nosnippet>2776</a> field(<span class="string">"a"</span>, DataType::Int32, <span class="bool-val">true</span>),
+<a href=#2777 id=2777 data-nosnippet>2777</a> field(<span class="string">"b"</span>, ints(), <span class="bool-val">false</span>),
+<a href=#2778 id=2778 data-nosnippet>2778</a> ]),
+<a href=#2779 id=2779 data-nosnippet>2779</a> <span class="bool-val">false</span>,
+<a href=#2780 id=2780 data-nosnippet>2780</a> ),
+<a href=#2781 id=2781 data-nosnippet>2781</a> <span class="bool-val">true</span>,
+<a href=#2782 id=2782 data-nosnippet>2782</a> ),
+<a href=#2783 id=2783 data-nosnippet>2783</a> field(
+<a href=#2784 id=2784 data-nosnippet>2784</a> <span class="string">"list_of_struct"</span>,
+<a href=#2785 id=2785 data-nosnippet>2785</a> DataType::List(element(struct_of(<span class="macro">vec!</span>[field(
+<a href=#2786 id=2786 data-nosnippet>2786</a> <span class="string">"m"</span>,
+<a href=#2787 id=2787 data-nosnippet>2787</a> map(ints(), <span class="bool-val">false</span>),
+<a href=#2788 id=2788 data-nosnippet>2788</a> <span class="bool-val">true</span>,
+<a href=#2789 id=2789 data-nosnippet>2789</a> )]))),
+<a href=#2790 id=2790 data-nosnippet>2790</a> <span class="bool-val">true</span>,
+<a href=#2791 id=2791 data-nosnippet>2791</a> ),
+<a href=#2792 id=2792 data-nosnippet>2792</a> field(<span class="string">"a"</span>, a_b_a_b, <span class="bool-val">true</span>),
+<a href=#2793 id=2793 data-nosnippet>2793</a> ])
+<a href=#2794 id=2794 data-nosnippet>2794</a> .with_metadata(metadata(<span class="string">"schema"</span>))
+<a href=#2795 id=2795 data-nosnippet>2795</a> };
+<a href=#2796 id=2796 data-nosnippet>2796</a>
+<a href=#2797 id=2797 data-nosnippet>2797</a> <span class="kw">let </span>(input, expected) = (schema(<span class="bool-val">true</span>), schema(<span class="bool-val">false</span>));
+<a href=#2798 id=2798 data-nosnippet>2798</a> <span class="comment">// Otherwise a builder that stopped adding metadata would pass trivially.
+<a href=#2799 id=2799 data-nosnippet>2799</a> </span><span class="macro">assert_ne!</span>(input, expected);
+<a href=#2800 id=2800 data-nosnippet>2800</a> <span class="macro">pretty_assertions::assert_eq!</span>(strip_metadata_from_schema(<span class="kw-2">&</span>input).unwrap(), expected);
+<a href=#2801 id=2801 data-nosnippet>2801</a> }
+<a href=#2802 id=2802 data-nosnippet>2802</a>
+<a href=#2803 id=2803 data-nosnippet>2803</a> <span class="doccomment">/// arrow-rs names a list's element `item`, and an arrow-rs `MapBuilder` names
+<a href=#2804 id=2804 data-nosnippet>2804</a> /// a map's fields `entries`, `keys` and `values`. Once stripped, a schema
+<a href=#2805 id=2805 data-nosnippet>2805</a> /// using those names, with a nullable map key, compares equal to the same
+<a href=#2806 id=2806 data-nosnippet>2806</a> /// schema from `schema_to_arrow_schema`.
+<a href=#2807 id=2807 data-nosnippet>2807</a> </span><span class="attr">#[test]
+<a href=#2808 id=2808 data-nosnippet>2808</a> </span><span class="kw">fn </span>test_strip_metadata_normalizes_container_field_names() {
+<a href=#2809 id=2809 data-nosnippet>2809</a> <span class="comment">// A list of ints and a map from string to a list of ints, with the given
+<a href=#2810 id=2810 data-nosnippet>2810</a> // names for the list elements and the map's entries, key and value.
+<a href=#2811 id=2811 data-nosnippet>2811</a> </span><span class="kw">let </span>schema = |[element, entries, key, value]: [<span class="kw-2">&</span>str; <span class="number">4</span>], key_nullable: bool| {
+<a href=#2812 id=2812 data-nosnippet>2812</a> <span class="kw">let </span>ints =
+<a href=#2813 id=2813 data-nosnippet>2813</a> |nullable| DataType::List(Arc::new(Field::new(element, DataType::Int32, nullable)));
+<a href=#2814 id=2814 data-nosnippet>2814</a> <span class="kw">let </span>key_value = Fields::from(<span class="macro">vec!</span>[
+<a href=#2815 id=2815 data-nosnippet>2815</a> Field::new(key, DataType::Utf8, key_nullable),
+<a href=#2816 id=2816 data-nosnippet>2816</a> Field::new(value, ints(<span class="bool-val">false</span>), <span class="bool-val">true</span>),
+<a href=#2817 id=2817 data-nosnippet>2817</a> ]);
+<a href=#2818 id=2818 data-nosnippet>2818</a> <span class="kw">let </span>entries = Field::new(entries, DataType::Struct(key_value), <span class="bool-val">false</span>);
+<a href=#2819 id=2819 data-nosnippet>2819</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2820 id=2820 data-nosnippet>2820</a> Field::new(<span class="string">"l"</span>, ints(<span class="bool-val">true</span>), <span class="bool-val">true</span>),
+<a href=#2821 id=2821 data-nosnippet>2821</a> Field::new(<span class="string">"m"</span>, DataType::Map(Arc::new(entries), <span class="bool-val">false</span>), <span class="bool-val">true</span>),
+<a href=#2822 id=2822 data-nosnippet>2822</a> ])
<a href=#2823 id=2823 data-nosnippet>2823</a> };
-<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="kw">let </span>entries = Fields::from(<span class="macro">vec!</span>[
-<a href=#2825 id=2825 data-nosnippet>2825</a> Field::new(MAP_KEY_FIELD_NAME, DataType::Utf8, <span class="bool-val">false</span>),
-<a href=#2826 id=2826 data-nosnippet>2826</a> Field::new(MAP_VALUE_FIELD_NAME, storage(), <span class="bool-val">true</span>),
-<a href=#2827 id=2827 data-nosnippet>2827</a> ]);
-<a href=#2828 id=2828 data-nosnippet>2828</a> <span class="kw">let </span>entries = Field::new(DEFAULT_MAP_FIELD_NAME, DataType::Struct(entries), <span class="bool-val">false</span>);
-<a href=#2829 id=2829 data-nosnippet>2829</a> <span class="kw">let </span>expected = ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2830 id=2830 data-nosnippet>2830</a> Field::new(<span class="string">"v"</span>, storage(), <span class="bool-val">true</span>),
-<a href=#2831 id=2831 data-nosnippet>2831</a> Field::new(
-<a href=#2832 id=2832 data-nosnippet>2832</a> <span class="string">"l"</span>,
-<a href=#2833 id=2833 data-nosnippet>2833</a> DataType::List(Arc::new(Field::new(LIST_FIELD_NAME, storage(), <span class="bool-val">true</span>))),
-<a href=#2834 id=2834 data-nosnippet>2834</a> <span class="bool-val">true</span>,
-<a href=#2835 id=2835 data-nosnippet>2835</a> ),
-<a href=#2836 id=2836 data-nosnippet>2836</a> Field::new(<span class="string">"m"</span>, DataType::Map(Arc::new(entries), <span class="bool-val">false</span>), <span class="bool-val">true</span>),
-<a href=#2837 id=2837 data-nosnippet>2837</a> ]);
-<a href=#2838 id=2838 data-nosnippet>2838</a>
-<a href=#2839 id=2839 data-nosnippet>2839</a> <span class="macro">pretty_assertions::assert_eq!</span>(
-<a href=#2840 id=2840 data-nosnippet>2840</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap()).unwrap(),
-<a href=#2841 id=2841 data-nosnippet>2841</a> expected
-<a href=#2842 id=2842 data-nosnippet>2842</a> );
-<a href=#2843 id=2843 data-nosnippet>2843</a> }
-<a href=#2844 id=2844 data-nosnippet>2844</a>
-<a href=#2845 id=2845 data-nosnippet>2845</a> <span class="doccomment">/// A dictionary-encoded field compares equal to a plain field of its value
-<a href=#2846 id=2846 data-nosnippet>2846</a> /// type once stripped, at any depth.
-<a href=#2847 id=2847 data-nosnippet>2847</a> </span><span class="attr">#[test]
-<a href=#2848 id=2848 data-nosnippet>2848</a> </span><span class="kw">fn </span>test_strip_metadata_unwraps_dictionaries() {
-<a href=#2849 id=2849 data-nosnippet>2849</a> <span class="kw">let </span>schema = |dictionary_encoded: bool| {
-<a href=#2850 id=2850 data-nosnippet>2850</a> <span class="kw">let </span>maybe_dictionary = |key: DataType, value: DataType| {
-<a href=#2851 id=2851 data-nosnippet>2851</a> <span class="kw">if </span>dictionary_encoded {
-<a href=#2852 id=2852 data-nosnippet>2852</a> DataType::Dictionary(Box::new(key), Box::new(value))
-<a href=#2853 id=2853 data-nosnippet>2853</a> } <span class="kw">else </span>{
-<a href=#2854 id=2854 data-nosnippet>2854</a> value
-<a href=#2855 id=2855 data-nosnippet>2855</a> }
-<a href=#2856 id=2856 data-nosnippet>2856</a> };
-<a href=#2857 id=2857 data-nosnippet>2857</a> <span class="kw">let </span>element = Field::new(
-<a href=#2858 id=2858 data-nosnippet>2858</a> LIST_FIELD_NAME,
-<a href=#2859 id=2859 data-nosnippet>2859</a> maybe_dictionary(DataType::Int8, DataType::LargeUtf8),
-<a href=#2860 id=2860 data-nosnippet>2860</a> <span class="bool-val">false</span>,
-<a href=#2861 id=2861 data-nosnippet>2861</a> );
-<a href=#2862 id=2862 data-nosnippet>2862</a> ArrowSchema::new(<span class="macro">vec!</span>[
-<a href=#2863 id=2863 data-nosnippet>2863</a> Field::new(<span class="string">"d"</span>, maybe_dictionary(DataType::Int32, DataType::Utf8), <span class="bool-val">true</span>),
-<a href=#2864 id=2864 data-nosnippet>2864</a> Field::new(<span class="string">"l"</span>, DataType::List(Arc::new(element)), <span class="bool-val">true</span>),
-<a href=#2865 id=2865 data-nosnippet>2865</a> ])
-<a href=#2866 id=2866 data-nosnippet>2866</a> };
-<a href=#2867 id=2867 data-nosnippet>2867</a>
-<a href=#2868 id=2868 data-nosnippet>2868</a> <span class="macro">pretty_assertions::assert_eq!</span>(
-<a href=#2869 id=2869 data-nosnippet>2869</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema(<span class="bool-val">true</span>)).unwrap(),
-<a href=#2870 id=2870 data-nosnippet>2870</a> schema(<span class="bool-val">false</span>)
-<a href=#2871 id=2871 data-nosnippet>2871</a> );
-<a href=#2872 id=2872 data-nosnippet>2872</a> }
-<a href=#2873 id=2873 data-nosnippet>2873</a>}
+<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="kw">let </span>arrow_rs = schema([<span class="string">"item"</span>, <span class="string">"entries"</span>, <span class="string">"keys"</span>, <span class="string">"values"</span>], <span class="bool-val">true</span>);
+<a href=#2825 id=2825 data-nosnippet>2825</a> <span class="kw">let </span>expected = schema(
+<a href=#2826 id=2826 data-nosnippet>2826</a> [
+<a href=#2827 id=2827 data-nosnippet>2827</a> LIST_FIELD_NAME,
+<a href=#2828 id=2828 data-nosnippet>2828</a> DEFAULT_MAP_FIELD_NAME,
+<a href=#2829 id=2829 data-nosnippet>2829</a> MAP_KEY_FIELD_NAME,
+<a href=#2830 id=2830 data-nosnippet>2830</a> MAP_VALUE_FIELD_NAME,
+<a href=#2831 id=2831 data-nosnippet>2831</a> ],
+<a href=#2832 id=2832 data-nosnippet>2832</a> <span class="bool-val">false</span>,
+<a href=#2833 id=2833 data-nosnippet>2833</a> );
+<a href=#2834 id=2834 data-nosnippet>2834</a>
+<a href=#2835 id=2835 data-nosnippet>2835</a> <span class="comment">// The same schema as an Iceberg table's.
+<a href=#2836 id=2836 data-nosnippet>2836</a> </span><span class="kw">let </span>int_list = |id, required| {
+<a href=#2837 id=2837 data-nosnippet>2837</a> <span class="kw">let </span>int = Type::Primitive(PrimitiveType::Int);
+<a href=#2838 id=2838 data-nosnippet>2838</a> Type::List(ListType::new(
+<a href=#2839 id=2839 data-nosnippet>2839</a> NestedField::list_element(id, int, required).into(),
+<a href=#2840 id=2840 data-nosnippet>2840</a> ))
+<a href=#2841 id=2841 data-nosnippet>2841</a> };
+<a href=#2842 id=2842 data-nosnippet>2842</a> <span class="kw">let </span>string_to_int_list = MapType::new(
+<a href=#2843 id=2843 data-nosnippet>2843</a> NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#2844 id=2844 data-nosnippet>2844</a> NestedField::map_value_element(<span class="number">5</span>, int_list(<span class="number">6</span>, <span class="bool-val">true</span>), <span class="bool-val">false</span>).into(),
+<a href=#2845 id=2845 data-nosnippet>2845</a> );
+<a href=#2846 id=2846 data-nosnippet>2846</a> <span class="kw">let </span>iceberg = Schema::builder()
+<a href=#2847 id=2847 data-nosnippet>2847</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2848 id=2848 data-nosnippet>2848</a> NestedField::optional(<span class="number">1</span>, <span class="string">"l"</span>, int_list(<span class="number">2</span>, <span class="bool-val">false</span>)).into(),
+<a href=#2849 id=2849 data-nosnippet>2849</a> NestedField::optional(<span class="number">3</span>, <span class="string">"m"</span>, Type::Map(string_to_int_list)).into(),
+<a href=#2850 id=2850 data-nosnippet>2850</a> ])
+<a href=#2851 id=2851 data-nosnippet>2851</a> .build()
+<a href=#2852 id=2852 data-nosnippet>2852</a> .unwrap();
+<a href=#2853 id=2853 data-nosnippet>2853</a>
+<a href=#2854 id=2854 data-nosnippet>2854</a> <span class="macro">pretty_assertions::assert_eq!</span>(strip_metadata_from_schema(<span class="kw-2">&</span>arrow_rs).unwrap(), expected);
+<a href=#2855 id=2855 data-nosnippet>2855</a> <span class="macro">pretty_assertions::assert_eq!</span>(
+<a href=#2856 id=2856 data-nosnippet>2856</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema_to_arrow_schema(<span class="kw-2">&</span>iceberg).unwrap()).unwrap(),
+<a href=#2857 id=2857 data-nosnippet>2857</a> expected
+<a href=#2858 id=2858 data-nosnippet>2858</a> );
+<a href=#2859 id=2859 data-nosnippet>2859</a> }
+<a href=#2860 id=2860 data-nosnippet>2860</a>
+<a href=#2861 id=2861 data-nosnippet>2861</a> <span class="doccomment">/// Names and nullability that `schema_to_arrow_schema` doesn't fix, such as a
+<a href=#2862 id=2862 data-nosnippet>2862</a> /// struct field's name or a list element's nullability, still tell schemas apart.
+<a href=#2863 id=2863 data-nosnippet>2863</a> </span><span class="attr">#[test]
+<a href=#2864 id=2864 data-nosnippet>2864</a> </span><span class="kw">fn </span>test_strip_metadata_keeps_other_differences() {
+<a href=#2865 id=2865 data-nosnippet>2865</a> <span class="kw">let </span>schema = |child: <span class="kw-2">&</span>str, element_nullable: bool| {
+<a href=#2866 id=2866 data-nosnippet>2866</a> <span class="kw">let </span>child = Field::new(child, DataType::Int32, <span class="bool-val">true</span>);
+<a href=#2867 id=2867 data-nosnippet>2867</a> <span class="kw">let </span>element = Field::new(<span class="string">"item"</span>, DataType::Int32, element_nullable);
+<a href=#2868 id=2868 data-nosnippet>2868</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2869 id=2869 data-nosnippet>2869</a> Field::new(<span class="string">"s"</span>, DataType::Struct(Fields::from(<span class="macro">vec!</span>[child])), <span class="bool-val">true</span>),
+<a href=#2870 id=2870 data-nosnippet>2870</a> Field::new(<span class="string">"l"</span>, DataType::List(Arc::new(element)), <span class="bool-val">true</span>),
+<a href=#2871 id=2871 data-nosnippet>2871</a> ])
+<a href=#2872 id=2872 data-nosnippet>2872</a> };
+<a href=#2873 id=2873 data-nosnippet>2873</a> <span class="kw">let </span>strip = |schema: ArrowSchema| strip_metadata_from_schema(<span class="kw-2">&</span>schema).unwrap();
+<a href=#2874 id=2874 data-nosnippet>2874</a>
+<a href=#2875 id=2875 data-nosnippet>2875</a> <span class="macro">assert_ne!</span>(strip(schema(<span class="string">"a"</span>, <span class="bool-val">true</span>)), strip(schema(<span class="string">"b"</span>, <span class="bool-val">true</span>)));
+<a href=#2876 id=2876 data-nosnippet>2876</a> <span class="macro">assert_ne!</span>(strip(schema(<span class="string">"a"</span>, <span class="bool-val">true</span>)), strip(schema(<span class="string">"a"</span>, <span class="bool-val">false</span>)));
+<a href=#2877 id=2877 data-nosnippet>2877</a> }
+<a href=#2878 id=2878 data-nosnippet>2878</a>
+<a href=#2879 id=2879 data-nosnippet>2879</a> <span class="doccomment">/// Stripping drops the `arrow.parquet.variant` extension type with the rest of
+<a href=#2880 id=2880 data-nosnippet>2880</a> /// the metadata, so a variant becomes a plain struct, in a list or map too.
+<a href=#2881 id=2881 data-nosnippet>2881</a> </span><span class="attr">#[test]
+<a href=#2882 id=2882 data-nosnippet>2882</a> </span><span class="kw">fn </span>test_strip_metadata_turns_variants_into_structs() {
+<a href=#2883 id=2883 data-nosnippet>2883</a> <span class="kw">let </span>variant = || Type::Variant(VariantType);
+<a href=#2884 id=2884 data-nosnippet>2884</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#2885 id=2885 data-nosnippet>2885</a> .with_fields(<span class="macro">vec!</span>[
+<a href=#2886 id=2886 data-nosnippet>2886</a> NestedField::optional(<span class="number">1</span>, <span class="string">"v"</span>, variant()).into(),
+<a href=#2887 id=2887 data-nosnippet>2887</a> NestedField::optional(
+<a href=#2888 id=2888 data-nosnippet>2888</a> <span class="number">2</span>,
+<a href=#2889 id=2889 data-nosnippet>2889</a> <span class="string">"l"</span>,
+<a href=#2890 id=2890 data-nosnippet>2890</a> Type::List(ListType::new(
+<a href=#2891 id=2891 data-nosnippet>2891</a> NestedField::list_element(<span class="number">3</span>, variant(), <span class="bool-val">false</span>).into(),
+<a href=#2892 id=2892 data-nosnippet>2892</a> )),
+<a href=#2893 id=2893 data-nosnippet>2893</a> )
+<a href=#2894 id=2894 data-nosnippet>2894</a> .into(),
+<a href=#2895 id=2895 data-nosnippet>2895</a> NestedField::optional(
+<a href=#2896 id=2896 data-nosnippet>2896</a> <span class="number">4</span>,
+<a href=#2897 id=2897 data-nosnippet>2897</a> <span class="string">"m"</span>,
+<a href=#2898 id=2898 data-nosnippet>2898</a> Type::Map(MapType::new(
+<a href=#2899 id=2899 data-nosnippet>2899</a> NestedField::map_key_element(<span class="number">5</span>, Type::Primitive(PrimitiveType::String))
+<a href=#2900 id=2900 data-nosnippet>2900</a> .into(),
+<a href=#2901 id=2901 data-nosnippet>2901</a> NestedField::map_value_element(<span class="number">6</span>, variant(), <span class="bool-val">false</span>).into(),
+<a href=#2902 id=2902 data-nosnippet>2902</a> )),
+<a href=#2903 id=2903 data-nosnippet>2903</a> )
+<a href=#2904 id=2904 data-nosnippet>2904</a> .into(),
+<a href=#2905 id=2905 data-nosnippet>2905</a> ])
+<a href=#2906 id=2906 data-nosnippet>2906</a> .build()
+<a href=#2907 id=2907 data-nosnippet>2907</a> .unwrap();
+<a href=#2908 id=2908 data-nosnippet>2908</a>
+<a href=#2909 id=2909 data-nosnippet>2909</a> <span class="kw">let </span>storage = || {
+<a href=#2910 id=2910 data-nosnippet>2910</a> DataType::Struct(Fields::from(<span class="macro">vec!</span>[
+<a href=#2911 id=2911 data-nosnippet>2911</a> Field::new(<span class="string">"metadata"</span>, DataType::Binary, <span class="bool-val">false</span>),
+<a href=#2912 id=2912 data-nosnippet>2912</a> Field::new(<span class="string">"value"</span>, DataType::Binary, <span class="bool-val">true</span>),
+<a href=#2913 id=2913 data-nosnippet>2913</a> ]))
+<a href=#2914 id=2914 data-nosnippet>2914</a> };
+<a href=#2915 id=2915 data-nosnippet>2915</a> <span class="kw">let </span>entries = Fields::from(<span class="macro">vec!</span>[
+<a href=#2916 id=2916 data-nosnippet>2916</a> Field::new(MAP_KEY_FIELD_NAME, DataType::Utf8, <span class="bool-val">false</span>),
+<a href=#2917 id=2917 data-nosnippet>2917</a> Field::new(MAP_VALUE_FIELD_NAME, storage(), <span class="bool-val">true</span>),
+<a href=#2918 id=2918 data-nosnippet>2918</a> ]);
+<a href=#2919 id=2919 data-nosnippet>2919</a> <span class="kw">let </span>entries = Field::new(DEFAULT_MAP_FIELD_NAME, DataType::Struct(entries), <span class="bool-val">false</span>);
+<a href=#2920 id=2920 data-nosnippet>2920</a> <span class="kw">let </span>expected = ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2921 id=2921 data-nosnippet>2921</a> Field::new(<span class="string">"v"</span>, storage(), <span class="bool-val">true</span>),
+<a href=#2922 id=2922 data-nosnippet>2922</a> Field::new(
+<a href=#2923 id=2923 data-nosnippet>2923</a> <span class="string">"l"</span>,
+<a href=#2924 id=2924 data-nosnippet>2924</a> DataType::List(Arc::new(Field::new(LIST_FIELD_NAME, storage(), <span class="bool-val">true</span>))),
+<a href=#2925 id=2925 data-nosnippet>2925</a> <span class="bool-val">true</span>,
+<a href=#2926 id=2926 data-nosnippet>2926</a> ),
+<a href=#2927 id=2927 data-nosnippet>2927</a> Field::new(<span class="string">"m"</span>, DataType::Map(Arc::new(entries), <span class="bool-val">false</span>), <span class="bool-val">true</span>),
+<a href=#2928 id=2928 data-nosnippet>2928</a> ]);
+<a href=#2929 id=2929 data-nosnippet>2929</a>
+<a href=#2930 id=2930 data-nosnippet>2930</a> <span class="macro">pretty_assertions::assert_eq!</span>(
+<a href=#2931 id=2931 data-nosnippet>2931</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema_to_arrow_schema(<span class="kw-2">&</span>schema).unwrap()).unwrap(),
+<a href=#2932 id=2932 data-nosnippet>2932</a> expected
+<a href=#2933 id=2933 data-nosnippet>2933</a> );
+<a href=#2934 id=2934 data-nosnippet>2934</a> }
+<a href=#2935 id=2935 data-nosnippet>2935</a>
+<a href=#2936 id=2936 data-nosnippet>2936</a> <span class="doccomment">/// A dictionary-encoded field compares equal to a plain field of its value
+<a href=#2937 id=2937 data-nosnippet>2937</a> /// type once stripped, at any depth.
+<a href=#2938 id=2938 data-nosnippet>2938</a> </span><span class="attr">#[test]
+<a href=#2939 id=2939 data-nosnippet>2939</a> </span><span class="kw">fn </span>test_strip_metadata_unwraps_dictionaries() {
+<a href=#2940 id=2940 data-nosnippet>2940</a> <span class="kw">let </span>schema = |dictionary_encoded: bool| {
+<a href=#2941 id=2941 data-nosnippet>2941</a> <span class="kw">let </span>maybe_dictionary = |key: DataType, value: DataType| {
+<a href=#2942 id=2942 data-nosnippet>2942</a> <span class="kw">if </span>dictionary_encoded {
+<a href=#2943 id=2943 data-nosnippet>2943</a> DataType::Dictionary(Box::new(key), Box::new(value))
+<a href=#2944 id=2944 data-nosnippet>2944</a> } <span class="kw">else </span>{
+<a href=#2945 id=2945 data-nosnippet>2945</a> value
+<a href=#2946 id=2946 data-nosnippet>2946</a> }
+<a href=#2947 id=2947 data-nosnippet>2947</a> };
+<a href=#2948 id=2948 data-nosnippet>2948</a> <span class="kw">let </span>element = Field::new(
+<a href=#2949 id=2949 data-nosnippet>2949</a> LIST_FIELD_NAME,
+<a href=#2950 id=2950 data-nosnippet>2950</a> maybe_dictionary(DataType::Int8, DataType::LargeUtf8),
+<a href=#2951 id=2951 data-nosnippet>2951</a> <span class="bool-val">false</span>,
+<a href=#2952 id=2952 data-nosnippet>2952</a> );
+<a href=#2953 id=2953 data-nosnippet>2953</a> ArrowSchema::new(<span class="macro">vec!</span>[
+<a href=#2954 id=2954 data-nosnippet>2954</a> Field::new(<span class="string">"d"</span>, maybe_dictionary(DataType::Int32, DataType::Utf8), <span class="bool-val">true</span>),
+<a href=#2955 id=2955 data-nosnippet>2955</a> Field::new(<span class="string">"l"</span>, DataType::List(Arc::new(element)), <span class="bool-val">true</span>),
+<a href=#2956 id=2956 data-nosnippet>2956</a> ])
+<a href=#2957 id=2957 data-nosnippet>2957</a> };
+<a href=#2958 id=2958 data-nosnippet>2958</a>
+<a href=#2959 id=2959 data-nosnippet>2959</a> <span class="macro">pretty_assertions::assert_eq!</span>(
+<a href=#2960 id=2960 data-nosnippet>2960</a> strip_metadata_from_schema(<span class="kw-2">&</span>schema(<span class="bool-val">true</span>)).unwrap(),
+<a href=#2961 id=2961 data-nosnippet>2961</a> schema(<span class="bool-val">false</span>)
+<a href=#2962 id=2962 data-nosnippet>2962</a> );
+<a href=#2963 id=2963 data-nosnippet>2963</a> }
+<a href=#2964 id=2964 data-nosnippet>2964</a>}
</code></pre></div></section></main></body></html>
\ No newline at end of file