@@ -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 >
7070where
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
7676fn 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
150139fn 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