diff --git a/pkg/yqlib/operator_anchors_aliases.go b/pkg/yqlib/operator_anchors_aliases.go index ddff9f73..75768438 100644 --- a/pkg/yqlib/operator_anchors_aliases.go +++ b/pkg/yqlib/operator_anchors_aliases.go @@ -183,7 +183,9 @@ func fixedReconstructAliasedMap(node *CandidateNode) error { }) for _, item := range itemsToAdd { - newContent = append(newContent, item.Copy()) + copied := item.Copy() + copied.Parent = node + newContent = append(newContent, copied) } } } @@ -226,8 +228,12 @@ func reconstructAliasedMap(node *CandidateNode, context Context) error { } } node.Content = make([]*CandidateNode, 0) + entries := make([]*CandidateNode, 0, newContent.Len()) for newEl := newContent.Front(); newEl != nil; newEl = newEl.Next() { - node.AddChild(newEl.Value.(*CandidateNode)) + entries = append(entries, newEl.Value.(*CandidateNode)) + } + for i := 0; i < len(entries); i += 2 { + node.AddKeyValueChild(entries[i], entries[i+1]) } return nil } diff --git a/pkg/yqlib/operator_anchors_aliases_test.go b/pkg/yqlib/operator_anchors_aliases_test.go index 9d9c5ed6..df168571 100644 --- a/pkg/yqlib/operator_anchors_aliases_test.go +++ b/pkg/yqlib/operator_anchors_aliases_test.go @@ -234,6 +234,29 @@ var fixedAnchorOperatorScenarios = []expressionScenario{ "D0, P[], (!!map)::a:\n b: 42\nb: 42\n", }, }, + { + skipDoc: true, + description: "Merge after explode preserves correct parent references", + document: `opensearch: &opensearch-cluster + ip2geo: + enabled: false + +opensearch-client: + <<: *opensearch-cluster + nodeGroup: client + opensearchJavaOpts: "-Xmx1024m -Xms1024m"`, + document2: `opensearch: &opensearch-cluster + ip2geo: + enabled: true + +opensearch-client: + <<: *opensearch-cluster + opensearchJavaOpts: "-Xmx1536m -Xms1536m"`, + expression: `(select(fi == 0) | explode(.)) * (select(fi == 1) | explode(.))`, + expected: []string{ + "D0, P[], (!!map)::opensearch:\n ip2geo:\n enabled: true\nopensearch-client:\n ip2geo:\n enabled: true\n nodeGroup: client\n opensearchJavaOpts: \"-Xmx1536m -Xms1536m\"\n", + }, + }, } var badAnchorOperatorScenarios = []expressionScenario{