@@ -40,7 +40,29 @@ impl TryToDataFusion<ScalarValue> for Scalar {
4040 let precision = decimal_type. precision ( ) ;
4141 let scale = decimal_type. scale ( ) ;
4242
43- if precision <= i128:: MAX_PRECISION {
43+ if precision <= i32:: MAX_PRECISION {
44+ match dscalar. decimal_value ( ) {
45+ None => ScalarValue :: Decimal32 ( None , precision, scale) ,
46+ Some ( DecimalValue :: I32 ( v32) ) => {
47+ ScalarValue :: Decimal32 ( Some ( v32) , precision, scale)
48+ }
49+ _ => vortex_bail ! (
50+ "invalid ScalarValue for decimal with precision {}" ,
51+ precision
52+ ) ,
53+ }
54+ } else if precision <= i64:: MAX_PRECISION {
55+ match dscalar. decimal_value ( ) {
56+ None => ScalarValue :: Decimal64 ( None , precision, scale) ,
57+ Some ( DecimalValue :: I64 ( v64) ) => {
58+ ScalarValue :: Decimal64 ( Some ( v64) , precision, scale)
59+ }
60+ _ => vortex_bail ! (
61+ "invalid ScalarValue for decimal with precision {}" ,
62+ precision
63+ ) ,
64+ }
65+ } else if precision <= i128:: MAX_PRECISION {
4466 match dscalar. decimal_value ( ) {
4567 None => ScalarValue :: Decimal128 ( None , precision, scale) ,
4668 Some ( DecimalValue :: I128 ( v128) ) => {
@@ -210,6 +232,32 @@ impl FromDataFusion<ScalarValue> for Scalar {
210232 . unwrap_or_else ( vortex:: scalar:: ScalarValue :: null) ,
211233 )
212234 }
235+ ScalarValue :: Decimal32 ( decimal, precision, scale) => {
236+ let decimal_dtype = DecimalDType :: new ( * precision, * scale) ;
237+ let nullable = Nullability :: Nullable ;
238+ if let Some ( value) = decimal {
239+ Scalar :: decimal (
240+ DecimalValue :: I32 ( * value) ,
241+ decimal_dtype,
242+ Nullability :: Nullable ,
243+ )
244+ } else {
245+ Scalar :: null ( DType :: Decimal ( decimal_dtype, nullable) )
246+ }
247+ }
248+ ScalarValue :: Decimal64 ( decimal, precision, scale) => {
249+ let decimal_dtype = DecimalDType :: new ( * precision, * scale) ;
250+ let nullable = Nullability :: Nullable ;
251+ if let Some ( value) = decimal {
252+ Scalar :: decimal (
253+ DecimalValue :: I64 ( * value) ,
254+ decimal_dtype,
255+ Nullability :: Nullable ,
256+ )
257+ } else {
258+ Scalar :: null ( DType :: Decimal ( decimal_dtype, nullable) )
259+ }
260+ }
213261 ScalarValue :: Decimal128 ( decimal, precision, scale) => {
214262 let decimal_dtype = DecimalDType :: new ( * precision, * scale) ;
215263 let nullable = Nullability :: Nullable ;
0 commit comments