• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

getdozer / dozer / 5966237682

24 Aug 2023 04:13PM UTC coverage: 75.46% (-0.2%) from 75.617%
5966237682

push

github

web-flow
chore: Update for Rust 1.72.0 (#1911)

Rust 1.72.0 has introduced a bunch of new lints. Here we fix them all.

`let ... else` finally gets formatted.

37 of 37 new or added lines in 8 files covered. (100.0%)

46983 of 62262 relevant lines covered (75.46%)

47979.13 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.58
/dozer-sql/src/pipeline/expression/mathematical.rs
1
use crate::pipeline::errors::OperationError;
2
use crate::pipeline::errors::PipelineError;
3
use crate::pipeline::errors::SqlError::Operation;
4
use crate::pipeline::expression::execution::Expression;
5
use dozer_types::rust_decimal::Decimal;
6
use dozer_types::types::Record;
7
use dozer_types::types::Schema;
8
use dozer_types::types::{DozerDuration, TimeUnit};
9
use dozer_types::{chrono, ordered_float::OrderedFloat, types::Field};
10
use num_traits::{FromPrimitive, Zero};
11
use std::num::Wrapping;
12
use std::ops::Neg;
13

14
macro_rules! define_math_operator {
15
    ($id:ident, $op:expr, $fct:expr, $t: expr) => {
16
        pub fn $id(
252,912✔
17
            schema: &Schema,
252,912✔
18
            left: &Expression,
252,912✔
19
            right: &Expression,
252,912✔
20
            record: &Record,
252,912✔
21
        ) -> Result<Field, PipelineError> {
252,912✔
22
            let left_p = left.evaluate(&record, schema)?;
252,912✔
23
            let right_p = right.evaluate(&record, schema)?;
252,912✔
24

25
            match left_p {
252,912✔
26
                Field::Duration(left_v) => {
10,001✔
27
                    match right_p {
10,001✔
28
                        Field::Duration(right_v) => match $op {
5,000✔
29
                            "-" => {
5,000✔
30
                                let duration = left_v.0.checked_sub(right_v.0).ok_or(
1,000✔
31
                                    PipelineError::SqlError(Operation(
1,000✔
32
                                        OperationError::AdditionOverflow,
1,000✔
33
                                    )),
1,000✔
34
                                )?;
1,000✔
35
                                Ok(Field::from(DozerDuration(duration, TimeUnit::Nanoseconds)))
517✔
36
                            }
37
                            "+" => {
4,000✔
38
                                let duration = left_v.0.checked_add(right_v.0).ok_or(
1,000✔
39
                                    PipelineError::SqlError(Operation(
1,000✔
40
                                        OperationError::SubtractionOverflow,
1,000✔
41
                                    )),
1,000✔
42
                                )?;
1,000✔
43
                                Ok(Field::from(DozerDuration(duration, TimeUnit::Nanoseconds)))
1,000✔
44
                            }
45
                            "*" | "/" | "%" => Err(PipelineError::InvalidTypeComparison(
3,000✔
46
                                left_p,
3,000✔
47
                                right_p,
3,000✔
48
                                $op.to_string(),
3,000✔
49
                            )),
3,000✔
50
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
51
                                left_p,
×
52
                                right_p,
×
53
                                $op.to_string(),
×
54
                            )),
×
55
                        },
56
                        Field::Timestamp(right_v) => match $op {
1✔
57
                            "+" => {
1✔
58
                                let duration = right_v
1✔
59
                                    .checked_add_signed(chrono::Duration::nanoseconds(
1✔
60
                                        left_v.0.as_nanos() as i64,
1✔
61
                                    ))
1✔
62
                                    .ok_or(PipelineError::SqlError(Operation(
1✔
63
                                        OperationError::AdditionOverflow,
1✔
64
                                    )))?;
1✔
65
                                Ok(Field::Timestamp(duration))
1✔
66
                            }
67
                            "-" | "*" | "/" | "%" => Err(PipelineError::InvalidTypeComparison(
×
68
                                left_p,
×
69
                                right_p,
×
70
                                $op.to_string(),
×
71
                            )),
×
72
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
73
                                left_p,
×
74
                                right_p,
×
75
                                $op.to_string(),
×
76
                            )),
×
77
                        },
78
                        Field::UInt(_)
79
                        | Field::U128(_)
80
                        | Field::Int(_)
81
                        | Field::I128(_)
82
                        | Field::Float(_)
83
                        | Field::Boolean(_)
84
                        | Field::String(_)
85
                        | Field::Text(_)
86
                        | Field::Binary(_)
87
                        | Field::Decimal(_)
88
                        | Field::Date(_)
89
                        | Field::Json(_)
90
                        | Field::Point(_)
91
                        | Field::Null => Err(PipelineError::InvalidTypeComparison(
5,000✔
92
                            left_p,
5,000✔
93
                            right_p,
5,000✔
94
                            $op.to_string(),
5,000✔
95
                        )),
5,000✔
96
                    }
97
                }
98
                Field::Timestamp(left_v) => match right_p {
5✔
99
                    Field::Duration(right_v) => match $op {
2✔
100
                        "-" => {
2✔
101
                            let duration = left_v
1✔
102
                                .checked_sub_signed(chrono::Duration::nanoseconds(
1✔
103
                                    right_v.0.as_nanos() as i64,
1✔
104
                                ))
1✔
105
                                .ok_or(PipelineError::SqlError(Operation(
1✔
106
                                    OperationError::AdditionOverflow,
1✔
107
                                )))?;
1✔
108
                            Ok(Field::Timestamp(duration))
1✔
109
                        }
110
                        "+" => {
1✔
111
                            let duration = left_v
1✔
112
                                .checked_add_signed(chrono::Duration::nanoseconds(
1✔
113
                                    right_v.0.as_nanos() as i64,
1✔
114
                                ))
1✔
115
                                .ok_or(PipelineError::SqlError(Operation(
1✔
116
                                    OperationError::SubtractionOverflow,
1✔
117
                                )))?;
1✔
118
                            Ok(Field::Timestamp(duration))
1✔
119
                        }
120
                        "*" | "/" | "%" => Err(PipelineError::InvalidTypeComparison(
×
121
                            left_p,
×
122
                            right_p,
×
123
                            $op.to_string(),
×
124
                        )),
×
125
                        &_ => Err(PipelineError::InvalidTypeComparison(
×
126
                            left_p,
×
127
                            right_p,
×
128
                            $op.to_string(),
×
129
                        )),
×
130
                    },
131
                    Field::Timestamp(right_v) => match $op {
3✔
132
                        "-" => {
3✔
133
                            if left_v > right_v {
3✔
134
                                let duration: i64 = (left_v - right_v).num_nanoseconds().ok_or(
2✔
135
                                    PipelineError::UnableToCast(
2✔
136
                                        format!("{}", left_v - right_v),
2✔
137
                                        "i64".to_string(),
2✔
138
                                    ),
2✔
139
                                )?;
2✔
140
                                Ok(Field::from(DozerDuration(
2✔
141
                                    std::time::Duration::from_nanos(duration as u64),
2✔
142
                                    TimeUnit::Nanoseconds,
2✔
143
                                )))
2✔
144
                            } else {
145
                                Err(PipelineError::InvalidTypeComparison(
1✔
146
                                    left_p,
1✔
147
                                    right_p,
1✔
148
                                    $op.to_string(),
1✔
149
                                ))
1✔
150
                            }
151
                        }
152
                        "+" | "*" | "/" | "%" => Err(PipelineError::InvalidTypeComparison(
×
153
                            left_p,
×
154
                            right_p,
×
155
                            $op.to_string(),
×
156
                        )),
×
157
                        &_ => Err(PipelineError::InvalidTypeComparison(
×
158
                            left_p,
×
159
                            right_p,
×
160
                            $op.to_string(),
×
161
                        )),
×
162
                    },
163
                    Field::UInt(_)
164
                    | Field::U128(_)
165
                    | Field::Int(_)
166
                    | Field::I128(_)
167
                    | Field::Float(_)
168
                    | Field::Boolean(_)
169
                    | Field::String(_)
170
                    | Field::Text(_)
171
                    | Field::Binary(_)
172
                    | Field::Decimal(_)
173
                    | Field::Date(_)
174
                    | Field::Json(_)
175
                    | Field::Point(_)
176
                    | Field::Null => Err(PipelineError::InvalidTypeComparison(
×
177
                        left_p,
×
178
                        right_p,
×
179
                        $op.to_string(),
×
180
                    )),
×
181
                },
182
                Field::Float(left_v) => match right_p {
31,961✔
183
                    // left: Float, right: Int
184
                    Field::Int(right_v) => {
5,000✔
185
                        return match $op {
5,000✔
186
                            "/" | "%" => {
5,000✔
187
                                if right_v == 0_i64 {
2,000✔
188
                                    Err(PipelineError::SqlError(Operation(
×
189
                                        OperationError::DivisionByZeroOrOverflow,
×
190
                                    )))
×
191
                                } else {
192
                                    Ok(Field::Float($fct(
193
                                        left_v,
2,000✔
194
                                        OrderedFloat::<f64>::from_i64(right_v).ok_or(
2,000✔
195
                                            PipelineError::UnableToCast(
2,000✔
196
                                                format!("{}", right_v),
2,000✔
197
                                                "f64".to_string(),
2,000✔
198
                                            ),
2,000✔
199
                                        )?,
2,000✔
200
                                    )))
201
                                }
202
                            }
203
                            &_ => Ok(Field::Float($fct(
204
                                left_v,
3,000✔
205
                                OrderedFloat::<f64>::from_i64(right_v).ok_or(
3,000✔
206
                                    PipelineError::UnableToCast(
3,000✔
207
                                        format!("{}", right_v),
3,000✔
208
                                        "f64".to_string(),
3,000✔
209
                                    ),
3,000✔
210
                                )?,
3,000✔
211
                            ))),
212
                        }
213
                    }
214
                    // left: Float, right: I128
215
                    Field::I128(right_v) => {
5,000✔
216
                        return match $op {
5,000✔
217
                            "/" | "%" => {
5,000✔
218
                                if right_v == 0_i128 {
2,000✔
219
                                    Err(PipelineError::SqlError(Operation(
×
220
                                        OperationError::DivisionByZeroOrOverflow,
×
221
                                    )))
×
222
                                } else {
223
                                    Ok(Field::Float($fct(
224
                                        left_v,
2,000✔
225
                                        OrderedFloat::<f64>::from_i128(right_v).ok_or(
2,000✔
226
                                            PipelineError::UnableToCast(
2,000✔
227
                                                format!("{}", right_v),
2,000✔
228
                                                "f64".to_string(),
2,000✔
229
                                            ),
2,000✔
230
                                        )?,
2,000✔
231
                                    )))
232
                                }
233
                            }
234
                            &_ => Ok(Field::Float($fct(
235
                                left_v,
3,000✔
236
                                OrderedFloat::<f64>::from_i128(right_v).ok_or(
3,000✔
237
                                    PipelineError::UnableToCast(
3,000✔
238
                                        format!("{}", right_v),
3,000✔
239
                                        "f64".to_string(),
3,000✔
240
                                    ),
3,000✔
241
                                )?,
3,000✔
242
                            ))),
243
                        }
244
                    }
245
                    // left: Float, right: UInt
246
                    Field::UInt(right_v) => {
5,000✔
247
                        return match $op {
5,000✔
248
                            "/" | "%" => {
5,000✔
249
                                if right_v == 0_u64 {
2,000✔
250
                                    Err(PipelineError::SqlError(Operation(
×
251
                                        OperationError::DivisionByZeroOrOverflow,
×
252
                                    )))
×
253
                                } else {
254
                                    Ok(Field::Float($fct(
255
                                        left_v,
2,000✔
256
                                        OrderedFloat::<f64>::from_u64(right_v).ok_or(
2,000✔
257
                                            PipelineError::UnableToCast(
2,000✔
258
                                                format!("{}", right_v),
2,000✔
259
                                                "f64".to_string(),
2,000✔
260
                                            ),
2,000✔
261
                                        )?,
2,000✔
262
                                    )))
263
                                }
264
                            }
265
                            &_ => Ok(Field::Float($fct(
266
                                left_v,
3,000✔
267
                                OrderedFloat::<f64>::from_u64(right_v).ok_or(
3,000✔
268
                                    PipelineError::UnableToCast(
3,000✔
269
                                        format!("{}", right_v),
3,000✔
270
                                        "f64".to_string(),
3,000✔
271
                                    ),
3,000✔
272
                                )?,
3,000✔
273
                            ))),
274
                        }
275
                    }
276
                    // left: Float, right: U128
277
                    Field::U128(right_v) => {
5,000✔
278
                        return match $op {
5,000✔
279
                            "/" | "%" => {
5,000✔
280
                                if right_v == 0_u128 {
2,000✔
281
                                    Err(PipelineError::SqlError(Operation(
×
282
                                        OperationError::DivisionByZeroOrOverflow,
×
283
                                    )))
×
284
                                } else {
285
                                    Ok(Field::Float($fct(
286
                                        left_v,
2,000✔
287
                                        OrderedFloat::<f64>::from_u128(right_v).ok_or(
2,000✔
288
                                            PipelineError::UnableToCast(
2,000✔
289
                                                format!("{}", right_v),
2,000✔
290
                                                "f64".to_string(),
2,000✔
291
                                            ),
2,000✔
292
                                        )?,
2,000✔
293
                                    )))
294
                                }
295
                            }
296
                            &_ => Ok(Field::Float($fct(
297
                                left_v,
3,000✔
298
                                OrderedFloat::<f64>::from_u128(right_v).ok_or(
3,000✔
299
                                    PipelineError::UnableToCast(
3,000✔
300
                                        format!("{}", right_v),
3,000✔
301
                                        "f64".to_string(),
3,000✔
302
                                    ),
3,000✔
303
                                )?,
3,000✔
304
                            ))),
305
                        }
306
                    }
307
                    // left: Float, right: Float
308
                    Field::Float(right_v) => {
4,721✔
309
                        return match $op {
4,721✔
310
                            "/" | "%" => {
4,721✔
311
                                if right_v == 0_f64 {
1,721✔
312
                                    Err(PipelineError::SqlError(Operation(
×
313
                                        OperationError::DivisionByZeroOrOverflow,
×
314
                                    )))
×
315
                                } else {
316
                                    Ok(Field::Float($fct(left_v, right_v)))
1,721✔
317
                                }
318
                            }
319
                            &_ => Ok(Field::Float($fct(left_v, right_v))),
3,000✔
320
                        }
321
                    }
322
                    // left: Float, right: Decimal
323
                    Field::Decimal(right_v) => {
2,240✔
324
                        return match $op {
2,240✔
325
                            "/" => Ok(Field::Decimal(
2,240✔
326
                                Decimal::from_f64(*left_v)
448✔
327
                                    .ok_or(PipelineError::UnableToCast(
448✔
328
                                        format!("{}", left_v),
448✔
329
                                        "Decimal".to_string(),
448✔
330
                                    ))?
448✔
331
                                    .checked_div(right_v)
448✔
332
                                    .ok_or(PipelineError::SqlError(Operation(
448✔
333
                                        OperationError::DivisionByZeroOrOverflow,
448✔
334
                                    )))?,
448✔
335
                            )),
336
                            "%" => Ok(Field::Decimal(
1,792✔
337
                                Decimal::from_f64(*left_v)
448✔
338
                                    .ok_or(PipelineError::UnableToCast(
448✔
339
                                        format!("{}", left_v),
448✔
340
                                        "Decimal".to_string(),
448✔
341
                                    ))?
448✔
342
                                    .checked_rem(right_v)
448✔
343
                                    .ok_or(PipelineError::SqlError(Operation(
448✔
344
                                        OperationError::ModuloByZeroOrOverflow,
448✔
345
                                    )))?,
448✔
346
                            )),
347
                            "*" => Ok(Field::Decimal(
1,344✔
348
                                Decimal::from_f64(*left_v)
448✔
349
                                    .ok_or(PipelineError::UnableToCast(
448✔
350
                                        format!("{}", left_v),
448✔
351
                                        "Decimal".to_string(),
448✔
352
                                    ))?
448✔
353
                                    .checked_mul(right_v)
448✔
354
                                    .ok_or(PipelineError::SqlError(Operation(
448✔
355
                                        OperationError::MultiplicationOverflow,
448✔
356
                                    )))?,
448✔
357
                            )),
358
                            "+" | "-" => Ok(Field::Decimal($fct(
896✔
359
                                Decimal::from_f64(*left_v).ok_or(PipelineError::UnableToCast(
896✔
360
                                    format!("{}", left_v),
896✔
361
                                    "Decimal".to_string(),
896✔
362
                                ))?,
896✔
363
                                right_v,
896✔
364
                            ))),
365
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
366
                                left_p,
×
367
                                right_p,
×
368
                                $op.to_string(),
×
369
                            )),
×
370
                        }
371
                    }
