json_encoding.err 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <sql-statement>
  2. --
  3. -- encoding-sensitive tests for json and jsonb
  4. --
  5. SELECT getdatabaseencoding(); -- just to label the results files
  6. </sql-statement>
  7. <sql-statement>
  8. -- first json
  9. -- basic unicode input
  10. SELECT '"\u"'::json; -- ERROR, incomplete escape
  11. </sql-statement>
  12. -stdin-:<main>: Fatal: Execution
  13. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  14. -- first json
  15. ^
  16. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  17. DETAIL: "\u" must be followed by four hexadecimal digits.
  18. CONTEXT: JSON data, line 1: "\u"
  19. -- first json
  20. ^
  21. <sql-statement>
  22. SELECT '"\u00"'::json; -- ERROR, incomplete escape
  23. </sql-statement>
  24. -stdin-:<main>: Fatal: Execution
  25. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  26. SELECT '"\u00"'::json; -- ERROR, incomplete escape
  27. ^
  28. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  29. DETAIL: "\u" must be followed by four hexadecimal digits.
  30. CONTEXT: JSON data, line 1: "\u00"
  31. SELECT '"\u00"'::json; -- ERROR, incomplete escape
  32. ^
  33. <sql-statement>
  34. SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
  35. </sql-statement>
  36. -stdin-:<main>: Fatal: Execution
  37. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  38. SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
  39. ^
  40. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  41. DETAIL: "\u" must be followed by four hexadecimal digits.
  42. CONTEXT: JSON data, line 1: "\u000g...
  43. SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit
  44. ^
  45. <sql-statement>
  46. SELECT '"\u0000"'::json; -- OK, legal escape
  47. </sql-statement>
  48. <sql-statement>
  49. SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK
  50. </sql-statement>
  51. <sql-statement>
  52. -- handling of unicode surrogate pairs
  53. select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8;
  54. </sql-statement>
  55. <sql-statement>
  56. select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  57. </sql-statement>
  58. -stdin-:<main>: Fatal: Execution
  59. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  60. select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  61. ^
  62. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  63. DETAIL: Unicode high surrogate must not follow a high surrogate.
  64. CONTEXT: JSON data, line 1: { "a":...
  65. select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  66. ^
  67. <sql-statement>
  68. select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  69. </sql-statement>
  70. -stdin-:<main>: Fatal: Execution
  71. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  72. select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  73. ^
  74. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  75. DETAIL: Unicode low surrogate must follow a high surrogate.
  76. CONTEXT: JSON data, line 1: { "a":...
  77. select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  78. ^
  79. <sql-statement>
  80. select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  81. </sql-statement>
  82. -stdin-:<main>: Fatal: Execution
  83. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  84. select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  85. ^
  86. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  87. DETAIL: Unicode low surrogate must follow a high surrogate.
  88. CONTEXT: JSON data, line 1: { "a":...
  89. select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  90. ^
  91. <sql-statement>
  92. select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  93. </sql-statement>
  94. -stdin-:<main>: Fatal: Execution
  95. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  96. select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  97. ^
  98. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  99. DETAIL: Unicode low surrogate must follow a high surrogate.
  100. CONTEXT: JSON data, line 1: { "a":...
  101. select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  102. ^
  103. <sql-statement>
  104. --handling of simple unicode escapes
  105. select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
  106. </sql-statement>
  107. <sql-statement>
  108. select json '{ "a": "dollar \u0024 character" }' as correct_everywhere;
  109. </sql-statement>
  110. <sql-statement>
  111. select json '{ "a": "dollar \\u0024 character" }' as not_an_escape;
  112. </sql-statement>
  113. <sql-statement>
  114. select json '{ "a": "null \u0000 escape" }' as not_unescaped;
  115. </sql-statement>
  116. <sql-statement>
  117. select json '{ "a": "null \\u0000 escape" }' as not_an_escape;
  118. </sql-statement>
  119. <sql-statement>
  120. select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
  121. </sql-statement>
  122. <sql-statement>
  123. select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
  124. </sql-statement>
  125. <sql-statement>
  126. select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
  127. </sql-statement>
  128. <sql-statement>
  129. select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  130. </sql-statement>
  131. -stdin-:<main>: Fatal: Execution
  132. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  133. select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  134. ^
  135. -stdin-:<main>:1:1: Fatal: ERROR: unsupported Unicode escape sequence
  136. DETAIL: \u0000 cannot be converted to text.
  137. CONTEXT: JSON data, line 1: { "a":...
  138. select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  139. ^
  140. <sql-statement>
  141. select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
  142. </sql-statement>
  143. <sql-statement>
  144. -- then jsonb
  145. -- basic unicode input
  146. SELECT '"\u"'::jsonb; -- ERROR, incomplete escape
  147. </sql-statement>
  148. -stdin-:<main>: Fatal: Execution
  149. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  150. -- then jsonb
  151. ^
  152. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  153. DETAIL: "\u" must be followed by four hexadecimal digits.
  154. CONTEXT: JSON data, line 1: "\u"
  155. -- then jsonb
  156. ^
  157. <sql-statement>
  158. SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
  159. </sql-statement>
  160. -stdin-:<main>: Fatal: Execution
  161. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  162. SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
  163. ^
  164. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  165. DETAIL: "\u" must be followed by four hexadecimal digits.
  166. CONTEXT: JSON data, line 1: "\u00"
  167. SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape
  168. ^
  169. <sql-statement>
  170. SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
  171. </sql-statement>
  172. -stdin-:<main>: Fatal: Execution
  173. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  174. SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
  175. ^
  176. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  177. DETAIL: "\u" must be followed by four hexadecimal digits.
  178. CONTEXT: JSON data, line 1: "\u000g...
  179. SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit
  180. ^
  181. <sql-statement>
  182. SELECT '"\u0045"'::jsonb; -- OK, legal escape
  183. </sql-statement>
  184. <sql-statement>
  185. SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
  186. </sql-statement>
  187. -stdin-:<main>: Fatal: Execution
  188. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  189. SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
  190. ^
  191. -stdin-:<main>:1:1: Fatal: ERROR: unsupported Unicode escape sequence
  192. DETAIL: \u0000 cannot be converted to text.
  193. CONTEXT: JSON data, line 1: ...
  194. SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000
  195. ^
  196. <sql-statement>
  197. -- use octet_length here so we don't get an odd unicode char in the
  198. -- output
  199. SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK
  200. </sql-statement>
  201. <sql-statement>
  202. -- handling of unicode surrogate pairs
  203. SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8;
  204. </sql-statement>
  205. <sql-statement>
  206. SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  207. </sql-statement>
  208. -stdin-:<main>: Fatal: Execution
  209. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  210. SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  211. ^
  212. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  213. DETAIL: Unicode high surrogate must not follow a high surrogate.
  214. CONTEXT: JSON data, line 1: { "a":...
  215. SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row
  216. ^
  217. <sql-statement>
  218. SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  219. </sql-statement>
  220. -stdin-:<main>: Fatal: Execution
  221. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  222. SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  223. ^
  224. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  225. DETAIL: Unicode low surrogate must follow a high surrogate.
  226. CONTEXT: JSON data, line 1: { "a":...
  227. SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order
  228. ^
  229. <sql-statement>
  230. SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  231. </sql-statement>
  232. -stdin-:<main>: Fatal: Execution
  233. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  234. SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  235. ^
  236. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  237. DETAIL: Unicode low surrogate must follow a high surrogate.
  238. CONTEXT: JSON data, line 1: { "a":...
  239. SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate
  240. ^
  241. <sql-statement>
  242. SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  243. </sql-statement>
  244. -stdin-:<main>: Fatal: Execution
  245. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  246. SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  247. ^
  248. -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type json
  249. DETAIL: Unicode low surrogate must follow a high surrogate.
  250. CONTEXT: JSON data, line 1: { "a":...
  251. SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate
  252. ^
  253. <sql-statement>
  254. -- handling of simple unicode escapes
  255. SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8;
  256. </sql-statement>
  257. <sql-statement>
  258. SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere;
  259. </sql-statement>
  260. <sql-statement>
  261. SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape;
  262. </sql-statement>
  263. <sql-statement>
  264. SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
  265. </sql-statement>
  266. -stdin-:<main>: Fatal: Execution
  267. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  268. SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
  269. ^
  270. -stdin-:<main>:1:1: Fatal: ERROR: unsupported Unicode escape sequence
  271. DETAIL: \u0000 cannot be converted to text.
  272. CONTEXT: JSON data, line 1: { "a":...
  273. SELECT jsonb '{ "a": "null \u0000 escape" }' as fails;
  274. ^
  275. <sql-statement>
  276. SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape;
  277. </sql-statement>
  278. <sql-statement>
  279. SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8;
  280. </sql-statement>
  281. <sql-statement>
  282. SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere;
  283. </sql-statement>
  284. <sql-statement>
  285. SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape;
  286. </sql-statement>
  287. <sql-statement>
  288. SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  289. </sql-statement>
  290. -stdin-:<main>: Fatal: Execution
  291. -stdin-:<main>:1:1: Fatal: Execution of node: Result
  292. SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  293. ^
  294. -stdin-:<main>:1:1: Fatal: ERROR: unsupported Unicode escape sequence
  295. DETAIL: \u0000 cannot be converted to text.
  296. CONTEXT: JSON data, line 1: { "a":...
  297. SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails;
  298. ^
  299. <sql-statement>
  300. SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape;
  301. </sql-statement>