From 2ea6389bf7069644616b3ab7b9f67002c8554870 Mon Sep 17 00:00:00 2001 From: auto-revert-processor Date: Fri, 21 Jan 2022 06:48:21 +0000 Subject: Revert "SERVER-62322 Allow an empty object to be projected in $setWindowFields" This reverts commit 2dac3294841b0374a94a5823f3726d5d02e27261. --- jstests/aggregation/sources/setWindowFields/parse.js | 12 ++---------- src/mongo/db/pipeline/document_source_set_window_fields.cpp | 9 +++------ 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/jstests/aggregation/sources/setWindowFields/parse.js b/jstests/aggregation/sources/setWindowFields/parse.js index c61839f27b8..63b92e952e0 100644 --- a/jstests/aggregation/sources/setWindowFields/parse.js +++ b/jstests/aggregation/sources/setWindowFields/parse.js @@ -213,7 +213,8 @@ assert.commandWorked(run({ })); // Not every accumulator is automatically a window function. -let err = assert.commandFailedWithCode(run({$setWindowFields: {output: {a: {b: {$sum: "$a"}}}}}), + +var err = assert.commandFailedWithCode(run({$setWindowFields: {output: {a: {b: {$sum: "$a"}}}}}), ErrorCodes.FailedToParse); assert.includes(err.errmsg, 'Expected a $-prefixed window function, b'); @@ -249,13 +250,4 @@ err = assert.commandFailedWithCode( }), ErrorCodes.FailedToParse); assert.includes(err.errmsg, 'Unrecognized window function, $summ'); - -// Test that an empty object is a valid projected field. -assert.commandWorked(coll.insert({})); -assert.commandWorked(run({$setWindowFields: {output: {v: {$max: {mergeObjects: {}}}}}})); - -// However conflicting field paths is always an error. -err = assert.commandFailedWithCode( - run({$setWindowFields: {output: {a: {$sum: 1}, 'a.b': {$sum: 1}}}}), 40176); -assert.includes(err.errmsg, 'specification contains two conflicting paths'); })(); diff --git a/src/mongo/db/pipeline/document_source_set_window_fields.cpp b/src/mongo/db/pipeline/document_source_set_window_fields.cpp index d736f56845d..87cd3ad0267 100644 --- a/src/mongo/db/pipeline/document_source_set_window_fields.cpp +++ b/src/mongo/db/pipeline/document_source_set_window_fields.cpp @@ -461,11 +461,9 @@ DocumentSource::GetNextResult DocumentSourceInternalSetWindowFields::doGetNext() MutableDocument addFieldsSpec; for (auto&& [fieldName, function] : _executableOutputs) { try { - // Wrap the projected value in a $literal since there are limitations on a user-facing - // $addFields that we don't want to enforce here (e.g. empty object). If we hit a - // uassert while evaluating expressions on user data, delete the temporary table before - // aborting the operation. - addFieldsSpec.addField(fieldName, Value(DOC("$literal" << function->getNext()))); + // If we hit a uassert while evaluating expressions on user data, delete the temporary + // table before aborting the operation. + addFieldsSpec.addField(fieldName, function->getNext()); } catch (const DBException&) { _iterator.finalize(); throw; @@ -508,7 +506,6 @@ DocumentSource::GetNextResult DocumentSourceInternalSetWindowFields::doGetNext() _iterator.finalize(); break; } - auto projExec = projection_executor::AddFieldsProjectionExecutor::create( pExpCtx, addFieldsSpec.freeze().toBson()); -- cgit v1.2.1