From: Nathan Bossart Date: Mon, 4 Dec 2023 17:55:18 +0000 (-0600) Subject: Teach convert() and friends to avoid copying when possible. X-Git-Tag: REL_17_BETA1~1339 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=b14b1eb4da4c97afec24cf8956e842b98ebb2a51;p=postgresql.git 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 --- diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 67a1ab2ab23..10eb6cd6fa7 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);