summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2014-09-03 09:21:17 -0400
committerScott Hernandez <scotthernandez@gmail.com>2014-09-03 09:21:37 -0400
commit8f8e59a78107a079c5367abdc31580d20428d9cc (patch)
treeac202be6e584fcba0f51504e45ab196e42f96b16
parent726a75d8decbbdb513bb3e0d860d64f88cdd349a (diff)
downloadmongo-8f8e59a78107a079c5367abdc31580d20428d9cc.tar.gz
SERVER-15029: missing rename source field should be a no-op
-rw-r--r--src/mongo/db/ops/modifier_rename.cpp5
-rw-r--r--src/mongo/db/ops/modifier_rename_test.cpp15
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'}}"));