From fbafa5eaaa84028b3bbfb7cde0cbcc3963fd033a Mon Sep 17 00:00:00 2001 From: Vignesh C Date: Tue, 14 Jul 2020 12:21:37 +0530 Subject: [PATCH] Improvements in copy from. There are couple of improvements for copy from in this patch which is detailed below: a) copy from stdin copies lesser amount of data to buffer even though space is available in buffer because minread was passed as 1 to CopyGetData, fixed it by passing the actual space available in buffer, this reduces the frequent call to CopyGetData. b) Copy from reads header line and does nothing for the read line, we need not clear EOL & need not convert to server encoding for the header line. --- src/backend/commands/copy.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 44da71c..bc27dfc 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -796,6 +796,7 @@ CopyLoadRawBuf(CopyState cstate) { int nbytes; int inbytes; + int minread = 1; if (cstate->raw_buf_index < cstate->raw_buf_len) { @@ -807,8 +808,11 @@ CopyLoadRawBuf(CopyState cstate) else nbytes = 0; /* no data need be saved */ + if (cstate->copy_dest == COPY_NEW_FE) + minread = RAW_BUF_SIZE - nbytes; + inbytes = CopyGetData(cstate, cstate->raw_buf + nbytes, - 1, RAW_BUF_SIZE - nbytes); + minread, RAW_BUF_SIZE - nbytes); nbytes += inbytes; cstate->raw_buf[nbytes] = '\0'; cstate->raw_buf_index = 0; @@ -3869,7 +3873,7 @@ CopyReadLine(CopyState cstate) } while (CopyLoadRawBuf(cstate)); } } - else + else if (!(cstate->cur_lineno == 0 && cstate->header_line)) { /* * If we didn't hit EOF, then we must have transferred the EOL marker @@ -3903,8 +3907,9 @@ CopyReadLine(CopyState cstate) } } - /* Done reading the line. Convert it to server encoding. */ - if (cstate->need_transcoding) + /* Done reading the line. Convert it to server encoding if not header. */ + if (cstate->need_transcoding && + !(cstate->cur_lineno == 0 && cstate->header_line)) { char *cvt; -- 1.8.3.1