*** a/src/backend/commands/copy.c --- b/src/backend/commands/copy.c *************** *** 2058,2069 **** CopyFrom(CopyState cstate) int16 fld_count; ListCell *cur; ! if (!CopyGetInt16(cstate, &fld_count) || ! fld_count == -1) { done = true; break; } if (fld_count != attr_count) ereport(ERROR, --- 2058,2087 ---- int16 fld_count; ListCell *cur; ! if (!CopyGetInt16(cstate, &fld_count)) { done = true; break; } + + if (fld_count == -1) + { + /* + * Reached EOF. In protocol version 3, we should ignore + * anything after the end of copy data marker up to the + * protocol end of copy data (CopyDone/Fail). + */ + if (cstate->copy_dest == COPY_NEW_FE) + { + do + { + cstate->raw_buf_index = cstate->raw_buf_len; + } while (CopyLoadRawBuf(cstate)); + continue; + } + done = true; + break; + } if (fld_count != attr_count) ereport(ERROR,