Skip to content

Commit

Permalink
Fixed bug when splatting empty array #1613
Browse files Browse the repository at this point in the history
  • Loading branch information
mikefarah committed Mar 31, 2023
1 parent 496035c commit a389bb6
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
5 changes: 5 additions & 0 deletions pkg/yqlib/operator_collect.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
log.Debugf("-- collectOperation")

if context.MatchingNodes.Len() == 0 {
log.Debugf("nothing to collect")
node := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Value: "[]"}
candidate := &CandidateNode{Node: node}
return context.SingleChildContext(candidate), nil
Expand All @@ -41,6 +42,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
}

if evaluateAllTogether {
log.Debugf("collect together")
collectedNode, err := collectTogether(d, context, expressionNode.RHS)
if err != nil {
return Context{}, err
Expand All @@ -56,6 +58,8 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
collectedNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"}
collectCandidate := candidate.CreateReplacement(collectedNode)

log.Debugf("collect rhs: %v", expressionNode.RHS.Operation.toString())

collectExpResults, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS)
if err != nil {
return Context{}, err
Expand All @@ -66,6 +70,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
log.Debugf("found this: %v", NodeToString(resultC))
collectedNode.Content = append(collectedNode.Content, unwrapDoc(resultC.Node))
}
log.Debugf("done collect rhs: %v", expressionNode.RHS.Operation.toString())

results.PushBack(collectCandidate)
}
Expand Down
7 changes: 6 additions & 1 deletion pkg/yqlib/operator_traverse_path.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
// BUT we still return the original context back (see jq)
// https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|...

log.Debugf("--traverseArrayOperator")

if expressionNode.RHS != nil && expressionNode.RHS.RHS != nil && expressionNode.RHS.RHS.Operation.OperationType == createMapOpType {
return sliceArrayOperator(d, context, expressionNode.RHS.RHS)
}
Expand All @@ -103,6 +105,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
}
var indicesToTraverse = rhs.MatchingNodes.Front().Value.(*CandidateNode).Node.Content

log.Debugf("indicesToTraverse %v", len(indicesToTraverse))

//now we traverse the result of the lhs against the indices we found
result, err := traverseNodesWithArrayIndices(lhs, indicesToTraverse, prefs)
if err != nil {
Expand Down Expand Up @@ -231,7 +235,8 @@ func traverseMap(context Context, matchingNode *CandidateNode, keyNode *yaml.Nod
return nil, err
}

if !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 {
if !splat && !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 {
log.Debugf("no matches, creating one")
//no matches, create one automagically
valueNode := &yaml.Node{Tag: "!!null", Kind: yaml.ScalarNode, Value: "null"}

Expand Down
7 changes: 7 additions & 0 deletions pkg/yqlib/operator_traverse_path_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ steps:
`

var traversePathOperatorScenarios = []expressionScenario{
{
skipDoc: true,
description: "splat empty map",
document: "{}",
expression: ".[]",
expected: []string{},
},
{
skipDoc: true,
document: `[[1]]`,
Expand Down

0 comments on commit a389bb6

Please sign in to comment.