Fix performance problem with new COPY DEFAULT code
authorDavid Rowley
Thu, 27 Jul 2023 02:47:05 +0000 (14:47 +1200)
committerDavid Rowley
Thu, 27 Jul 2023 02:47:05 +0000 (14:47 +1200)
9f8377f7a added code to allow COPY FROM insert a column's default value
when the input matches the DEFAULT string specified in the COPY command.

Here we fix some inefficient code which needlessly palloc0'd an array to
store if we should use the default value or input value for the given
column.  This array was being palloc0'd and pfree'd once per row.  It's
much more efficient to allocate this once and just reset the values once
per row.

Reported-by: Masahiko Sawada
Author: Masahiko Sawada
Discussion: https://postgr.es/m/CAD21AoDvDmUQeJtZrau1ovnT_smN940%3DKp6mszNGK3bq9yRN6g%40mail.gmail.com
Backpatch-through: 16, where 9f8377f7a was introduced.

src/backend/commands/copyfrom.c
src/backend/commands/copyfromparse.c

index 80bca79cd0ed8250d718c9fc4f7954843bb7e801..b47cb5c66da7a39e383e33668eddaee15af0a7e9 100644 (file)
@@ -1609,6 +1609,7 @@ BeginCopyFrom(ParseState *pstate,
        }
    }
 
+   cstate->defaults = (bool *) palloc0(tupDesc->natts * sizeof(bool));
 
    /* initialize progress */
    pgstat_progress_start_command(PROGRESS_COMMAND_COPY,
index d2e8c74402be3f37298f46652705860f8ffb5e66..232768a6e139a5dbaa8df9e33cde37611b639bd3 100644 (file)
@@ -871,7 +871,7 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext,
    /* Initialize all values for row to NULL */
    MemSet(values, 0, num_phys_attrs * sizeof(Datum));
    MemSet(nulls, true, num_phys_attrs * sizeof(bool));
-   cstate->defaults = (bool *) palloc0(num_phys_attrs * sizeof(bool));
+   MemSet(cstate->defaults, false, num_phys_attrs * sizeof(bool));
 
    if (!cstate->opts.binary)
    {
@@ -1040,8 +1040,6 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext,
                                         &nulls[defmap[i]]);
    }
 
-   pfree(cstate->defaults);
-
    return true;
 }