Teach convert() and friends to avoid copying when possible.
authorNathan Bossart <[email protected]>
Mon, 4 Dec 2023 17:55:18 +0000 (11:55 -0600)
committerNathan Bossart <[email protected]>
Mon, 4 Dec 2023 17:55:18 +0000 (11:55 -0600)
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

index 67a1ab2ab23b7aefe2725e24c5f93db6411ee122..10eb6cd6fa75046847992f1963213c99e74d3707 100644 (file)
@@ -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);