aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/copy.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-07-11 14:21:28 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-07-11 14:21:28 -0400
commitcd22d3cdb9bd9963c694c01a8c0232bbae3ddcfb (patch)
treedb03825cd2d21a726efcc59e71780f4758cc795f /src/backend/commands/copy.c
parentea9125304dc6e90eabad165bd120eb1e667525d4 (diff)
downloadpostgresql-cd22d3cdb9bd9963c694c01a8c0232bbae3ddcfb.tar.gz
postgresql-cd22d3cdb9bd9963c694c01a8c0232bbae3ddcfb.zip
Avoid useless buffer allocations during binary COPY FROM.
The raw_buf and line_buf buffers aren't used when reading binary format, so skip allocating them. raw_buf is 64K so that seems like a worthwhile savings. An unused line_buf only wastes 1K, but as long as we're checking it's free to avoid allocating that too. Bharath Rupireddy, tweaked a bit by me Discussion: https://postgr.es/m/CALj2ACXcCKaGPY0whowqrJ4OPJvDnTssgpGCzvuFQu5z0CXb-g@mail.gmail.com
Diffstat (limited to 'src/backend/commands/copy.c')
-rw-r--r--src/backend/commands/copy.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 3e199bdfd0c..99d14571801 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -193,6 +193,9 @@ typedef struct CopyStateData
* the current line. The CopyReadAttributes functions return arrays of
* pointers into this buffer. We avoid palloc/pfree overhead by re-using
* the buffer on each cycle.
+ *
+ * (In binary COPY FROM, attribute_buf holds the binary data for the
+ * current field, while the other variables are not used.)
*/
StringInfoData attribute_buf;
@@ -3359,12 +3362,19 @@ BeginCopyFrom(ParseState *pstate,
cstate->cur_attname = NULL;
cstate->cur_attval = NULL;
- /* Set up variables to avoid per-attribute overhead. */
+ /*
+ * Set up variables to avoid per-attribute overhead. attribute_buf is
+ * used in both text and binary modes, but we use line_buf and raw_buf
+ * only in text mode.
+ */
initStringInfo(&cstate->attribute_buf);
- initStringInfo(&cstate->line_buf);
- cstate->line_buf_converted = false;
- cstate->raw_buf = (char *) palloc(RAW_BUF_SIZE + 1);
- cstate->raw_buf_index = cstate->raw_buf_len = 0;
+ if (!cstate->binary)
+ {
+ initStringInfo(&cstate->line_buf);
+ cstate->line_buf_converted = false;
+ cstate->raw_buf = (char *) palloc(RAW_BUF_SIZE + 1);
+ cstate->raw_buf_index = cstate->raw_buf_len = 0;
+ }
/* Assign range table, we'll need it in CopyFrom. */
if (pstate)