mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Factor out encoding specific tests for json
This lets us remove the large alternative results files for the main json and jsonb tests, which makes modifying those tests simpler for committers and patch submitters. Backpatch to 9.4 for jsonb and 9.3 for json.
This commit is contained in:
parent
fc95734a14
commit
48a78d80c8
@ -42,36 +42,7 @@ LINE 1: SELECT '"\v"'::json;
|
||||
^
|
||||
DETAIL: Escape sequence "\v" is invalid.
|
||||
CONTEXT: JSON data, line 1: "\v...
|
||||
SELECT '"\u"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0000"'::json; -- OK, legal escape
|
||||
json
|
||||
----------
|
||||
"\u0000"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
|
||||
json
|
||||
----------
|
||||
"\uaBcD"
|
||||
(1 row)
|
||||
|
||||
-- see json_encoding test for input with unicode escapes
|
||||
-- Numbers.
|
||||
SELECT '1'::json; -- OK
|
||||
json
|
||||
@ -1419,88 +1390,6 @@ select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,3
|
||||
{"z":true} | 3 | Fri Jan 20 10:42:53 2012
|
||||
(2 rows)
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------------
|
||||
"\ud83d\ude04\ud83d\udc36"
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
--handling of simple unicode escapes
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
---------------------------------------
|
||||
{ "a": "the Copyright \u00a9 sign" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-------------------------------------
|
||||
{ "a": "dollar \u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------------------------
|
||||
{ "a": "dollar \\u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' as not_unescaped;
|
||||
not_unescaped
|
||||
--------------------------------
|
||||
{ "a": "null \u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
---------------------------------
|
||||
{ "a": "null \\u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------
|
||||
the Copyright © sign
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
||||
--json_typeof() function
|
||||
select value, json_typeof(value)
|
||||
from (values (json '123.4'),
|
||||
|
File diff suppressed because it is too large
Load Diff
247
src/test/regress/expected/json_encoding.out
Normal file
247
src/test/regress/expected/json_encoding.out
Normal file
@ -0,0 +1,247 @@
|
||||
-- encoding-sensitive tests for json and jsonb
|
||||
-- first json
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0000"'::json; -- OK, legal escape
|
||||
json
|
||||
----------
|
||||
"\u0000"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
|
||||
json
|
||||
----------
|
||||
"\uaBcD"
|
||||
(1 row)
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------------
|
||||
"\ud83d\ude04\ud83d\udc36"
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
--handling of simple unicode escapes
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
---------------------------------------
|
||||
{ "a": "the Copyright \u00a9 sign" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-------------------------------------
|
||||
{ "a": "dollar \u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------------------------
|
||||
{ "a": "dollar \\u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' as not_unescaped;
|
||||
not_unescaped
|
||||
--------------------------------
|
||||
{ "a": "null \u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
---------------------------------
|
||||
{ "a": "null \\u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------
|
||||
the Copyright © sign
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
||||
-- then jsonb
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0045"'::jsonb; -- OK, legal escape
|
||||
jsonb
|
||||
-------
|
||||
"E"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT '"\u0000"'::jsonb;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: ...
|
||||
-- use octet_length here so we don't get an odd unicode char in the
|
||||
-- output
|
||||
SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
|
||||
octet_length
|
||||
--------------
|
||||
5
|
||||
(1 row)
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
|
||||
correct_in_utf8
|
||||
-----------------
|
||||
10
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83dX" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04X" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
-- handling of simple unicode escapes
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
-------------------------------
|
||||
{"a": "the Copyright © sign"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-----------------------------
|
||||
{"a": "dollar $ character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
-----------------------------------
|
||||
{"a": "dollar \\u0024 character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
------------------------------
|
||||
{"a": "null \\u0000 escape"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------
|
||||
the Copyright © sign
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fai...
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
243
src/test/regress/expected/json_encoding_1.out
Normal file
243
src/test/regress/expected/json_encoding_1.out
Normal file
@ -0,0 +1,243 @@
|
||||
-- encoding-sensitive tests for json and jsonb
|
||||
-- first json
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::json; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::json;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0000"'::json; -- OK, legal escape
|
||||
json
|
||||
----------
|
||||
"\u0000"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
|
||||
json
|
||||
----------
|
||||
"\uaBcD"
|
||||
(1 row)
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
--handling of simple unicode escapes
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
---------------------------------------
|
||||
{ "a": "the Copyright \u00a9 sign" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-------------------------------------
|
||||
{ "a": "dollar \u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------------------------
|
||||
{ "a": "dollar \\u0024 character" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' as not_unescaped;
|
||||
not_unescaped
|
||||
--------------------------------
|
||||
{ "a": "null \u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
---------------------------------
|
||||
{ "a": "null \\u0000 escape" }
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
||||
-- then jsonb
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0045"'::jsonb; -- OK, legal escape
|
||||
jsonb
|
||||
-------
|
||||
"E"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT '"\u0000"'::jsonb;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: ...
|
||||
-- use octet_length here so we don't get an odd unicode char in the
|
||||
-- output
|
||||
SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT octet_length('"\uaBcD"'::jsonb::text);
|
||||
^
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: ...
|
||||
-- handling of unicode surrogate pairs
|
||||
SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc3...
|
||||
^
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83dX" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04X" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
-- handling of simple unicode escapes
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as corr...
|
||||
^
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-----------------------------
|
||||
{"a": "dollar $ character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
-----------------------------------
|
||||
{"a": "dollar \\u0024 character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
------------------------------
|
||||
{"a": "null \\u0000 escape"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a'...
|
||||
^
|
||||
DETAIL: Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fai...
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
@ -42,44 +42,7 @@ LINE 1: SELECT '"\v"'::jsonb;
|
||||
^
|
||||
DETAIL: Escape sequence "\v" is invalid.
|
||||
CONTEXT: JSON data, line 1: "\v...
|
||||
SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u"
|
||||
SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u00"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u00"
|
||||
SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT '"\u000g"'::jsonb;
|
||||
^
|
||||
DETAIL: "\u" must be followed by four hexadecimal digits.
|
||||
CONTEXT: JSON data, line 1: "\u000g...
|
||||
SELECT '"\u0045"'::jsonb; -- OK, legal escape
|
||||
jsonb
|
||||
-------
|
||||
"E"
|
||||
(1 row)
|
||||
|
||||
SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT '"\u0000"'::jsonb;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: ...
|
||||
-- use octet_length here so we don't get an odd unicode char in the
|
||||
-- output
|
||||
SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
|
||||
octet_length
|
||||
--------------
|
||||
5
|
||||
(1 row)
|
||||
|
||||
-- see json_encoding test for input with unicode escapes
|
||||
-- Numbers.
|
||||
SELECT '1'::jsonb; -- OK
|
||||
jsonb
|
||||
@ -1981,98 +1944,6 @@ SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200
|
||||
{"z": true} | 3 | Fri Jan 20 10:42:53 2012
|
||||
(2 rows)
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
|
||||
correct_in_utf8
|
||||
-----------------
|
||||
10
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode high surrogate must not follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ud83dX" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
ERROR: invalid input syntax for type json
|
||||
LINE 1: SELECT jsonb '{ "a": "\ude04X" }' -> 'a';
|
||||
^
|
||||
DETAIL: Unicode low surrogate must follow a high surrogate.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
-- handling of simple unicode escapes
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
-------------------------------
|
||||
{"a": "the Copyright © sign"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
correct_everywhere
|
||||
-----------------------------
|
||||
{"a": "dollar $ character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
not_an_escape
|
||||
-----------------------------------
|
||||
{"a": "dollar \\u0024 character"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
not_an_escape
|
||||
------------------------------
|
||||
{"a": "null \\u0000 escape"}
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
correct_in_utf8
|
||||
----------------------
|
||||
the Copyright © sign
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
correct_everywhere
|
||||
--------------------
|
||||
dollar $ character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
-------------------------
|
||||
dollar \u0024 character
|
||||
(1 row)
|
||||
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
ERROR: unsupported Unicode escape sequence
|
||||
LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fai...
|
||||
^
|
||||
DETAIL: \u0000 cannot be converted to text.
|
||||
CONTEXT: JSON data, line 1: { "a":...
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
not_an_escape
|
||||
--------------------
|
||||
null \u0000 escape
|
||||
(1 row)
|
||||
|
||||
-- jsonb_to_record and jsonb_to_recordset
|
||||
select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}')
|
||||
as x(a int, b text, d text);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -97,7 +97,7 @@ test: rules
|
||||
# ----------
|
||||
# Another group of parallel tests
|
||||
# ----------
|
||||
test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb indirect_toast equivclass
|
||||
test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock json jsonb json_encoding indirect_toast equivclass
|
||||
# ----------
|
||||
# Another group of parallel tests
|
||||
# NB: temp.sql does a reconnect which transiently uses 2 connections,
|
||||
|
@ -134,6 +134,7 @@ test: functional_deps
|
||||
test: advisory_lock
|
||||
test: json
|
||||
test: jsonb
|
||||
test: json_encoding
|
||||
test: indirect_toast
|
||||
test: equivclass
|
||||
test: plancache
|
||||
|
@ -7,11 +7,7 @@ SELECT '"abc
|
||||
def"'::json; -- ERROR, unescaped newline in string constant
|
||||
SELECT '"\n\"\\"'::json; -- OK, legal escapes
|
||||
SELECT '"\v"'::json; -- ERROR, not a valid JSON escape
|
||||
SELECT '"\u"'::json; -- ERROR, incomplete escape
|
||||
SELECT '"\u00"'::json; -- ERROR, incomplete escape
|
||||
SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
|
||||
SELECT '"\u0000"'::json; -- OK, legal escape
|
||||
SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
|
||||
-- see json_encoding test for input with unicode escapes
|
||||
|
||||
-- Numbers.
|
||||
SELECT '1'::json; -- OK
|
||||
@ -405,28 +401,6 @@ select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":
|
||||
select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
|
||||
select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q;
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
|
||||
select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
|
||||
select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
|
||||
--handling of simple unicode escapes
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
select json '{ "a": "null \u0000 escape" }' as not_unescaped;
|
||||
select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
|
||||
--json_typeof() function
|
||||
select value, json_typeof(value)
|
||||
from (values (json '123.4'),
|
||||
|
68
src/test/regress/sql/json_encoding.sql
Normal file
68
src/test/regress/sql/json_encoding.sql
Normal file
@ -0,0 +1,68 @@
|
||||
|
||||
-- encoding-sensitive tests for json and jsonb
|
||||
|
||||
-- first json
|
||||
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::json; -- ERROR, incomplete escape
|
||||
SELECT '"\u00"'::json; -- ERROR, incomplete escape
|
||||
SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
|
||||
SELECT '"\u0000"'::json; -- OK, legal escape
|
||||
SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
|
||||
select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
|
||||
select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
|
||||
--handling of simple unicode escapes
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
select json '{ "a": "null \u0000 escape" }' as not_unescaped;
|
||||
select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
|
||||
select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
|
||||
-- then jsonb
|
||||
|
||||
-- basic unicode input
|
||||
SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
|
||||
SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
|
||||
SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
|
||||
SELECT '"\u0045"'::jsonb; -- OK, legal escape
|
||||
SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
|
||||
-- use octet_length here so we don't get an odd unicode char in the
|
||||
-- output
|
||||
SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
|
||||
SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
|
||||
-- handling of simple unicode escapes
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
|
@ -7,14 +7,7 @@ SELECT '"abc
|
||||
def"'::jsonb; -- ERROR, unescaped newline in string constant
|
||||
SELECT '"\n\"\\"'::jsonb; -- OK, legal escapes
|
||||
SELECT '"\v"'::jsonb; -- ERROR, not a valid JSON escape
|
||||
SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
|
||||
SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
|
||||
SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
|
||||
SELECT '"\u0045"'::jsonb; -- OK, legal escape
|
||||
SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
|
||||
-- use octet_length here so we don't get an odd unicode char in the
|
||||
-- output
|
||||
SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
|
||||
-- see json_encoding test for input with unicode escapes
|
||||
|
||||
-- Numbers.
|
||||
SELECT '1'::jsonb; -- OK
|
||||
@ -494,28 +487,6 @@ SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b
|
||||
SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q;
|
||||
SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q;
|
||||
|
||||
-- handling of unicode surrogate pairs
|
||||
|
||||
SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
|
||||
SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
|
||||
SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
|
||||
SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
|
||||
|
||||
-- handling of simple unicode escapes
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
|
||||
|
||||
SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
|
||||
SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
|
||||
SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
|
||||
SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
|
||||
SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
|
||||
|
||||
-- jsonb_to_record and jsonb_to_recordset
|
||||
|
||||
select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}')
|
||||
|
Loading…
x
Reference in New Issue
Block a user