aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/json.c
diff options
context:
space:
mode:
authorNathan Bossart <nathan@postgresql.org>2023-12-18 10:34:33 -0600
committerNathan Bossart <nathan@postgresql.org>2023-12-18 10:34:33 -0600
commit0d1adae6f739273046705acaf5314384e8a73a18 (patch)
tree41fd6fda8833012ed1822beb93237190d912cb8d /src/backend/utils/adt/json.c
parent4908c5872059c409aa647bcde758dfeffe07996e (diff)
downloadpostgresql-0d1adae6f739273046705acaf5314384e8a73a18.tar.gz
postgresql-0d1adae6f739273046705acaf5314384e8a73a18.zip
Micro-optimize datum_to_json_internal() some more.
Commit dc3f9bc549 mainly targeted the JSONTYPE_NUMERIC code path. This commit applies similar optimizations (e.g., removing unnecessary runtime calls to strlen() and palloc()) to nearby code. Reviewed-by: Tom Lane Discussion: https://postgr.es/m/20231208203708.GA4126315%40nathanxps13
Diffstat (limited to 'src/backend/utils/adt/json.c')
-rw-r--r--src/backend/utils/adt/json.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 0778d8dec92..507c1c22b71 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -188,7 +188,7 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result,
if (is_null)
{
- appendStringInfoString(result, "null");
+ appendBinaryStringInfo(result, "null", strlen("null"));
return;
}
@@ -210,11 +210,14 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result,
composite_to_json(val, result, false);
break;
case JSONTYPE_BOOL:
- outputstr = DatumGetBool(val) ? "true" : "false";
if (key_scalar)
- escape_json(result, outputstr);
+ appendStringInfoChar(result, '"');
+ if (DatumGetBool(val))
+ appendBinaryStringInfo(result, "true", strlen("true"));
else
- appendStringInfoString(result, outputstr);
+ appendBinaryStringInfo(result, "false", strlen("false"));
+ if (key_scalar)
+ appendStringInfoChar(result, '"');
break;
case JSONTYPE_NUMERIC:
outputstr = OidOutputFunctionCall(outfuncoid, val);
@@ -277,9 +280,8 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result,
case JSONTYPE_CAST:
/* outfuncoid refers to a cast function, not an output function */
jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val));
- outputstr = text_to_cstring(jsontext);
- appendStringInfoString(result, outputstr);
- pfree(outputstr);
+ appendBinaryStringInfo(result, VARDATA_ANY(jsontext),
+ VARSIZE_ANY_EXHDR(jsontext));
pfree(jsontext);
break;
default: