Skip to content

Array subtraction unexpectedly modifies its LHS #2159

@dsharp-pivotal

Description

@dsharp-pivotal

Describe the bug

Array subtraction appears to modify its LHS. When the LHS is a variable that is used again later, this has unexpected results.

Version of yq:

$ yq --version
yq (https://github.com/mikefarah/yq/) version v4.44.3

Operating system: macOS
Installed via: homebrew

Input Yaml

["a", "b"]

Command
The command you ran:

$ <<<'["a", "b"]' yq e '["a","b"] as $f | {"0": $f, "1": $f - ., "2": $f}'

Actual behavior

The variable appears to be modified. .2 is empty.

"0":
  - a
  - b
"1": []
"2": []

Expected behavior

.2 should contain the assigned value of $f, ["a", "b"]

Compare to re-using a variable without doing the array subtraction:

$ <<<'["a", "b"]' yq e '["a","b"] as $f | {"0": $f, "2": $f}'
"0":
  - a
  - b
"2":
  - a
  - b

If the LHS is the context ., the same thing occurs:

$ <<<'["a", "b"]' yq e '["a","b"] as $f | {"0": ., "1": . - $f, "2": .}'
"0": ["a", "b"]
"1": []
"2": []

As a point of comparison, jq does not have this behavior:

$ <<<'["a", "b"]' jq '["a","b"] as $f | {"0": $f, "1": ($f - .) , "2": $f}'
{
  "0": [
    "a",
    "b"
  ],
  "1": [],
  "2": [
    "a",
    "b"
  ]
}

Additional context

I think this is due to this line:
https://github.com/mikefarah/yq/blob/master/pkg/yqlib/operator_subtract.go#L41

	// removing children from LHS, parent hasn't changed
	lhs.Content = newLHSArray

I don't understand the intent expressed by the comment.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions