Skip to content

Commit 8f70d25

Browse files
committed
Simplify float & int casting
Instead of reusing `checked_int_cast` also for the float code paths and requiring a `source` parameter, split the int & float paths completely, making the callsites simpler, and reducing the overall code length.
1 parent 397b809 commit 8f70d25

1 file changed

Lines changed: 22 additions & 68 deletions

File tree

  • arrow-pg/src/datatypes

arrow-pg/src/datatypes/df.rs

Lines changed: 22 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -66,50 +66,36 @@ fn out_of_range_error(source: &str, value: i64, target: &DataType) -> PgWireErro
6666
))
6767
}
6868

69-
fn checked_int_cast<T>(value: i64, source: &str, target: &DataType) -> PgWireResult<T>
69+
fn checked_int_cast<T>(value: i64, target: &DataType) -> PgWireResult<T>
7070
where
7171
T: TryFrom<i64>,
7272
{
73-
T::try_from(value).map_err(|_| out_of_range_error(source, value, target))
73+
T::try_from(value).map_err(|_| out_of_range_error("INT", value, target))
7474
}
7575

7676
fn coerce_int_value(value: Option<i64>, target: &DataType) -> PgWireResult<ScalarValue> {
7777
match target {
7878
DataType::Int8 => Ok(ScalarValue::Int8(
79-
value
80-
.map(|n| checked_int_cast::<i8>(n, "INT", target))
81-
.transpose()?,
79+
value.map(|n| checked_int_cast(n, target)).transpose()?,
8280
)),
8381
DataType::Int16 => Ok(ScalarValue::Int16(
84-
value
85-
.map(|n| checked_int_cast::<i16>(n, "INT", target))
86-
.transpose()?,
82+
value.map(|n| checked_int_cast(n, target)).transpose()?,
8783
)),
8884
DataType::Int32 => Ok(ScalarValue::Int32(
89-
value
90-
.map(|n| checked_int_cast::<i32>(n, "INT", target))
91-
.transpose()?,
85+
value.map(|n| checked_int_cast(n, target)).transpose()?,
9286
)),
9387
DataType::Int64 => Ok(ScalarValue::Int64(value)),
9488
DataType::UInt8 => Ok(ScalarValue::UInt8(
95-
value
96-
.map(|n| checked_int_cast::<u8>(n, "INT", target))
97-
.transpose()?,
89+
value.map(|n| checked_int_cast(n, target)).transpose()?,
9890
)),
9991
DataType::UInt16 => Ok(ScalarValue::UInt16(
100-
value
101-
.map(|n| checked_int_cast::<u16>(n, "INT", target))
102-
.transpose()?,
92+
value.map(|n| checked_int_cast(n, target)).transpose()?,
10393
)),
10494
DataType::UInt32 => Ok(ScalarValue::UInt32(
105-
value
106-
.map(|n| checked_int_cast::<u32>(n, "INT", target))
107-
.transpose()?,
95+
value.map(|n| checked_int_cast(n, target)).transpose()?,
10896
)),
10997
DataType::UInt64 => Ok(ScalarValue::UInt64(
110-
value
111-
.map(|n| checked_int_cast::<u64>(n, "INT", target))
112-
.transpose()?,
98+
value.map(|n| checked_int_cast(n, target)).transpose()?,
11399
)),
114100
DataType::Float32 => Ok(ScalarValue::Float32(value.map(|n| n as f32))),
115101
DataType::Float64 => Ok(ScalarValue::Float64(value.map(|n| n as f64))),
@@ -133,7 +119,10 @@ fn coerce_int_value(value: Option<i64>, target: &DataType) -> PgWireResult<Scala
133119
}
134120
}
135121

