BUG #13996: json_to_record() returns non-NULL, malformed value for omitted key under some circumstances - Mailing list pgsql-bugs

From johann@visagie.za.net
Subject BUG #13996: json_to_record() returns non-NULL, malformed value for omitted key under some circumstances
Date
Msg-id 20160302080310.2629.98690@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #13996: json_to_record() returns non-NULL, malformed value for omitted key under some circumstances  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      13996
Logged by:          Johann Visagie
Email address:      johann@visagie.za.net
PostgreSQL version: 9.5.1
Operating system:   OS X 10.11.3
Description:

In the following call to json_to_record(), the target row format `t`
specifies a text column `c` which does *not* appear as a key in the JSON
object used as the function’s argument.

SELECT t.*
FROM json_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8}'::json)
AS t(a int, b json, c text, x int);

By the definition of the function in section 9.15 of the manual, the
statement should return a NULL value for the column `c`.  This is made
explicit in the second Note at the bottom of that manual page, which states
i.a.:

>JSON fields that do not appear in the target row type will be omitted from
the output, and target columns that do not match any JSON field will simply
be NULL.

However, if (as in this example) another key in the JSON object — `b` in
this case — refers to a nested JSON object which *does* contain a key `c`,
the function returns a malformed JSON string as (text)  value for column
`c`:

 a |       b        |    c    | x
---+----------------+---------+---
 1 | {"c":16,"d":2} | {"c":16 | 8
(1 row)

I have not tested whether json_ro_recordset() exhibits the same
misbehaviour.

pgsql-bugs by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: BUG #13750: Autovacuum slows down with large numbers of tables. More workers makes it slower.
Next
From: Joe Conway
Date:
Subject: Re: BUG #13750: Autovacuum slows down with large numbers of tables. More workers makes it slower.