fix: release the allocator when an updated value escapes to a query
The allocator of _modify tracks the values it created so that a later
update can modify them in place instead of copying them. When a target
path is a proper prefix of an earlier one, getpath hands such a value to
the update function, which may store it in more than one place; updating
through one of those places then changes all of them.
$ gojq -cn '{"a":{"b":1}} | (.a.b, .a, .a.p.z) |= {p: ., q: .}'
.a.p and .a.q hold separate values in jq, so only .a.p gains the "z" key,
while gojq adds it to both. Release the allocator whenever a value it
created leaves the update, so that the values are copied on update from
then on. The same applies to an object used as a path element, which
stays reachable through the path after the update.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
b18851b748
commit
1b0e1db888
3 files changed
+40
-5
No files matched your search
@@ -5429,6 +5429,14 @@
|
||||
expected: |
|
||||
[1,3,6,5,5]
|
||||
|
||||
- name: update-assignment operator against object with overlapping paths
|
||||
args:
|
||||
- -c
|
||||
- '(.a.b,.a,.a.p.z) |= {p: ., q: .}'
|
||||
input: '{"a":{"b":1}}'
|
||||
expected: |
|
||||
{"a":{"p":{"b":{"p":1,"q":1},"z":{"p":null,"q":null}},"q":{"b":{"p":1,"q":1}}}}
|
||||
|
||||
- name: update-assignment operator with optional operator
|
||||
args:
|
||||
- -c
|
||||
|
||||
Reference in new issue
Block a user