92 lines
4.1 KiB
JavaScript
92 lines
4.1 KiB
JavaScript
// Miscellaneous covered query tests. Mostly negative tests
|
|
// These are tests where we do not expect the query to be a
|
|
// covered index query. Hence we expect indexOnly=false and
|
|
// nscannedObjects > 0
|
|
|
|
// Include helpers for analyzing explain output.
|
|
load("jstests/libs/analyze_plan.js");
|
|
|
|
var coll = db.getCollection("covered_negative_1");
|
|
coll.drop();
|
|
for (i = 0; i < 100; i++) {
|
|
coll.insert(
|
|
{a: i, b: "strvar_" + (i % 13), c: NumberInt(i % 10), d: i * 10, e: [i, i % 10], f: i});
|
|
}
|
|
coll.ensureIndex({a: 1, b: -1, c: 1});
|
|
coll.ensureIndex({e: 1});
|
|
coll.ensureIndex({d: 1});
|
|
coll.ensureIndex({f: "hashed"});
|
|
|
|
// Test no projection
|
|
var plan =
|
|
coll.find({a: 10, b: "strvar_10", c: 0}).hint({a: 1, b: -1, c: 1}).explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.1 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.1 - docs examined should not be 0 for a non covered query");
|
|
|
|
// Test projection and not excluding _id
|
|
var plan = coll.find({a: 10, b: "strvar_10", c: 0}, {a: 1, b: 1, c: 1})
|
|
.hint({a: 1, b: -1, c: 1})
|
|
.explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.2 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.2 - docs examined should not be 0 for a non covered query");
|
|
|
|
// Test projection of non-indexed field
|
|
var plan = coll.find({d: 100}, {d: 1, c: 1, _id: 0}).hint({d: 1}).explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.3 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.3 - docs examined should not be 0 for a non covered query");
|
|
|
|
// Test query and projection on a multi-key index
|
|
var plan = coll.find({e: 99}, {e: 1, _id: 0}).hint({e: 1}).explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.4 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.4 - docs examined should not be 0 for a non covered query");
|
|
|
|
// Commenting out negative.1.5 and 1.6 pending fix in SERVER-8650
|
|
// // Test projection and $natural sort
|
|
// var plan = coll.find({a:{$gt:70}},{a:1, b:1, c:1, _id:0}).sort({$natural:1}).hint({a:1, b:-1,
|
|
// c:1}).explain()
|
|
// // indexOnly should be false but is not due to bug https://jira.mongodb.org/browse/SERVER-8561
|
|
// assert.eq(true, plan.indexOnly, "negative.1.5 - indexOnly should be false on a non covered
|
|
// query")
|
|
// assert.neq(0, plan.nscannedObjects, "negative.1.5 - nscannedObjects should not be 0 for a non
|
|
// covered query")
|
|
|
|
// // Test sort on non-indexed field
|
|
// var plan = coll.find({d:{$lt:1000}},{d:1, _id:0}).sort({c:1}).hint({d:1}).explain()
|
|
// //indexOnly should be false but is not due to bug https://jira.mongodb.org/browse/SERVER-8562
|
|
// assert.eq(true, plan.indexOnly, "negative.1.6 - indexOnly should be false on a non covered
|
|
// query")
|
|
// assert.neq(0, plan.nscannedObjects, "negative.1.6 - nscannedObjects should not be 0 for a non
|
|
// covered query")
|
|
|
|
// Test query on non-indexed field
|
|
var plan = coll.find({d: {$lt: 1000}}, {a: 1, b: 1, c: 1, _id: 0})
|
|
.hint({a: 1, b: -1, c: 1})
|
|
.explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.7 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.7 - docs examined should not be 0 for a non covered query");
|
|
|
|
// Test query on hashed indexed field
|
|
var plan = coll.find({f: 10}, {f: 1, _id: 0}).hint({f: "hashed"}).explain("executionStats");
|
|
assert(!isIndexOnly(plan.queryPlanner.winningPlan),
|
|
"negative.1.8 - indexOnly should be false on a non covered query");
|
|
assert.neq(0,
|
|
plan.executionStats.totalDocsExamined,
|
|
"negative.1.8 - nscannedObjects should not be 0 for a non covered query");
|
|
|
|
print('all tests passed');
|