summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/javascript_execution.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
commit959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch)
treeacc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/pipeline/javascript_execution.cpp
parent76588293975fc059cf076779e4283e6ffaf8afff (diff)
New upstream version 6.0.20upstream
Diffstat (limited to 'src/mongo/db/pipeline/javascript_execution.cpp')
-rw-r--r--src/mongo/db/pipeline/javascript_execution.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/mongo/db/pipeline/javascript_execution.cpp b/src/mongo/db/pipeline/javascript_execution.cpp
index f9ce429ba76..8b6d3bc6f9b 100644
--- a/src/mongo/db/pipeline/javascript_execution.cpp
+++ b/src/mongo/db/pipeline/javascript_execution.cpp
@@ -47,22 +47,37 @@ JsExecution* JsExecution::get(OperationContext* opCtx,
StringData database,
bool loadStoredProcedures,
boost::optional<int> jsHeapLimitMB) {
+ // If a JsExecution object has already been created, return it.
+ JsExecution* jsExec = getCached(opCtx, loadStoredProcedures);
+ if (jsExec) {
+ return jsExec;
+ }
+
+ // There is no cached JsExecution object, so create and cache one now.
auto& exec = getExec(opCtx);
- if (!exec) {
- exec = std::make_unique<JsExecution>(opCtx, scope, jsHeapLimitMB);
- exec->getScope()->setLocalDB(database);
- if (loadStoredProcedures) {
- exec->getScope()->loadStored(opCtx, true);
- }
- exec->_storedProceduresLoaded = loadStoredProcedures;
- } else {
- uassert(31438,
- "A single operation cannot use both JavaScript aggregation expressions and $where.",
- loadStoredProcedures == exec->_storedProceduresLoaded);
+ exec = std::make_unique<JsExecution>(opCtx, scope, jsHeapLimitMB);
+ exec->getScope()->setLocalDB(database);
+ if (loadStoredProcedures) {
+ exec->getScope()->loadStored(opCtx, true);
}
+ exec->_storedProceduresLoaded = loadStoredProcedures;
+
return exec.get();
}
+JsExecution* JsExecution::getCached(OperationContext* opCtx, bool loadStoredProcedures) {
+ auto& exec = getExec(opCtx);
+ if (exec) {
+ if (loadStoredProcedures == exec->_storedProceduresLoaded) {
+ return exec.get();
+ }
+ tasserted(
+ 9136200,
+ "A single operation cannot use both JavaScript aggregation expressions and $where.");
+ }
+ return nullptr;
+}
+
Value JsExecution::callFunction(ScriptingFunction func,
const BSONObj& params,
const BSONObj& thisObj) {