summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/expression_leaf.cpp
diff options
context:
space:
mode:
authorNick Zolnierz <nicholas.zolnierz@mongodb.com>2018-06-29 14:47:34 -0400
committerNick Zolnierz <nicholas.zolnierz@mongodb.com>2018-06-29 14:47:55 -0400
commita4dfe1ce6b04fceff0794d842b791951990d187c (patch)
treed14c7dbda313ac8b62ab7d5bfdb9316c1adc3d59 /src/mongo/db/matcher/expression_leaf.cpp
parentae29cbee182e41c10ca7b1a44e034f9e200a5b90 (diff)
downloadmongo-a4dfe1ce6b04fceff0794d842b791951990d187c.tar.gz
SERVER-35851: Check whether the array passed to $in is sorted before calling std::sort
Diffstat (limited to 'src/mongo/db/matcher/expression_leaf.cpp')
-rw-r--r--src/mongo/db/matcher/expression_leaf.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/mongo/db/matcher/expression_leaf.cpp b/src/mongo/db/matcher/expression_leaf.cpp
index 1bbd1389e3e..7226d9111ae 100644
--- a/src/mongo/db/matcher/expression_leaf.cpp
+++ b/src/mongo/db/matcher/expression_leaf.cpp
@@ -477,10 +477,14 @@ void InMatchExpression::_doSetCollator(const CollatorInterface* collator) {
_collator = collator;
_eltCmp = BSONElementComparator(BSONElementComparator::FieldNamesMode::kIgnore, _collator);
- // Re-sort the list of equalities according to our current comparator. This is necessary to work
- // around https://svn.boost.org/trac10/ticket/13140.
- std::sort(
- _originalEqualityVector.begin(), _originalEqualityVector.end(), _eltCmp.makeLessThan());
+ if (!std::is_sorted(_originalEqualityVector.begin(),
+ _originalEqualityVector.end(),
+ _eltCmp.makeLessThan())) {
+ // Re-sort the list of equalities according to our current comparator. This is necessary to
+ // work around https://svn.boost.org/trac10/ticket/13140.
+ std::sort(
+ _originalEqualityVector.begin(), _originalEqualityVector.end(), _eltCmp.makeLessThan());
+ }
// We need to re-compute '_equalitySet', since our set comparator has changed.
_equalitySet = _eltCmp.makeBSONEltFlatSet(_originalEqualityVector);
@@ -504,9 +508,13 @@ Status InMatchExpression::setEqualities(std::vector<BSONElement> equalities) {
_originalEqualityVector = std::move(equalities);
- // Sort the list of equalities to work around https://svn.boost.org/trac10/ticket/13140.
- std::sort(
- _originalEqualityVector.begin(), _originalEqualityVector.end(), _eltCmp.makeLessThan());
+ if (!std::is_sorted(_originalEqualityVector.begin(),
+ _originalEqualityVector.end(),
+ _eltCmp.makeLessThan())) {
+ // Sort the list of equalities to work around https://svn.boost.org/trac10/ticket/13140.
+ std::sort(
+ _originalEqualityVector.begin(), _originalEqualityVector.end(), _eltCmp.makeLessThan());
+ }
_equalitySet = _eltCmp.makeBSONEltFlatSet(_originalEqualityVector);