|
12 | 12 | // See the License for the specific language governing permissions and |
13 | 13 | // limitations under the License. |
14 | 14 |
|
15 | | -use crate::errors::DatabaseError; |
16 | 15 | use crate::types::evaluator::cast::{to_char, to_varchar}; |
17 | | -use crate::types::evaluator::BinaryEvaluator; |
18 | 16 | use crate::types::evaluator::DataValue; |
19 | 17 | use crate::types::CharLengthUnits; |
20 | 18 | use ordered_float::OrderedFloat; |
21 | 19 | use rust_decimal::prelude::ToPrimitive; |
22 | | -use serde::{Deserialize, Serialize}; |
23 | | -use std::hint; |
24 | | - |
25 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
26 | | -pub struct DecimalPlusBinaryEvaluator; |
27 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
28 | | -pub struct DecimalMinusBinaryEvaluator; |
29 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
30 | | -pub struct DecimalMultiplyBinaryEvaluator; |
31 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
32 | | -pub struct DecimalDivideBinaryEvaluator; |
33 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
34 | | -pub struct DecimalGtBinaryEvaluator; |
35 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
36 | | -pub struct DecimalGtEqBinaryEvaluator; |
37 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
38 | | -pub struct DecimalLtBinaryEvaluator; |
39 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
40 | | -pub struct DecimalLtEqBinaryEvaluator; |
41 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
42 | | -pub struct DecimalEqBinaryEvaluator; |
43 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
44 | | -pub struct DecimalNotEqBinaryEvaluator; |
45 | | -#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] |
46 | | -pub struct DecimalModBinaryEvaluator; |
47 | | -impl BinaryEvaluator for DecimalPlusBinaryEvaluator { |
48 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
49 | | - Ok(match (left, right) { |
50 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Decimal(v1 + v2), |
51 | | - (DataValue::Decimal(_), DataValue::Null) |
52 | | - | (DataValue::Null, DataValue::Decimal(_)) |
53 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
54 | | - _ => unsafe { hint::unreachable_unchecked() }, |
55 | | - }) |
56 | | - } |
57 | | -} |
58 | | -impl BinaryEvaluator for DecimalMinusBinaryEvaluator { |
59 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
60 | | - Ok(match (left, right) { |
61 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Decimal(v1 - v2), |
62 | | - (DataValue::Decimal(_), DataValue::Null) |
63 | | - | (DataValue::Null, DataValue::Decimal(_)) |
64 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
65 | | - _ => unsafe { hint::unreachable_unchecked() }, |
66 | | - }) |
67 | | - } |
68 | | -} |
69 | 20 |
|
70 | 21 | crate::define_cast_evaluator!(DecimalToFloatCastEvaluator, DataValue::Decimal(value) => { |
71 | 22 | Ok(DataValue::Float32(OrderedFloat(value.to_f32().ok_or_else(|| { |
@@ -124,106 +75,6 @@ crate::define_cast_evaluator!(DecimalToUIntegerCastEvaluator, DataValue::Decimal |
124 | 75 | crate::define_cast_evaluator!(DecimalToUBigintCastEvaluator, DataValue::Decimal(value) => { |
125 | 76 | Ok(DataValue::UInt64(crate::decimal_to_int_cast!(*value, u64))) |
126 | 77 | }); |
127 | | -impl BinaryEvaluator for DecimalMultiplyBinaryEvaluator { |
128 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
129 | | - Ok(match (left, right) { |
130 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Decimal(v1 * v2), |
131 | | - (DataValue::Decimal(_), DataValue::Null) |
132 | | - | (DataValue::Null, DataValue::Decimal(_)) |
133 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
134 | | - _ => unsafe { hint::unreachable_unchecked() }, |
135 | | - }) |
136 | | - } |
137 | | -} |
138 | | -impl BinaryEvaluator for DecimalDivideBinaryEvaluator { |
139 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
140 | | - Ok(match (left, right) { |
141 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Decimal(v1 / v2), |
142 | | - (DataValue::Decimal(_), DataValue::Null) |
143 | | - | (DataValue::Null, DataValue::Decimal(_)) |
144 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
145 | | - _ => unsafe { hint::unreachable_unchecked() }, |
146 | | - }) |
147 | | - } |
148 | | -} |
149 | | -impl BinaryEvaluator for DecimalGtBinaryEvaluator { |
150 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
151 | | - Ok(match (left, right) { |
152 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 > v2), |
153 | | - (DataValue::Decimal(_), DataValue::Null) |
154 | | - | (DataValue::Null, DataValue::Decimal(_)) |
155 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
156 | | - _ => unsafe { hint::unreachable_unchecked() }, |
157 | | - }) |
158 | | - } |
159 | | -} |
160 | | -impl BinaryEvaluator for DecimalGtEqBinaryEvaluator { |
161 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
162 | | - Ok(match (left, right) { |
163 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 >= v2), |
164 | | - (DataValue::Decimal(_), DataValue::Null) |
165 | | - | (DataValue::Null, DataValue::Decimal(_)) |
166 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
167 | | - _ => unsafe { hint::unreachable_unchecked() }, |
168 | | - }) |
169 | | - } |
170 | | -} |
171 | | -impl BinaryEvaluator for DecimalLtBinaryEvaluator { |
172 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
173 | | - Ok(match (left, right) { |
174 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 < v2), |
175 | | - (DataValue::Decimal(_), DataValue::Null) |
176 | | - | (DataValue::Null, DataValue::Decimal(_)) |
177 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
178 | | - _ => unsafe { hint::unreachable_unchecked() }, |
179 | | - }) |
180 | | - } |
181 | | -} |
182 | | -impl BinaryEvaluator for DecimalLtEqBinaryEvaluator { |
183 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
184 | | - Ok(match (left, right) { |
185 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 <= v2), |
186 | | - (DataValue::Decimal(_), DataValue::Null) |
187 | | - | (DataValue::Null, DataValue::Decimal(_)) |
188 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
189 | | - _ => unsafe { hint::unreachable_unchecked() }, |
190 | | - }) |
191 | | - } |
192 | | -} |
193 | | -impl BinaryEvaluator for DecimalEqBinaryEvaluator { |
194 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
195 | | - Ok(match (left, right) { |
196 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 == v2), |
197 | | - (DataValue::Decimal(_), DataValue::Null) |
198 | | - | (DataValue::Null, DataValue::Decimal(_)) |
199 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
200 | | - _ => unsafe { hint::unreachable_unchecked() }, |
201 | | - }) |
202 | | - } |
203 | | -} |
204 | | -impl BinaryEvaluator for DecimalNotEqBinaryEvaluator { |
205 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
206 | | - Ok(match (left, right) { |
207 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Boolean(v1 != v2), |
208 | | - (DataValue::Decimal(_), DataValue::Null) |
209 | | - | (DataValue::Null, DataValue::Decimal(_)) |
210 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
211 | | - _ => unsafe { hint::unreachable_unchecked() }, |
212 | | - }) |
213 | | - } |
214 | | -} |
215 | | -impl BinaryEvaluator for DecimalModBinaryEvaluator { |
216 | | - fn binary_eval(&self, left: &DataValue, right: &DataValue) -> Result<DataValue, DatabaseError> { |
217 | | - Ok(match (left, right) { |
218 | | - (DataValue::Decimal(v1), DataValue::Decimal(v2)) => DataValue::Decimal(v1 % v2), |
219 | | - (DataValue::Decimal(_), DataValue::Null) |
220 | | - | (DataValue::Null, DataValue::Decimal(_)) |
221 | | - | (DataValue::Null, DataValue::Null) => DataValue::Null, |
222 | | - _ => unsafe { hint::unreachable_unchecked() }, |
223 | | - }) |
224 | | - } |
225 | | -} |
226 | | - |
227 | 78 | #[cfg(all(test, not(target_arch = "wasm32")))] |
228 | 79 | mod test { |
229 | 80 | use super::*; |
|
0 commit comments