diff options
Diffstat (limited to 'jstests/core/index/bindata_indexonly.js')
-rw-r--r-- | jstests/core/index/bindata_indexonly.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/jstests/core/index/bindata_indexonly.js b/jstests/core/index/bindata_indexonly.js new file mode 100644 index 00000000000..3fc83d0f2fd --- /dev/null +++ b/jstests/core/index/bindata_indexonly.js @@ -0,0 +1,77 @@ +/** + * This test ensures that range predicates with a BinData value: + * 1) Return the correct documents. + * 2) Can perform index-only data access. + * @tags: [ + * assumes_read_concern_local, + * ] + */ +(function() { +'use strict'; + +load("jstests/libs/analyze_plan.js"); + +var coll = db.jstests_bindata_indexonly; + +coll.drop(); +assert.commandWorked(coll.insert({_id: BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAAA"), a: 1})); +assert.commandWorked(coll.insert({_id: BinData(0, "AQAAAAEBAAVlbl9VSwAAAAAAAAhv"), a: 2})); +assert.commandWorked(coll.insert({_id: BinData(0, "AQAAAAEBAAVlbl9VSwAAAAAAAAhz"), a: 3})); +assert.commandWorked(coll.insert({_id: BinData(0, "////////////////////////////"), a: 4})); +assert.commandWorked(coll.createIndex({_id: 1, a: 1})); + +assert.throws(function() { + db.mycoll.insert({_id: 0, a: BinData.prototype}); +}, [], "bindata getter did not fail"); + +function testIndexOnlyBinData(blob) { + var explain = + coll.find({$and: [{_id: {$lte: BinData(0, blob)}}, {_id: {$gte: BinData(0, blob)}}]}, + {_id: 1, a: 1}) + .hint({_id: 1, a: 1}) + .explain("executionStats"); + + assert(isIndexOnly(db, explain.queryPlanner.winningPlan), + "indexonly.BinData(0, " + blob + ") - must be index-only"); + assert.eq(1, + explain.executionStats.nReturned, + "EXACTone.BinData(0, " + blob + ") - should only return one in unique set"); +} + +testIndexOnlyBinData("AAAAAAAAAAAAAAAAAAAAAAAAAAAA"); +testIndexOnlyBinData("AQAAAAEBAAVlbl9VSwAAAAAAAAhv"); +testIndexOnlyBinData("AQAAAAEBAAVlbl9VSwAAAAAAAAhz"); +testIndexOnlyBinData("////////////////////////////"); + +var explain; + +explain = coll.find({_id: {$lt: BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAAA")}}, {_id: 1, a: 1}) + .hint({_id: 1, a: 1}) + .explain("executionStats"); +assert(isIndexOnly(db, explain), "indexonly.$lt.1 - must be index-only"); +assert.eq( + 0, explain.executionStats.nReturned, "correctcount.$lt.1 - not returning correct documents"); + +explain = coll.find({_id: {$gt: BinData(0, "////////////////////////////")}}, {_id: 1, a: 1}) + .hint({_id: 1, a: 1}) + .explain("executionStats"); +assert(isIndexOnly(db, explain), "indexonly.$gt.2 - must be index-only"); +assert.eq( + 0, explain.executionStats.nReturned, "correctcount.$gt.2 - not returning correct documents"); + +explain = coll.find({_id: {$lte: BinData(0, "AQAAAAEBAAVlbl9VSwAAAAAAAAhv")}}, {_id: 1, a: 1}) + .hint({_id: 1, a: 1}) + .explain("executionStats"); +assert(isIndexOnly(db, explain), "indexonly.$lte.3 - must be index-only"); +assert.eq( + 2, explain.executionStats.nReturned, "correctcount.$lte.3 - not returning correct documents"); + +explain = coll.find({_id: {$gte: BinData(0, "AQAAAAEBAAVlbl9VSwAAAAAAAAhz")}}, {_id: 1, a: 1}) + .hint({_id: 1, a: 1}) + .explain("executionStats"); +assert(isIndexOnly(db, explain), "indexonly.$gte.3 - must be index-only"); +assert.eq( + 2, explain.executionStats.nReturned, "correctcount.$gte.3 - not returning correct documents"); + +coll.drop(); +})(); |