summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoritchyny <itchyny@cybozu.co.jp>2023-07-07 13:54:27 +0900
committerNico Williams <nico@cryptonector.com>2023-07-07 20:11:10 -0500
commit371abc73ba97dfd49c3affa330236eb41150b8dd (patch)
tree539cf62718236455a988b2411adfa64e1a666f5e
parentcd8898d5b95cbf082da000096ff5befe191329e0 (diff)
Fix deletion using assigning empty against arrays (fix #2051)
-rw-r--r--src/builtin.jq10
-rw-r--r--tests/jq.test13
2 files changed, 18 insertions, 5 deletions
diff --git a/src/builtin.jq b/src/builtin.jq
index f9e5f1ea..bb7da93f 100644
--- a/src/builtin.jq
+++ b/src/builtin.jq
@@ -12,24 +12,24 @@ def add: reduce .[] as $x (null; . + $x);
def del(f): delpaths([path(f)]);
def _assign(paths; $value): reduce path(paths) as $p (.; setpath($p; $value));
def _modify(paths; update):
- reduce path(paths) as $p (.;
+ reduce path(paths) as $p ([., []];
. as $dot
| null
| label $out
- | ($dot | getpath($p)) as $v
+ | ($dot[0] | getpath($p)) as $v
| (
( $$$$v
| update
| (., break $out) as $v
| $$$$dot
- | setpath($p; $v)
+ | setpath([0] + $p; $v)
),
(
$$$$dot
- | delpaths([$p])
+ | setpath([1]; .[1] + [$p])
)
)
- );
+ ) | . as $dot | $dot[0] | delpaths($dot[1]);
def map_values(f): .[] |= f;
# recurse
diff --git a/tests/jq.test b/tests/jq.test
index 308a4e6b..a4b8d5fd 100644
--- a/tests/jq.test
+++ b/tests/jq.test
@@ -1044,6 +1044,19 @@ def inc(x): x |= .+1; inc(.[].a)
{"a":[{"b":5}]}
{"a":[{"c":3,"b":5}]}
+# #2051, deletion using assigning empty against arrays
+(.[] | select(. >= 2)) |= empty
+[1,5,3,0,7]
+[1,0]
+
+.[] |= select(. % 2 == 0)
+[0,1,2,3,4,5]
+[0,2,4]
+
+.foo[1,4,2,3] |= empty
+{"foo":[0,1,2,3,4,5]}
+{"foo":[0,5]}
+
.[2][3] = 1
[4]
[4, null, [null, null, null, 1]]