I wrote: > Are we sufficiently convinced that we must have the dont-allow-partial > option to not fix this in the back branches? I'm not.
I just had a thought about that: suppose we add a flag to CopyState to indicate whether we reached EOF while reading. This wouldn't be hugely expensive, just something like switch (cstate->copy_dest) { case COPY_FILE: bytesread = fread(databuf, 1, maxread, cstate->copy_file); if (ferror(cstate->copy_file)) ereport(ERROR, (errcode_for_file_access(), errmsg("could not read from COPY file: %m"))); + cstate->reached_eof |= (bytesread < maxread); break; case COPY_OLD_FE: Then the logic in ClosePipeToProgram could be "if we did not reach EOF, then a SIGPIPE termination is unsurprising. If we did reach EOF, then SIGPIPE is an error." If the called program gets SIGPIPE for some reason other than us closing the pipe early, then we would see EOF next time we try to read, and correctly report that there's a problem. There are race-ish conditions in cases like the called program getting an unrelated SIGPIPE at about the same time that we decide to stop reading early, but I don't think it's really possible to disambiguate that. regards, tom lane