jsonb_concat: make sure we always return a non-scalar value - Mailing list pgsql-hackers

From Oskari Saarenmaa
Subject jsonb_concat: make sure we always return a non-scalar value
Date
Msg-id 55EA8FEB.5040004@ohmu.fi
Whole thread Raw
Responses Re: jsonb_concat: make sure we always return a non-scalar value  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
There was a long thread about concatenating jsonb objects to each other,
but that discussion didn't touch concatenating other types.  Currently
jsonb_concat always just returns the other argument if one of arguments
is considered empty.  This causes surprising behavior when concatenating
scalar values to empty arrays:

os=# select '[]'::jsonb || '1'::jsonb;
1

os=# select '[]'::jsonb || '[1]'::jsonb;
  [1]

os=# select '[]'::jsonb || '1'::jsonb || '2'::jsonb;
  [1, 2]

os=# select '0'::jsonb || '1'::jsonb;
  [0, 1]

os=# select '{"x": "y"}'::jsonb || '[1]'::jsonb;
  [{"x": "y"}, 1]

os=# select '{"x": "y"}'::jsonb || '1'::jsonb;
ERROR:  invalid concatenation of jsonb objects

Attached a patch to fix and test this.  Also added a test case for
concatenating two scalar values which currently produces an array.. I'm
not sure that behavior makes sense, but didn't want to change that in
this patch as I guess someone could consider that feature useful.

/ Oskari

Attachment

pgsql-hackers by date:

Previous
From: Jim Nasby
Date:
Subject: Re: Fwd: Core dump with nested CREATE TEMP TABLE
Next
From: Fabien COELHO
Date:
Subject: Re: checkpointer continuous flushing