372
                    Field::Null => Ok(Field::Null),
5,000✔
373
                    Field::Boolean(_)
374
                    | Field::String(_)
375
                    | Field::Text(_)
376
                    | Field::Binary(_)
377
                    | Field::Timestamp(_)
378
                    | Field::Date(_)
379
                    | Field::Json(_)
380
                    | Field::Point(_)
381
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
382
                        left_p,
×
383
                        right_p,
×
384
                        $op.to_string(),
×
385
                    )),
×
386
                },
387
                Field::Int(left_v) => match right_p {
34,743✔
388
                    // left: Int, right: Int
389
                    Field::Int(right_v) => {
5,002✔
390
                        return match $op {
5,002✔
391
                            // When Int / Int division happens
5,002✔
392
                            "/" => {
5,002✔
393
                                if right_v == 0_i64 {
1,000✔
394
                                    Err(PipelineError::SqlError(Operation(
×
395
                                        OperationError::DivisionByZeroOrOverflow,
×
396
                                    )))
×
397
                                } else {
398
                                    Ok(Field::Float($fct(
399
                                        OrderedFloat::<f64>::from_i64(left_v).ok_or(
1,000✔
400
                                            PipelineError::UnableToCast(
1,000✔
401
                                                format!("{}", left_v),
1,000✔
402
                                                "f64".to_string(),
1,000✔
403
                                            ),
1,000✔
404
                                        )?,
1,000✔
405
                                        OrderedFloat::<f64>::from_i64(right_v).ok_or(
1,000✔
406
                                            PipelineError::UnableToCast(
1,000✔
407
                                                format!("{}", right_v),
1,000✔
408
                                                "f64".to_string(),
1,000✔
409
                                            ),
1,000✔
410
                                        )?,
1,000✔
411
                                    )))
412
                                }
413
                            }
414
                            // When it's not division operation
415
                            "+" | "-" | "*" | "%" => {
4,002✔
416
                                Ok(Field::Int($fct(Wrapping(left_v), Wrapping(right_v)).0))
4,002✔
417
                            }
418
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
419
                                left_p,
×
420
                                right_p,
×
421
                                $op.to_string(),
×
422
                            )),
×
423
                        };
424
                    }
425
                    // left: Int, right: I128
426
                    Field::I128(right_v) => {
5,000✔
427
                        return match $op {
5,000✔
428
                            // When Int / I128 division happens
5,000✔
429
                            "/" => {
5,000✔
430
                                if right_v == 0_i128 {
1,000✔
431
                                    Err(PipelineError::SqlError(Operation(
×
432
                                        OperationError::DivisionByZeroOrOverflow,
×
433
                                    )))
×
434
                                } else {
435
                                    Ok(Field::Float($fct(
436
                                        OrderedFloat::<f64>::from_i64(left_v).ok_or(
1,000✔
437
                                            PipelineError::UnableToCast(
1,000✔
438
                                                format!("{}", left_v),
1,000✔
439
                                                "f64".to_string(),
1,000✔
440
                                            ),
1,000✔
441
                                        )?,
1,000✔
442
                                        OrderedFloat::<f64>::from_i128(right_v).ok_or(
1,000✔
443
                                            PipelineError::UnableToCast(
1,000✔
444
                                                format!("{}", right_v),
1,000✔
445
                                                "f64".to_string(),
1,000✔
446
                                            ),
1,000✔
447
                                        )?,
1,000✔
448
                                    )))
449
                                }
450
                            }
451
                            // When it's not division operation
452
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
453
                                $fct(Wrapping(left_v as i128), Wrapping(right_v)).0,
4,000✔
454
                            )),
4,000✔
455
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
456
                                left_p,
×
457
                                right_p,
×
458
                                $op.to_string(),
×
459
                            )),
×
460
                        };
461
                    }
462
                    // left: Int, right: UInt
