diff options
Diffstat (limited to 'dbtests/updatetests.cpp')
-rw-r--r-- | dbtests/updatetests.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/dbtests/updatetests.cpp b/dbtests/updatetests.cpp index c912bf4..95476ef 100644 --- a/dbtests/updatetests.cpp +++ b/dbtests/updatetests.cpp @@ -519,6 +519,48 @@ namespace UpdateTests { } }; + /** SERVER-4777 */ + class TwoModsWithinDuplicatedField : public SetBase { + public: + void run() { + client().insert( ns(), BSON( "_id" << 0 << "a" << 1 + << "x" << BSONObj() << "x" << BSONObj() + << "z" << 5 ) ); + client().update( ns(), BSONObj(), BSON( "$set" << BSON( "x.b" << 1 << "x.c" << 1 ) ) ); + ASSERT_EQUALS( BSON( "_id" << 0 << "a" << 1 + << "x" << BSON( "b" << 1 << "c" << 1 ) << "x" << BSONObj() + << "z" << 5 ), + client().findOne( ns(), BSONObj() ) ); + } + }; + + /** SERVER-4777 */ + class ThreeModsWithinDuplicatedField : public SetBase { + public: + void run() { + client().insert( ns(), + BSON( "_id" << 0 + << "x" << BSONObj() << "x" << BSONObj() << "x" << BSONObj() ) ); + client().update( ns(), BSONObj(), + BSON( "$set" << BSON( "x.b" << 1 << "x.c" << 1 << "x.d" << 1 ) ) ); + ASSERT_EQUALS( BSON( "_id" << 0 + << "x" << BSON( "b" << 1 << "c" << 1 << "d" << 1 ) + << "x" << BSONObj() << "x" << BSONObj() ), + client().findOne( ns(), BSONObj() ) ); + } + }; + + class TwoModsBeforeExistingField : public SetBase { + public: + void run() { + client().insert( ns(), BSON( "_id" << 0 << "x" << 5 ) ); + client().update( ns(), BSONObj(), + BSON( "$set" << BSON( "a" << 1 << "b" << 1 << "x" << 10 ) ) ); + ASSERT_EQUALS( BSON( "_id" << 0 << "a" << 1 << "b" << 1 << "x" << 10 ), + client().findOne( ns(), BSONObj() ) ); + } + }; + namespace ModSetTests { class internal1 { @@ -854,6 +896,9 @@ namespace UpdateTests { add< PreserveIdWithIndex >(); add< CheckNoMods >(); add< UpdateMissingToNull >(); + add< TwoModsWithinDuplicatedField >(); + add< ThreeModsWithinDuplicatedField >(); + add< TwoModsBeforeExistingField >(); add< ModSetTests::internal1 >(); add< ModSetTests::inc1 >(); |