Validates the layout of `child_data` ArrayData structures
(&self)
| 1123 | |
| 1124 | /// Validates the layout of `child_data` ArrayData structures |
| 1125 | fn validate_child_data(&self) -> Result<(), ArrowError> { |
| 1126 | match &self.data_type { |
| 1127 | DataType::List(field) | DataType::Map(field, _) => { |
| 1128 | let values_data = self.get_single_valid_child_data(field.data_type())?; |
| 1129 | self.validate_offsets::<i32>(values_data.len)?; |
| 1130 | Ok(()) |
| 1131 | } |
| 1132 | DataType::LargeList(field) => { |
| 1133 | let values_data = self.get_single_valid_child_data(field.data_type())?; |
| 1134 | self.validate_offsets::<i64>(values_data.len)?; |
| 1135 | Ok(()) |
| 1136 | } |
| 1137 | DataType::ListView(field) => { |
| 1138 | let values_data = self.get_single_valid_child_data(field.data_type())?; |
| 1139 | self.validate_offsets_and_sizes::<i32>(values_data.len)?; |
| 1140 | Ok(()) |
| 1141 | } |
| 1142 | DataType::LargeListView(field) => { |
| 1143 | let values_data = self.get_single_valid_child_data(field.data_type())?; |
| 1144 | self.validate_offsets_and_sizes::<i64>(values_data.len)?; |
| 1145 | Ok(()) |
| 1146 | } |
| 1147 | DataType::FixedSizeList(field, list_size) => { |
| 1148 | let values_data = self.get_single_valid_child_data(field.data_type())?; |
| 1149 | |
| 1150 | let list_size: usize = (*list_size).try_into().map_err(|_| { |
| 1151 | ArrowError::InvalidArgumentError(format!( |
| 1152 | "{} has a negative list_size {}", |
| 1153 | self.data_type, list_size |
| 1154 | )) |
| 1155 | })?; |
| 1156 | |
| 1157 | let expected_values_len = self.len |
| 1158 | .checked_mul(list_size) |
| 1159 | .expect("integer overflow computing expected number of expected values in FixedListSize"); |
| 1160 | |
| 1161 | if values_data.len < expected_values_len { |
| 1162 | return Err(ArrowError::InvalidArgumentError(format!( |
| 1163 | "Values length {} is less than the length ({}) multiplied by the value size ({}) for {}", |
| 1164 | values_data.len, self.len, list_size, self.data_type |
| 1165 | ))); |
| 1166 | } |
| 1167 | |
| 1168 | Ok(()) |
| 1169 | } |
| 1170 | DataType::Struct(fields) => { |
| 1171 | self.validate_num_child_data(fields.len())?; |
| 1172 | for (i, field) in fields.iter().enumerate() { |
| 1173 | let field_data = self.get_valid_child_data(i, field.data_type())?; |
| 1174 | |
| 1175 | // Ensure child field has sufficient size |
| 1176 | if field_data.len < self.len { |
| 1177 | return Err(ArrowError::InvalidArgumentError(format!( |
| 1178 | "{} child array #{} for field {} has length smaller than expected for struct array ({} < {})", |
| 1179 | self.data_type, |
| 1180 | i, |
| 1181 | field.name(), |
| 1182 | field_data.len, |
no test coverage detected