diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
| commit | 959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch) | |
| tree | acc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/pipeline/javascript_execution.cpp | |
| parent | 76588293975fc059cf076779e4283e6ffaf8afff (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.cpp | 37 |
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) { |
