diff options
Diffstat (limited to 'src/backend/utils/adt/jsonfuncs.c')
-rw-r--r-- | src/backend/utils/adt/jsonfuncs.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 1b681eff5f1..7076b344b7b 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3133,18 +3133,6 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, json = jsv->val.json.str; Assert(json); - if (len >= 0) - { - /* Need to copy non-null-terminated string */ - str = palloc(len + 1 * sizeof(char)); - memcpy(str, json, len); - str[len] = '\0'; - } - else - { - /* string is already null-terminated */ - str = unconstify(char *, json); - } /* If converting to json/jsonb, make string into valid JSON literal */ if ((typid == JSONOID || typid == JSONBOID) && @@ -3153,12 +3141,24 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, StringInfoData buf; initStringInfo(&buf); - escape_json(&buf, str); - /* free temporary buffer */ - if (str != json) - pfree(str); + if (len >= 0) + escape_json_with_len(&buf, json, len); + else + escape_json(&buf, json); str = buf.data; } + else if (len >= 0) + { + /* create a NUL-terminated version */ + str = palloc(len + 1); + memcpy(str, json, len); + str[len] = '\0'; + } + else + { + /* string is already NUL-terminated */ + str = unconstify(char *, json); + } } else { @@ -5936,7 +5936,7 @@ transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype { text *out = _state->action(_state->action_state, token, strlen(token)); - escape_json(_state->strval, text_to_cstring(out)); + escape_json_text(_state->strval, out); } else appendStringInfoString(_state->strval, token); |