[PATH] Jsonb, insert a new value into an array at arbitrary position

Поиск
Список
Период
Сортировка
От Dmitry Dolgov
Тема [PATH] Jsonb, insert a new value into an array at arbitrary position
Дата
Msg-id CA+q6zcWqhkGzNQs9GK+x_3ecOkZ=ufRMux6H0brmHLfUQJ0KLw@mail.gmail.com
обсуждение исходный текст
Ответы Re: [PATH] Jsonb, insert a new value into an array at arbitrary position  (Petr Jelinek <petr@2ndquadrant.com>)
Список pgsql-hackers
Hi

As far as I see there is one basic update function for jsonb, that can't be
covered by `jsonb_set` - insert a new value into an array at arbitrary position.
Using `jsonb_set` function we can only append into array at the end/at the
beginning, and it looks more like a hack:

```
=# select jsonb_set('{"a": [1, 2, 3]}', '{a, 100}', '4');
      jsonb_set      
---------------------
 {"a": [1, 2, 3, 4]}
(1 row)


=# select jsonb_set('{"a": [1, 2, 3]}', '{a, -100}', '4');
      jsonb_set      
---------------------
 {"a": [4, 1, 2, 3]}
(1 row)
```

I think the possibility to insert into arbitrary position will be quite useful,
something like `json_array_insert` in MySql:

```
mysql> set @j = '["a", {"b": [1, 2]}, [3, 4]]';
mysql> select json_array_insert(@j, '$[1].b[0]', 'x');

 json_array_insert(@j, '$[1].b[0]', 'x') 
+-----------------------------------------+
 ["a", {"b": ["x", 1, 2]}, [3, 4]]       
```

It can look like `jsonb_insert` function in our case:

```
=# select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"');
         jsonb_insert          
-------------------------------
 {"a": [0, "new_value", 1, 2]}
(1 row)
```

I attached possible implementation, which is basically quite small (all logic-related
modifications is only about 4 lines in `setPath` function). This implementation
assumes a flag to separate "insert before"/"insert after" operations, and an
alias to `jsonb_set` in case if we working with a jsonb object, not an array.

What do you think about this?
Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Amit Kapila
Дата:
Сообщение: Re: [COMMITTERS] pgsql: Introduce group locking to prevent parallel processes from deadl
Следующее
От: "Constantin S. Pan"
Дата:
Сообщение: Re: [WIP] speeding up GIN build with parallel workers