463
                    Field::UInt(right_v) => {
5,000✔
464
                        return match $op {
5,000✔
465
                            // When Int / UInt division happens
5,000✔
466
                            "/" => {
5,000✔
467
                                if right_v == 0_u64 {
1,000✔
468
                                    Err(PipelineError::SqlError(Operation(
×
469
                                        OperationError::DivisionByZeroOrOverflow,
×
470
                                    )))
×
471
                                } else {
472
                                    Ok(Field::Float($fct(
473
                                        OrderedFloat::<f64>::from_i64(left_v).ok_or(
1,000✔
474
                                            PipelineError::UnableToCast(
1,000✔
475
                                                format!("{}", left_v),
1,000✔
476
                                                "f64".to_string(),
1,000✔
477
                                            ),
1,000✔
478
                                        )?,
1,000✔
479
                                        OrderedFloat::<f64>::from_u64(right_v).ok_or(
1,000✔
480
                                            PipelineError::UnableToCast(
1,000✔
481
                                                format!("{}", right_v),
1,000✔
482
                                                "f64".to_string(),
1,000✔
483
                                            ),
1,000✔
484
                                        )?,
1,000✔
485
                                    )))
486
                                }
487
                            }
488
                            // When it's not division operation
489
                            "+" | "-" | "*" | "%" => Ok(Field::Int(
4,000✔
490
                                $fct(Wrapping(left_v), Wrapping(right_v as i64)).0,
4,000✔
491
                            )),
4,000✔
492
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
493
                                left_p,
×
494
                                right_p,
×
495
                                $op.to_string(),
×
496
                            )),
×
497
                        };
498
                    }
499
                    // left: Int, right: U128
500
                    Field::U128(right_v) => {
5,000✔
501
                        return match $op {
5,000✔
502
                            // When Int / U128 division happens
5,000✔
503
                            "/" => {
5,000✔
504
                                if right_v == 0_u128 {
1,000✔
505
                                    Err(PipelineError::SqlError(Operation(
×
506
                                        OperationError::DivisionByZeroOrOverflow,
×
507
                                    )))
×
508
                                } else {
509
                                    Ok(Field::Float($fct(
510
                                        OrderedFloat::<f64>::from_i64(left_v).ok_or(
1,000✔
511
                                            PipelineError::UnableToCast(
1,000✔
512
                                                format!("{}", left_v),
1,000✔
513
                                                "f64".to_string(),
1,000✔
514
                                            ),
1,000✔
515
                                        )?,
1,000✔
516
                                        OrderedFloat::<f64>::from_u128(right_v).ok_or(
1,000✔
517
                                            PipelineError::UnableToCast(
1,000✔
518
                                                format!("{}", right_v),
1,000✔
519
                                                "f64".to_string(),
1,000✔
520
                                            ),
1,000✔
521
                                        )?,
1,000✔
522
                                    )))
523
                                }
524
                            }
525
                            // When it's not division operation
526
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
527
                                $fct(Wrapping(left_v as i128), Wrapping(right_v as i128)).0,
4,000✔
528
                            )),
4,000✔
529
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
530
                                left_p,
×
531
                                right_p,
×
532
                                $op.to_string(),
×
533
                            )),
×
534
                        };
535
                    }
536
                    // left: Int, right: Float
537
                    Field::Float(right_v) => {
4,736✔
538
                        return match $op {
4,736✔
539
                            "/" | "%" => {
4,736✔
540
                                if right_v == 0_f64 {
1,736✔
541
                                    Err(PipelineError::SqlError(Operation(
×
542
                                        OperationError::DivisionByZeroOrOverflow,
×
543
                                    )))
×
544
                                } else {
545
                                    Ok(Field::Float($fct(
546
                                        OrderedFloat::<f64>::from_i64(left_v).ok_or(
1,736✔
547
                                            PipelineError::UnableToCast(
1,736✔
548
                                                format!("{}", left_v),
1,736✔
549
                                                "f64".to_string(),
1,736✔
550
                                            ),
1,736✔
551
                                        )?,
1,736✔
552
                                        right_v,
1,736✔
553
                                    )))
554
                                }
555
                            }
556
                            &_ => Ok(Field::Float($fct(
557
                                OrderedFloat::<f64>::from_i64(left_v).ok_or(
3,000✔
558
                                    PipelineError::UnableToCast(
3,000✔
559
                                        format!("{}", left_v),
3,000✔
560
                                        "f64".to_string(),
3,000✔
561
                                    ),
3,000✔
562
                                )?,
3,000✔
563
                                right_v,
3,000✔
564
                            ))),
565
                        }
566
                    }
567

568
                    // left: Int, right: Decimal
569
                    Field::Decimal(right_v) => {
5,005✔
570
                        return match $op {
5,005✔
571
                            "/" => Ok(Field::Decimal(
5,005✔
572
                                Decimal::from_i64(left_v)
1,001✔
573
                                    .ok_or(PipelineError::UnableToCast(
1,001✔
574
                                        format!("{}", left_v),
1,001✔
575
                                        "Decimal".to_string(),
1,001✔
576
                                    ))?
1,001✔
577
                                    .checked_div(right_v)
1,001✔
578
                                    .ok_or(PipelineError::SqlError(Operation(
1,001✔
579
                                        OperationError::DivisionByZeroOrOverflow,
1,001✔
580
                                    )))?,
1,001✔
581
                            )),
582
                            "%" => Ok(Field::Decimal(
4,004✔
583
                                Decimal::from_i64(left_v)
1,001✔
584
                                    .ok_or(PipelineError::UnableToCast(
1,001✔
585
                                        format!("{}", left_v),
1,001✔
586
                                        "Decimal".to_string(),
1,001✔
587
                                    ))?
1,001✔
588
                                    .checked_rem(right_v)
1,001✔
589
                                    .ok_or(PipelineError::SqlError(Operation(
1,001✔
590
                                        OperationError::ModuloByZeroOrOverflow,
1,001✔
591
                                    )))?,
1,001✔
592
                            )),
593
                            "*" => Ok(Field::Decimal(
3,003✔
594
                                Decimal::from_i64(left_v)
1,001✔
595
                                    .ok_or(PipelineError::UnableToCast(
1,001✔
596
                                        format!("{}", left_v),
1,001✔
597
                                        "Decimal".to_string(),
1,001✔
598
                                    ))?
1,001✔
599
                                    .checked_mul(right_v)
1,001✔
600
                                    .ok_or(PipelineError::SqlError(Operation(
1,001✔
601
                                        OperationError::MultiplicationOverflow,
1,001✔
602
                                    )))?,
1,001✔
603
                            )),
604
                            "+" | "-" => Ok(Field::Decimal($fct(
2,002✔
605
                                Decimal::from_i64(left_v).ok_or(PipelineError::UnableToCast(
2,002✔
606
                                    format!("{}", left_v),
2,002✔
607
                                    "Decimal".to_string(),
2,002✔
608
                                ))?,
2,002✔
609
                                right_v,
2,002✔
610
                            ))),
611
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
612
                                left_p,
×
613
                                right_p,
×
614
                                $op.to_string(),
×
615
                            )),
×
616
                        }
617
                    }
618
                    // left: Int, right: Null
619
                    Field::Null => Ok(Field::Null),
5,000✔
620
                    Field::Boolean(_)
621
                    | Field::String(_)
622
                    | Field::Text(_)
623
                    | Field::Binary(_)
624
                    | Field::Timestamp(_)
625
                    | Field::Date(_)
626
                    | Field::Json(_)
627
                    | Field::Point(_)
628
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
629
                        left_p,
×
630
                        right_p,
×
631
                        $op.to_string(),
×
632
                    )),
×
633
                },
634
                Field::I128(left_v) => match right_p {
35,000✔
635
                    // left: I128, right: Int
636
                    Field::Int(right_v) => {
5,000✔
637
                        return match $op {
5,000✔
638
                            // When I128 / Int division happens
5,000✔
639
                            "/" => {
5,000✔
640
                                if right_v == 0_i64 {
1,000✔
641
                                    Err(PipelineError::SqlError(Operation(
×
642
                                        OperationError::DivisionByZeroOrOverflow,
×
643
                                    )))
×
644
                                } else {
645
                                    Ok(Field::Float($fct(
646
                                        OrderedFloat::<f64>::from_i128(left_v).ok_or(
1,000✔
647
                                            PipelineError::UnableToCast(
1,000✔
648
                                                format!("{}", left_v),
1,000✔
649
                                                "f64".to_string(),
1,000✔
650
                                            ),
1,000✔
651
                                        )?,
1,000✔
652
                                        OrderedFloat::<f64>::from_i64(right_v).ok_or(
×
653
                                            PipelineError::UnableToCast(
×
654
                                                format!("{}", right_v),
×
655
                                                "f64".to_string(),
×
656
                                            ),
×
657
                                        )?,
×
658
                                    )))
659
                                }
660
                            }
661
                            // When it's not division operation
662
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
663
                                $fct(Wrapping(left_v), Wrapping(right_v as i128)).0,
4,000✔
664
                            )),
4,000✔
665
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
666
                                left_p,
×
667
                                right_p,
×
668
                                $op.to_string(),
×
669
                            )),
×
670
                        };
671
                    }
672
                    // left: I128, right: I128
673
                    Field::I128(right_v) => {
5,000✔
674
                        return match $op {
5,000✔
675
                            // When I128 / I128 division happens
5,000✔
676
                            "/" => {
5,000✔
677
                                if right_v == 0_i128 {
1,000✔
678
                                    Err(PipelineError::SqlError(Operation(
×
679
                                        OperationError::DivisionByZeroOrOverflow,
×
680
                                    )))
×
681
                                } else {
682
                                    Ok(Field::Float($fct(
683
                                        OrderedFloat::<f64>::from_i128(left_v).ok_or(
1,000✔
684
                                            PipelineError::UnableToCast(
1,000✔
685
                                                format!("{}", left_v),
1,000✔
686
                                                "f64".to_string(),
1,000✔
687
                                            ),
1,000✔
688
                                        )?,
1,000✔
689
                                        OrderedFloat::<f64>::from_i128(right_v).ok_or(
×
690
                                            PipelineError::UnableToCast(
×
691
                                                format!("{}", right_v),
×
692
                                                "f64".to_string(),
×
693
                                            ),
×
694
                                        )?,
×
695
                                    )))
696
                                }
697
                            }
698
                            // When it's not division operation
699
                            "+" | "-" | "*" | "%" => {
4,000✔
700
                                Ok(Field::I128($fct(Wrapping(left_v), Wrapping(right_v)).0))
4,000✔
701
                            }
702
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
703
                                left_p,
×
704
                                right_p,
×
705
                                $op.to_string(),
×
706
                            )),
×
707
                        };
708
                    }
709
                    // left: I128, right: UInt
