diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2020-07-11 14:21:28 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2020-07-11 14:21:28 -0400 |
commit | cd22d3cdb9bd9963c694c01a8c0232bbae3ddcfb (patch) | |
tree | db03825cd2d21a726efcc59e71780f4758cc795f /src | |
parent | ea9125304dc6e90eabad165bd120eb1e667525d4 (diff) | |
download | postgresql-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')
-rw-r--r-- | src/backend/commands/copy.c | 20 |
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) |