diff --git a/src/common/backend/utils/adt/json.cpp b/src/common/backend/utils/adt/json.cpp index 3feec1f9e..9d3faa78c 100644 --- a/src/common/backend/utils/adt/json.cpp +++ b/src/common/backend/utils/adt/json.cpp @@ -2107,7 +2107,7 @@ void escape_json(StringInfo buf, const char *str) appendStringInfo(buf, "\\u%04x", (int) *p); } else { for (int i = 0; i < charlen; i++) { - appendStringInfoCharMacro(buf, *p); + appendStringInfoCharMacro(buf, *(p + i)); } } break; diff --git a/src/test/regress/expected/json.out b/src/test/regress/expected/json.out index 396dc32f5..a772b8d78 100644 --- a/src/test/regress/expected/json.out +++ b/src/test/regress/expected/json.out @@ -79,6 +79,12 @@ SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK "\uaBcD" (1 row) +SELECT '"哈1哈"'::jsonb; -- OK + jsonb +--------- + "哈1哈" +(1 row) + -- Numbers. SELECT '1'::json; -- OK json diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index 1c0b0ed68..da7e9f3d8 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -73,6 +73,12 @@ SELECT '"\u0000"'::jsonb; -- OK, legal escape "\\u0000" (1 row) +SELECT '"哈1哈"'::jsonb; -- OK + jsonb +--------- + "哈1哈" +(1 row) + -- 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 diff --git a/src/test/regress/sql/json.sql b/src/test/regress/sql/json.sql index c9898cfd7..49c2a0740 100644 --- a/src/test/regress/sql/json.sql +++ b/src/test/regress/sql/json.sql @@ -12,6 +12,7 @@ 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 +SELECT '"哈1哈"'::jsonb; -- OK -- Numbers. SELECT '1'::json; -- OK diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index fd9b80b03..6d84fe5b8 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -11,6 +11,7 @@ SELECT '"\u"'::jsonb; -- ERROR, incomplete escape SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit SELECT '"\u0000"'::jsonb; -- OK, legal escape +SELECT '"哈1哈"'::jsonb; -- OK -- 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