diff options
author | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-06-03 10:49:24 -0400 |
---|---|---|
committer | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-06-03 16:59:47 -0400 |
commit | 10e662cad7fe15581c6c499b934b7d4fd3a1e83d (patch) | |
tree | 2decfc9142283d0b9b9ea505350e7955859dbeb9 | |
parent | 8d51acc6890304e4c8a4e7b397504d8e5717beff (diff) | |
download | mongo-10e662cad7fe15581c6c499b934b7d4fd3a1e83d.tar.gz |
SERVER-24392 Remove invalid invariant in expression::isSubsetOf()
-rw-r--r-- | src/mongo/db/matcher/expression_algo.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/matcher/expression_algo_test.cpp | 14 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/mongo/db/matcher/expression_algo.cpp b/src/mongo/db/matcher/expression_algo.cpp index 966c727501f..1b130592597 100644 --- a/src/mongo/db/matcher/expression_algo.cpp +++ b/src/mongo/db/matcher/expression_algo.cpp @@ -95,14 +95,16 @@ bool _isSubsetOf(const ComparisonMatchExpression* lhs, const ComparisonMatchExpr return false; } - // Either collator may be used by compareElementValues() here. If lhs (the query) contains - // string comparison, then _isSubsetOf will only be called if lhs and rhs have the same - // collator. Otherwise, the collator will not be used by compareElementValues(). if (!CollatorInterface::collatorsMatch(lhs->getCollator(), rhs->getCollator())) { // TODO SERVER-23172: Check that lhsData does not contain string comparison in nested // objects or arrays. - invariant(lhsData.type() != BSONType::String); + if (lhsData.type() == BSONType::String) { + return false; + } } + + // Either collator may be used by compareElementValues() here, since either the collators are + // the same or lhsData does not contain string comparison. int cmp = compareElementValues(lhsData, rhsData, rhs->getCollator()); // Check whether the two expressions are equivalent. diff --git a/src/mongo/db/matcher/expression_algo_test.cpp b/src/mongo/db/matcher/expression_algo_test.cpp index ead421bc76e..1eccce190bb 100644 --- a/src/mongo/db/matcher/expression_algo_test.cpp +++ b/src/mongo/db/matcher/expression_algo_test.cpp @@ -663,6 +663,20 @@ TEST(ExpressionAlgoIsSubsetOf, CollationAwareStringComparison) { ASSERT_FALSE(expression::isSubsetOf(lhsLT.get(), rhsLT.get())); } +TEST(ExpressionAlgoIsSubsetOf, NonMatchingCollationsStringComparison) { + CollatorInterfaceMock collatorAlwaysEqual(CollatorInterfaceMock::MockType::kAlwaysEqual); + CollatorInterfaceMock collatorReverseString(CollatorInterfaceMock::MockType::kReverseString); + ParsedMatchExpression lhs("{a: {$gt: 'abc'}}", &collatorAlwaysEqual); + ParsedMatchExpression rhs("{a: {$gt: 'cba'}}", &collatorReverseString); + + ASSERT_FALSE(expression::isSubsetOf(lhs.get(), rhs.get())); + + ParsedMatchExpression lhsLT("{a: {$lt: 'abc'}}", &collatorAlwaysEqual); + ParsedMatchExpression rhsLT("{a: {$lt: 'cba'}}", &collatorReverseString); + + ASSERT_FALSE(expression::isSubsetOf(lhsLT.get(), rhsLT.get())); +} + TEST(ExpressionAlgoIsSubsetOf, CollationAwareStringComparisonIn) { CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kReverseString); ParsedMatchExpression lhsAllGTcba("{a: {$in: ['abc', 'cbc']}}", &collator); |