summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2018-06-26 18:33:11 -0400
committerDavid Storch <david.storch@10gen.com>2018-06-27 16:23:02 -0400
commited5dccdc3ffe74a869c04ee31c61e61da0b0d0c3 (patch)
treef9a7c4396fe030a58848165cc6563d9c8e77094d
parent4c2d1a88c19c316c7cfc895a6e0f7d1a81e85bd7 (diff)
downloadmongo-ed5dccdc3ffe74a869c04ee31c61e61da0b0d0c3.tar.gz
SERVER-35693 Pre-sort $in elements to avoid O(n^2) boost::flat_set() complexity.
-rw-r--r--src/mongo/db/matcher/expression_leaf.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/mongo/db/matcher/expression_leaf.cpp b/src/mongo/db/matcher/expression_leaf.cpp
index dce381e8a27..843f086bf58 100644
--- a/src/mongo/db/matcher/expression_leaf.cpp
+++ b/src/mongo/db/matcher/expression_leaf.cpp
@@ -551,7 +551,10 @@ Status ArrayFilterEntries::setEqualities(std::vector<BSONElement> equalities) {
}
}
- _equalities = BSONElementFlatSet(equalities.begin(), equalities.end());
+ // Sort the list of equalities to work around https://svn.boost.org/trac10/ticket/13140.
+ std::sort(equalities.begin(), equalities.end(), BSONElementCmpWithoutField());
+ _equalities =
+ BSONElementFlatSet(equalities.begin(), equalities.end(), BSONElementCmpWithoutField());
return Status::OK();
}