mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Filling array gaps during jsonb subscripting
This commit introduces two new flags for jsonb assignment: * JB_PATH_FILL_GAPS: Appending array elements on the specified position, gaps are filled with nulls (similar to the JavaScript behavior). This mode also instructs to create the whole path in a jsonb object if some part of the path (more than just the last element) is not present. * JB_PATH_CONSISTENT_POSITION: Assigning keeps array positions consistent by preventing prepending of elements. Both flags are used only in jsonb subscripting assignment. Initially proposed by Nikita Glukhov based on polymorphic subscripting patch, but transformed into an independent change. Discussion: https://postgr.es/m/CA%2Bq6zcV8qvGcDXurwwgUbwACV86Th7G80pnubg42e-p9gsSf%3Dg%40mail.gmail.com Discussion: https://postgr.es/m/CA%2Bq6zcX3mdxGCgdThzuySwH-ApyHHM-G4oB1R0fn0j2hZqqkLQ%40mail.gmail.com Discussion: https://postgr.es/m/CA%2Bq6zcVDuGBv%3DM0FqBYX8DPebS3F_0KQ6OVFobGJPM507_SZ_w%40mail.gmail.com Discussion: https://postgr.es/m/CA%2Bq6zcVovR%2BXY4mfk-7oNk-rF91gH0PebnNfuUjuuDsyHjOcVA%40mail.gmail.com Author: Dmitry Dolgov Reviewed-by: Tom Lane, Arthur Zakirov, Pavel Stehule, Dian M Fay Reviewed-by: Andrew Dunstan, Chapman Flack, Merlin Moncure, Peter Geoghegan Reviewed-by: Alvaro Herrera, Jim Nasby, Josh Berkus, Victor Wagner Reviewed-by: Aleksander Alekseev, Robert Haas, Oleg Bartunov
This commit is contained in:
@ -648,6 +648,30 @@ UPDATE table_name SET jsonb_field['a'] = '1';
|
||||
|
||||
-- Where jsonb_field was NULL, it is now [1]
|
||||
UPDATE table_name SET jsonb_field[0] = '1';
|
||||
</programlisting>
|
||||
|
||||
If an index is specified for an array containing too few elements,
|
||||
<literal>NULL</literal> elements will be appended until the index is reachable
|
||||
and the value can be set.
|
||||
|
||||
<programlisting>
|
||||
-- Where jsonb_field was [], it is now [null, null, 2];
|
||||
-- where jsonb_field was [0], it is now [0, null, 2]
|
||||
UPDATE table_name SET jsonb_field[2] = '2';
|
||||
</programlisting>
|
||||
|
||||
A <type>jsonb</type> value will accept assignments to nonexistent subscript
|
||||
paths as long as the last existing path key is an object or an array. Since
|
||||
the final subscript is not traversed, it may be an object key. Nested arrays
|
||||
will be created and <literal>NULL</literal>-padded according to the path until
|
||||
the value can be placed appropriately.
|
||||
|
||||
<programlisting>
|
||||
-- Where jsonb_field was {}, it is now {'a': [{'b': 1}]}
|
||||
UPDATE table_name SET jsonb_field['a'][0]['b'] = '1';
|
||||
|
||||
-- Where jsonb_field was [], it is now [{'a': 1}]
|
||||
UPDATE table_name SET jsonb_field[0]['a'] = '1';
|
||||
</programlisting>
|
||||
|
||||
</para>
|
||||
|
Reference in New Issue
Block a user