jsonb_set array append hack? - Mailing list pgsql-hackers

From Thom Brown
Subject jsonb_set array append hack?
Date
Msg-id CAA-aLv59dToy02HNQd2wvFO8S5ZpLwQwtnsdoCGKehp7tCHrxA@mail.gmail.com
Whole thread Raw
Responses Re: jsonb_set array append hack?  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
Hi,

I've noticed that if you use a string for an element key in jsonb_set with create_missing set to true, you can use it to append to an array:

postgres=# SELECT jsonb_set(
'{"name": "Joe", "vehicle_types": ["car","van"]}'::jsonb,
           '{vehicle_types,nonsense}',
           '"motorcycle"', true);
                           jsonb_set                           
----------------------------------------------------------------
 {"name": "Joe", "vehicle_types": ["car", "van", "motorcycle"]}
(1 row)

What this really should match is a nested element inside "vehicle_types" called "nonsense".  But this seems to be a hack to get an element added to an array.  To do it properly currently requires specifying an arbitrary number in the hope that it will exceed the number of elements you have in the array.

e.g.

postgres=# SELECT jsonb_set(
           '{"name": "Joe", "vehicle_types": ["car","van"]}'::jsonb,
           '{vehicle_types,100000}',
           '"motorcycle"', true);
                           jsonb_set                           
----------------------------------------------------------------
 {"name": "Joe", "vehicle_types": ["car", "van", "motorcycle"]}
(1 row)

But I'm guessing people shouldn't be relying on the hack in the first example.  Isn't this a bug?  If so, wouldn't this also be a bug?:

postgres=# SELECT jsonb_set(
           '{"name": "Joe", "vehicle_types": ["car","van"]}'::jsonb,
           array['vehicle_types',NULL],
           '"motorcycle"', true);

Thom

pgsql-hackers by date:

Previous
From: Pavel Stehule
Date:
Subject: Re: On-demand running query plans using auto_explain and signals
Next
From: Alvaro Herrera
Date:
Subject: Re: WIP: Make timestamptz_out less slow.