summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSvilen Mihaylov <svilen.mihaylov@mongodb.com>2023-01-25 17:32:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-01-25 18:46:31 +0000
commitfe28233bb6292f97629f36d85c3853698bcf240a (patch)
tree3af5fa68a0cbea30d64ff7605367d68450b547bf
parent19d71c2910c2ee4796217c52e03d404451e84668 (diff)
downloadmongo-fe28233bb6292f97629f36d85c3853698bcf240a.tar.gz
SERVER-73301 [CQF] Ensure plan stability for generated SBE plans
-rw-r--r--src/mongo/db/exec/sbe/abt/abt_lower.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/mongo/db/exec/sbe/abt/abt_lower.cpp b/src/mongo/db/exec/sbe/abt/abt_lower.cpp
index bd6b5d0fd3a..17b13b26db1 100644
--- a/src/mongo/db/exec/sbe/abt/abt_lower.cpp
+++ b/src/mongo/db/exec/sbe/abt/abt_lower.cpp
@@ -720,6 +720,8 @@ std::unique_ptr<sbe::PlanStage> SBENodeLowering::walk(const NestedLoopJoinNode&
for (const ProjectionName& projectionName : n.getCorrelatedProjectionNames()) {
correlatedSlots.push_back(_slotMap.at(projectionName));
}
+ // Soring is not essential. Here we sort only for SBE plan stability.
+ std::sort(correlatedSlots.begin(), correlatedSlots.end());
auto expr = lowerExpression(filter);
@@ -979,7 +981,13 @@ void SBENodeLowering::generateSlots(const FieldProjectionMap& fieldProjectionMap
rootSlot = _slotIdGenerator.generate();
mapProjToSlot(*projName, rootSlot.value());
}
- for (const auto& [fieldName, projectionName] : fieldProjectionMap._fieldProjections) {
+
+ // Soring is not essential. Here we sort only for SBE plan stability.
+ std::map<FieldNameType, ProjectionName> ordered;
+ for (const auto& entry : fieldProjectionMap._fieldProjections) {
+ ordered.insert(entry);
+ }
+ for (const auto& [fieldName, projectionName] : ordered) {
vars.push_back(_slotIdGenerator.generate());
mapProjToSlot(projectionName, vars.back());
fields.push_back(fieldName.value().toString());