@@ -2,12 +2,14 @@ use arrow_array::builder::make_view;
22use arrow_buffer:: { BooleanBuffer , BufferBuilder } ;
33use vortex_buffer:: Buffer ;
44use vortex_dtype:: { match_each_native_ptype, DType , Nullability , PType } ;
5- use vortex_error:: { vortex_bail, VortexResult } ;
6- use vortex_scalar:: { BinaryScalar , BoolScalar , Utf8Scalar } ;
5+ use vortex_error:: { vortex_bail, vortex_panic , VortexResult } ;
6+ use vortex_scalar:: { BinaryScalar , BoolScalar , ExtScalar , Scalar , Utf8Scalar } ;
77
88use crate :: array:: constant:: ConstantArray ;
99use crate :: array:: primitive:: PrimitiveArray ;
10- use crate :: array:: { BinaryView , BoolArray , NullArray , VarBinViewArray , VIEW_SIZE_BYTES } ;
10+ use crate :: array:: {
11+ BinaryView , BoolArray , ExtensionArray , NullArray , VarBinViewArray , VIEW_SIZE_BYTES ,
12+ } ;
1113use crate :: validity:: Validity ;
1214use crate :: { ArrayDType , Canonical , IntoArrayData , IntoCanonical } ;
1315
@@ -63,6 +65,17 @@ impl IntoCanonical for ConstantArray {
6365 return Ok ( Canonical :: Null ( NullArray :: new ( self . len ( ) ) ) ) ;
6466 }
6567
68+ if let Ok ( s) = ExtScalar :: try_from ( scalar) {
69+ let DType :: Extension ( ext_dtype) = s. dtype ( ) else {
70+ vortex_panic ! ( "ExtScalar has a non-ext dtype {}" , s. dtype( ) ) ;
71+ } ;
72+
73+ let storage_dtype = ext_dtype. storage_dtype ( ) ;
74+ let storage_scalar = Scalar :: new ( storage_dtype. clone ( ) , s. value ( ) . clone ( ) ) ;
75+ let storage_array = ConstantArray :: new ( storage_scalar, self . len ( ) ) . into_array ( ) ;
76+ return ExtensionArray :: new ( ext_dtype. clone ( ) , storage_array) . into_canonical ( ) ;
77+ }
78+
6679 vortex_bail ! ( "Unsupported scalar type {}" , self . dtype( ) )
6780 }
6881}
0 commit comments