Re: BUG #15140: Incorrect jsonb_set behavoir
От | Ivan E. Panchenko |
---|---|
Тема | Re: BUG #15140: Incorrect jsonb_set behavoir |
Дата | |
Msg-id | 3ab7ce91-9d9e-8b82-e77f-73d2da52c17e@postgrespro.ru обсуждение исходный текст |
Ответ на | Re: BUG #15140: Incorrect jsonb_set behavoir (Dmitry Dolgov <9erthalion6@gmail.com>) |
Ответы |
Re: BUG #15140: Incorrect jsonb_set behavoir
|
Список | pgsql-bugs |
Hi,
02.04.2018 15:04, Dmitry Dolgov пишет:
Yes, I think it would be good.On 2 April 2018 at 12:36, PG Bug reporting form <noreply@postgresql.org> wrote: The following bug has been logged on the website: Bug reference: 15140 Logged by: Ivan Panchenko Email address: i.panchenko@postgrespro.ru PostgreSQL version: 10.3 Operating system: any Description: First. Impossible to create a nested structure for a path with more than one new keys. postgres => select jsonb_set('{}'::jsonb, array['x', 'y'], to_jsonb(1::text), true);jsonb_set -----------{} (1 строка) Expected {"x": { "y" : "1" }} Second. Setting a NULL value nullifies the whole JSON postgres=> select jsonb_set('{}'::jsonb, array['x'], null, true);jsonb_insert -------------- (1 строка) Expected { "x" : null }As far as I remember, these are not really bugs, but documented behavior. About the first one, here is [1]: All the items of the path parameter of jsonb_set as well as jsonb_insert except the last item must be present in the target. If create_missing is false, all items of the path parameter of jsonb_set must be present. If these conditions are not met the target is returned unchanged. Although I agree this can be confusing, and we may want to change this.
Now I see it in the documentation, but unfortunately, it is a separate note, which is not referenced from the main jsonb_set description which says,
...with
new_value
added if create_missing
is true ( default is true
) and the item designated by path
does not exist.Thanks for the workaround. Nevertheless, this behavior looks counter-intuitive, and I would vote for removing strictness from this function.About the second one, `jsonb_set` is defined as a strict function, which means `null` arguments will produce null as a result. To avoid this you can do: =# select jsonb_set('{}'::jsonb, array['x'], 'null', true); jsonb_set ------------- {"x": null} (1 row) 1: https://www.postgresql.org/docs/devel/static/functions-json.html
Regards,
Ivan
В списке pgsql-bugs по дате отправления: