pgsql: Fix jsonb Unicode escape processing, and in consequence disallow

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix jsonb Unicode escape processing, and in consequence disallow
Date: 2015-01-30 19:45:10
Message-ID: E1YHHV8-00032A-Em@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix jsonb Unicode escape processing, and in consequence disallow \u0000.

We've been trying to support \u0000 in JSON values since commit
78ed8e03c67d7333, and have introduced increasingly worse hacks to try to
make it work, such as commit 0ad1a816320a2b53. However, it fundamentally
can't work in the way envisioned, because the stored representation looks
the same as for \\u0000 which is not the same thing at all. It's also
entirely bogus to output \u0000 when de-escaped output is called for.

The right way to do this would be to store an actual 0x00 byte, and then
throw error only if asked to produce de-escaped textual output. However,
getting to that point seems likely to take considerable work and may well
never be practical in the 9.4.x series.

To preserve our options for better behavior while getting rid of the nasty
side-effects of 0ad1a816320a2b53, revert that commit in toto and instead
throw error if \u0000 is used in a context where it needs to be de-escaped.
(These are the same contexts where non-ASCII Unicode escapes throw error
if the database encoding isn't UTF8, so this behavior is by no means
without precedent.)

In passing, make both the \u0000 case and the non-ASCII Unicode case report
ERRCODE_UNTRANSLATABLE_CHARACTER / "unsupported Unicode escape sequence"
rather than claiming there's something wrong with the input syntax.

Back-patch to 9.4, where we have to do something because 0ad1a816320a2b53
broke things for many cases having nothing to do with \u0000. 9.3 also has
bogus behavior, but only for that specific escape value, so given the lack
of field complaints it seems better to leave 9.3 alone.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/451d2808151e56c2c70893b8c3ee72af393a9f1d

Modified Files
--------------
doc/src/sgml/json.sgml | 19 ++++----
doc/src/sgml/release-9.4.sgml | 16 -------
src/backend/utils/adt/json.c | 49 ++++++-------------
src/test/regress/expected/json.out | 58 ++++++++++++++++-------
src/test/regress/expected/json_1.out | 62 +++++++++++++++++-------
src/test/regress/expected/jsonb.out | 78 +++++++++++++++++++++---------
src/test/regress/expected/jsonb_1.out | 84 +++++++++++++++++++++++----------
src/test/regress/sql/json.sql | 18 +++----
src/test/regress/sql/jsonb.sql | 26 +++++-----
9 files changed, 250 insertions(+), 160 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Stephen Frost 2015-01-30 21:10:39 pgsql: Policy documentation improvements
Previous Message Peter Eisentraut 2015-01-30 18:31:37 pgsql: doc: Remove superfluous table column