On 09/14/2015 01:29 PM, Thom Brown wrote:
> 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.
That's a bug and we should fix it.
>
> 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);
>
>
I think that's a bug too.
cheers
andrew