]> granicus.if.org Git - postgresql/commit
Make psql handle EOF during COPY FROM STDIN properly on all platforms.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 May 2017 16:24:19 +0000 (12:24 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 May 2017 16:24:19 +0000 (12:24 -0400)
commitbee9e8698404da6cc6a1e6dd08c1b22e6ca1ca13
tree010b626d8ca9bd4a1e25fd78f4c6824a43ec5e1e
parent47b4913050a320bfba55fa65d52d9ba15488bc70
Make psql handle EOF during COPY FROM STDIN properly on all platforms.

When stdin is a terminal, it's possible to end a COPY FROM STDIN with
a keyboard EOF signal (typically control-D), and then keep on issuing
SQL commands.  One would expect another COPY FROM STDIN to work as well,
but on some platforms it did not.  This turns out to be because we were
not resetting the stream's feof() flag, and BSD-ish versions of fread()
and fgets() won't attempt to read more data if that's set.

The misbehavior is observed on BSDen (including macOS), but not Linux,
Windows, or SysV-ish Unixen, which makes this a portability bug not
just a missing feature.

Add a clearerr() call to fix the behavior, and improve the prompt that's
issued when copying from a TTY to mention that EOF signals work.

It's been like this forever, so back-patch to all supported branches.

Thomas Munro

Discussion: https://postgr.es/m/CAEepm=0MCGfYf=JAMiYhO6JPtv9-3ZfBo8fcGeCZ8oMzaw+Z+Q@mail.gmail.com
src/bin/psql/copy.c