diff options
author | Arun Banala <arun.banala@mongodb.com> | 2020-06-11 10:47:55 +0100 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-06-26 18:00:55 +0000 |
commit | 31499dd163068b6c70a1d2a072aaa9576a628ff0 (patch) | |
tree | 4920d80aa94ebf1af16d7f5e2364b63b9d009b4d /src/mongo/db/exec/inclusion_projection_executor.h | |
parent | 307c909b4a7bd574b09cd630701a915d2bc982b9 (diff) | |
download | mongo-31499dd163068b6c70a1d2a072aaa9576a628ff0.tar.gz |
SERVER-48684 Pipeline stage $set fails to set a non-existent dotted field to an object
Diffstat (limited to 'src/mongo/db/exec/inclusion_projection_executor.h')
-rw-r--r-- | src/mongo/db/exec/inclusion_projection_executor.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/mongo/db/exec/inclusion_projection_executor.h b/src/mongo/db/exec/inclusion_projection_executor.h index b095a423652..b26b62859ed 100644 --- a/src/mongo/db/exec/inclusion_projection_executor.h +++ b/src/mongo/db/exec/inclusion_projection_executor.h @@ -43,8 +43,10 @@ namespace mongo::projection_executor { */ class InclusionNode : public ProjectionNode { public: - InclusionNode(ProjectionPolicies policies, std::string pathToNode = "") - : ProjectionNode(policies, std::move(pathToNode)) {} + InclusionNode(ProjectionPolicies policies, + bool containsComputedFields, + std::string pathToNode = "") + : ProjectionNode(policies, containsComputedFields, std::move(pathToNode)) {} InclusionNode* addOrGetChild(const std::string& field) { return static_cast<InclusionNode*>(ProjectionNode::addOrGetChild(field)); @@ -83,7 +85,9 @@ protected: } std::unique_ptr<ProjectionNode> makeChild(const std::string& fieldName) const override { return std::make_unique<InclusionNode>( - _policies, FieldPath::getFullyQualifiedPath(_pathToNode, fieldName)); + _policies, + _subtreeContainsComputedFields, + FieldPath::getFullyQualifiedPath(_pathToNode, fieldName)); } MutableDocument initializeOutputDocument(const Document& inputDoc) const final { // Technically this value could be min(number of projected fields, size of input @@ -112,15 +116,19 @@ protected: */ class FastPathEligibleInclusionNode final : public InclusionNode { public: - FastPathEligibleInclusionNode(ProjectionPolicies policies, std::string pathToNode = "") - : InclusionNode(policies, std::move(pathToNode)) {} + FastPathEligibleInclusionNode(ProjectionPolicies policies, + bool containsComputedFields, + std::string pathToNode = "") + : InclusionNode(policies, containsComputedFields, std::move(pathToNode)) {} Document applyToDocument(const Document& inputDoc) const final; protected: std::unique_ptr<ProjectionNode> makeChild(const std::string& fieldName) const final { return std::make_unique<FastPathEligibleInclusionNode>( - _policies, FieldPath::getFullyQualifiedPath(_pathToNode, fieldName)); + _policies, + _subtreeContainsComputedFields, + FieldPath::getFullyQualifiedPath(_pathToNode, fieldName)); } private: @@ -147,8 +155,8 @@ public: : InclusionProjectionExecutor( expCtx, policies, - allowFastPath ? std::make_unique<FastPathEligibleInclusionNode>(policies) - : std::make_unique<InclusionNode>(policies)) {} + allowFastPath ? std::make_unique<FastPathEligibleInclusionNode>(policies, false) + : std::make_unique<InclusionNode>(policies, false)) {} TransformerType getType() const final { return TransformerType::kInclusionProjection; |