diff --git a/pkg/yqlib/operator_collect_object_test.go b/pkg/yqlib/operator_collect_object_test.go index eda96ad4..35fa555b 100644 --- a/pkg/yqlib/operator_collect_object_test.go +++ b/pkg/yqlib/operator_collect_object_test.go @@ -14,6 +14,13 @@ var collectObjectOperatorScenarios = []expressionScenario{ "D0, P[], (!!map)::dog: great\n", }, }, + { + skipDoc: true, + expression: `({} + {}) | (.b = 3)`, + expected: []string{ + "D0, P[], (!!map)::b: 3\n", + }, + }, { skipDoc: true, document: "a: []", diff --git a/pkg/yqlib/operator_pipe.go b/pkg/yqlib/operator_pipe.go index e1a90d91..800395cd 100644 --- a/pkg/yqlib/operator_pipe.go +++ b/pkg/yqlib/operator_pipe.go @@ -5,12 +5,12 @@ func pipeOperator(d *dataTreeNavigator, context Context, expressionNode *Express if expressionNode.LHS.Operation.OperationType == assignVariableOpType { return variableLoop(d, context, expressionNode) } - lhs, err := d.GetMatchingNodes(context, expressionNode.LHS) if err != nil { return Context{}, err } - rhs, err := d.GetMatchingNodes(lhs, expressionNode.RHS) + rhsContext := context.ChildContext(lhs.MatchingNodes) + rhs, err := d.GetMatchingNodes(rhsContext, expressionNode.RHS) if err != nil { return Context{}, err } diff --git a/pkg/yqlib/operator_pipe_test.go b/pkg/yqlib/operator_pipe_test.go index 9e979603..8d884689 100644 --- a/pkg/yqlib/operator_pipe_test.go +++ b/pkg/yqlib/operator_pipe_test.go @@ -21,6 +21,14 @@ var pipeOperatorScenarios = []expressionScenario{ "D0, P[], (doc)::{a: cat, b: dog, c: same}\n", }, }, + { + skipDoc: true, + description: "Don't pass readonly context", + expression: `(3 + 4) | ({} | .b = "dog")`, + expected: []string{ + "D0, P[], (!!map)::b: dog\n", + }, + }, } func TestPipeOperatorScenarios(t *testing.T) {