diff options
author | Kyle Suarez <kyle.suarez@mongodb.com> | 2017-10-26 18:08:11 -0400 |
---|---|---|
committer | Kyle Suarez <kyle.suarez@mongodb.com> | 2017-10-26 18:08:34 -0400 |
commit | 260fd0c76599520d9d733874753a94a2db763538 (patch) | |
tree | 6d2e5c0c91ed2e279d3fa5cdef89dd687cf8514f /src/mongo/db/query/index_bounds_builder_test.cpp | |
parent | 722136a8bff8208787bb97186d7b339bb5116ba3 (diff) | |
download | mongo-260fd0c76599520d9d733874753a94a2db763538.tar.gz |
SERVER-20432 allow some escaped | chars in regexes to use tight index bounds
Diffstat (limited to 'src/mongo/db/query/index_bounds_builder_test.cpp')
-rw-r--r-- | src/mongo/db/query/index_bounds_builder_test.cpp | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/mongo/db/query/index_bounds_builder_test.cpp b/src/mongo/db/query/index_bounds_builder_test.cpp index 264972d017f..8305f91be4b 100644 --- a/src/mongo/db/query/index_bounds_builder_test.cpp +++ b/src/mongo/db/query/index_bounds_builder_test.cpp @@ -1046,8 +1046,9 @@ TEST(SimpleRegexTest, RootedLiteralNestedEscapeEnd) { ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); } -// A regular expression with the "|" character is not considered simple. See SERVER-15235. -TEST(SimpleRegexTest, PipeCharacterDisallowed) { +// An anchored regular expression that uses the "|" operator is not considered "simple" and has +// non-tight index bounds. +TEST(SimpleRegexTest, PipeCharacterUsesInexactBounds) { IndexEntry testIndex = IndexEntry(BSONObj()); IndexBoundsBuilder::BoundsTightness tightness; string prefix = IndexBoundsBuilder::simpleRegex("^(a(a|$)|b", "", testIndex, &tightness); @@ -1055,7 +1056,7 @@ TEST(SimpleRegexTest, PipeCharacterDisallowed) { ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); } -TEST(SimpleRegexTest, PipeCharacterDisallowed2) { +TEST(SimpleRegexTest, PipeCharacterUsesInexactBoundsWithTwoPrefixes) { IndexEntry testIndex = IndexEntry(BSONObj()); IndexBoundsBuilder::BoundsTightness tightness; string prefix = IndexBoundsBuilder::simpleRegex("^(a(a|$)|^b", "", testIndex, &tightness); @@ -1063,6 +1064,48 @@ TEST(SimpleRegexTest, PipeCharacterDisallowed2) { ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); } +TEST(SimpleRegexTest, PipeCharacterPrecededByEscapedBackslashUsesInexactBounds) { + IndexEntry testIndex = IndexEntry(BSONObj()); + IndexBoundsBuilder::BoundsTightness tightness; + string prefix = IndexBoundsBuilder::simpleRegex(R"(^a\\|b)", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, ""); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); + + prefix = IndexBoundsBuilder::simpleRegex(R"(^(foo\\|bar)\\|baz)", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, ""); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); +} + +// However, a regular expression with an escaped pipe (that is, using no special meaning) can use +// exact index bounds. +TEST(SimpleRegexTest, PipeCharacterEscapedWithBackslashUsesExactBounds) { + IndexEntry testIndex = IndexEntry(BSONObj()); + IndexBoundsBuilder::BoundsTightness tightness; + string prefix = IndexBoundsBuilder::simpleRegex(R"(^a\|b)", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, "a|b"); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); + + prefix = IndexBoundsBuilder::simpleRegex(R"(^\|1\|2\|\|)", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, "|1|2||"); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); +} + +TEST(SimpleRegexTest, FalsePositiveOnPipeInQEEscapeSequenceUsesInexactBounds) { + IndexEntry testIndex = IndexEntry(BSONObj()); + IndexBoundsBuilder::BoundsTightness tightness; + string prefix = IndexBoundsBuilder::simpleRegex(R"(^\Q|\E)", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, ""); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); +} + +TEST(SimpleRegexTest, FalsePositiveOnPipeInCharacterClassUsesInexactBounds) { + IndexEntry testIndex = IndexEntry(BSONObj()); + IndexBoundsBuilder::BoundsTightness tightness; + string prefix = IndexBoundsBuilder::simpleRegex(R"(^[|])", "", testIndex, &tightness); + ASSERT_EQUALS(prefix, ""); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_COVERED); +} + // SERVER-9035 TEST(SimpleRegexTest, RootedSingleLineMode) { IndexEntry testIndex = IndexEntry(BSONObj()); |