@@ -50,6 +50,10 @@ use crate::types::StringType;
50
50
use crate :: types:: ValueType ;
51
51
use crate :: types:: VariantType ;
52
52
use crate :: values:: Column ;
53
+ use crate :: types:: VectorColumn ;
54
+ use crate :: types:: VectorDataType ;
55
+ use crate :: types:: VectorScalar ;
56
+ use crate :: types:: F32 ;
53
57
use crate :: values:: ColumnBuilder ;
54
58
use crate :: values:: Scalar ;
55
59
use crate :: values:: Value ;
@@ -924,6 +928,85 @@ impl<'a> Evaluator<'a> {
924
928
other => unreachable ! ( "source: {}" , other) ,
925
929
}
926
930
}
931
+ ( DataType :: Array ( inner_src_ty) , DataType :: Vector ( inner_dest_ty) ) => {
932
+ if !matches ! ( & * * inner_src_ty, DataType :: Number ( _) | DataType :: Decimal ( _) )
933
+ || matches ! ( inner_dest_ty, VectorDataType :: Int8 ( _) )
934
+ {
935
+ return Err ( ErrorCode :: BadArguments ( format ! (
936
+ "unable to cast type `{src_type}` to type `{dest_type}`"
937
+ ) )
938
+ . set_span ( span) ) ;
939
+ }
940
+ let dimension = inner_dest_ty. dimension ( ) as usize ;
941
+ match value {
942
+ Value :: Scalar ( Scalar :: Array ( col) ) => {
943
+ if col. len ( ) != dimension {
944
+ return Err ( ErrorCode :: BadArguments (
945
+ "Array value cast to a vector has incorrect dimension" . to_string ( ) ,
946
+ )
947
+ . set_span ( span) ) ;
948
+ }
949
+ let mut vals = Vec :: with_capacity ( dimension) ;
950
+ match col {
951
+ Column :: Number ( num_col) => {
952
+ for i in 0 ..dimension {
953
+ let num = unsafe { num_col. index_unchecked ( i) } ;
954
+ vals. push ( num. to_f32 ( ) ) ;
955
+ }
956
+ }
957
+ Column :: Decimal ( dec_col) => {
958
+ for i in 0 ..dimension {
959
+ let dec = unsafe { dec_col. index_unchecked ( i) } ;
960
+ vals. push ( F32 :: from ( dec. to_float32 ( ) ) ) ;
961
+ }
962
+ }
963
+ _ => {
964
+ return Err ( ErrorCode :: BadArguments (
965
+ "Array value cast to a vector has invalid value" . to_string ( ) ,
966
+ )
967
+ . set_span ( span) ) ;
968
+ }
969
+ }
970
+ Ok ( Value :: Scalar ( Scalar :: Vector ( VectorScalar :: Float32 ( vals) ) ) )
971
+ }
972
+ Value :: Column ( Column :: Array ( array_col) ) => {
973
+ let mut vals = Vec :: with_capacity ( dimension * array_col. len ( ) ) ;
974
+ for col in array_col. iter ( ) {
975
+ if col. len ( ) != dimension {
976
+ return Err ( ErrorCode :: BadArguments (
977
+ "Array value cast to a vector has incorrect dimension"
978
+ . to_string ( ) ,
979
+ )
980
+ . set_span ( span) ) ;
981
+ }
982
+ match col {
983
+ Column :: Number ( num_col) => {
984
+ for i in 0 ..dimension {
985
+ let num = unsafe { num_col. index_unchecked ( i) } ;
986
+ vals. push ( num. to_f32 ( ) ) ;
987
+ }
988
+ }
989
+ Column :: Decimal ( dec_col) => {
990
+ for i in 0 ..dimension {
991
+ let dec = unsafe { dec_col. index_unchecked ( i) } ;
992
+ vals. push ( F32 :: from ( dec. to_float32 ( ) ) ) ;
993
+ }
994
+ }
995
+ _ => {
996
+ return Err ( ErrorCode :: BadArguments (
997
+ "Array value cast to a vector has invalid value"
998
+ . to_string ( ) ,
999
+ )
1000
+ . set_span ( span) ) ;
1001
+ }
1002
+ }
1003
+ }
1004
+ let vector_col = VectorColumn :: Float32 ( ( vals. into ( ) , dimension) ) ;
1005
+ Ok ( Value :: Column ( Column :: Vector ( vector_col) ) )
1006
+ }
1007
+ other => unreachable ! ( "source: {}" , other) ,
1008
+ }
1009
+ }
927
1010
928
1011
_ => Err ( ErrorCode :: BadArguments ( format ! (
929
1012
"unable to cast type `{src_type}` to type `{dest_type}`"
0 commit comments