1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// Tests for $add, $subtract and $multiply aggregation expression type promotion on overflow
// @tags: [require_fcv_71]
(function() {
"use strict";
const coll = db.arith_overflow;
function runTest(operator, expectedResults) {
const result =
coll.aggregate([{$project: {res: {[operator]: ["$lhs", "$rhs"]}}}, {$sort: {_id: 1}}])
.toArray()
.map(r => r.res);
assert.eq(result, expectedResults);
}
// $add
coll.drop();
assert.commandWorked(coll.insert({_id: 0, lhs: NumberInt(2e+9), rhs: NumberInt(2e+9)}));
assert.commandWorked(coll.insert({_id: 1, lhs: NumberLong(9e+18), rhs: NumberLong(9e+18)}));
runTest("$add", [NumberLong(4e+9), 1.8e+19]);
// $subtract
coll.drop();
assert.commandWorked(coll.insert({_id: 0, lhs: NumberInt(2e+9), rhs: NumberInt(-2e+9)}));
assert.commandWorked(coll.insert({_id: 1, lhs: NumberLong(9e+18), rhs: NumberLong(-9e+18)}));
runTest("$subtract", [NumberLong(4e+9), 1.8e+19]);
// $multiply uses same arguments
runTest("$multiply", [NumberLong(-4e+18), -8.1e+37]);
}());
|