From b4278a09b60c9832fdab4bc11089e48d2ba8b933 Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath.rupireddy@enterprisedb.com>
Date: Sat, 18 Jul 2020 10:03:50 +0530
Subject: [PATCH v1] 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.
---
 src/backend/commands/copy.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 6d53dc463c..72057af21f 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;
 
@@ -3364,12 +3367,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)
-- 
2.25.1

