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

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


The following commit(s) were added to refs/heads/main by this push:
     new de32fc86f feat: Override MapBuilder values field with expected schema 
(#1643)
de32fc86f is described below

commit de32fc86f78d9243a7d22506c5656176cdbf74c0
Author: Oleks V <comph...@users.noreply.github.com>
AuthorDate: Mon Apr 14 09:30:29 2025 -0700

    feat: Override MapBuilder values field with expected schema (#1643)
    
    * feat: Override MapBuilder values field with expected schema
    
    * fmt
---
 native/core/src/execution/shuffle/map.rs           |   26 +-
 native/core/src/execution/shuffle/row.rs           | 1314 +++++++++-----------
 .../apache/comet/exec/CometNativeReaderSuite.scala |   13 +-
 3 files changed, 601 insertions(+), 752 deletions(-)

diff --git a/native/core/src/execution/shuffle/map.rs 
b/native/core/src/execution/shuffle/map.rs
index 0ad8dafa2..c07bd95e2 100644
--- a/native/core/src/execution/shuffle/map.rs
+++ b/native/core/src/execution/shuffle/map.rs
@@ -1925,10 +1925,10 @@ pub fn append_map_elements<K: ArrayBuilder, V: 
ArrayBuilder>(
     map_builder: &mut MapBuilder<K, V>,
     map: &SparkUnsafeMap,
 ) -> Result<(), CometError> {
-    let (key_dt, value_dt, _) = get_map_key_value_dt(field)?;
+    let (key_field, value_field, _) = get_map_key_value_fields(field)?;
 
     // macro cannot expand to match arm
-    match (key_dt, value_dt) {
+    match (key_field.data_type(), value_field.data_type()) {
         (DataType::Boolean, DataType::Boolean) => {
             let map_builder =
                 downcast_builder_ref!(MapBuilder<BooleanBuilder, 
BooleanBuilder>, map_builder);
@@ -2823,7 +2823,8 @@ pub fn append_map_elements<K: ArrayBuilder, V: 
ArrayBuilder>(
         _ => {
             return Err(CometError::Internal(format!(
                 "Unsupported map key/value data type: {:?}/{:?}",
-                key_dt, value_dt
+                key_field.data_type(),
+                value_field.data_type()
             )))
         }
     }
@@ -2832,13 +2833,13 @@ pub fn append_map_elements<K: ArrayBuilder, V: 
ArrayBuilder>(
 }
 
 #[allow(clippy::field_reassign_with_default)]
-pub fn get_map_key_value_dt(
+pub fn get_map_key_value_fields(
     field: &FieldRef,
-) -> Result<(&DataType, &DataType, MapFieldNames), CometError> {
+) -> Result<(&FieldRef, &FieldRef, MapFieldNames), CometError> {
     let mut map_fieldnames = MapFieldNames::default();
     map_fieldnames.entry = field.name().to_string();
 
-    let (key_dt, value_dt) = match field.data_type() {
+    let (key_field, value_field) = match field.data_type() {
         DataType::Struct(fields) => {
             if fields.len() != 2 {
                 return Err(CometError::Internal(format!(
@@ -2847,12 +2848,13 @@ pub fn get_map_key_value_dt(
                 )));
             }
 
-            map_fieldnames.key = fields[0].name().to_string();
-            map_fieldnames.value = fields[1].name().to_string();
+            let key = &fields[0];
+            let value = &fields[1];
 
-            let key_dt = fields[0].data_type();
-            let value_dt = fields[1].data_type();
-            (key_dt, value_dt)
+            map_fieldnames.key = key.name().to_string();
+            map_fieldnames.value = value.name().to_string();
+
+            (key, value)
         }
         _ => {
             return Err(CometError::Internal(format!(
@@ -2862,5 +2864,5 @@ pub fn get_map_key_value_dt(
         }
     };
 
-    Ok((key_dt, value_dt, map_fieldnames))
+    Ok((key_field, value_field, map_fieldnames))
 }
diff --git a/native/core/src/execution/shuffle/row.rs 
b/native/core/src/execution/shuffle/row.rs
index 6fa6259ef..91dc915f7 100644
--- a/native/core/src/execution/shuffle/row.rs
+++ b/native/core/src/execution/shuffle/row.rs
@@ -23,7 +23,7 @@ use crate::{
         shuffle::{
             codec::{Checksum, ShuffleBlockWriter},
             list::{append_list_element, SparkUnsafeArray},
-            map::{append_map_elements, get_map_key_value_dt, SparkUnsafeMap},
+            map::{append_map_elements, get_map_key_value_fields, 
SparkUnsafeMap},
         },
         utils::bytes_to_i128,
     },
@@ -466,10 +466,10 @@ pub(crate) fn append_field(
             }
         }
         DataType::Map(field, _) => {
-            let (key_dt, value_dt, _) = get_map_key_value_dt(field).unwrap();
+            let (key_field, value_field, _) = get_map_key_value_fields(field)?;
 
             // macro cannot expand to match arm
-            match (key_dt, value_dt) {
+            match (key_field.data_type(), value_field.data_type()) {
                 (DataType::Boolean, DataType::Boolean) => {
                     append_map_element!(BooleanBuilder, BooleanBuilder, field);
                 }
@@ -987,7 +987,8 @@ pub(crate) fn append_field(
                 _ => {
                     unreachable!(
                         "Unsupported data type of map key and value: {:?} and 
{:?}",
-                        key_dt, value_dt
+                        key_field.data_type(),
+                        value_field.data_type()
                     )
                 }
             }
@@ -1286,10 +1287,10 @@ pub(crate) fn append_columns(
             );
         }
         DataType::Map(field, _) => {
-            let (key_dt, value_dt, _) = get_map_key_value_dt(field)?;
+            let (key_field, value_field, _) = get_map_key_value_fields(field)?;
 
             // macro cannot expand to match arm
-            match (key_dt, value_dt) {
+            match (key_field.data_type(), value_field.data_type()) {
                 (DataType::Boolean, DataType::Boolean) => {
                     append_column_to_map_builder!(BooleanBuilder, 
BooleanBuilder, field)
                 }
@@ -1865,8 +1866,9 @@ fn make_builders(
             
Box::new(TimestampMicrosecondBuilder::with_capacity(row_num).with_data_type(dt.clone()))
         }
         DataType::Map(field, _) => {
-            let (key_dt, value_dt, map_fieldnames) = 
get_map_key_value_dt(field)?;
-
+            let (key_field, value_field, map_field_names) = 
get_map_key_value_fields(field)?;
+            let key_dt = key_field.data_type();
+            let value_dt = value_field.data_type();
             let key_builder = make_builders(key_dt, 
NESTED_TYPE_BUILDER_CAPACITY, 1.0)?;
             let value_builder = make_builders(value_dt, 
NESTED_TYPE_BUILDER_CAPACITY, 1.0)?;
 
@@ -1876,937 +1878,834 @@ fn make_builders(
                 (DataType::Boolean, DataType::Boolean) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Int8) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Int16) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Int32) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Int64) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Float32) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Float64) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Date32) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Binary) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Utf8) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Boolean, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(BooleanBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Int8) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Int16) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Int32) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Int64) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Float32) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Float64) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Date32) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Binary) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int8, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Int8Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Int8) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Int16) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Int32) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Int64) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Float32) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Float64) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Date32) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Binary) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int16, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Int16Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Int8) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Int16) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Int32) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Int64) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Float32) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Float64) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Date32) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Binary) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int32, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Int32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Int8) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Int16) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Int32) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Int64) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Float32) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Float64) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Date32) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Binary) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Int64, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Int64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Int8) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Int16) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Int32) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Int64) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Float32) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Float64) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Date32) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Binary) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float32, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Float32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Int8) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Int16) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Int32) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Int64) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Float32) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Float64) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Date32) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Binary) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Float64, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Float64Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Boolean) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Int8) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Int16) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Int32) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Int64) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Float32) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Float64) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Date32) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Binary) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Utf8) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Date32, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Date32Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Boolean) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Int8) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Int16) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Int32) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Int64) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Float32) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Float64) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (
                     DataType::Timestamp(TimeUnit::Microsecond, _),
@@ -2815,374 +2714,333 @@ fn make_builders(
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Date32) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Binary) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Utf8) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Timestamp(TimeUnit::Microsecond, _), 
DataType::Decimal128(_, _)) => {
                     let key_builder = 
downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Boolean) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Int8) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Int16) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Int32) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Int64) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Float32) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Float64) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Date32) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Binary) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Utf8) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Binary, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(BinaryBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Boolean) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Int8) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Int16) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Int32) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Int64) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Float32) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Float64) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Timestamp(TimeUnit::Microsecond, 
_)) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Date32) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Binary) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Utf8) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Utf8, DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(StringBuilder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Boolean) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(BooleanBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Int8) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int8Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Int16) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int16Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Int32) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Int64) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Int64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Float32) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Float64) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Float64Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), 
DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder =
                         downcast_builder!(TimestampMicrosecondBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Date32) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Date32Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Binary) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(BinaryBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Utf8) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(StringBuilder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
                 (DataType::Decimal128(_, _), DataType::Decimal128(_, _)) => {
                     let key_builder = downcast_builder!(Decimal128Builder, 
key_builder);
                     let value_builder = downcast_builder!(Decimal128Builder, 
value_builder);
-                    Box::new(MapBuilder::new(
-                        Some(map_fieldnames),
-                        *key_builder,
-                        *value_builder,
-                    ))
+                    Box::new(
+                        MapBuilder::new(Some(map_field_names), *key_builder, 
*value_builder)
+                            .with_values_field(Arc::clone(value_field)),
+                    )
                 }
 
                 _ => {
diff --git 
a/spark/src/test/scala/org/apache/comet/exec/CometNativeReaderSuite.scala 
b/spark/src/test/scala/org/apache/comet/exec/CometNativeReaderSuite.scala
index 4dc4a12ea..d9c71f147 100644
--- a/spark/src/test/scala/org/apache/comet/exec/CometNativeReaderSuite.scala
+++ b/spark/src/test/scala/org/apache/comet/exec/CometNativeReaderSuite.scala
@@ -171,18 +171,7 @@ class CometNativeReaderSuite extends CometTestBase with 
AdaptiveSparkPlanHelper
       "select c0 from tbl")
   }
 