710
                    Field::UInt(right_v) => {
5,000✔
711
                        return match $op {
5,000✔
712
                            // When I128 / UInt division happens
5,000✔
713
                            "/" => {
5,000✔
714
                                if right_v == 0_u64 {
1,000✔
715
                                    Err(PipelineError::SqlError(Operation(
×
716
                                        OperationError::DivisionByZeroOrOverflow,
×
717
                                    )))
×
718
                                } else {
719
                                    Ok(Field::Float($fct(
720
                                        OrderedFloat::<f64>::from_i128(left_v).ok_or(
1,000✔
721
                                            PipelineError::UnableToCast(
1,000✔
722
                                                format!("{}", left_v),
1,000✔
723
                                                "f64".to_string(),
1,000✔
724
                                            ),
1,000✔
725
                                        )?,
1,000✔
726
                                        OrderedFloat::<f64>::from_u64(right_v).ok_or(
×
727
                                            PipelineError::UnableToCast(
×
728
                                                format!("{}", right_v),
×
729
                                                "f64".to_string(),
×
730
                                            ),
×
731
                                        )?,
×
732
                                    )))
733
                                }
734
                            }
735
                            // When it's not division operation
736
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
737
                                $fct(Wrapping(left_v), Wrapping(right_v as i128)).0,
4,000✔
738
                            )),
4,000✔
739
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
740
                                left_p,
×
741
                                right_p,
×
742
                                $op.to_string(),
×
743
                            )),
×
744
                        };
745
                    }
746
                    // left: I128, right: U128
747
                    Field::U128(right_v) => {
5,000✔
748
                        return match $op {
5,000✔
749
                            // When Int / U128 division happens
5,000✔
750
                            "/" => {
5,000✔
751
                                if right_v == 0_u128 {
1,000✔
752
                                    Err(PipelineError::SqlError(Operation(
×
753
                                        OperationError::DivisionByZeroOrOverflow,
×
754
                                    )))
×
755
                                } else {
756
                                    Ok(Field::Float($fct(
757
                                        OrderedFloat::<f64>::from_i128(left_v).ok_or(
1,000✔
758
                                            PipelineError::UnableToCast(
1,000✔
759
                                                format!("{}", left_v),
1,000✔
760
                                                "f64".to_string(),
1,000✔
761
                                            ),
1,000✔
762
                                        )?,
1,000✔
763
                                        OrderedFloat::<f64>::from_u128(right_v).ok_or(
×
764
                                            PipelineError::UnableToCast(
×
765
                                                format!("{}", right_v),
×
766
                                                "f64".to_string(),
×
767
                                            ),
×
768
                                        )?,
×
769
                                    )))
770
                                }
771
                            }
772
                            // When it's not division operation
773
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
774
                                $fct(Wrapping(left_v), Wrapping(right_v as i128)).0,
4,000✔
775
                            )),
4,000✔
776
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
777
                                left_p,
×
778
                                right_p,
×
779
                                $op.to_string(),
×
780
                            )),
×
781
                        };
782
                    }
783
                    // left: I128, right: Float
784
                    Field::Float(right_v) => {
5,000✔
785
                        return match $op {
5,000✔
786
                            "/" | "%" => {
5,000✔
787
                                if right_v == 0_f64 {
2,000✔
788
                                    Err(PipelineError::SqlError(Operation(
285✔
789
                                        OperationError::DivisionByZeroOrOverflow,
285✔
790
                                    )))
285✔
791
                                } else {
792
                                    Ok(Field::Float($fct(
793
                                        OrderedFloat::<f64>::from_i128(left_v).ok_or(
1,715✔
794
                                            PipelineError::UnableToCast(
1,715✔
795
                                                format!("{}", left_v),
1,715✔
796
                                                "f64".to_string(),
1,715✔
797
                                            ),
1,715✔
798
                                        )?,
1,715✔
799
                                        right_v,
×
800
                                    )))
801
                                }
802
                            }
803
                            &_ => Ok(Field::Float($fct(
804
                                OrderedFloat::<f64>::from_i128(left_v).ok_or(
3,000✔
805
                                    PipelineError::UnableToCast(
3,000✔
806
                                        format!("{}", left_v),
3,000✔
807
                                        "f64".to_string(),
3,000✔
808
                                    ),
3,000✔
809
                                )?,
3,000✔
810
                                right_v,
×
811
                            ))),
812
                        }
813
                    }
814
                    // left: I128, right: Decimal
815
                    Field::Decimal(right_v) => {
5,000✔
816
                        return match $op {
5,000✔
817
                            "/" | "%" => {
5,000✔
818
                                if right_v == dozer_types::rust_decimal::Decimal::zero() {
2,000✔
819
                                    Err(PipelineError::SqlError(Operation(
×
820
                                        OperationError::DivisionByZeroOrOverflow,
×
821
                                    )))
×
822
                                } else {
823
                                    Ok(Field::Decimal($fct(
824
                                        Decimal::from_i128(left_v).ok_or(
2,000✔
825
                                            PipelineError::UnableToCast(
2,000✔
826
                                                format!("{}", left_v),
2,000✔
827
                                                "Decimal".to_string(),
2,000✔
828
                                            ),
2,000✔
829
                                        )?,
2,000✔
830
                                        right_v,
×
831
                                    )))
832
                                }
833
                            }
834
                            &_ => Ok(Field::Decimal($fct(
835
                                Decimal::from_i128(left_v).ok_or(PipelineError::UnableToCast(
3,000✔
836
                                    format!("{}", left_v),
3,000✔
837
                                    "Decimal".to_string(),
3,000✔
838
                                ))?,
3,000✔
839
                                right_v,
×
840
                            ))),
841
                        }
842
                    }
843
                    // left: I128, right: Null
844
                    Field::Null => Ok(Field::Null),
5,000✔
845
                    Field::Boolean(_)
846
                    | Field::String(_)
847
                    | Field::Text(_)
848
                    | Field::Binary(_)
849
                    | Field::Timestamp(_)
850
                    | Field::Date(_)
851
                    | Field::Json(_)
852
                    | Field::Point(_)
853
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
854
                        left_p,
×
855
                        right_p,
×
856
                        $op.to_string(),
×
857
                    )),
×
858
                },
859
                Field::UInt(left_v) => match right_p {
34,704✔
860
                    // left: UInt, right: Int
861
                    Field::Int(right_v) => {
5,000✔
862
                        return match $op {
5,000✔
863
                            // When UInt / Int division happens
5,000✔
864
                            "/" => {
5,000✔
865
                                if right_v == 0_i64 {
1,000✔
866
                                    Err(PipelineError::SqlError(Operation(
×
867
                                        OperationError::DivisionByZeroOrOverflow,
×
868
                                    )))
×
869
                                } else {
870
                                    Ok(Field::Float(OrderedFloat($fct(
871
                                        f64::from_u64(left_v).ok_or(
1,000✔
872
                                            PipelineError::UnableToCast(
1,000✔
873
                                                format!("{}", left_v),
1,000✔
874
                                                "f64".to_string(),
1,000✔
875
                                            ),
1,000✔
876
                                        )?,
1,000✔
877
                                        f64::from_i64(right_v).ok_or(
1,000✔
878
                                            PipelineError::UnableToCast(
1,000✔
879
                                                format!("{}", right_v),
1,000✔
880
                                                "f64".to_string(),
1,000✔
881
                                            ),
1,000✔
882
                                        )?,
1,000✔
883
                                    ))))
884
                                }
885
                            }
886
                            // When it's not division operation
887
                            "+" | "-" | "*" | "%" => Ok(Field::Int(
4,000✔
888
                                $fct(Wrapping(left_v as i64), Wrapping(right_v)).0,
4,000✔
889
                            )),
4,000✔
890
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
891
                                left_p,
×
892
                                right_p,
×
893
                                $op.to_string(),
×
894
                            )),
×
895
                        };
896
                    }
897
                    // left: UInt, right: I128
898
                    Field::I128(right_v) => {
5,000✔
899
                        return match $op {
5,000✔
900
                            // When UInt / I128 division happens
5,000✔
901
                            "/" => {
5,000✔
902
                                if right_v == 0_i128 {
1,000✔
903
                                    Err(PipelineError::SqlError(Operation(
×
904
                                        OperationError::DivisionByZeroOrOverflow,
×
905
                                    )))
×
906
                                } else {
907
                                    Ok(Field::Float(OrderedFloat($fct(
908
                                        f64::from_u64(left_v).ok_or(
1,000✔
909
                                            PipelineError::UnableToCast(
1,000✔
910
                                                format!("{}", left_v),
1,000✔
911
                                                "f64".to_string(),
1,000✔
912
                                            ),
1,000✔
913
                                        )?,
1,000✔
914
                                        f64::from_i128(right_v).ok_or(
1,000✔
915
                                            PipelineError::UnableToCast(
1,000✔
916
                                                format!("{}", right_v),
1,000✔
917
                                                "f64".to_string(),
1,000✔
918
                                            ),
1,000✔
919
                                        )?,
1,000✔
920
                                    ))))
921
                                }
922
                            }
923
                            // When it's not division operation
924
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
925
                                $fct(Wrapping(left_v as i128), Wrapping(right_v)).0,
4,000✔
926
                            )),
4,000✔
927
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
928
                                left_p,
×
929
                                right_p,
×
930
                                $op.to_string(),
×
931
                            )),
×
932
                        };
933
                    }
934
                    // left: UInt, right: UInt
935
                    Field::UInt(right_v) => {
5,000✔
936
                        return match $op {
5,000✔
937
                            // When UInt / UInt division happens
5,000✔
938
                            "/" => {
5,000✔
939
                                if right_v == 0_u64 {
1,000✔
940
                                    Err(PipelineError::SqlError(Operation(
×
941
                                        OperationError::DivisionByZeroOrOverflow,
×
942
                                    )))
×
943
                                } else {
944
                                    Ok(Field::Float(
945
                                        OrderedFloat::<f64>::from_f64($fct(
946
                                            f64::from_u64(left_v).ok_or(
1,000✔
947
                                                PipelineError::UnableToCast(
1,000✔
948
                                                    format!("{}", left_v),
1,000✔
949
                                                    "f64".to_string(),
1,000✔
950
                                                ),
1,000✔
951
                                            )?,
1,000✔
952
                                            f64::from_u64(right_v).ok_or(
1,000✔
953
                                                PipelineError::UnableToCast(
1,000✔
954
                                                    format!("{}", right_v),
1,000✔
955
                                                    "f64".to_string(),
1,000✔
956
                                                ),
1,000✔
957
                                            )?,
1,000✔
958
                                        ))
959
                                        .ok_or(
1,000✔
960
                                            PipelineError::UnableToCast(
1,000✔
961
                                                format!("{}", left_v),
1,000✔
962
                                                "OrderedFloat".to_string(),
1,000✔
963
                                            ),
1,000✔
964
                                        )?,
1,000✔
965
                                    ))
966
                                }
967
                            }
968
                            // When it's not division operation
969
                            "+" | "-" | "*" | "%" => {
4,000✔
970
                                Ok(Field::UInt($fct(Wrapping(left_v), Wrapping(right_v)).0))
4,000✔
971
                            }
972
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
973
                                left_p,
×
974
                                right_p,
×
975
                                $op.to_string(),
×
976
                            )),
