diff options
author | Scott Hernandez <scotthernandez@gmail.com> | 2014-09-03 09:21:17 -0400 |
---|---|---|
committer | Scott Hernandez <scotthernandez@gmail.com> | 2014-09-03 09:21:37 -0400 |
commit | 8f8e59a78107a079c5367abdc31580d20428d9cc (patch) | |
tree | ac202be6e584fcba0f51504e45ab196e42f96b16 | |
parent | 726a75d8decbbdb513bb3e0d860d64f88cdd349a (diff) | |
download | mongo-8f8e59a78107a079c5367abdc31580d20428d9cc.tar.gz |
SERVER-15029: missing rename source field should be a no-op
-rw-r--r-- | src/mongo/db/ops/modifier_rename.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/ops/modifier_rename_test.cpp | 15 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/mongo/db/ops/modifier_rename.cpp b/src/mongo/db/ops/modifier_rename.cpp index d603ff9da0f..c2a86e5cb0d 100644 --- a/src/mongo/db/ops/modifier_rename.cpp +++ b/src/mongo/db/ops/modifier_rename.cpp @@ -146,8 +146,11 @@ namespace mongo { &fromIdxFound, &_preparedState->fromElemFound); + const bool sourceExists = (_preparedState->fromElemFound.ok() && + fromIdxFound == (_fromFieldRef.numParts() - 1)); + // If we can't find the full element in the from field then we can't do anything. - if (!status.isOK()) { + if (!status.isOK() || !sourceExists) { execInfo->noOp = true; _preparedState->fromElemFound = root.getDocument().end(); diff --git a/src/mongo/db/ops/modifier_rename_test.cpp b/src/mongo/db/ops/modifier_rename_test.cpp index 0c1b3310264..606337bdd7c 100644 --- a/src/mongo/db/ops/modifier_rename_test.cpp +++ b/src/mongo/db/ops/modifier_rename_test.cpp @@ -121,6 +121,21 @@ namespace { ASSERT_EQUALS(logDoc, logObj); } + TEST(MissingFromDotted, InitPrepLog) { + Document doc(fromjson("{a: {r:2}}")); + Mod setMod(fromjson("{$rename: {'a.b':'a.c'}}")); + + ModifierInterface::ExecInfo execInfo; + ASSERT_OK(setMod.prepare(doc.root(), "", &execInfo)); + ASSERT_TRUE(execInfo.noOp); + + Document logDoc; + LogBuilder logBuilder(logDoc.root()); + BSONObj logObj = fromjson("{}"); + ASSERT_OK(setMod.log(&logBuilder)); + ASSERT_EQUALS(logDoc, logObj); + } + TEST(BasicInit, DifferentRoots) { Document doc(fromjson("{a: 2}")); Mod setMod(fromjson("{$rename: {'a':'f.g'}}")); |