@@ -355,7 +355,7 @@ impl RecordBatch {
355
355
/// assert_eq!(batch.num_columns(), 1);
356
356
/// ```
357
357
pub fn remove_column ( & mut self , index : usize ) -> ArrayRef {
358
- let mut builder = SchemaBuilder :: from ( self . schema . fields ( ) ) ;
358
+ let mut builder = SchemaBuilder :: from ( self . schema . as_ref ( ) ) ;
359
359
builder. remove ( index) ;
360
360
self . schema = Arc :: new ( builder. finish ( ) ) ;
361
361
self . columns . remove ( index)
@@ -618,6 +618,8 @@ where
618
618
619
619
#[ cfg( test) ]
620
620
mod tests {
621
+ use std:: collections:: HashMap ;
622
+
621
623
use super :: * ;
622
624
use crate :: { BooleanArray , Int32Array , Int64Array , Int8Array , ListArray , StringArray } ;
623
625
use arrow_buffer:: { Buffer , ToByteSlice } ;
@@ -1155,4 +1157,31 @@ mod tests {
1155
1157
let size = get_size ( reader) ;
1156
1158
assert_eq ! ( size, 0 ) ;
1157
1159
}
1160
+
1161
+ #[ test]
1162
+ fn test_remove_column_maintains_schema_metadata ( ) {
1163
+ let id_array = Int32Array :: from ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
1164
+ let bool_array = BooleanArray :: from ( vec ! [ true , false , false , true , true ] ) ;
1165
+
1166
+ let mut metadata = HashMap :: new ( ) ;
1167
+ metadata. insert ( "foo" . to_string ( ) , "bar" . to_string ( ) ) ;
1168
+ let schema = Schema :: new ( vec ! [
1169
+ Field :: new( "id" , DataType :: Int32 , false ) ,
1170
+ Field :: new( "bool" , DataType :: Boolean , false ) ,
1171
+ ] )
1172
+ . with_metadata ( metadata) ;
1173
+
1174
+ let mut batch = RecordBatch :: try_new (
1175
+ Arc :: new ( schema) ,
1176
+ vec ! [ Arc :: new( id_array) , Arc :: new( bool_array) ] ,
1177
+ )
1178
+ . unwrap ( ) ;
1179
+
1180
+ let _removed_column = batch. remove_column ( 0 ) ;
1181
+ assert_eq ! ( batch. schema( ) . metadata( ) . len( ) , 1 ) ;
1182
+ assert_eq ! (
1183
+ batch. schema( ) . metadata( ) . get( "foo" ) . unwrap( ) . as_str( ) ,
1184
+ "bar"
1185
+ ) ;
1186
+ }
1158
1187
}
0 commit comments