From 385921a3e21fb7f679224cd65b3cfcdd3ac74df2 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Tue, 11 Apr 2023 12:04:04 +1000 Subject: [PATCH] Fixed passing of readonly context in pipe --- pkg/yqlib/operator_collect_object_test.go | 7 +++++++ pkg/yqlib/operator_pipe.go | 4 ++-- pkg/yqlib/operator_pipe_test.go | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) 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) {