×
977
                        };
978
                    }
979
                    // left: UInt, right: U128
980
                    Field::U128(right_v) => {
5,000✔
981
                        return match $op {
5,000✔
982
                            // When UInt / UInt division happens
5,000✔
983
                            "/" => {
5,000✔
984
                                if right_v == 0_u128 {
1,000✔
985
                                    Err(PipelineError::SqlError(Operation(
×
986
                                        OperationError::DivisionByZeroOrOverflow,
×
987
                                    )))
×
988
                                } else {
989
                                    Ok(Field::Float(
990
                                        OrderedFloat::<f64>::from_f64($fct(
991
                                            f64::from_u64(left_v).ok_or(
1,000✔
992
                                                PipelineError::UnableToCast(
1,000✔
993
                                                    format!("{}", left_v),
1,000✔
994
                                                    "f64".to_string(),
1,000✔
995
                                                ),
1,000✔
996
                                            )?,
1,000✔
997
                                            f64::from_u128(right_v).ok_or(
1,000✔
998
                                                PipelineError::UnableToCast(
1,000✔
999
                                                    format!("{}", right_v),
1,000✔
1000
                                                    "f64".to_string(),
1,000✔
1001
                                                ),
1,000✔
1002
                                            )?,
1,000✔
1003
                                        ))
1004
                                        .ok_or(
1,000✔
1005
                                            PipelineError::UnableToCast(
1,000✔
1006
                                                format!("{}", left_v),
1,000✔
1007
                                                "OrderedFloat".to_string(),
1,000✔
1008
                                            ),
1,000✔
1009
                                        )?,
1,000✔
1010
                                    ))
1011
                                }
1012
                            }
1013
                            // When it's not division operation
1014
                            "+" | "-" | "*" | "%" => Ok(Field::U128(
4,000✔
1015
                                $fct(Wrapping(left_v as u128), Wrapping(right_v)).0,
4,000✔
1016
                            )),
4,000✔
1017
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1018
                                left_p,
×
1019
                                right_p,
×
1020
                                $op.to_string(),
×
1021
                            )),
×
1022
                        };
1023
                    }
1024
                    // left: UInt, right: Float
1025
                    Field::Float(right_v) => {
4,699✔
1026
                        return match $op {
4,699✔
1027
                            "/" | "%" => {
4,699✔
1028
                                if right_v == 0_f64 {
1,699✔
1029
                                    Err(PipelineError::SqlError(Operation(
×
1030
                                        OperationError::DivisionByZeroOrOverflow,
×
1031
                                    )))
×
1032
                                } else {
1033
                                    Ok(Field::Float($fct(
1034
                                        OrderedFloat::<f64>::from_u64(left_v).ok_or(
1,699✔
1035
                                            PipelineError::UnableToCast(
1,699✔
1036
                                                format!("{}", left_v),
1,699✔
1037
                                                "f64".to_string(),
1,699✔
1038
                                            ),
1,699✔
1039
                                        )?,
1,699✔
1040
                                        right_v,
1,699✔
1041
                                    )))
1042
                                }
1043
                            }
1044
                            &_ => Ok(Field::Float($fct(
1045
                                OrderedFloat::<f64>::from_u64(left_v).ok_or(
3,000✔
1046
                                    PipelineError::UnableToCast(
3,000✔
1047
                                        format!("{}", left_v),
3,000✔
1048
                                        "f64".to_string(),
3,000✔
1049
                                    ),
3,000✔
1050
                                )?,
3,000✔
1051
                                right_v,
3,000✔
1052
                            ))),
1053
                        }
1054
                    }
1055
                    // left: UInt, right: Decimal
1056
                    Field::Decimal(right_v) => {
5,005✔
1057
                        return match $op {
5,005✔
1058
                            "/" => {
5,005✔
1059
                                if right_v == dozer_types::rust_decimal::Decimal::zero() {
1,001✔
1060
                                    Err(PipelineError::SqlError(Operation(
×
1061
                                        OperationError::DivisionByZeroOrOverflow,
×
1062
                                    )))
×
1063
                                } else {
1064
                                    Ok(Field::Decimal(
1065
                                        Decimal::from_u64(left_v)
1,001✔
1066
                                            .ok_or(PipelineError::UnableToCast(
1,001✔
1067
                                                format!("{}", left_v),
1,001✔
1068
                                                "Decimal".to_string(),
1,001✔
1069
                                            ))?
1,001✔
1070
                                            .checked_div(right_v)
1,001✔
1071
                                            .ok_or(PipelineError::SqlError(Operation(
1,001✔
1072
                                                OperationError::DivisionByZeroOrOverflow,
1,001✔
1073
                                            )))?,
1,001✔
1074
                                    ))
1075
                                }
1076
                            }
1077
                            "%" => Ok(Field::Decimal(
4,004✔
1078
                                Decimal::from_u64(left_v)
1,001✔
1079
                                    .ok_or(PipelineError::UnableToCast(
1,001✔
1080
                                        format!("{}", left_v),
1,001✔
1081
                                        "Decimal".to_string(),
1,001✔
1082
                                    ))?
1,001✔
1083
                                    .checked_rem(right_v)
1,001✔
1084
                                    .ok_or(PipelineError::SqlError(Operation(
1,001✔
1085
                                        OperationError::ModuloByZeroOrOverflow,
1,001✔
1086
                                    )))?,
1,001✔
1087
                            )),
1088
                            "*" => Ok(Field::Decimal(
3,003✔
1089
                                Decimal::from_u64(left_v)
1,001✔
1090
                                    .ok_or(PipelineError::UnableToCast(
1,001✔
1091
                                        format!("{}", left_v),
1,001✔
1092
                                        "Decimal".to_string(),
1,001✔
1093
                                    ))?
1,001✔
1094
                                    .checked_mul(right_v)
1,001✔
1095
                                    .ok_or(PipelineError::SqlError(Operation(
1,001✔
1096
                                        OperationError::MultiplicationOverflow,
1,001✔
1097
                                    )))?,
1,001✔
1098
                            )),
1099
                            "+" | "-" => Ok(Field::Decimal($fct(
2,002✔
1100
                                Decimal::from_u64(left_v).ok_or(PipelineError::UnableToCast(
2,002✔
1101
                                    format!("{}", left_v),
2,002✔
1102
                                    "Decimal".to_string(),
2,002✔
1103
                                ))?,
2,002✔
1104
                                right_v,
2,002✔
1105
                            ))),
1106
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1107
                                left_p,
×
1108
                                right_p,
×
1109
                                $op.to_string(),
×
1110
                            )),
×
1111
                        }
1112
                    }
1113
                    // left: UInt, right: Null
1114
                    Field::Null => Ok(Field::Null),
5,000✔
1115
                    Field::Boolean(_)
1116
                    | Field::String(_)
1117
                    | Field::Text(_)
1118
                    | Field::Binary(_)
1119
                    | Field::Timestamp(_)
1120
                    | Field::Date(_)
1121
                    | Field::Json(_)
1122
                    | Field::Point(_)
1123
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1124
                        left_p,
×
1125
                        right_p,
×
1126
                        $op.to_string(),
×
1127
                    )),
×
1128
                },
1129
                Field::U128(left_v) => match right_p {
35,000✔
1130
                    // left: U128, right: Int
1131
                    Field::Int(right_v) => {
5,000✔
1132
                        return match $op {
5,000✔
1133
                            // When U128 / Int division happens
5,000✔
1134
                            "/" => {
5,000✔
1135
                                if right_v == 0_i64 {
1,000✔
1136
                                    Err(PipelineError::SqlError(Operation(
×
1137
                                        OperationError::DivisionByZeroOrOverflow,
×
1138
                                    )))
×
1139
                                } else {
1140
                                    Ok(Field::Float(OrderedFloat($fct(
1141
                                        f64::from_u128(left_v).ok_or(
1,000✔
1142
                                            PipelineError::UnableToCast(
1,000✔
1143
                                                format!("{}", left_v),
1,000✔
1144
                                                "f64".to_string(),
1,000✔
1145
                                            ),
1,000✔
1146
                                        )?,
1,000✔
1147
                                        f64::from_i64(right_v).ok_or(
1,000✔
1148
                                            PipelineError::UnableToCast(
1,000✔
1149
                                                format!("{}", right_v),
1,000✔
1150
                                                "f64".to_string(),
1,000✔
1151
                                            ),
1,000✔
1152
                                        )?,
1,000✔
1153
                                    ))))
1154
                                }
1155
                            }
1156
                            // When it's not division operation
1157
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
1158
                                $fct(Wrapping(left_v as i128), Wrapping(right_v as i128)).0,
4,000✔
1159
                            )),
4,000✔
1160
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1161
                                left_p,
×
1162
                                right_p,
×
1163
                                $op.to_string(),
×
1164
                            )),
×
1165
                        };
1166
                    }
1167
                    // left: U128, right: I128
1168
                    Field::I128(right_v) => {
5,000✔
1169
                        return match $op {
5,000✔
1170
                            // When U128 / I128 division happens
5,000✔
1171
                            "/" => {
5,000✔
1172
                                if right_v == 0_i128 {
1,000✔
1173
                                    Err(PipelineError::SqlError(Operation(
×
1174
                                        OperationError::DivisionByZeroOrOverflow,
×
1175
                                    )))
×
1176
                                } else {
1177
                                    Ok(Field::Float(OrderedFloat($fct(
1178
                                        f64::from_u128(left_v).ok_or(
1,000✔
1179
                                            PipelineError::UnableToCast(
1,000✔
1180
                                                format!("{}", left_v),
1,000✔
1181
                                                "f64".to_string(),
1,000✔
1182
                                            ),
1,000✔
1183
                                        )?,
1,000✔
1184
                                        f64::from_i128(right_v).ok_or(
1,000✔
1185
                                            PipelineError::UnableToCast(
1,000✔
1186
                                                format!("{}", right_v),
1,000✔
1187
                                                "f64".to_string(),
1,000✔
1188
                                            ),
1,000✔
1189
                                        )?,
1,000✔
1190
                                    ))))
1191
                                }
1192
                            }
1193
                            // When it's not division operation
1194
                            "+" | "-" | "*" | "%" => Ok(Field::I128(
4,000✔
1195
                                $fct(Wrapping(left_v as i128), Wrapping(right_v)).0,
4,000✔
1196
                            )),
4,000✔
1197
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1198
                                left_p,
×
1199
                                right_p,
×
1200
                                $op.to_string(),
×
1201
                            )),
