diff options
Diffstat (limited to 'jstests/core/always_true_false.js')
-rw-r--r-- | jstests/core/always_true_false.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/jstests/core/always_true_false.js b/jstests/core/always_true_false.js new file mode 100644 index 00000000000..0b32ac22a16 --- /dev/null +++ b/jstests/core/always_true_false.js @@ -0,0 +1,54 @@ +// Tests $alwaysTrue and $alwaysFalse behavior for match expressions. +(function() { +"use strict"; + +const coll = db.always_true_false; +coll.drop(); + +assert.commandWorked( + coll.insert([{a: []}, {a: false}, {a: null}, {}, {a: false, b: 2}, {a: false, b: 1}])); + +// Check alwaysFalse. +assert.eq(0, coll.find({$alwaysFalse: 1}).itcount()); +assert.eq(0, coll.find({$alwaysFalse: 1, a: false}).itcount()); +assert.eq(0, coll.find({$alwaysFalse: 1, b: 1}).itcount()); + +// Check alwaysFalse with $and, $or. +assert.eq(1, coll.find({$or: [{b: 1}, {$alwaysFalse: 1}]}).itcount()); +assert.eq(0, coll.find({$or: [{$alwaysFalse: 1}]}).itcount()); +assert.eq(0, coll.find({$or: [{$alwaysFalse: 1}, {$alwaysFalse: 1}]}).itcount()); +assert.eq(0, coll.find({$or: [{$alwaysFalse: 1}, {a: {$all: []}}, {$alwaysFalse: 1}]}).itcount()); +assert.eq(0, coll.find({$and: [{b: 1}, {$alwaysFalse: 1}]}).itcount()); +assert.eq(0, coll.find({$and: [{a: false}, {$alwaysFalse: 1}, {$alwaysFalse: 1}]}).itcount()); + +// Check alwaysTrue. +assert.eq(6, coll.find({$alwaysTrue: 1}).itcount()); +assert.eq(3, coll.find({$alwaysTrue: 1, a: false}).itcount()); +assert.eq(1, coll.find({$alwaysTrue: 1, b: 1}).itcount()); + +// Check alwaysTrue with $and, $or. +assert.eq(3, coll.find({$and: [{a: false}, {$alwaysTrue: 1}, {$alwaysTrue: 1}]}).itcount()); +assert.eq(0, coll.find({$and: [{a: false}, {$alwaysTrue: 1}, {$alwaysFalse: 1}]}).itcount()); +assert.eq(6, coll.find({$or: [{b: 1}, {$alwaysTrue: 1}]}).itcount()); +assert.eq(6, coll.find({$or: [{b: 1}, {$alwaysFalse: 1}, {$alwaysTrue: 1}]}).itcount()); + +assert(coll.drop()); + +// Check that a rooted-$or query with each clause false will not return any results. +assert.commandWorked(coll.insert([{}, {}, {}])); +const emptyOrError = assert.throws(() => coll.find({$or: []}).itcount()); +assert.eq(emptyOrError.code, ErrorCodes.BadValue); + +assert.eq(coll.find({$or: [{$alwaysFalse: 1}]}).itcount(), 0); +assert.eq(coll.find({$or: [{a: {$all: []}}]}).itcount(), 0); +assert.eq(coll.find({$or: [{$alwaysFalse: 1}, {$alwaysFalse: 1}]}).itcount(), 0); +assert.eq(coll.find({$or: [{$alwaysFalse: 1}, {a: {$all: []}}, {$alwaysFalse: 1}]}).itcount(), 0); + +// Check failure cases. +assert.commandFailedWithCode(db.runCommand({find: coll.getName(), filter: {$alwaysTrue: 0}}), + ErrorCodes.FailedToParse); +assert.commandFailedWithCode(db.runCommand({find: coll.getName(), filter: {$alwaysFalse: 0}}), + ErrorCodes.FailedToParse); +assert.commandFailedWithCode(db.runCommand({find: coll.getName(), filter: {a: {$alwaysFalse: 1}}}), + ErrorCodes.BadValue); +}()); |