BUG #16092: json[b]_to_recordset and json[b]_populate_record do not read properties with mixed-case names

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

BUG #16092: json[b]_to_recordset and json[b]_populate_record do not read properties with mixed-case names

PG Bug reporting form
The following bug has been logged on the website:

Bug reference:      16092
Logged by:          Dirk Weinhardt
Email address:      [hidden email]
PostgreSQL version: 11.5
Operating system:   Alpine Linux
Description:        

Using Docker container image postgres:11.5-alpine pulled on 2019-10-31
14:12:00 CET.

Given this fairly simple piece of JSON data: [{"aName": "foo"}]

When any of these queries is executed:
SELECT x.* FROM jsonb_to_recordset('[{"aName": "foo"}]'::jsonb) AS x(aName
text);
SELECT x.* FROM json_to_recordset('[{"aName": "foo"}]'::json) AS x(aName
text);
SELECT x.* FROM jsonb_to_recordset('[{"aname": "foo"}]'::jsonb) AS x(aname
text);
SELECT x.* FROM json_to_recordset('[{"aname": "foo"}]'::json) AS x(aname
text);

Then the output should be:
aname (text)
-----------------
foo

But for the first and the second query (the ones with mixed-case property
names) the actual output is:
aname (text)
-----------------
NULL

The same issue also exists with these queries:
DROP TYPE IF EXISTS x;
CREATE TYPE x AS (aName text);
SELECT x.* FROM jsonb_array_elements('[{"aName": "foo"}]'::jsonb) AS s,
jsonb_populate_record(NULL::x, s.value) AS x;
SELECT x.* FROM json_array_elements('[{"aName": "foo"}]'::json) AS s,
json_populate_record(NULL::x, s.value) AS x;

Reply | Threaded
Open this post in threaded view
|

Re: BUG #16092: json[b]_to_recordset and json[b]_populate_record do not read properties with mixed-case names

Sergei Kornilov
Hello

Its correct. Identifier name definition should be quoted if you want use uppercase symbols:

SELECT x.* FROM jsonb_to_recordset('[{"aName": "foo"}]'::jsonb) AS x("aName" text);

 aName
-------
 foo

unquoted names are always folded to lower case and therefore do not match. Per lexical structure documentation: https://www.postgresql.org/docs/current/sql-syntax-lexical.html

regards, Sergei