diff options
author | Misha Ivkov <misha.ivkov@10gen.com> | 2019-07-30 10:34:01 -0400 |
---|---|---|
committer | Misha Ivkov <misha.ivkov@10gen.com> | 2019-07-31 12:04:08 -0400 |
commit | e3fe1f22904b0b3a7488242ffc8e608bed9b3c07 (patch) | |
tree | 7e5754edbe3e7bb83a166a20fb8f2c42084be407 | |
parent | 32589c52d876b7b641dbb740f8f9808593234960 (diff) | |
download | mongo-e3fe1f22904b0b3a7488242ffc8e608bed9b3c07.tar.gz |
SERVER-42491 Ensure DocumentSourceSort does not crash on searchScore or searchHighlightsr4.2.0-rc5
-rw-r--r-- | jstests/aggregation/sources/sort/sort_with_metadata.js | 47 | ||||
-rw-r--r-- | src/mongo/db/index/sort_key_generator.cpp | 9 | ||||
-rw-r--r-- | src/mongo/db/index/sort_key_generator_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/pipeline/document_source_sort.cpp | 2 |
4 files changed, 56 insertions, 4 deletions
diff --git a/jstests/aggregation/sources/sort/sort_with_metadata.js b/jstests/aggregation/sources/sort/sort_with_metadata.js new file mode 100644 index 00000000000..ab4d7ce5b83 --- /dev/null +++ b/jstests/aggregation/sources/sort/sort_with_metadata.js @@ -0,0 +1,47 @@ +// Test that the $sort stage properly errors on invalid $meta. +(function() { +"use strict"; + +var coll = db.sort_with_metadata; +coll.drop(); +assert.writeOK(coll.insert({_id: 1, text: "apple", words: 1})); +assert.writeOK(coll.insert({_id: 2, text: "banana", words: 1})); +assert.writeOK(coll.insert({_id: 3, text: "apple banana", words: 2})); +assert.writeOK(coll.insert({_id: 4, text: "cantaloupe", words: 1})); + +assert.commandWorked(coll.createIndex({text: "text"})); + +assert.throws(() => coll.aggregate([ + {$match: {$text: {$search: 'apple banana'}}}, + {$sort: {textScore: {$meta: 'searchScore'}}} +])); + +assert.throws(() => coll.aggregate([ + {$match: {$text: {$search: 'apple banana'}}}, + {$sort: {textScore: {$meta: 'searchHighlights'}}} +])); + +assert.throws( + () => coll.aggregate( + [{$match: {$text: {$search: 'apple banana'}}}, {$sort: {textScore: {$meta: 'unknown'}}}])); + +const results = [ + {_id: 3, text: 'apple banana', words: 2}, + {_id: 2, text: 'banana', words: 1}, + {_id: 1, text: 'apple', words: 1} +]; + +assert.eq(results, + coll.aggregate([ + {$match: {$text: {$search: 'apple banana'}}}, + {$sort: {textScore: {$meta: 'textScore'}}} + ]) + .toArray()); + +assert.sameMembers(results, + coll.aggregate([ + {$match: {$text: {$search: 'apple banana'}}}, + {$sort: {textScore: {$meta: 'randVal'}}} + ]) + .toArray()); +})();
\ No newline at end of file diff --git a/src/mongo/db/index/sort_key_generator.cpp b/src/mongo/db/index/sort_key_generator.cpp index 7f9bd3dd018..db3602ef8d1 100644 --- a/src/mongo/db/index/sort_key_generator.cpp +++ b/src/mongo/db/index/sort_key_generator.cpp @@ -52,9 +52,14 @@ SortKeyGenerator::SortKeyGenerator(const BSONObj& sortSpec, const CollatorInterf invariant(metaElem.fieldNameStringData() == "$meta"_sd); if (metaElem.valueStringData() == "textScore"_sd) { _patternPartTypes.push_back(SortPatternPartType::kMetaTextScore); - } else { - invariant(metaElem.valueStringData() == "randVal"_sd); + } else if (metaElem.valueStringData() == "randVal"_sd) { _patternPartTypes.push_back(SortPatternPartType::kMetaRandVal); + } else if (metaElem.valueStringData() == "searchScore"_sd) { + uasserted(31218, "$meta sort by 'searchScore' metadata is not supported"); + } else if (metaElem.valueStringData() == "searchHighlights"_sd) { + uasserted(31219, "$meta sort by 'searchHighlights' metadata is not supported"); + } else { + uasserted(31138, "Illegal $meta sort: " + metaElem.valueStringData()); } _sortHasMeta = true; } diff --git a/src/mongo/db/index/sort_key_generator_test.cpp b/src/mongo/db/index/sort_key_generator_test.cpp index 485a6a3d0a5..9ac04b3052d 100644 --- a/src/mongo/db/index/sort_key_generator_test.cpp +++ b/src/mongo/db/index/sort_key_generator_test.cpp @@ -162,7 +162,7 @@ DEATH_TEST(SortKeyGeneratorTest, DEATH_TEST(SortKeyGeneratorTest, SortPatternComponentWithUnknownMetaKeywordIsFatal, - "Invariant failure metaElem.valueStringData() == \"randVal\"_sd") { + "Illegal $meta sort: unknown") { MONGO_COMPILER_VARIABLE_UNUSED auto ignored = stdx::make_unique<SortKeyGenerator>(BSON("a" << BSON("$meta" << "unknown")), diff --git a/src/mongo/db/pipeline/document_source_sort.cpp b/src/mongo/db/pipeline/document_source_sort.cpp index 395d517ce2d..bdd22510961 100644 --- a/src/mongo/db/pipeline/document_source_sort.cpp +++ b/src/mongo/db/pipeline/document_source_sort.cpp @@ -294,7 +294,7 @@ intrusive_ptr<DocumentSourceSort> DocumentSourceSort::create( } uassert(15974, - "$sort key ordering must be specified using a number or {$meta: 'textScore'}", + str::stream() << "Illegal key in $sort specification: " << keyField, keyField.isNumber()); int sortOrder = keyField.numberInt(); |