Files
mongo/jstests/aggregation/expressions/regex_error_cases.js
James Bronsted 95b4794340 SERVER-94150 switch to v5 clang-format, reformat server (#34018)
GitOrigin-RevId: ff6b2194e3617a338d83597d96710b1b92a18940
2025-04-10 03:09:33 +00:00

113 lines
4.3 KiB
JavaScript

import "jstests/libs/query/sbe_assert_error_override.js";
import {executeAggregationTestCase} from "jstests/libs/query/aggregation_pipeline_utils.js";
const coll = db.regex_error_cases;
coll.drop();
function assertFails(parameters, errorCode, allowNullResponse = false) {
// Check constant parameters.
let inputDocument = {text: 'ABCD'};
const constantParameters = Object.assign({input: '$text'}, parameters);
const regexMatchTest =
Object.assign({inputDocuments: inputDocument, expectedErrorCode: errorCode},
allowNullResponse ? {expectedResults: [{"result": false}]} : {});
const regexFindTest =
Object.assign({inputDocuments: inputDocument, expectedErrorCode: errorCode},
allowNullResponse ? {expectedResults: [{"result": null}]} : {});
const regexFindAllTest =
Object.assign({inputDocuments: inputDocument, expectedErrorCode: errorCode},
allowNullResponse ? {expectedResults: [{"result": []}]} : {});
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexMatch': constantParameters}}}]},
regexMatchTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFind': constantParameters}}}]},
regexFindTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFindAll': constantParameters}}}]},
regexFindAllTest));
// Check constant parameters, but without optimization phase.
try {
assert.commandWorked(db.adminCommand(
{'configureFailPoint': 'disablePipelineOptimization', 'mode': 'alwaysOn'}));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexMatch': constantParameters}}}]},
regexMatchTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFind': constantParameters}}}]},
regexFindTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFindAll': constantParameters}}}]},
regexFindAllTest));
} finally {
assert.commandWorked(
db.adminCommand({'configureFailPoint': 'disablePipelineOptimization', 'mode': 'off'}));
}
// Check parameters pulled from collection.
inputDocument = Object.assign(inputDocument, parameters);
const dynamicParameters = {input: '$text'};
if ('regex' in parameters) {
dynamicParameters.regex = '$regex';
}
if ('options' in parameters) {
dynamicParameters.options = '$options';
}
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexMatch': dynamicParameters}}}]},
regexMatchTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFind': dynamicParameters}}}]},
regexFindTest));
executeAggregationTestCase(
coll,
Object.assign(
{pipeline: [{$project: {"_id": 0, result: {'$regexFindAll': dynamicParameters}}}]},
regexFindAllTest));
}
// Regex pattern must be string, BSON RegEx or null.
assertFails({regex: 123}, 51105);
// Regex flags must be string or null.
assertFails({regex: '.*', options: 123}, 51106);
// Options cannot be specified both in BSON RegEx and in options field.
assertFails({regex: /.*/i, options: 's'}, 51107);
// Regex pattern cannot contain null bytes.
assertFails({regex: '[a-b]+\0[c-d]+'}, 51109);
// Regex flags cannot contain null bytes.
assertFails({regex: '.*', options: 'i\0s'}, 51110);
// If regex pattern is null, the query could either return null or report the 'cannot contain null
// bytes' error.
assertFails({regex: null, options: 'i\0s'}, 51110, true /* allowNullResponse */);
// Regex pattern must be a valid regular expression.
assertFails({regex: '[a-'}, 51111);
// Regex flags must be valid.
assertFails({regex: '.*', options: 'ish'}, 51108);