diff options
author | Rushan Chen <rushan.chen@mongodb.com> | 2023-05-17 09:22:28 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-05-17 10:22:40 +0000 |
commit | 1b4a551a6b8c85611e26857217ce1a1e1363e716 (patch) | |
tree | 3a6159a18a979749843592e34e06343b96d35050 /jstests/aggregation/expressions/add.js | |
parent | f332018330ee82ec6e240a81896d8432e37609da (diff) | |
download | mongo-1b4a551a6b8c85611e26857217ce1a1e1363e716.tar.gz |
SERVER-75287: fix rounding and overflow detection in Classic for subtract when one operand is Date and another numeric
Diffstat (limited to 'jstests/aggregation/expressions/add.js')
-rw-r--r-- | jstests/aggregation/expressions/add.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/jstests/aggregation/expressions/add.js b/jstests/aggregation/expressions/add.js index cc074a9ae08..c411c3f213b 100644 --- a/jstests/aggregation/expressions/add.js +++ b/jstests/aggregation/expressions/add.js @@ -1,5 +1,7 @@ (function() { "use strict"; +load("jstests/aggregation/extras/utils.js"); // For assertErrorCode and assertErrMsgContains. +load("jstests/libs/sbe_assert_error_override.js"); // Override error-code-checking APIs. // In SERVER-63012, translation of $add expression into sbe now defaults the translation of $add // with no operands to a zero integer constant. @@ -43,4 +45,49 @@ let addResult = coll.aggregate([{$project: {add: {$add: queryArr}}}]).toArray(); let sumResult = coll.aggregate([{$project: {sum: {$sum: queryArr}}}]).toArray(); assert.neq(addResult[0]["add"], sumResult[0]["sum"]); assert.eq(addResult[0]["add"], arr.reduce((a, b) => a + b)); + +assert.eq(true, coll.drop()); +// Doubles are rounded to int64 when added to Date +assert.commandWorked(coll.insert({_id: 0, lhs: new Date(1683794065002), rhs: 0.5})); +assert.commandWorked(coll.insert({_id: 1, lhs: new Date(1683794065002), rhs: 1.4})); +assert.commandWorked(coll.insert({_id: 2, lhs: new Date(1683794065002), rhs: 1.5})); +assert.commandWorked(coll.insert({_id: 3, lhs: new Date(1683794065002), rhs: 1.7})); +// Decimals are rounded to int64, when tie rounded to even, when added to Date +assert.commandWorked( + coll.insert({_id: 4, lhs: new Date(1683794065002), rhs: new NumberDecimal("1.4")})); +assert.commandWorked( + coll.insert({_id: 5, lhs: new Date(1683794065002), rhs: new NumberDecimal("1.5")})); +assert.commandWorked( + coll.insert({_id: 6, lhs: new Date(1683794065002), rhs: new NumberDecimal("1.7")})); +assert.commandWorked( + coll.insert({_id: 7, lhs: new Date(1683794065002), rhs: new NumberDecimal("2.5")})); + +let result1 = + coll.aggregate([{$project: {sum: {$add: ["$lhs", "$rhs"]}}}, {$sort: {_id: 1}}]).toArray(); +assert.eq(result1[0].sum, new Date(1683794065003)); +assert.eq(result1[1].sum, new Date(1683794065003)); +assert.eq(result1[2].sum, new Date(1683794065004)); +assert.eq(result1[3].sum, new Date(1683794065004)); +assert.eq(result1[4].sum, new Date(1683794065003)); +assert.eq(result1[5].sum, new Date(1683794065004)); +assert.eq(result1[6].sum, new Date(1683794065004)); +assert.eq(result1[7].sum, new Date(1683794065004)); + +coll.drop(); + +assert.commandWorked(coll.insert([{ + _id: 0, + veryBigPositiveLong: NumberLong("9223372036854775806"), + veryBigPositiveDouble: 9223372036854775806, + veryBigPositiveDecimal: NumberDecimal("9223372036854775806") +}])); + +let pipeline = [{$project: {res: {$add: [new Date(10), "$veryBigPositiveLong"]}}}]; +assertErrCodeAndErrMsgContains(coll, pipeline, ErrorCodes.Overflow, "date overflow"); + +pipeline = [{$project: {res: {$add: [new Date(10), "$veryBigPositiveDouble"]}}}]; +assertErrCodeAndErrMsgContains(coll, pipeline, ErrorCodes.Overflow, "date overflow"); + +pipeline = [{$project: {res: {$add: [new Date(10), "$veryBigPositiveDecimal"]}}}]; +assertErrCodeAndErrMsgContains(coll, pipeline, ErrorCodes.Overflow, "date overflow"); }()); |