summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/get_executor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/get_executor.cpp')
-rw-r--r--src/mongo/db/query/get_executor.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/mongo/db/query/get_executor.cpp b/src/mongo/db/query/get_executor.cpp
index 4e10cb9eff6..7e616547934 100644
--- a/src/mongo/db/query/get_executor.cpp
+++ b/src/mongo/db/query/get_executor.cpp
@@ -1104,24 +1104,26 @@ StatusWith<std::unique_ptr<PlanExecutor, PlanExecutor::Deleter>> getSlotBasedExe
extractAndAttachPipelineStages(cq.get());
}
+ // Analyze the provided query and build the list of candidate plans for it.
auto nss = cq->nss();
auto yieldPolicy = makeSbeYieldPolicy(opCtx, requestedYieldPolicy, collection, nss);
SlotBasedPrepareExecutionHelper helper{
opCtx, *collection, cq.get(), yieldPolicy.get(), plannerOptions};
- auto executionResult = helper.prepare();
- if (!executionResult.isOK()) {
- return executionResult.getStatus();
+ auto planningResultWithStatus = helper.prepare();
+ if (!planningResultWithStatus.isOK()) {
+ return planningResultWithStatus.getStatus();
}
+ auto&& planningResult = planningResultWithStatus.getValue();
+ auto&& [roots, solutions] = planningResult->extractResultData();
- auto&& result = executionResult.getValue();
- auto&& [roots, solutions] = result->extractResultData();
-
+ // In some circumstances (e.g. when have multiple candidate plans or using a cached one), we
+ // might need to execute the plan(s) to pick the best one or to confirm the choice.
if (auto planner = makeRuntimePlannerIfNeeded(opCtx,
*collection,
cq.get(),
solutions.size(),
- result->decisionWorks(),
- result->needsSubplanning(),
+ planningResult->decisionWorks(),
+ planningResult->needsSubplanning(),
yieldPolicy.get(),
plannerOptions)) {
// Do the runtime planning and pick the best candidate plan.