getpath/1 should be a path expression (fix #1358)
It needs to be possible to do something like
getpath($paths[]) += 1
meaning: increment all the paths in . that are listed in $paths[].
In order to do this getpath() needs to update the jq->path and
jq->value_at_path as necessary.
This commit is contained in:
1 parent
63791b795a
commit
2fcb257168
3 files changed
+38
-1
No files matched your search
+4
-1
@@ -1089,7 +1089,10 @@ static jv f_string_implode(jq_state *jq, jv a) {
|
||||
}
|
||||
|
||||
static jv f_setpath(jq_state *jq, jv a, jv b, jv c) { return jv_setpath(a, b, c); }
|
||||
static jv f_getpath(jq_state *jq, jv a, jv b) { return jv_getpath(a, b); }
|
||||
extern jv _jq_path_append(jq_state *, jv, jv, jv);
|
||||
static jv f_getpath(jq_state *jq, jv a, jv b) {
|
||||
return _jq_path_append(jq, a, b, jv_getpath(jv_copy(a), jv_copy(b)));
|
||||
}
|
||||
static jv f_delpaths(jq_state *jq, jv a, jv b) { return jv_delpaths(a, b); }
|
||||
static jv f_has(jq_state *jq, jv a, jv b) { return jv_has(a, b); }
|
||||
|
||||
|
||||
@@ -246,6 +246,28 @@ static void path_append(jq_state* jq, jv component, jv value_at_path) {
|
||||
}
|
||||
}
|
||||
|
||||
/* For f_getpath() */
|
||||
jv
|
||||
_jq_path_append(jq_state *jq, jv v, jv p, jv value_at_path) {
|
||||
if (jq->subexp_nest != 0 ||
|
||||
jv_get_kind(jq->path) != JV_KIND_ARRAY ||
|
||||
!jv_is_valid(value_at_path)) {
|
||||
jv_free(v);
|
||||
jv_free(p);
|
||||
return value_at_path;
|
||||
}
|
||||
if (!jv_identical(v, jv_copy(jq->value_at_path))) {
|
||||
jv_free(p);
|
||||
return value_at_path;
|
||||
}
|
||||
if (jv_get_kind(p) == JV_KIND_ARRAY)
|
||||
jq->path = jv_array_concat(jq->path, p);
|
||||
else
|
||||
jq->path = jv_array_append(jq->path, p);
|
||||
jv_free(jq->value_at_path);
|
||||
return jv_copy(jq->value_at_path = value_at_path);
|
||||
}
|
||||
|
||||
uint16_t* stack_restore(jq_state *jq){
|
||||
while (!stack_pop_will_free(&jq->stk, jq->fork_top)) {
|
||||
if (stack_pop_will_free(&jq->stk, jq->stk_top)) {
|
||||
|
||||
@@ -842,6 +842,18 @@ def inc(x): x |= .+1; inc(.[].a)
|
||||
[{"a":1,"b":2},{"a":2,"b":4},{"a":7,"b":8}]
|
||||
[{"a":2,"b":2},{"a":3,"b":4},{"a":8,"b":8}]
|
||||
|
||||
# #1358, getpath/1 should work in path expressions
|
||||
.[] | try (getpath(["a",0,"b"]) |= 5) catch .
|
||||
[null,{"b":0},{"a":0},{"a":null},{"a":[0,1]},{"a":{"b":1}},{"a":[{}]},{"a":[{"c":3}]}]
|
||||
{"a":[{"b":5}]}
|
||||
{"b":0,"a":[{"b":5}]}
|
||||
"Cannot index number with number"
|
||||
{"a":[{"b":5}]}
|
||||
"Cannot index number with string \"b\""
|
||||
"Cannot index object with number"
|
||||
{"a":[{"b":5}]}
|
||||
{"a":[{"c":3,"b":5}]}
|
||||
|
||||
.[2][3] = 1
|
||||
[4]
|
||||
[4, null, [null, null, null, 1]]
|
||||
|
||||
Reference in new issue
Block a user