-- -- encoding-sensitive tests for jsonpath -- -- We provide expected-results files for UTF8 (jsonpath_encoding.out) -- and for SQL_ASCII (jsonpath_encoding_1.out). Skip otherwise. SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') AS skip_test \gset \if :skip_test \quit \endif SELECT getdatabaseencoding(); -- just to label the results files getdatabaseencoding --------------------- SQL_ASCII (1 row) -- checks for double-quoted values -- basic unicode input SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape ERROR: invalid unicode sequence at or near "\u" of jsonpath input LINE 1: SELECT '"\u"'::jsonpath; ^ SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape ERROR: invalid unicode sequence at or near "\u00" of jsonpath input LINE 1: SELECT '"\u00"'::jsonpath; ^ SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit ERROR: invalid unicode sequence at or near "\u000" of jsonpath input LINE 1: SELECT '"\u000g"'::jsonpath; ^ SELECT '"\u0000"'::jsonpath; -- OK, legal escape ERROR: unsupported Unicode escape sequence LINE 1: SELECT '"\u0000"'::jsonpath; ^ DETAIL: \u0000 cannot be converted to text. SELECT '"\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: SELECT '"\uaBcD"'::jsonpath; ^ -- handling of unicode surrogate pairs select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_... ^ select '"\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row ERROR: invalid input syntax for type jsonpath LINE 1: select '"\ud83d\ud83d"'::jsonpath; ^ DETAIL: Unicode high surrogate must not follow a high surrogate. select '"\ude04\ud83d"'::jsonpath; -- surrogates in wrong order ERROR: invalid input syntax for type jsonpath LINE 1: select '"\ude04\ud83d"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. select '"\ud83dX"'::jsonpath; -- orphan high surrogate ERROR: invalid input syntax for type jsonpath LINE 1: select '"\ud83dX"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. select '"\ude04X"'::jsonpath; -- orphan low surrogate ERROR: invalid input syntax for type jsonpath LINE 1: select '"\ude04X"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. --handling of simple unicode escapes select '"the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: select '"the Copyright \u00a9 sign"'::jsonpath as correct_in... ^ select '"dollar \u0024 character"'::jsonpath as correct_everywhere; correct_everywhere ---------------------- "dollar $ character" (1 row) select '"dollar \\u0024 character"'::jsonpath as not_an_escape; not_an_escape ---------------------------- "dollar \\u0024 character" (1 row) select '"null \u0000 escape"'::jsonpath as not_unescaped; ERROR: unsupported Unicode escape sequence LINE 1: select '"null \u0000 escape"'::jsonpath as not_unescaped; ^ DETAIL: \u0000 cannot be converted to text. select '"null \\u0000 escape"'::jsonpath as not_an_escape; not_an_escape ----------------------- "null \\u0000 escape" (1 row) -- checks for quoted key names -- basic unicode input SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape ERROR: invalid unicode sequence at or near "\u" of jsonpath input LINE 1: SELECT '$."\u"'::jsonpath; ^ SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape ERROR: invalid unicode sequence at or near "\u00" of jsonpath input LINE 1: SELECT '$."\u00"'::jsonpath; ^ SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit ERROR: invalid unicode sequence at or near "\u000" of jsonpath input LINE 1: SELECT '$."\u000g"'::jsonpath; ^ SELECT '$."\u0000"'::jsonpath; -- OK, legal escape ERROR: unsupported Unicode escape sequence LINE 1: SELECT '$."\u0000"'::jsonpath; ^ DETAIL: \u0000 cannot be converted to text. SELECT '$."\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: SELECT '$."\uaBcD"'::jsonpath; ^ -- handling of unicode surrogate pairs select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_i... ^ select '$."\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row ERROR: invalid input syntax for type jsonpath LINE 1: select '$."\ud83d\ud83d"'::jsonpath; ^ DETAIL: Unicode high surrogate must not follow a high surrogate. select '$."\ude04\ud83d"'::jsonpath; -- surrogates in wrong order ERROR: invalid input syntax for type jsonpath LINE 1: select '$."\ude04\ud83d"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. select '$."\ud83dX"'::jsonpath; -- orphan high surrogate ERROR: invalid input syntax for type jsonpath LINE 1: select '$."\ud83dX"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. select '$."\ude04X"'::jsonpath; -- orphan low surrogate ERROR: invalid input syntax for type jsonpath LINE 1: select '$."\ude04X"'::jsonpath; ^ DETAIL: Unicode low surrogate must follow a high surrogate. --handling of simple unicode escapes select '$."the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; ERROR: conversion between UTF8 and SQL_ASCII is not supported LINE 1: select '$."the Copyright \u00a9 sign"'::jsonpath as correct_... ^ select '$."dollar \u0024 character"'::jsonpath as correct_everywhere; correct_everywhere ------------------------ $."dollar $ character" (1 row) select '$."dollar \\u0024 character"'::jsonpath as not_an_escape; not_an_escape ------------------------------ $."dollar \\u0024 character" (1 row) select '$."null \u0000 escape"'::jsonpath as not_unescaped; ERROR: unsupported Unicode escape sequence LINE 1: select '$."null \u0000 escape"'::jsonpath as not_unescaped; ^ DETAIL: \u0000 cannot be converted to text. select '$."null \\u0000 escape"'::jsonpath as not_an_escape; not_an_escape ------------------------- $."null \\u0000 escape" (1 row)