From b14b1eb4da4c97afec24cf8956e842b98ebb2a51 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Mon, 4 Dec 2023 11:55:18 -0600 Subject: [PATCH] Teach convert() and friends to avoid copying when possible. Presently, pg_convert() allocates a new bytea and copies the result regardless of whether any conversion actually happened. This commit adjusts this function to return the source pointer as-is if no conversion occurred. This optimization isn't expected to make a tremendous difference, but it still seems worthwhile to avoid unnecessary memory allocations. Author: Yurii Rashkovskii Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/CA%2BRLCQyknBPSWXRBQGOi6aYEcdQ9RpH9Kch4GjoeY8dQ3D%2Bvhw%40mail.gmail.com --- src/backend/utils/mb/mbutils.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 67a1ab2ab2..10eb6cd6fa 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -585,19 +585,19 @@ pg_convert(PG_FUNCTION_ARGS) src_encoding, dest_encoding); - /* update len if conversion actually happened */ - if (dest_str != src_str) - len = strlen(dest_str); + + /* return source string if no conversion happened */ + if (dest_str == src_str) + PG_RETURN_BYTEA_P(string); /* * build bytea data type structure. */ + len = strlen(dest_str); retval = (bytea *) palloc(len + VARHDRSZ); SET_VARSIZE(retval, len + VARHDRSZ); memcpy(VARDATA(retval), dest_str, len); - - if (dest_str != src_str) - pfree(dest_str); + pfree(dest_str); /* free memory if allocated by the toaster */ PG_FREE_IF_COPY(string, 0);