diff options
Diffstat (limited to 'jstests/core/stage_debug/stages_and_hash.js')
-rw-r--r-- | jstests/core/stage_debug/stages_and_hash.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/jstests/core/stage_debug/stages_and_hash.js b/jstests/core/stage_debug/stages_and_hash.js new file mode 100644 index 00000000000..4e75dace007 --- /dev/null +++ b/jstests/core/stage_debug/stages_and_hash.js @@ -0,0 +1,71 @@ +// The test runs commands that are not allowed with security token: stageDebug. +// @tags: [ +// not_allowed_with_security_token, +// does_not_support_stepdowns, +// uses_testing_only_commands, +// no_selinux, +// ] + +t = db.stages_and_hashed; +t.drop(); + +var collname = "stages_and_hashed"; + +var N = 50; +for (var i = 0; i < N; ++i) { + t.insert({foo: i, bar: N - i, baz: i}); +} + +t.createIndex({foo: 1}); +t.createIndex({bar: 1}); +t.createIndex({baz: 1}); + +// Scan foo <= 20 +ixscan1 = { + ixscan: { + args: { + name: "stages_and_hashed", + keyPattern: {foo: 1}, + startKey: {"": 20}, + endKey: {}, + startKeyInclusive: true, + endKeyInclusive: true, + direction: -1 + } + } +}; + +// Scan bar >= 40 +ixscan2 = { + ixscan: { + args: { + name: "stages_and_hashed", + keyPattern: {bar: 1}, + startKey: {"": 40}, + endKey: {}, + startKeyInclusive: true, + endKeyInclusive: true, + direction: 1 + } + } +}; + +// bar = 50 - foo +// Intersection is (foo=0 bar=50, foo=1 bar=49, ..., foo=10 bar=40) +andix1ix2 = { + andHash: {args: {nodes: [ixscan1, ixscan2]}} +}; +res = db.runCommand({stageDebug: {plan: andix1ix2, collection: collname}}); +assert.eq(res.ok, 1); +assert.eq(res.results.length, 11); + +// Filter predicates from 2 indices. Tests that we union the idx info. +andix1ix2filter = { + fetch: { + filter: {bar: {$in: [45, 46, 48]}, foo: {$in: [4, 5, 6]}}, + args: {node: {andHash: {args: {nodes: [ixscan1, ixscan2]}}}} + } +}; +res = db.runCommand({stageDebug: {collection: collname, plan: andix1ix2filter}}); +assert.eq(res.ok, 1); +assert.eq(res.results.length, 2); |