136-
fn checked_float_to_int(value: f64, target: &DataType) -> PgWireResult<i64> {
122+
fn checked_float_cast<T>(value: f64, target: &DataType) -> PgWireResult<T>
123+
where
124+
T: TryFrom<i64>,
125+
{
137126
if !value.is_finite() {
138127
return Err(invalid_parameter_error(format!(
139128
"FLOAT value {} is out of range for {:?}",
@@ -144,69 +133,34 @@ fn checked_float_to_int(value: f64, target: &DataType) -> PgWireResult<i64> {
144133
if (n as f64 - value).abs() > f64::EPSILON {
145134
return Err(out_of_range_error("FLOAT", n, target));
146135
}
147-
Ok(n)
136+
T::try_from(n).map_err(|_| out_of_range_error("FLOAT", n, target))
148137
}
149138

150139
fn coerce_float_value(value: Option<f64>, target: &DataType) -> PgWireResult<ScalarValue> {
151140
match target {
152141
DataType::Int8 => Ok(ScalarValue::Int8(
153-
value
154-
.map(|n| {
155-
checked_float_to_int(n, target)
156-
.and_then(|v| checked_int_cast::<i8>(v, "FLOAT", target))
157-
})
158-
.transpose()?,
142+
value.map(|n| checked_float_cast(n, target)).transpose()?,
159143
)),
160144
DataType::Int16 => Ok(ScalarValue::Int16(
161-
value
162-
.map(|n| {
163-
checked_float_to_int(n, target)
164-
.and_then(|v| checked_int_cast::<i16>(v, "FLOAT", target))
165-
})
166-
.transpose()?,
145+
value.map(|n| checked_float_cast(n, target)).transpose()?,
167146
)),
168147
DataType::Int32 => Ok(ScalarValue::Int32(
169-
value
170-
.map(|n| {
171-
checked_float_to_int(n, target)
172-
.and_then(|v| checked_int_cast::<i32>(v, "FLOAT", target))
173-
})
174-
.transpose()?,
148+
value.map(|n| checked_float_cast(n, target)).transpose()?,
175149
)),
176150
DataType::Int64 => Ok(ScalarValue::Int64(
177-
value.map(|n| checked_float_to_int(n, target)).transpose()?,
151+
value.map(|n| checked_float_cast(n, target)).transpose()?,
178152
)),
179153
DataType::UInt8 => Ok(ScalarValue::UInt8(
180-
value
181-
.map(|n| {
182-
checked_float_to_int(n, target)
183-
.and_then(|v| checked_int_cast::<u8>(v, "FLOAT", target))
184-
})
185-
.transpose()?,
154+
value.map(|n| checked_float_cast(n, target)).transpose()?,
186155
)),
187156
DataType::UInt16 => Ok(ScalarValue::UInt16(
188-
value
189-
.map(|n| {
190-
checked_float_to_int(n, target)
191-
.and_then(|v| checked_int_cast::<u16>(v, "FLOAT", target))
192-
})
193-
.transpose()?,
157+
value.map(|n| checked_float_cast(n, target)).transpose()?,
194158
)),
195159
DataType::UInt32 => Ok(ScalarValue::UInt32(
196-
value
197-
.map(|n| {
198-
checked_float_to_int(n, target)
199-
.and_then(|v| checked_int_cast::<u32>(v, "FLOAT", target))
200-
})
201-
.transpose()?,
160+
value.map(|n| checked_float_cast(n, target)).transpose()?,
202161
)),
203162
DataType::UInt64 => Ok(ScalarValue::UInt64(
204-
value
205-
.map(|n| {
206-
checked_float_to_int(n, target)
207-
.and_then(|v| checked_int_cast::<u64>(v, "FLOAT", target))
208-
})
209-
.transpose()?,
163+
value.map(|n| checked_float_cast(n, target)).transpose()?,
210164
)),
211165
DataType::Float32 => Ok(ScalarValue::Float32(value.map(|n| n as f32))),
212166
DataType::Float64 => Ok(ScalarValue::Float64(value)),

0 commit comments

Comments
 (0)