@@ -233,6 +233,7 @@ fn build_extend_dictionary(
233233fn  build_extend ( array :  & ArrayData )  -> Extend  { 
234234    use  crate :: datatypes:: * ; 
235235    match  array. data_type ( )  { 
236+         DataType :: Decimal ( _,  _)  => primitive:: build_extend :: < i128 > ( array) , 
236237        DataType :: Null  => null:: build_extend ( array) , 
237238        DataType :: Boolean  => boolean:: build_extend ( array) , 
238239        DataType :: UInt8  => primitive:: build_extend :: < u8 > ( array) , 
@@ -281,6 +282,7 @@ fn build_extend(array: &ArrayData) -> Extend {
281282fn  build_extend_nulls ( data_type :  & DataType )  -> ExtendNulls  { 
282283    use  crate :: datatypes:: * ; 
283284    Box :: new ( match  data_type { 
285+         DataType :: Decimal ( _,  _)  => primitive:: extend_nulls :: < i128 > , 
284286        DataType :: Null  => null:: extend_nulls, 
285287        DataType :: Boolean  => boolean:: extend_nulls, 
286288        DataType :: UInt8  => primitive:: extend_nulls :: < u8 > , 
@@ -423,7 +425,8 @@ impl<'a> MutableArrayData<'a> {
423425        } ; 
424426
425427        let  child_data = match  & data_type { 
426-             DataType :: Null 
428+             DataType :: Decimal ( _,  _) 
429+             | DataType :: Null 
427430            | DataType :: Boolean 
428431            | DataType :: UInt8 
429432            | DataType :: UInt16 
@@ -656,6 +659,7 @@ mod tests {
656659
657660    use  super :: * ; 
658661
662+     use  crate :: array:: { DecimalArray ,  DecimalBuilder } ; 
659663    use  crate :: { 
660664        array:: { 
661665            Array ,  ArrayData ,  ArrayRef ,  BooleanArray ,  DictionaryArray , 
@@ -671,6 +675,72 @@ mod tests {
671675        error:: Result , 
672676    } ; 
673677
678+     fn  create_decimal_array ( 
679+         array :  & [ Option < i128 > ] , 
680+         precision :  usize , 
681+         scale :  usize , 
682+     )  -> DecimalArray  { 
683+         let  mut  decimal_builder = DecimalBuilder :: new ( array. len ( ) ,  precision,  scale) ; 
684+         for  value in  array { 
685+             match  value { 
686+                 None  => { 
687+                     decimal_builder. append_null ( ) . unwrap ( ) ; 
688+                 } 
689+                 Some ( v)  => { 
690+                     decimal_builder. append_value ( * v) . unwrap ( ) ; 
691+                 } 
692+             } 
693+         } 
694+         decimal_builder. finish ( ) 
695+     } 
696+ 
697+     #[ test]  
698+     fn  test_decimal ( )  { 
699+         let  decimal_array =
700+             create_decimal_array ( & [ Some ( 1 ) ,  Some ( 2 ) ,  None ,  Some ( 3 ) ] ,  10 ,  3 ) ; 
701+         let  arrays = vec ! [ decimal_array. data( ) ] ; 
702+         let  mut  a = MutableArrayData :: new ( arrays,  true ,  3 ) ; 
703+         a. extend ( 0 ,  0 ,  3 ) ; 
704+         a. extend ( 0 ,  2 ,  3 ) ; 
705+         let  result = a. freeze ( ) ; 
706+         let  array = DecimalArray :: from ( result) ; 
707+         let  expected = create_decimal_array ( & [ Some ( 1 ) ,  Some ( 2 ) ,  None ,  None ] ,  10 ,  3 ) ; 
708+         assert_eq ! ( array,  expected) ; 
709+     } 
710+     #[ test]  
711+     fn  test_decimal_offset ( )  { 
712+         let  decimal_array =
713+             create_decimal_array ( & [ Some ( 1 ) ,  Some ( 2 ) ,  None ,  Some ( 3 ) ] ,  10 ,  3 ) ; 
714+         let  decimal_array = decimal_array. slice ( 1 ,  3 ) ;  // 2, null, 3 
715+         let  arrays = vec ! [ decimal_array. data( ) ] ; 
716+         let  mut  a = MutableArrayData :: new ( arrays,  true ,  2 ) ; 
717+         a. extend ( 0 ,  0 ,  2 ) ;  // 2, null 
718+         let  result = a. freeze ( ) ; 
719+         let  array = DecimalArray :: from ( result) ; 
720+         let  expected = create_decimal_array ( & [ Some ( 2 ) ,  None ] ,  10 ,  3 ) ; 
721+         assert_eq ! ( array,  expected) ; 
722+     } 
723+ 
724+     #[ test]  
725+     fn  test_decimal_null_offset_nulls ( )  { 
726+         let  decimal_array =
727+             create_decimal_array ( & [ Some ( 1 ) ,  Some ( 2 ) ,  None ,  Some ( 3 ) ] ,  10 ,  3 ) ; 
728+         let  decimal_array = decimal_array. slice ( 1 ,  3 ) ;  // 2, null, 3 
729+         let  arrays = vec ! [ decimal_array. data( ) ] ; 
730+         let  mut  a = MutableArrayData :: new ( arrays,  true ,  2 ) ; 
731+         a. extend ( 0 ,  0 ,  2 ) ;  // 2, null 
732+         a. extend_nulls ( 3 ) ;  // 2, null, null, null, null 
733+         a. extend ( 0 ,  1 ,  3 ) ;  //2, null, null, null, null, null, 3 
734+         let  result = a. freeze ( ) ; 
735+         let  array = DecimalArray :: from ( result) ; 
736+         let  expected = create_decimal_array ( 
737+             & [ Some ( 2 ) ,  None ,  None ,  None ,  None ,  None ,  Some ( 3 ) ] , 
738+             10 , 
739+             3 , 
740+         ) ; 
741+         assert_eq ! ( array,  expected) ; 
742+     } 
743+ 
674744    /// tests extending from a primitive array w/ offset nor nulls 
675745#[ test]  
676746    fn  test_primitive ( )  { 
0 commit comments