From ba59b00736b5b8dc0f0bd46397575aaf0cd4d44f Mon Sep 17 00:00:00 2001 From: Antonin Kral Date: Thu, 1 Mar 2012 13:43:25 +0100 Subject: Imported Upstream version 2.0.3 --- dbtests/queryoptimizertests.cpp | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'dbtests/queryoptimizertests.cpp') diff --git a/dbtests/queryoptimizertests.cpp b/dbtests/queryoptimizertests.cpp index 38d631e..59a9874 100644 --- a/dbtests/queryoptimizertests.cpp +++ b/dbtests/queryoptimizertests.cpp @@ -1921,6 +1921,33 @@ namespace QueryOptimizerTests { } }; + /** Yield and remove document with $or query. */ + class YieldRemoveOr : public Base { + public: + void run() { + _cli.insert( ns(), BSON( "_id" << 1 ) ); + _cli.insert( ns(), BSON( "_id" << 2 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + setQueryOptimizerCursor( BSON( "$or" << BSON_ARRAY( BSON( "_id" << 1 ) << BSON( "_id" << 2 ) ) ) ); + ASSERT_EQUALS( 1, current().getIntField( "_id" ) ); + ASSERT( prepareToYield() ); + } + + _cli.remove( ns(), BSON( "_id" << 1 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + recoverFromYield(); + ASSERT( ok() ); + ASSERT_EQUALS( 2, current().getIntField( "_id" ) ); + } + } + }; + /** Yield and overwrite current in capped collection. */ class YieldCappedOverwrite : public Base { public: @@ -2074,6 +2101,68 @@ namespace QueryOptimizerTests { } }; + /** Yielding with delete, multiple plans active, and $or clause. */ + class YieldMultiplePlansDeleteOr : public Base { + public: + void run() { + _cli.insert( ns(), BSON( "_id" << 1 << "a" << 2 ) ); + _cli.insert( ns(), BSON( "_id" << 2 << "a" << 1 ) ); + _cli.ensureIndex( ns(), BSON( "a" << 1 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + setQueryOptimizerCursor( BSON( "$or" << BSON_ARRAY( BSON( "_id" << 1 << "a" << 2 ) << BSON( "_id" << 2 << "a" << 1 ) ) ) ); + ASSERT_EQUALS( 1, current().getIntField( "_id" ) ); + ASSERT( prepareToYield() ); + } + + _cli.remove( ns(), BSON( "_id" << 1 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + c()->recoverFromYield(); + ASSERT( ok() ); + ASSERT_EQUALS( 2, current().getIntField( "_id" ) ); + ASSERT( !advance() ); + ASSERT( !ok() ); + } + } + }; + + /** Yielding with delete, multiple plans active with advancement to the second, and $or clause. */ + class YieldMultiplePlansDeleteOrAdvance : public Base { + public: + void run() { + _cli.insert( ns(), BSON( "_id" << 1 << "a" << 2 ) ); + _cli.insert( ns(), BSON( "_id" << 2 << "a" << 1 ) ); + _cli.ensureIndex( ns(), BSON( "a" << 1 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + setQueryOptimizerCursor( BSON( "$or" << BSON_ARRAY( BSON( "_id" << 1 << "a" << 2 ) << BSON( "_id" << 2 << "a" << 1 ) ) ) ); + ASSERT_EQUALS( 1, current().getIntField( "_id" ) ); + ASSERT( prepareToYield() ); + c()->advance(); + ASSERT_EQUALS( 1, current().getIntField( "_id" ) ); + } + + _cli.remove( ns(), BSON( "_id" << 1 ) ); + + { + dblock lk; + Client::Context ctx( ns() ); + c()->recoverFromYield(); + ASSERT( ok() ); + ASSERT_EQUALS( 2, current().getIntField( "_id" ) ); + ASSERT( !advance() ); + ASSERT( !ok() ); + } + } + }; + /** Yielding with multiple plans and capped overwrite. */ class YieldMultiplePlansCappedOverwrite : public Base { public: @@ -2703,11 +2792,14 @@ namespace QueryOptimizerTests { add(); add(); add(); + add(); add(); add(); add(); add(); add(); + add(); + add(); add(); add(); add(); -- cgit v1.2.3