-  /*
-    org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 
in stage 171.0 failed 1 times, most recent failure:
-    Lost task 1.0 in stage 171.0 (TID 179) (knode0099.cngya03.pie.silu.net 
executor driver): org.apache.comet.CometNativeException: called 
`Result::unwrap()`
-    on an `Err` value: InvalidArgumentError("Incorrect datatype for 
StructArray field \"m0\", expected Map(Field { name: \"entries\",
-    data_type: Struct([Field { name: \"key\", data_type: Utf8, nullable: 
false, dict_id: 0, dict_is_ordered: false, metadata: {} },
-    Field { name: \"value\", data_type: Int32, nullable: false, dict_id: 0, 
dict_is_ordered: false, metadata: {} }]),
-    nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, 
false) got Map(Field { name: \"entries\", d
-    ata_type: Struct([Field { name: \"key\", data_type: Utf8, nullable: false, 
dict_id: 0, dict_is_ordered: false, metadata: {} },
-    Field { name: \"value\", data_type: Int32, nullable: true, dict_id: 0, 
dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, 
dict_is_ordered: false, metadata: {} }, false)")
-
-   */
-  ignore("native reader - read STRUCT of MAP fields") {
+  test("native reader - read STRUCT of MAP fields") {
     testSingleLineQuery(
       """
         |select named_struct('m0', map('a', 1)) as c0 union all


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@datafusion.apache.org
For additional commands, e-mail: commits-h...@datafusion.apache.org

Reply via email to