Thread: pgsql: Implementation of subscripting for jsonb
Implementation of subscripting for jsonb Subscripting for jsonb does not support slices, does not have a limit for the number of subscripts, and an assignment expects a replace value to have jsonb type. There is also one functional difference between assignment via subscripting and assignment via jsonb_set(). When an original jsonb container is NULL, the subscripting replaces it with an empty jsonb and proceeds with an assignment. For the sake of code reuse, we rearrange some parts of jsonb functionality to allow the usage of the same functions for jsonb_set and assign subscripting operation. The original idea belongs to Oleg Bartunov. Catversion is bumped. 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 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/676887a3b0b8e3c0348ac3f82ab0d16e9a24bd43 Modified Files -------------- doc/src/sgml/json.sgml | 51 +++++ src/backend/utils/adt/Makefile | 1 + src/backend/utils/adt/jsonb_util.c | 72 ++++++- src/backend/utils/adt/jsonbsubs.c | 412 ++++++++++++++++++++++++++++++++++++ src/backend/utils/adt/jsonfuncs.c | 188 ++++++++-------- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 4 + src/include/catalog/pg_type.dat | 3 +- src/include/utils/jsonb.h | 6 +- src/test/regress/expected/jsonb.out | 272 +++++++++++++++++++++++- src/test/regress/sql/jsonb.sql | 84 +++++++- src/tools/pgindent/typedefs.list | 1 + 12 files changed, 988 insertions(+), 108 deletions(-)
On 31/01/2021 22:54, Alexander Korotkov wrote: > Implementation of subscripting for jsonb The Itanium and sparc64 buildfarm members didn't like this, and are crashing at "select ('123'::jsonb)['a'];". Unaligned memory access, perhaps? - Heikki
Heikki Linnakangas <hlinnaka@iki.fi> writes: > On 31/01/2021 22:54, Alexander Korotkov wrote: >> Implementation of subscripting for jsonb > The Itanium and sparc64 buildfarm members didn't like this, and are > crashing at "select ('123'::jsonb)['a'];". Unaligned memory access, perhaps? I think I just identified the cause. regards, tom lane
On Mon, Feb 1, 2021 at 10:06 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > Heikki Linnakangas <hlinnaka@iki.fi> writes: > > On 31/01/2021 22:54, Alexander Korotkov wrote: > >> Implementation of subscripting for jsonb > > > The Itanium and sparc64 buildfarm members didn't like this, and are > > crashing at "select ('123'::jsonb)['a'];". Unaligned memory access, perhaps? > > I think I just identified the cause. Thanks again for fixing this. BTW, I managed to reproduce the issue by compiling with CFLAGS="-O0 -fsanitize=alignment -fsanitize-trap=alignment" and the patch attached. I can propose the following to catch such issues earlier. We could finish (wrap attribute with macro and apply it to other places with misalignment access if any) and apply the attached patch and make commitfest.cputube.org check patches with CFLAGS="-O0 -fsanitize=alignment -fsanitize-trap=alignment". What do you think? ------ Regards, Alexander Korotkov
Attachment
On Mon, Feb 1, 2021 at 3:41 PM Alexander Korotkov <aekorotkov@gmail.com> wrote: > On Mon, Feb 1, 2021 at 10:06 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > Heikki Linnakangas <hlinnaka@iki.fi> writes: > > > On 31/01/2021 22:54, Alexander Korotkov wrote: > > >> Implementation of subscripting for jsonb > > > > > The Itanium and sparc64 buildfarm members didn't like this, and are > > > crashing at "select ('123'::jsonb)['a'];". Unaligned memory access, perhaps? > > > > I think I just identified the cause. > > Thanks again for fixing this. > > BTW, I managed to reproduce the issue by compiling with CFLAGS="-O0 > -fsanitize=alignment -fsanitize-trap=alignment" and the patch > attached. > > I can propose the following to catch such issues earlier. We could > finish (wrap attribute with macro and apply it to other places with > misalignment access if any) and apply the attached patch and make > commitfest.cputube.org check patches with CFLAGS="-O0 > -fsanitize=alignment -fsanitize-trap=alignment". What do you think? The revised patch is attached. The attribute is wrapped into pg_attribute_no_sanitize_alignment() macro. I've checked it works for me with gcc-10 and clang-11. ------ Regards, Alexander Korotkov