diff options
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) { |
