]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid useless buffer allocations during binary COPY FROM.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 Jul 2020 18:21:28 +0000 (14:21 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 Jul 2020 18:21:28 +0000 (14:21 -0400)
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

src/backend/commands/copy.c

index 3e199bdfd0c6520a455f821df8acfedc0df76ede..99d14571801224ba8cfe4bf87829ae0ec8db2e65 100644 (file)
@@ -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)