×
1202
                        };
1203
                    }
1204
                    // left: U128, right: UInt
1205
                    Field::UInt(right_v) => {
5,000✔
1206
                        return match $op {
5,000✔
1207
                            // When U128 / UInt division happens
5,000✔
1208
                            "/" => {
5,000✔
1209
                                if right_v == 0_u64 {
1,000✔
1210
                                    Err(PipelineError::SqlError(Operation(
×
1211
                                        OperationError::DivisionByZeroOrOverflow,
×
1212
                                    )))
×
1213
                                } else {
1214
                                    Ok(Field::Float(
1215
                                        OrderedFloat::<f64>::from_f64($fct(
1216
                                            f64::from_u128(left_v).ok_or(
1,000✔
1217
                                                PipelineError::UnableToCast(
1,000✔
1218
                                                    format!("{}", left_v),
1,000✔
1219
                                                    "f64".to_string(),
1,000✔
1220
                                                ),
1,000✔
1221
                                            )?,
1,000✔
1222
                                            f64::from_u64(right_v).ok_or(
1,000✔
1223
                                                PipelineError::UnableToCast(
1,000✔
1224
                                                    format!("{}", right_v),
1,000✔
1225
                                                    "f64".to_string(),
1,000✔
1226
                                                ),
1,000✔
1227
                                            )?,
1,000✔
1228
                                        ))
1229
                                        .ok_or(
1,000✔
1230
                                            PipelineError::UnableToCast(
1,000✔
1231
                                                format!("{}", left_v),
1,000✔
1232
                                                "OrderedFloat".to_string(),
1,000✔
1233
                                            ),
1,000✔
1234
                                        )?,
1,000✔
1235
                                    ))
1236
                                }
1237
                            }
1238
                            // When it's not division operation
1239
                            "+" | "-" | "*" | "%" => Ok(Field::U128(
4,000✔
1240
                                $fct(Wrapping(left_v), Wrapping(right_v as u128)).0,
4,000✔
1241
                            )),
4,000✔
1242
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1243
                                left_p,
×
1244
                                right_p,
×
1245
                                $op.to_string(),
×
1246
                            )),
×
1247
                        };
1248
                    }
1249
                    // left: U128, right: U128
1250
                    Field::U128(right_v) => {
5,000✔
1251
                        return match $op {
5,000✔
1252
                            // When U128 / U128 division happens
5,000✔
1253
                            "/" => {
5,000✔
1254
                                if right_v == 0_u128 {
1,000✔
1255
                                    Err(PipelineError::SqlError(Operation(
×
1256
                                        OperationError::DivisionByZeroOrOverflow,
×
1257
                                    )))
×
1258
                                } else {
1259
                                    Ok(Field::Float(
1260
                                        OrderedFloat::<f64>::from_f64($fct(
1261
                                            f64::from_u128(left_v).ok_or(
1,000✔
1262
                                                PipelineError::UnableToCast(
1,000✔
1263
                                                    format!("{}", left_v),
1,000✔
1264
                                                    "f64".to_string(),
1,000✔
1265
                                                ),
1,000✔
1266
                                            )?,
1,000✔
1267
                                            f64::from_u128(right_v).ok_or(
1,000✔
1268
                                                PipelineError::UnableToCast(
1,000✔
1269
                                                    format!("{}", right_v),
1,000✔
1270
                                                    "f64".to_string(),
1,000✔
1271
                                                ),
1,000✔
1272
                                            )?,
1,000✔
1273
                                        ))
1274
                                        .ok_or(
1,000✔
1275
                                            PipelineError::UnableToCast(
1,000✔
1276
                                                format!("{}", left_v),
1,000✔
1277
                                                "OrderedFloat".to_string(),
1,000✔
1278
                                            ),
1,000✔
1279
                                        )?,
1,000✔
1280
                                    ))
1281
                                }
1282
                            }
1283
                            // When it's not division operation
1284
                            "+" | "-" | "*" | "%" => {
4,000✔
1285
                                Ok(Field::U128($fct(Wrapping(left_v), Wrapping(right_v)).0))
4,000✔
1286
                            }
1287
                            &_ => Err(PipelineError::InvalidTypeComparison(
×
1288
                                left_p,
×
1289
                                right_p,
×
1290
                                $op.to_string(),
×
1291
                            )),
×
1292
                        };
1293
                    }
1294
                    // left: U128, right: Float
1295
                    Field::Float(right_v) => {
5,000✔
1296
                        return match $op {
5,000✔
1297
                            "/" | "%" => {
5,000✔
1298
                                if right_v == 0_f64 {
2,000✔
1299
                                    Err(PipelineError::SqlError(Operation(
286✔
1300
                                        OperationError::DivisionByZeroOrOverflow,
286✔
1301
                                    )))
286✔
1302
                                } else {
1303
                                    Ok(Field::Float($fct(
1304
                                        OrderedFloat::<f64>::from_u128(left_v).ok_or(
1,714✔
1305
                                            PipelineError::UnableToCast(
1,714✔
1306
                                                format!("{}", left_v),
1,714✔
1307
                                                "f64".to_string(),
1,714✔
1308
                                            ),
1,714✔
1309
                                        )?,
1,714✔
1310
                                        right_v,
×
1311
                                    )))
1312
                                }
1313
                            }
1314
                            &_ => Ok(Field::Float($fct(
1315
                                OrderedFloat::<f64>::from_u128(left_v).ok_or(
3,000✔
1316
                                    PipelineError::UnableToCast(
3,000✔
1317
                                        format!("{}", left_v),
3,000✔
1318
                                        "f64".to_string(),
3,000✔
1319
                                    ),
3,000✔
1320
                                )?,
3,000✔
1321
                                right_v,
×
1322
                            ))),
1323
                        }
1324
                    }
1325
                    // left: U128, right: Decimal
1326
                    Field::Decimal(right_v) => {
5,000✔
1327
                        return match $op {
5,000✔
1328
                            "/" | "%" => {
5,000✔
1329
                                if right_v == dozer_types::rust_decimal::Decimal::zero() {
2,000✔
1330
                                    Err(PipelineError::SqlError(Operation(
×
1331
                                        OperationError::DivisionByZeroOrOverflow,
×
1332
                                    )))
×
1333
                                } else {
1334
                                    Ok(Field::Decimal($fct(
1335
                                        Decimal::from_u128(left_v).ok_or(
2,000✔
1336
                                            PipelineError::UnableToCast(
2,000✔
1337
                                                format!("{}", left_v),
2,000✔
1338
                                                "Decimal".to_string(),
2,000✔
1339
                                            ),
2,000✔
1340
                                        )?,
2,000✔
1341
                                        right_v,
×
1342
                                    )))
1343
                                }
1344
                            }
1345
                            &_ => Ok(Field::Decimal($fct(
1346
                                Decimal::from_u128(left_v).ok_or(PipelineError::UnableToCast(
3,000✔
1347
                                    format!("{}", left_v),
3,000✔
1348
                                    "Decimal".to_string(),
3,000✔
1349
                                ))?,
3,000✔
1350
                                right_v,
×
1351
                            ))),
1352
                        }
1353
                    }
1354
                    // left: U128, right: Null
1355
                    Field::Null => Ok(Field::Null),
5,000✔
1356
                    Field::Boolean(_)
1357
                    | Field::String(_)
1358
                    | Field::Text(_)
1359
                    | Field::Binary(_)
1360
                    | Field::Timestamp(_)
1361
                    | Field::Date(_)
1362
                    | Field::Json(_)
1363
                    | Field::Point(_)
1364
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1365
                        left_p,
×
1366
                        right_p,
×
1367
                        $op.to_string(),
×
1368
                    )),
×
1369
                },
