summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops/parsed_update.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/ops/parsed_update.cpp')
-rw-r--r--src/mongo/db/ops/parsed_update.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/mongo/db/ops/parsed_update.cpp b/src/mongo/db/ops/parsed_update.cpp
index 7944a16a545..aecf7c30794 100644
--- a/src/mongo/db/ops/parsed_update.cpp
+++ b/src/mongo/db/ops/parsed_update.cpp
@@ -171,15 +171,25 @@ Status ParsedUpdate::parseArrayFilters() {
for (auto rawArrayFilter : _request->getArrayFilters()) {
boost::intrusive_ptr<ExpressionContext> expCtx(
new ExpressionContext(_opCtx, _collator.get()));
- auto arrayFilterStatus =
- ExpressionWithPlaceholder::parse(rawArrayFilter, std::move(expCtx));
- if (!arrayFilterStatus.isOK()) {
- return Status(arrayFilterStatus.getStatus().code(),
+ auto parsedArrayFilter =
+ MatchExpressionParser::parse(rawArrayFilter,
+ std::move(expCtx),
+ ExtensionsCallbackNoop(),
+ MatchExpressionParser::kBanAllSpecialFeatures);
+ if (!parsedArrayFilter.isOK()) {
+ return Status(parsedArrayFilter.getStatus().code(),
str::stream() << "Error parsing array filter: "
- << arrayFilterStatus.getStatus().reason());
+ << parsedArrayFilter.getStatus().reason());
}
- auto arrayFilter = std::move(arrayFilterStatus.getValue());
- auto fieldName = arrayFilter->getPlaceholder();
+ auto parsedArrayFilterWithPlaceholder =
+ ExpressionWithPlaceholder::make(std::move(parsedArrayFilter.getValue()));
+ if (!parsedArrayFilterWithPlaceholder.isOK()) {
+ return Status(parsedArrayFilterWithPlaceholder.getStatus().code(),
+ str::stream() << "Error parsing array filter: "
+ << parsedArrayFilterWithPlaceholder.getStatus().reason());
+ }
+ auto finalArrayFilter = std::move(parsedArrayFilterWithPlaceholder.getValue());
+ auto fieldName = finalArrayFilter->getPlaceholder();
if (!fieldName) {
return Status(
ErrorCodes::FailedToParse,
@@ -192,7 +202,7 @@ Status ParsedUpdate::parseArrayFilters() {
<< *fieldName);
}
- _arrayFilters[*fieldName] = std::move(arrayFilter);
+ _arrayFilters[*fieldName] = std::move(finalArrayFilter);
}
return Status::OK();