diff options
-rw-r--r-- | jstests/aggregation/bugs/substr.js | 13 | ||||
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 6 |
2 files changed, 8 insertions, 11 deletions
diff --git a/jstests/aggregation/bugs/substr.js b/jstests/aggregation/bugs/substr.js index 0c7f5bef64d..c4eaff7e137 100644 --- a/jstests/aggregation/bugs/substr.js +++ b/jstests/aggregation/bugs/substr.js @@ -1,8 +1,5 @@ // Aggregation $substrBytes tests. -(function() { -"use strict"; - t = db.jstests_aggregation_substr; t.drop(); @@ -48,11 +45,10 @@ assertException('abcd', -10, 0); // Additional numeric types for offset / length. assertSubstring('bc', 'abcd', 1, 2); assertSubstring('bc', 'abcd', 1.0, 2.0); -assertSubstring('bc', 'abcd', NumberInt("1"), NumberInt("2")); -assertSubstring('bc', 'abcd', NumberLong("1"), NumberLong("2")); -assertSubstring('bc', 'abcd', NumberInt("1"), NumberLong("2")); -assertSubstring('bc', 'abcd', NumberLong("1"), NumberInt("2")); -assertSubstring('bc', 'abcd', NumberDecimal("1"), NumberDecimal("2")); +assertSubstring('bc', 'abcd', NumberInt(1), NumberInt(2)); +assertSubstring('bc', 'abcd', NumberLong(1), NumberLong(2)); +assertSubstring('bc', 'abcd', NumberInt(1), NumberLong(2)); +assertSubstring('bc', 'abcd', NumberLong(1), NumberInt(2)); // Integer component is used. assertSubstring('bc', 'abcd', 1.2, 2.2); assertSubstring('bc', 'abcd', 1.9, 2.9); @@ -137,4 +133,3 @@ assert.eq( }) .toArray()[0] .a); -}()); diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index f1f55f6d4d3..80400576bf0 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -4472,11 +4472,13 @@ Value ExpressionSubstrBytes::evaluate(const Document& root, Variables* variables str::stream() << getOpName() << ": starting index must be a numeric type (is BSON type " << typeName(pLower.getType()) << ")", - pLower.numeric()); + (pLower.getType() == NumberInt || pLower.getType() == NumberLong || + pLower.getType() == NumberDouble)); uassert(16035, str::stream() << getOpName() << ": length must be a numeric type (is BSON type " << typeName(pLength.getType()) << ")", - pLength.numeric()); + (pLength.getType() == NumberInt || pLength.getType() == NumberLong || + pLength.getType() == NumberDouble)); const long long signedLower = pLower.coerceToLong(); |