why are null bytes allowed in JSON columns?

From: Wyatt Alt <wyatt(dot)alt(at)gmail(dot)com>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: why are null bytes allowed in JSON columns?
Date: 2023-09-22 01:40:48
Message-ID: CAGem3qDepjdfXjWUSb7gx=8E9TYU_BW_dd=JkgfpnUbsrHE2Nw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi,

I am not sure if this is a bug or a known inconvenience. First create a
table with a JSON column:

create table test(t json);
insert into test(t) values ('{"foo": "bar"}');
select * from test where t->>'foo' = 'bar';

-- t
-- ----------------
-- {"foo": "bar"}
-- (1 row)

Now, insert a record with a null byte

insert into test(t) values ('{"foo\u0000": "bar"}');
select * from test where t->>'foo' = 'bar';
-- ERROR: unsupported Unicode escape sequence
-- DETAIL: \u0000 cannot be converted to text.
-- CONTEXT: JSON data, line 1: {...

insert into test(t) values ('{"foo\u0000": "bar"}');
select * from test where t->>'foo' = 'bar';
-- ERROR: unsupported Unicode escape sequence
-- DETAIL: \u0000 cannot be converted to text.
-- CONTEXT: JSON data, line 1: {...

Once the null byte is inserted the JSON operator ->> can no longer be
applied to the column. JSONB columns don't allow null bytes at all. Should
the same constraint apply on JSON? If not, applications must be vigilant to
guard against null bytes, or queries could break at read time. My reading
of table 8.23 in https://www.postgresql.org/docs/16/datatype-json.html is
they should be disallowed at insert.

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Bruce Momjian 2023-09-22 01:47:39 Re: BUG #18124: PG16 release note document bug in "Add build option to allow testing of small WAL segment sizes"
Previous Message Robert Haas 2023-09-21 20:15:14 Re: [16+] subscription can end up in inconsistent state