1370
                Field::Decimal(left_v) => {
31,498✔
1371
                    return match $op {
31,498✔
1372
                        "/" => {
31,498✔
1373
                            match right_p {
6,396✔
1374
                                // left: Decimal, right: Int
1375
                                Field::Int(right_v) => {
1,392✔
1376
                                    if right_v == 0_i64 {
1,392✔
1377
                                        Err(PipelineError::SqlError(Operation(
×
1378
                                            OperationError::DivisionByZeroOrOverflow,
×
1379
                                        )))
×
1380
                                    } else {
1381
                                        Ok(Field::Decimal(
1382
                                            left_v
1,392✔
1383
                                                .checked_div(Decimal::from_i64(right_v).ok_or(
1,392✔
1384
                                                    PipelineError::UnableToCast(
1,392✔
1385
                                                        format!("{}", left_v),
1,392✔
1386
                                                        "Decimal".to_string(),
1,392✔
1387
                                                    ),
1,392✔
1388
                                                )?)
1,392✔
1389
                                                .ok_or(PipelineError::SqlError(Operation(
1,392✔
1390
                                                    OperationError::DivisionByZeroOrOverflow,
1,392✔
1391
                                                )))?,
1,392✔
1392
                                        ))
1393
                                    }
1394
                                }
1395
                                // left: Decimal, right: I128
1396
                                Field::I128(right_v) => {
1,000✔
1397
                                    if right_v == 0_i128 {
1,000✔
1398
                                        Err(PipelineError::SqlError(Operation(
×
1399
                                            OperationError::DivisionByZeroOrOverflow,
×
1400
                                        )))
×
1401
                                    } else {
1402
                                        Ok(Field::Decimal(
1403
                                            left_v
1,000✔
1404
                                                .checked_div(Decimal::from_i128(right_v).ok_or(
1,000✔
1405
                                                    PipelineError::UnableToCast(
1,000✔
1406
                                                        format!("{}", left_v),
1,000✔
1407
                                                        "Decimal".to_string(),
1,000✔
1408
                                                    ),
1,000✔
1409
                                                )?)
1,000✔
1410
                                                .ok_or(PipelineError::SqlError(Operation(
×
1411
                                                    OperationError::DivisionByZeroOrOverflow,
×
1412
                                                )))?,
×
1413
                                        ))
1414
                                    }
1415
                                }
1416
                                // left: Decimal, right: UInt
1417
                                Field::UInt(right_v) => {
1,000✔
1418
                                    if right_v == 0_u64 {
1,000✔
1419
                                        Err(PipelineError::SqlError(Operation(
×
1420
                                            OperationError::DivisionByZeroOrOverflow,
×
1421
                                        )))
×
1422
                                    } else {
1423
                                        Ok(Field::Decimal(
1424
                                            left_v
1,000✔
1425
                                                .checked_div(Decimal::from_u64(right_v).ok_or(
1,000✔
1426
                                                    PipelineError::UnableToCast(
1,000✔
1427
                                                        format!("{}", right_v),
1,000✔
1428
                                                        "Decimal".to_string(),
1,000✔
1429
                                                    ),
1,000✔
1430
                                                )?)
1,000✔
1431
                                                .ok_or(PipelineError::SqlError(Operation(
1,000✔
1432
                                                    OperationError::DivisionByZeroOrOverflow,
1,000✔
1433
                                                )))?,
1,000✔
1434
                                        ))
1435
                                    }
1436
                                }
1437
                                // left: Decimal, right: U128
1438
                                Field::U128(right_v) => {
1,000✔
1439
                                    if right_v == 0_u128 {
1,000✔
1440
                                        Err(PipelineError::SqlError(Operation(
×
1441
                                            OperationError::DivisionByZeroOrOverflow,
×
1442
                                        )))
×
1443
                                    } else {
1444
                                        Ok(Field::Decimal(
1445
                                            left_v
1,000✔
1446
                                                .checked_div(Decimal::from_u128(right_v).ok_or(
1,000✔
1447
                                                    PipelineError::UnableToCast(
1,000✔
1448
                                                        format!("{}", right_v),
1,000✔
1449
                                                        "Decimal".to_string(),
1,000✔
1450
                                                    ),
1,000✔
1451
                                                )?)
1,000✔
1452
                                                .ok_or(PipelineError::SqlError(Operation(
×
1453
                                                    OperationError::DivisionByZeroOrOverflow,
×
1454
                                                )))?,
×
1455
                                        ))
1456
                                    }
1457
                                }
1458
                                // left: Decimal, right: Float
1459
                                Field::Float(right_v) => {
4✔
1460
                                    if right_v == 0_f64 {
4✔
1461
                                        Err(PipelineError::SqlError(Operation(
×
1462
                                            OperationError::DivisionByZeroOrOverflow,
×
1463
                                        )))
×
1464
                                    } else {
1465
                                        Ok(Field::Decimal(
1466
                                            left_v
4✔
1467
                                                .checked_div(Decimal::from_f64(*right_v).ok_or(
4✔
1468
                                                    PipelineError::UnableToCast(
4✔
1469
                                                        format!("{}", right_v),
4✔
1470
                                                        "Decimal".to_string(),
4✔
1471
                                                    ),
4✔
1472
                                                )?)
4✔
1473
                                                .ok_or(PipelineError::SqlError(Operation(
4✔
1474
                                                    OperationError::DivisionByZeroOrOverflow,
4✔
1475
                                                )))?,
4✔
1476
                                        ))
1477
                                    }
1478
                                }
1479
                                // left: Decimal, right: Null
1480
                                Field::Null => Ok(Field::Null),
1,000✔
1481
                                // left: Decimal, right: Decimal
1482
                                Field::Decimal(right_v) => Ok(Field::Decimal(
1,000✔
1483
                                    left_v.checked_div(right_v).ok_or(PipelineError::SqlError(
1,000✔
1484
                                        Operation(OperationError::DivisionByZeroOrOverflow),
1,000✔
1485
                                    ))?,
1,000✔
1486
                                )),
1487
                                Field::Boolean(_)
1488
                                | Field::String(_)
1489
                                | Field::Text(_)
1490
                                | Field::Binary(_)
1491
                                | Field::Timestamp(_)
1492
                                | Field::Date(_)
1493
                                | Field::Json(_)
1494
                                | Field::Point(_)
1495
                                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1496
                                    left_p,
×
1497
                                    right_p,
×
1498
                                    $op.to_string(),
×
1499
                                )),
×
1500
                            }
1501
                        }
1502
                        "%" => {
25,102✔
1503
                            match right_p {
6,004✔
1504
                                // left: Decimal, right: Int
1505
                                Field::Int(right_v) => Ok(Field::Decimal(
1,000✔
1506
                                    left_v
1,000✔
1507
                                        .checked_rem(Decimal::from_i64(right_v).ok_or(
1,000✔
1508
                                            PipelineError::UnableToCast(
1,000✔
1509
                                                format!("{}", left_v),
1,000✔
1510
                                                "Decimal".to_string(),
1,000✔
1511
                                            ),
1,000✔
1512
                                        )?)
1,000✔
1513
                                        .ok_or(PipelineError::SqlError(Operation(
1,000✔
1514
                                            OperationError::ModuloByZeroOrOverflow,
1,000✔
1515
                                        )))?,
1,000✔
1516
                                )),
1517
                                // left: Decimal, right: I128
1518
                                Field::I128(right_v) => Ok(Field::Decimal(
1,000✔
1519
                                    left_v
1,000✔
1520
                                        .checked_rem(Decimal::from_i128(right_v).ok_or(
1,000✔
1521
                                            PipelineError::UnableToCast(
1,000✔
1522
                                                format!("{}", left_v),
1,000✔
1523
                                                "Decimal".to_string(),
1,000✔
1524
                                            ),
1,000✔
1525
                                        )?)
1,000✔
1526
                                        .ok_or(PipelineError::SqlError(Operation(
×
1527
                                            OperationError::ModuloByZeroOrOverflow,
×
1528
                                        )))?,
×
1529
                                )),
1530
                                // left: Decimal, right: UInt
1531
                                Field::UInt(right_v) => Ok(Field::Decimal(
1,000✔
1532
                                    left_v
1,000✔
1533
                                        .checked_rem(Decimal::from_u64(right_v).ok_or(
1,000✔
1534
                                            PipelineError::UnableToCast(
1,000✔
1535
                                                format!("{}", right_v),
1,000✔
1536
                                                "Decimal".to_string(),
1,000✔
1537
                                            ),
1,000✔
1538
                                        )?)
1,000✔
1539
                                        .ok_or(PipelineError::SqlError(Operation(
1,000✔
1540
                                            OperationError::ModuloByZeroOrOverflow,
1,000✔
1541
                                        )))?,
1,000✔
1542
                                )),
1543
                                // left: Decimal, right: U128
1544
                                Field::U128(right_v) => Ok(Field::Decimal(
1,000✔
1545
                                    left_v
1,000✔
1546
                                        .checked_rem(Decimal::from_u128(right_v).ok_or(
1,000✔
1547
                                            PipelineError::UnableToCast(
1,000✔
1548
                                                format!("{}", right_v),
1,000✔
1549
                                                "Decimal".to_string(),
1,000✔
1550
                                            ),
1,000✔
1551
                                        )?)
1,000✔
1552
                                        .ok_or(PipelineError::SqlError(Operation(
×
1553
                                            OperationError::ModuloByZeroOrOverflow,
×
1554
                                        )))?,
×
1555
                                )),
1556
                                // left: Decimal, right: Float
1557
                                Field::Float(right_v) => Ok(Field::Decimal(
4✔
1558
                                    left_v
4✔
1559
                                        .checked_rem(Decimal::from_f64(*right_v).ok_or(
4✔
1560
                                            PipelineError::UnableToCast(
4✔
1561
                                                format!("{}", right_v),
4✔
1562
                                                "Decimal".to_string(),
4✔
1563
                                            ),
4✔
1564
                                        )?)
4✔
1565
                                        .ok_or(PipelineError::SqlError(Operation(
4✔
1566
                                            OperationError::ModuloByZeroOrOverflow,
4✔
1567
                                        )))?,
4✔
1568
                                )),
1569
                                // left: Decimal, right: Null
1570
                                Field::Null => Ok(Field::Null),
1,000✔
1571
                                // left: Decimal, right: Decimal
1572
                                Field::Decimal(right_v) => Ok(Field::Decimal(
1,000✔
1573
                                    left_v.checked_rem(right_v).ok_or(PipelineError::SqlError(
1,000✔
1574
                                        Operation(OperationError::ModuloByZeroOrOverflow),
1,000✔
1575
                                    ))?,
1,000✔
1576
                                )),
1577
                                Field::Boolean(_)
1578
                                | Field::String(_)
1579
                                | Field::Text(_)
1580
                                | Field::Binary(_)
1581
                                | Field::Timestamp(_)
1582
                                | Field::Date(_)
1583
                                | Field::Json(_)
1584
                                | Field::Point(_)
1585
                                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1586
                                    left_p,
×
1587
                                    right_p,
×
1588
                                    $op.to_string(),
×
1589
                                )),
×
1590
                            }
1591
                        }
