Skip to content

Commit e587525

Browse files
committed
Decimal DF scalar conversion
1 parent 8b14719 commit e587525

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

vortex-datafusion/src/convert/scalars.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)