diff options
author | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2018-06-29 14:47:34 -0400 |
---|---|---|
committer | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2018-06-29 14:47:55 -0400 |
commit | a4dfe1ce6b04fceff0794d842b791951990d187c (patch) | |
tree | d14c7dbda313ac8b62ab7d5bfdb9316c1adc3d59 /src/mongo/db/matcher/expression_leaf.cpp | |
parent | ae29cbee182e41c10ca7b1a44e034f9e200a5b90 (diff) | |
download | mongo-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.cpp | 22 |
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); |