1592
                        "*" => {
19,098✔
1593
                            match right_p {
6,698✔
1594
                                // left: Decimal, right: Int
1595
                                Field::Int(right_v) => Ok(Field::Decimal(
1,694✔
1596
                                    left_v
1,694✔
1597
                                        .checked_mul(Decimal::from_i64(right_v).ok_or(
1,694✔
1598
                                            PipelineError::UnableToCast(
1,694✔
1599
                                                format!("{}", left_v),
1,694✔
1600
                                                "Decimal".to_string(),
1,694✔
1601
                                            ),
1,694✔
1602
                                        )?)
1,694✔
1603
                                        .ok_or(PipelineError::SqlError(Operation(
1,694✔
1604
                                            OperationError::MultiplicationOverflow,
1,694✔
1605
                                        )))?,
1,694✔
1606
                                )),
1607
                                // left: Decimal, right: I128
1608
                                Field::I128(right_v) => Ok(Field::Decimal(
1,000✔
1609
                                    left_v
1,000✔
1610
                                        .checked_mul(Decimal::from_i128(right_v).ok_or(
1,000✔
1611
                                            PipelineError::UnableToCast(
1,000✔
1612
                                                format!("{}", left_v),
1,000✔
1613
                                                "Decimal".to_string(),
1,000✔
1614
                                            ),
1,000✔
1615
                                        )?)
1,000✔
1616
                                        .ok_or(PipelineError::SqlError(Operation(
×
1617
                                            OperationError::MultiplicationOverflow,
×
1618
                                        )))?,
×
1619
                                )),
1620
                                // left: Decimal, right: UInt
1621
                                Field::UInt(right_v) => Ok(Field::Decimal(
1,000✔
1622
                                    left_v
1,000✔
1623
                                        .checked_mul(Decimal::from_u64(right_v).ok_or(
1,000✔
1624
                                            PipelineError::UnableToCast(
1,000✔
1625
                                                format!("{}", right_v),
1,000✔
1626
                                                "Decimal".to_string(),
1,000✔
1627
                                            ),
1,000✔
1628
                                        )?)
1,000✔
1629
                                        .ok_or(PipelineError::SqlError(Operation(
1,000✔
1630
                                            OperationError::MultiplicationOverflow,
1,000✔
1631
                                        )))?,
1,000✔
1632
                                )),
1633
                                // left: Decimal, right: U128
1634
                                Field::U128(right_v) => Ok(Field::Decimal(
1,000✔
1635
                                    left_v
1,000✔
1636
                                        .checked_mul(Decimal::from_u128(right_v).ok_or(
1,000✔
1637
                                            PipelineError::UnableToCast(
1,000✔
1638
                                                format!("{}", right_v),
1,000✔
1639
                                                "Decimal".to_string(),
1,000✔
1640
                                            ),
1,000✔
1641
                                        )?)
1,000✔
1642
                                        .ok_or(PipelineError::SqlError(Operation(
×
1643
                                            OperationError::MultiplicationOverflow,
×
1644
                                        )))?,
×
1645
                                )),
1646
                                // left: Decimal, right: Float
1647
                                Field::Float(right_v) => Ok(Field::Decimal(
4✔
1648
                                    left_v
4✔
1649
                                        .checked_mul(Decimal::from_f64(*right_v).ok_or(
4✔
1650
                                            PipelineError::UnableToCast(
4✔
1651
                                                format!("{}", right_v),
4✔
1652
                                                "Decimal".to_string(),
4✔
1653
                                            ),
4✔
1654
                                        )?)
4✔
1655
                                        .ok_or(PipelineError::SqlError(Operation(
4✔
1656
                                            OperationError::MultiplicationOverflow,
4✔
1657
                                        )))?,
4✔
1658
                                )),
1659
                                // left: Decimal, right: Null
1660
                                Field::Null => Ok(Field::Null),
1,000✔
1661
                                // left: Decimal, right: Decimal
1662
                                Field::Decimal(right_v) => Ok(Field::Decimal(
1,000✔
1663
                                    left_v.checked_mul(right_v).ok_or(PipelineError::SqlError(
1,000✔
1664
                                        Operation(OperationError::MultiplicationOverflow),
1,000✔
1665
                                    ))?,
1,000✔
1666
                                )),
1667
                                Field::Boolean(_)
1668
                                | Field::String(_)
1669
                                | Field::Text(_)
1670
                                | Field::Binary(_)
1671
                                | Field::Timestamp(_)
1672
                                | Field::Date(_)
1673
                                | Field::Json(_)
1674
                                | Field::Point(_)
1675
                                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1676
                                    left_p,
×
1677
                                    right_p,
×
1678
                                    $op.to_string(),
×
1679
                                )),
×
1680
                            }
1681
                        }
1682
                        "+" | "-" => {
12,400✔
1683
                            match right_p {
12,400✔
1684
                                // left: Decimal, right: Int
1685
                                Field::Int(right_v) => Ok(Field::Decimal($fct(
2,000✔
1686
                                    left_v,
2,000✔
1687
                                    Decimal::from_i64(right_v).ok_or(
2,000✔
1688
                                        PipelineError::UnableToCast(
2,000✔
1689
                                            format!("{}", left_v),
2,000✔
1690
                                            "Decimal".to_string(),
2,000✔
1691
                                        ),
2,000✔
1692
                                    )?,
2,000✔
1693
                                ))),
1694
                                // left: Decimal, right: I128
1695
                                Field::I128(right_v) => Ok(Field::Decimal($fct(
2,000✔
1696
                                    left_v,
2,000✔
1697
                                    Decimal::from_i128(right_v).ok_or(
2,000✔
1698
                                        PipelineError::UnableToCast(
2,000✔
1699
                                            format!("{}", left_v),
2,000✔
1700
                                            "Decimal".to_string(),
2,000✔
1701
                                        ),
2,000✔
1702
                                    )?,
2,000✔
1703
                                ))),
1704
                                // left: Decimal, right: UInt
1705
                                Field::UInt(right_v) => Ok(Field::Decimal($fct(
2,000✔
1706
                                    left_v,
2,000✔
1707
                                    Decimal::from_u64(right_v).ok_or(
2,000✔
1708
                                        PipelineError::UnableToCast(
2,000✔
1709
                                            format!("{}", right_v),
2,000✔
1710
                                            "Decimal".to_string(),
2,000✔
1711
                                        ),
2,000✔
1712
                                    )?,
2,000✔
1713
                                ))),
1714
                                // left: Decimal, right: U128
1715
                                Field::U128(right_v) => Ok(Field::Decimal($fct(
2,000✔
1716
                                    left_v,
2,000✔
1717
                                    Decimal::from_u128(right_v).ok_or(
2,000✔
1718
                                        PipelineError::UnableToCast(
2,000✔
1719
                                            format!("{}", right_v),
2,000✔
1720
                                            "Decimal".to_string(),
2,000✔
1721
                                        ),
2,000✔
1722
                                    )?,
2,000✔
1723
                                ))),
1724
                                // left: Decimal, right: Float
1725
                                Field::Float(right_v) => Ok(Field::Decimal($fct(
8✔
1726
                                    left_v,
8✔
1727
                                    Decimal::from_f64(*right_v).ok_or(
8✔
1728
                                        PipelineError::UnableToCast(
8✔
1729
                                            format!("{}", right_v),
8✔
1730
                                            "Decimal".to_string(),
8✔
1731
                                        ),
8✔
1732
                                    )?,
8✔
1733
                                ))),
1734
                                // left: Decimal, right: Null
1735
                                Field::Null => Ok(Field::Null),
2,000✔
1736
                                // left: Decimal, right: Decimal
1737
                                Field::Decimal(right_v) => {
2,392✔
1738
                                    Ok(Field::Decimal($fct(left_v, right_v)))
2,392✔
1739
                                }
1740
                                Field::Boolean(_)
1741
                                | Field::String(_)
1742
                                | Field::Text(_)
1743
                                | Field::Binary(_)
1744
                                | Field::Timestamp(_)
1745
                                | Field::Date(_)
1746
                                | Field::Json(_)
1747
                                | Field::Point(_)
1748
                                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1749
                                    left_p,
×
1750
                                    right_p,
×
1751
                                    $op.to_string(),
×
1752
                                )),
×
1753
                            }
1754
                        }
1755
                        &_ => Err(PipelineError::InvalidTypeComparison(
×
1756
                            left_p,
×
1757
                            right_p,
×
1758
                            $op.to_string(),
×
1759
                        )),
×
1760
                    };
1761
                }
1762
                // right: Null, right: *
1763
                Field::Null => Ok(Field::Null),
35,000✔
1764
                Field::Boolean(_)
1765
                | Field::String(_)
1766
                | Field::Text(_)
1767
                | Field::Binary(_)
1768
                | Field::Date(_)
1769
                | Field::Json(_)
1770
                | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
5,000✔
1771
                    left_p,
5,000✔
1772
                    right_p,
5,000✔
1773
                    $op.to_string(),
5,000✔
1774
                )),
5,000✔
1775
            }
1776
        }
252,912✔
1777
    };
1778
}
1779

1780
define_math_operator!(evaluate_add, "+", std::ops::Add::add, 0);
×
1781
define_math_operator!(evaluate_sub, "-", std::ops::Sub::sub, 0);
×
1782
define_math_operator!(evaluate_mul, "*", std::ops::Mul::mul, 0);
×
1783
define_math_operator!(evaluate_div, "/", std::ops::Div::div, 1);
×
1784
define_math_operator!(evaluate_mod, "%", std::ops::Rem::rem, 0);
×
1785

1786
pub fn evaluate_plus(
×
1787
    schema: &Schema,
×
1788
    expression: &Expression,
×
1789
    record: &Record,
×
1790
) -> Result<Field, PipelineError> {
×
1791
    let expression_result = expression.evaluate(record, schema)?;
×
1792
    match expression_result {
×
1793
        Field::UInt(v) => Ok(Field::UInt(v)),
×
1794
        Field::U128(v) => Ok(Field::U128(v)),
×
1795
        Field::Int(v) => Ok(Field::Int(v)),
×
1796
        Field::I128(v) => Ok(Field::I128(v)),
×
1797
        Field::Float(v) => Ok(Field::Float(v)),
×
1798
        Field::Decimal(v) => Ok(Field::Decimal(v)),
×
1799
        Field::Boolean(_)
1800
        | Field::String(_)
1801
        | Field::Text(_)
1802
        | Field::Binary(_)
1803
        | Field::Timestamp(_)
1804
        | Field::Date(_)
1805
        | Field::Json(_)
1806
        | Field::Point(_)
1807
        | Field::Duration(_)
1808
        | Field::Null => Err(PipelineError::InvalidType(
×
1809
            expression_result,
×
1810
            "+".to_string(),
×
1811
        )),
×
1812
    }
1813
}
×
1814

1815
pub fn evaluate_minus(
×
1816
    schema: &Schema,
×
1817
    expression: &Expression,
×
1818
    record: &Record,
×
1819
) -> Result<Field, PipelineError> {
×
1820
    let expression_result = expression.evaluate(record, schema)?;
×
1821
    match expression_result {
×
1822
        Field::UInt(v) => Ok(Field::UInt(v)),
×
1823
        Field::U128(v) => Ok(Field::U128(v)),
×
1824
        Field::Int(v) => Ok(Field::Int(-v)),
×
1825
        Field::I128(v) => Ok(Field::I128(-v)),
×
1826
        Field::Float(v) => Ok(Field::Float(-v)),
×
1827
        Field::Decimal(v) => Ok(Field::Decimal(v.neg())),
×
1828
        Field::Timestamp(dt) => Ok(Field::Timestamp(dt.checked_add_signed(chrono::Duration::nanoseconds(1)).unwrap())),
×
1829
        Field::Boolean(_)
1830
        | Field::String(_)
1831
        | Field::Text(_)
1832
        | Field::Binary(_)
1833
        // | Field::Timestamp(_)
1834
        | Field::Date(_)
1835
        | Field::Json(_)
1836
        | Field::Point(_)
1837
        | Field::Duration(_)
1838
        | Field::Null => Err(PipelineError::InvalidType(
×
1839
            expression_result,
×
1840
            "-".to_string(),
×
1841
        )),
×
1842
    }
1843
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc