diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index a266f60ff3..b15f6c5e64 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -24,6 +24,7 @@ #include "utils/builtins.h" #include "utils/date.h" #include "utils/datetime.h" +#include "utils/fmgroids.h" #include "utils/json.h" #include "utils/jsonfuncs.h" #include "utils/lsyscache.h" @@ -286,9 +287,15 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result, pfree(jsontext); break; default: - outputstr = OidOutputFunctionCall(outfuncoid, val); - escape_json_cstring(result, outputstr); - pfree(outputstr); + /* special case common case for text types */ + if (outfuncoid == F_TEXTOUT) + escape_json_from_text(result, (text *) DatumGetPointer(val)); + else + { + outputstr = OidOutputFunctionCall(outfuncoid, val); + escape_json_cstring(result, outputstr); + pfree(outputstr); + } break; } }