aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2023-07-27 14:48:44 +1200
committerDavid Rowley <drowley@postgresql.org>2023-07-27 14:48:44 +1200
commitc1308ce2d9224f0ec08128ab35e161837f9a5105 (patch)
tree9edc26aaf4ffa979f2f35ae2da3391bfbf733aaf
parentb4f14d2e433bf9f2499f07bcaca07b9ff13d641b (diff)
downloadpostgresql-c1308ce2d9224f0ec08128ab35e161837f9a5105.tar.gz
postgresql-c1308ce2d9224f0ec08128ab35e161837f9a5105.zip
Fix performance problem with new COPY DEFAULT code
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.
-rw-r--r--src/backend/commands/copyfrom.c1
-rw-r--r--src/backend/commands/copyfromparse.c4
2 files changed, 2 insertions, 3 deletions
diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c
index 80bca79cd0e..b47cb5c66da 100644
--- a/src/backend/commands/copyfrom.c
+++ b/src/backend/commands/copyfrom.c
@@ -1609,6 +1609,7 @@ BeginCopyFrom(ParseState *pstate,
}
}
+ cstate->defaults = (bool *) palloc0(tupDesc->natts * sizeof(bool));
/* initialize progress */
pgstat_progress_start_command(PROGRESS_COMMAND_COPY,
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index d2e8c74402b..232768a6e13 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -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;
}