summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression_context.cpp
diff options
context:
space:
mode:
authorCharlie Swanson <charlie.swanson@mongodb.com>2017-11-01 16:33:01 -0400
committerCharlie Swanson <charlie.swanson@mongodb.com>2017-11-14 17:20:02 -0500
commitde0b16077945eb6b6ec161b99f41c3222aade3b8 (patch)
treeab8992c77b9e4ec4e53711c21f3d62697e3b9fc6 /src/mongo/db/pipeline/expression_context.cpp
parentb4f6f2c967afc21d03bfca68f09d148d50e59134 (diff)
downloadmongo-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.cpp23
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;