Re: BUG #13961: Unexpected behaviour of JSONB_SET if the new_value is null

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: pravin(at)gida(dot)in
Cc: "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: BUG #13961: Unexpected behaviour of JSONB_SET if the new_value is null
Date: 2016-02-15 18:03:32
Message-ID: CAKFQuwaJyyEmUbTa_yU5OZLAnH+0jVh0632i=Kp5QPcWyF_Nxg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Mon, Feb 15, 2016 at 1:02 AM, <pravin(at)gida(dot)in> wrote:

> The following bug has been logged on the website:
>
> Bug reference: 13961
> Logged by: Pravin Carvalho
> Email address: pravin(at)gida(dot)in
> PostgreSQL version: 9.5.1
> Operating system: All
> Description:
>
> If the new_value is null, JSONB_SET evaluates to null. This is not
> mentioned
> in the documentation and intuitively I would expect this set the value of
> the key at the specified path as null.
> eg. SELECT jsonb_set('{"f1":1,"f2":2}', '{f2}',null);
>
> I was using JSONB_SET to update a JSONB column where the new_value was the
> result of the query and this could have led to loss of data.
>
>
​Working as designed - though in retrospect I don't see why this particular
function had to be defined "STRICT".

You will need to use:
COALESCE((SELECT ...), 'null') if you want to store a JSON null when the
subquery results in an SQL being returned. The two are not the same thing.

The technical answer is that with jsonb_set defined as being "NULL ON NULL
INPUT (a.k.a., STRICT)" ​as soon as any of its arguments are SQL NULL the
executor replaces the function call with an SQL NULL without ever
attempting to execute the function.

I think that this point could be better made in the documentation​ for
these functions. It is alluded to in the note for json_typeof (
http://www.postgresql.org/docs/9.5/interactive/functions-json.html) but
that is a bit detached from the situation you encountered.

David J.

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Jakov Sosic 2016-02-15 18:20:10 Re: BUG #13959: Missing tmpfile exclude conf for socket
Previous Message David G. Johnston 2016-02-15 17:54:11 Re: Row count mismatch post pg_dump piped restore