From 03ae73b213fa9703b25cb2cccded8c396259a73c Mon Sep 17 00:00:00 2001 From: Ryan Johnson Date: Mon, 26 Jan 2026 10:54:36 -0800 Subject: [PATCH 1/3] make_decoder accepts borrowed DataType instead of owned --- arrow-json/src/reader/list_array.rs | 8 ++++---- arrow-json/src/reader/map_array.rs | 10 +++++----- arrow-json/src/reader/mod.rs | 20 ++++++++++---------- arrow-json/src/reader/primitive_array.rs | 4 ++-- arrow-json/src/reader/struct_array.rs | 8 ++++---- arrow-json/src/reader/timestamp_array.rs | 4 ++-- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/arrow-json/src/reader/list_array.rs b/arrow-json/src/reader/list_array.rs index e74fef79178a..c4b659288df7 100644 --- a/arrow-json/src/reader/list_array.rs +++ b/arrow-json/src/reader/list_array.rs @@ -34,19 +34,19 @@ pub struct ListArrayDecoder { impl ListArrayDecoder { pub fn new( - data_type: DataType, + data_type: &DataType, coerce_primitive: bool, strict_mode: bool, is_nullable: bool, struct_mode: StructMode, ) -> Result { - let field = match &data_type { + let field = match data_type { DataType::List(f) if !O::IS_LARGE => f, DataType::LargeList(f) if O::IS_LARGE => f, _ => unreachable!(), }; let decoder = make_decoder( - field.data_type().clone(), + field.data_type(), coerce_primitive, strict_mode, field.is_nullable(), @@ -54,7 +54,7 @@ impl ListArrayDecoder { )?; Ok(Self { - data_type, + data_type: data_type.clone(), decoder, phantom: Default::default(), is_nullable, diff --git a/arrow-json/src/reader/map_array.rs b/arrow-json/src/reader/map_array.rs index c2068577a094..a70eea1f5749 100644 --- a/arrow-json/src/reader/map_array.rs +++ b/arrow-json/src/reader/map_array.rs @@ -33,13 +33,13 @@ pub struct MapArrayDecoder { impl MapArrayDecoder { pub fn new( - data_type: DataType, + data_type: &DataType, coerce_primitive: bool, strict_mode: bool, is_nullable: bool, struct_mode: StructMode, ) -> Result { - let fields = match &data_type { + let fields = match data_type { DataType::Map(_, true) => { return Err(ArrowError::NotYetImplemented( "Decoding MapArray with sorted fields".to_string(), @@ -57,14 +57,14 @@ impl MapArrayDecoder { }; let keys = make_decoder( - fields[0].data_type().clone(), + fields[0].data_type(), coerce_primitive, strict_mode, fields[0].is_nullable(), struct_mode, )?; let values = make_decoder( - fields[1].data_type().clone(), + fields[1].data_type(), coerce_primitive, strict_mode, fields[1].is_nullable(), @@ -72,7 +72,7 @@ impl MapArrayDecoder { )?; Ok(Self { - data_type, + data_type: data_type.clone(), keys, values, is_nullable, diff --git a/arrow-json/src/reader/mod.rs b/arrow-json/src/reader/mod.rs index f5fd1a8e7c38..dc65f1014f5f 100644 --- a/arrow-json/src/reader/mod.rs +++ b/arrow-json/src/reader/mod.rs @@ -137,6 +137,7 @@ use crate::StructMode; use crate::reader::binary_array::{ BinaryArrayDecoder, BinaryViewDecoder, FixedSizeBinaryArrayDecoder, }; +use std::borrow::Cow; use std::io::BufRead; use std::sync::Arc; @@ -295,16 +296,15 @@ impl ReaderBuilder { /// Create a [`Decoder`] pub fn build_decoder(self) -> Result { - let (data_type, nullable) = match self.is_field { - false => (DataType::Struct(self.schema.fields.clone()), false), - true => { - let field = &self.schema.fields[0]; - (field.data_type().clone(), field.is_nullable()) - } + let (data_type, nullable) = if self.is_field { + let field = &self.schema.fields[0]; + (Cow::Borrowed(field.data_type()), field.is_nullable()) + } else { + (Cow::Owned(DataType::Struct(self.schema.fields.clone())), false) }; let decoder = make_decoder( - data_type, + data_type.as_ref(), self.coerce_primitive, self.strict_mode, nullable, @@ -686,14 +686,14 @@ macro_rules! primitive_decoder { } fn make_decoder( - data_type: DataType, + data_type: &DataType, coerce_primitive: bool, strict_mode: bool, is_nullable: bool, struct_mode: StructMode, ) -> Result, ArrowError> { downcast_integer! { - data_type => (primitive_decoder, data_type), + *data_type => (primitive_decoder, data_type), DataType::Null => Ok(Box::::default()), DataType::Float16 => primitive_decoder!(Float16Type, data_type), DataType::Float32 => primitive_decoder!(Float32Type, data_type), @@ -752,7 +752,7 @@ fn make_decoder( DataType::FixedSizeBinary(len) => Ok(Box::new(FixedSizeBinaryArrayDecoder::new(len))), DataType::BinaryView => Ok(Box::new(BinaryViewDecoder::default())), DataType::Map(_, _) => Ok(Box::new(MapArrayDecoder::new(data_type, coerce_primitive, strict_mode, is_nullable, struct_mode)?)), - d => Err(ArrowError::NotYetImplemented(format!("Support for {d} in JSON reader"))) + _ => Err(ArrowError::NotYetImplemented(format!("Support for {data_type} in JSON reader"))) } } diff --git a/arrow-json/src/reader/primitive_array.rs b/arrow-json/src/reader/primitive_array.rs index fa8464aa3251..b2bffe45e43a 100644 --- a/arrow-json/src/reader/primitive_array.rs +++ b/arrow-json/src/reader/primitive_array.rs @@ -80,9 +80,9 @@ pub struct PrimitiveArrayDecoder { } impl PrimitiveArrayDecoder

{ - pub fn new(data_type: DataType) -> Self { + pub fn new(data_type: &DataType) -> Self { Self { - data_type, + data_type: data_type.clone(), phantom: Default::default(), } } diff --git a/arrow-json/src/reader/struct_array.rs b/arrow-json/src/reader/struct_array.rs index df0d5b8a5b83..f658abbad3f7 100644 --- a/arrow-json/src/reader/struct_array.rs +++ b/arrow-json/src/reader/struct_array.rs @@ -80,14 +80,14 @@ pub struct StructArrayDecoder { impl StructArrayDecoder { pub fn new( - data_type: DataType, + data_type: &DataType, coerce_primitive: bool, strict_mode: bool, is_nullable: bool, struct_mode: StructMode, ) -> Result { let (decoders, field_name_to_index) = { - let fields = struct_fields(&data_type); + let fields = struct_fields(data_type); let decoders = fields .iter() .map(|f| { @@ -96,7 +96,7 @@ impl StructArrayDecoder { // it doesn't contain any nulls not masked by its parent let nullable = f.is_nullable() || is_nullable; make_decoder( - f.data_type().clone(), + f.data_type(), coerce_primitive, strict_mode, nullable, @@ -113,7 +113,7 @@ impl StructArrayDecoder { }; Ok(Self { - data_type, + data_type: data_type.clone(), decoders, strict_mode, is_nullable, diff --git a/arrow-json/src/reader/timestamp_array.rs b/arrow-json/src/reader/timestamp_array.rs index 79f2b04eeba8..ff24d5391f9d 100644 --- a/arrow-json/src/reader/timestamp_array.rs +++ b/arrow-json/src/reader/timestamp_array.rs @@ -37,9 +37,9 @@ pub struct TimestampArrayDecoder { } impl TimestampArrayDecoder { - pub fn new(data_type: DataType, timezone: Tz) -> Self { + pub fn new(data_type: &DataType, timezone: Tz) -> Self { Self { - data_type, + data_type: data_type.clone(), timezone, phantom: Default::default(), } From b558aaef170b43fa38316962f02facff133f1996 Mon Sep 17 00:00:00 2001 From: Ryan Johnson Date: Mon, 26 Jan 2026 13:12:56 -0800 Subject: [PATCH 2/3] fmt --- arrow-json/src/reader/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arrow-json/src/reader/mod.rs b/arrow-json/src/reader/mod.rs index dc65f1014f5f..9600f89922b5 100644 --- a/arrow-json/src/reader/mod.rs +++ b/arrow-json/src/reader/mod.rs @@ -300,7 +300,8 @@ impl ReaderBuilder { let field = &self.schema.fields[0]; (Cow::Borrowed(field.data_type()), field.is_nullable()) } else { - (Cow::Owned(DataType::Struct(self.schema.fields.clone())), false) + let data_type = DataType::Struct(self.schema.fields.clone()); + (Cow::Owned(data_type), false) }; let decoder = make_decoder( From 6e2340dd57c44066d095b6ef09fa294ddb57f645 Mon Sep 17 00:00:00 2001 From: Ryan Johnson Date: Mon, 26 Jan 2026 13:59:32 -0800 Subject: [PATCH 3/3] cleanup --- arrow-json/src/reader/mod.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arrow-json/src/reader/mod.rs b/arrow-json/src/reader/mod.rs index 9600f89922b5..4765141b977a 100644 --- a/arrow-json/src/reader/mod.rs +++ b/arrow-json/src/reader/mod.rs @@ -298,10 +298,11 @@ impl ReaderBuilder { pub fn build_decoder(self) -> Result { let (data_type, nullable) = if self.is_field { let field = &self.schema.fields[0]; - (Cow::Borrowed(field.data_type()), field.is_nullable()) + let data_type = Cow::Borrowed(field.data_type()); + (data_type, field.is_nullable()) } else { - let data_type = DataType::Struct(self.schema.fields.clone()); - (Cow::Owned(data_type), false) + let data_type = Cow::Owned(DataType::Struct(self.schema.fields.clone())); + (data_type, false) }; let decoder = make_decoder(