90 lines
4.0 KiB
JavaScript
90 lines
4.0 KiB
JavaScript
/**
|
|
* Tests some of the find command's semantics with respect to how 64-bit integers and doubles are
|
|
* compared with each other.
|
|
* @tags: [
|
|
* requires_getmore
|
|
* ]
|
|
*/
|
|
import {arrayEq, orderedArrayEq} from "jstests/aggregation/extras/utils.js";
|
|
|
|
const coll = db.jstests_compare_long_double;
|
|
coll.drop();
|
|
|
|
function runWithAndWithoutIndex(keyPattern, testFunc) {
|
|
testFunc();
|
|
assert.commandWorked(coll.createIndex(keyPattern));
|
|
testFunc();
|
|
}
|
|
|
|
const values = [
|
|
{_id: 125, a: 0, b: 0, c: -(Math.pow(2, 63) + Math.pow(2, 11))},
|
|
{_id: 101, a: 1, b: 0, c: NumberLong("-9223372036854775808")},
|
|
{_id: 112, a: 1, b: 1, c: -(Math.pow(2, 63))},
|
|
{_id: 132, a: 2, b: 0, c: NumberLong("-9223372036854775807")},
|
|
{_id: 106, a: 3, b: 0, c: NumberLong("-9223372036854773761")},
|
|
{_id: 126, a: 4, b: 0, c: NumberLong("-9223372036854773760")},
|
|
{_id: 131, a: 4, b: 1, c: -(Math.pow(2, 63) - Math.pow(2, 11))},
|
|
{_id: 122, a: 5, b: 0, c: NumberLong("-9223372036854773759")},
|
|
{_id: 111, a: 6, b: 0, c: NumberLong("-9007199254740996")},
|
|
{_id: 123, a: 6, b: 1, c: -9007199254740996},
|
|
{_id: 117, a: 7, b: 0, c: NumberLong("-9007199254740995")},
|
|
{_id: 103, a: 8, b: 0, c: NumberLong("-9007199254740994")},
|
|
{_id: 114, a: 8, b: 1, c: -9007199254740994},
|
|
{_id: 109, a: 9, b: 0, c: NumberLong("-9007199254740993")},
|
|
{_id: 116, a: 10, b: 0, c: NumberLong("-9007199254740992")},
|
|
{_id: 124, a: 10, b: 1, c: -9007199254740992},
|
|
{_id: 129, a: 11, b: 0, c: NumberLong("-9007199254740991")},
|
|
{_id: 130, a: 11, b: 1, c: -9007199254740991},
|
|
{_id: 105, a: 12, b: 0, c: NumberLong("9007199254740991")},
|
|
{_id: 115, a: 12, b: 1, c: 9007199254740991},
|
|
{_id: 113, a: 13, b: 0, c: NumberLong("9007199254740992")},
|
|
{_id: 120, a: 13, b: 1, c: 9007199254740992},
|
|
{_id: 108, a: 14, b: 0, c: NumberLong("9007199254740993")},
|
|
{_id: 107, a: 15, b: 0, c: NumberLong("9007199254740994")},
|
|
{_id: 110, a: 15, b: 1, c: 9007199254740994},
|
|
{_id: 121, a: 16, b: 0, c: NumberLong("9007199254740995")},
|
|
{_id: 118, a: 17, b: 0, c: NumberLong("9007199254740996")},
|
|
{_id: 100, a: 17, b: 1, c: 9007199254740996},
|
|
{_id: 104, a: 18, b: 0, c: NumberLong("9223372036854773759")},
|
|
{_id: 127, a: 19, b: 0, c: NumberLong("9223372036854773760")},
|
|
{_id: 133, a: 19, b: 1, c: (Math.pow(2, 63) - Math.pow(2, 11))},
|
|
{_id: 128, a: 20, b: 0, c: NumberLong("9223372036854773761")},
|
|
{_id: 102, a: 21, b: 0, c: NumberLong("9223372036854775807")},
|
|
{_id: 119, a: 22, b: 0, c: Math.pow(2, 63)},
|
|
];
|
|
|
|
Random.setRandomSeed(0);
|
|
|
|
assert.commandWorked(coll.insert(Array.shuffle(values.concat())));
|
|
|
|
runWithAndWithoutIndex({a: 1}, () => {
|
|
const testcase = function(query, lambda) {
|
|
const expected = values
|
|
.map(x => {
|
|
return {a: x.a};
|
|
})
|
|
.filter(lambda);
|
|
const result = coll.find(query, {a: 1, _id: 0}).toArray();
|
|
assert(arrayEq(result, expected),
|
|
tojson(query) + " failed:\n" + tojson(result) + " != " + tojson(expected));
|
|
};
|
|
|
|
for (const {_id: id, a: a, c: c} of values) {
|
|
testcase({c: {$lt: c}}, x => (x.a < a));
|
|
testcase({c: {$lte: c}}, x => (x.a <= a));
|
|
testcase({c: {$eq: c}}, x => (x.a == a));
|
|
testcase({c: {$gte: c}}, x => (x.a >= a));
|
|
testcase({c: {$gt: c}}, x => (x.a > a));
|
|
|
|
testcase({$expr: {$lt: ["$c", c]}}, x => (x.a < a));
|
|
testcase({$expr: {$lte: ["$c", c]}}, x => (x.a <= a));
|
|
testcase({$expr: {$eq: ["$c", c]}}, x => (x.a == a));
|
|
testcase({$expr: {$gte: ["$c", c]}}, x => (x.a >= a));
|
|
testcase({$expr: {$gt: ["$c", c]}}, x => (x.a > a));
|
|
|
|
const result = coll.find({}).sort({c: 1, b: 1}).toArray().map(x => x._id);
|
|
const expected = coll.find({}).sort({a: 1, b: 1}).toArray().map(x => x._id);
|
|
assert(orderedArrayEq(result, expected),
|
|
"Comparison of sort results failed:\n" + tojson(result) + " != " + tojson(expected));
|
|
}
|
|
}); |