Skip to content

Commit

Permalink
fix: reduce/foreach state variable should not be reset each iteration (
Browse files Browse the repository at this point in the history
…#3205)

When the UPDATE query in a reduce or foreach syntax does not emit
a value, it should simply skip updating the state variable. But
currently it resets the state variable to null.
  • Loading branch information
itchyny authored Nov 20, 2024
1 parent 8619f8a commit 96e8d89
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ block gen_reduce(block source, block matcher, block init, block body) {
block loop = BLOCK(gen_op_simple(DUPN),
source,
bind_alternation_matchers(matcher,
BLOCK(gen_op_bound(LOADVN, res_var),
BLOCK(gen_op_bound(LOADV, res_var),
body,
gen_op_bound(STOREV, res_var))),
gen_op_simple(BACKTRACK));
Expand All @@ -854,7 +854,7 @@ block gen_foreach(block source, block matcher, block init, block update, block e
// in the body to see
bind_alternation_matchers(matcher,
// load the loop state variable
BLOCK(gen_op_bound(LOADVN, state_var),
BLOCK(gen_op_bound(LOADV, state_var),
// generate updated state
update,
// save the updated state for value extraction
Expand Down
8 changes: 8 additions & 0 deletions tests/jq.test
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,10 @@ null
[{"a":1}, {"b":2}, {"a":3, "b":4}]
[-1, -1, -4]

[foreach range(5) as $x (0; .+$x | select($x!=2); [$x,.])]
null
[[0,0],[1,1],[3,4],[4,8]]

[limit(3; .[])]
[11,22,33,44,55,66,77,88,99]
[11,22,33]
Expand Down Expand Up @@ -825,6 +829,10 @@ reduce . as $n (.; .)
null
null

reduce range(5) as $x (0; .+$x | select($x!=2))
null
8

# Destructuring
. as {$a, b: [$c, {$d}]} | [$a, $c, $d]
{"a":1, "b":[2,{"d":3}]}
Expand Down

0 comments on commit 96e8d89

Please sign in to comment.