Files
mongo/jstests/core/sortg.js

72 lines
1.8 KiB
JavaScript

// Cannot implicitly shard accessed collections because of extra shard key index in sharded
// collection.
// @tags: [
// assumes_no_implicit_index_creation,
// requires_getmore,
// sbe_incompatible,
// ]
// Test that a memory exception is triggered for in memory sorts, but not for indexed sorts.
(function() {
"use strict";
const t = db.jstests_sortg;
t.drop();
const big = new Array(1000000).toString();
let i;
for (i = 0; i < 100; ++i) {
t.save({b: 0});
}
for (i = 0; i < 110; ++i) {
t.save({a: 0, x: big});
}
function memoryException(sortSpec, querySpec) {
querySpec = querySpec || {};
var ex = assert.throws(function() {
t.find(querySpec).sort(sortSpec).batchSize(1000).itcount();
});
assert(ex.toString().match(/Sort/));
}
function noMemoryException(sortSpec, querySpec) {
querySpec = querySpec || {};
t.find(querySpec).sort(sortSpec).batchSize(1000).itcount();
}
// Unindexed sorts.
memoryException({a: 1});
memoryException({b: 1});
// Indexed sorts.
noMemoryException({_id: 1});
noMemoryException({$natural: 1});
assert.eq(1, t.getIndexes().length);
t.ensureIndex({a: 1});
t.ensureIndex({b: 1});
t.ensureIndex({c: 1});
assert.eq(4, t.getIndexes().length);
// These sorts are now indexed.
noMemoryException({a: 1});
noMemoryException({b: 1});
// A memory exception is triggered for an unindexed sort involving multiple plans.
memoryException({d: 1}, {b: null, c: null});
// With an indexed plan on _id:1 and an unindexed plan on b:1, the indexed plan should succeed
// even if the unindexed one would exhaust its memory limit.
noMemoryException({_id: 1}, {b: null});
// With an unindexed plan on b:1 recorded for a query, the query should be retried when the
// unindexed plan exhausts its memory limit.
noMemoryException({_id: 1}, {b: null});
t.drop();
})();