From 0ca3ab54f265d522c5fdb7497bdc59ce9c072d0c Mon Sep 17 00:00:00 2001 From: camilesing Date: Sun, 2 Nov 2025 15:30:50 +0800 Subject: [PATCH 1/2] fix: panic unwrap on None in decoder.rs --- rust/lance-encoding/src/decoder.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/rust/lance-encoding/src/decoder.rs b/rust/lance-encoding/src/decoder.rs index 70730d21371..781f5ada1a1 100644 --- a/rust/lance-encoding/src/decoder.rs +++ b/rust/lance-encoding/src/decoder.rs @@ -789,7 +789,7 @@ impl CoreFieldDecoderStrategy { let scheduler = self.create_primitive_scheduler(field, column_info, buffers)?; return Ok(scheduler); } else if data_type.is_binary_like() { - let column_info = column_infos.next().unwrap().clone(); + let column_info = column_infos.expect_next()?; // Column is blob and user is asking for binary data if let Some(blob_col) = Self::unwrap_blob(column_info.as_ref()) { let desc_scheduler = @@ -813,18 +813,30 @@ impl CoreFieldDecoderStrategy { false, ))) }; - let list_field = Field::try_from(ArrowField::new( + let list_field_result = Field::try_from(ArrowField::new( field.name.clone(), list_type, field.nullable, - )) - .unwrap(); - let list_scheduler = self.create_list_scheduler( + )); + + if list_field_result.is_err() { + return Err(list_field_result.err().unwrap()); + } + + let list_field = list_field_result?; + let list_scheduler_result = self.create_list_scheduler( &list_field, column_infos, buffers, &column_info, - )?; + ); + + if list_scheduler_result.is_err() { + return Err(list_scheduler_result.err().unwrap()); + } + + let list_scheduler = list_scheduler_result?; + let binary_scheduler = Box::new(BinaryFieldScheduler::new( list_scheduler.into(), field.data_type(), @@ -837,7 +849,7 @@ impl CoreFieldDecoderStrategy { } } else { return self.create_primitive_scheduler(field, &column_info, buffers); - } + }; } match &data_type { DataType::FixedSizeList(inner, _dimension) => { From cb0ecbf8ad5dea08df27a90635a0d52a126d768d Mon Sep 17 00:00:00 2001 From: Will Jones Date: Thu, 11 Dec 2025 09:44:17 -0800 Subject: [PATCH 2/2] add clone and remove unrelated changes --- rust/lance-encoding/src/decoder.rs | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/rust/lance-encoding/src/decoder.rs b/rust/lance-encoding/src/decoder.rs index 53cb4c8419f..a1bc2e93e25 100644 --- a/rust/lance-encoding/src/decoder.rs +++ b/rust/lance-encoding/src/decoder.rs @@ -789,7 +789,7 @@ impl CoreFieldDecoderStrategy { let scheduler = self.create_primitive_scheduler(field, column_info, buffers)?; return Ok(scheduler); } else if data_type.is_binary_like() { - let column_info = column_infos.expect_next()?; + let column_info = column_infos.expect_next()?.clone(); // Column is blob and user is asking for binary data if let Some(blob_col) = Self::unwrap_blob(column_info.as_ref()) { let desc_scheduler = @@ -813,30 +813,18 @@ impl CoreFieldDecoderStrategy { false, ))) }; - let list_field_result = Field::try_from(ArrowField::new( + let list_field = Field::try_from(ArrowField::new( field.name.clone(), list_type, field.nullable, - )); - - if list_field_result.is_err() { - return Err(list_field_result.err().unwrap()); - } - - let list_field = list_field_result?; - let list_scheduler_result = self.create_list_scheduler( + )) + .unwrap(); + let list_scheduler = self.create_list_scheduler( &list_field, column_infos, buffers, &column_info, - ); - - if list_scheduler_result.is_err() { - return Err(list_scheduler_result.err().unwrap()); - } - - let list_scheduler = list_scheduler_result?; - + )?; let binary_scheduler = Box::new(BinaryFieldScheduler::new( list_scheduler.into(), field.data_type(), @@ -849,7 +837,7 @@ impl CoreFieldDecoderStrategy { } } else { return self.create_primitive_scheduler(field, &column_info, buffers); - }; + } } match &data_type { DataType::FixedSizeList(inner, _dimension) => {