summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMisha Ivkov <misha.ivkov@10gen.com>2019-07-30 10:34:01 -0400
committerMisha Ivkov <misha.ivkov@10gen.com>2019-07-31 12:04:08 -0400
commite3fe1f22904b0b3a7488242ffc8e608bed9b3c07 (patch)
tree7e5754edbe3e7bb83a166a20fb8f2c42084be407
parent32589c52d876b7b641dbb740f8f9808593234960 (diff)
downloadmongo-r4.2.0-rc5.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.js47
-rw-r--r--src/mongo/db/index/sort_key_generator.cpp9
-rw-r--r--src/mongo/db/index/sort_key_generator_test.cpp2
-rw-r--r--src/mongo/db/pipeline/document_source_sort.cpp2
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();