diff options
author | Charlie Swanson <charlie.swanson@mongodb.com> | 2017-11-01 16:33:01 -0400 |
---|---|---|
committer | Charlie Swanson <charlie.swanson@mongodb.com> | 2017-11-14 17:20:02 -0500 |
commit | de0b16077945eb6b6ec161b99f41c3222aade3b8 (patch) | |
tree | ab8992c77b9e4ec4e53711c21f3d62697e3b9fc6 /src/mongo/db/pipeline/expression_context.cpp | |
parent | b4f6f2c967afc21d03bfca68f09d148d50e59134 (diff) | |
download | mongo-de0b16077945eb6b6ec161b99f41c3222aade3b8.tar.gz |
SERVER-31447 Use correct collation for update lookup
Diffstat (limited to 'src/mongo/db/pipeline/expression_context.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression_context.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/mongo/db/pipeline/expression_context.cpp b/src/mongo/db/pipeline/expression_context.cpp index 64c813ed5a4..e2b2e1e758d 100644 --- a/src/mongo/db/pipeline/expression_context.cpp +++ b/src/mongo/db/pipeline/expression_context.cpp @@ -29,6 +29,7 @@ #include "mongo/platform/basic.h" #include "mongo/db/pipeline/expression_context.h" +#include "mongo/db/query/collation/collation_spec.h" #include "mongo/db/query/collation/collator_factory_interface.h" namespace mongo { @@ -121,8 +122,10 @@ void ExpressionContext::setCollator(const CollatorInterface* collator) { _valueComparator = ValueComparator(_collator); } -intrusive_ptr<ExpressionContext> ExpressionContext::copyWith(NamespaceString ns, - boost::optional<UUID> uuid) const { +intrusive_ptr<ExpressionContext> ExpressionContext::copyWith( + NamespaceString ns, + boost::optional<UUID> uuid, + boost::optional<std::unique_ptr<CollatorInterface>> collator) const { intrusive_ptr<ExpressionContext> expCtx = new ExpressionContext(std::move(ns), timeZoneDatabase); @@ -140,11 +143,17 @@ intrusive_ptr<ExpressionContext> ExpressionContext::copyWith(NamespaceString ns, expCtx->opCtx = opCtx; - expCtx->collation = collation; - if (_ownedCollator) { - expCtx->setCollator(_ownedCollator->clone()); - } else if (_collator) { - expCtx->setCollator(_collator); + if (collator) { + expCtx->collation = + *collator ? (*collator)->getSpec().toBSON() : CollationSpec::kSimpleSpec; + expCtx->setCollator(std::move(*collator)); + } else { + expCtx->collation = collation; + if (_ownedCollator) { + expCtx->setCollator(_ownedCollator->clone()); + } else if (_collator) { + expCtx->setCollator(_collator); + } } expCtx->_resolvedNamespaces = _resolvedNamespaces; |