Thread: pgsql: Implementation of subscripting for jsonb

pgsql: Implementation of subscripting for jsonb

From
Alexander Korotkov
Date:
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(-)


Re: pgsql: Implementation of subscripting for jsonb

From
Heikki Linnakangas
Date:
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



Re: pgsql: Implementation of subscripting for jsonb

From
Tom Lane
Date:
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



Re: pgsql: Implementation of subscripting for jsonb

From
Alexander Korotkov
Date:
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

Re: pgsql: Implementation of subscripting for jsonb

From
Alexander Korotkov
Date:
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

Attachment