On 7 September 2016 at 04:19, Christoph Berg <m...@debian.org> wrote:
> I like your new version, it's crisp and transports the right message. OK, updated with Tom's tweaked version of Christoph's wording per discussion. Thanks all. -- Craig Ringer http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
From 17bdc19e15f21ce84eee76dee9f4f86e868a8430 Mon Sep 17 00:00:00 2001 From: Craig Ringer <cr...@2ndquadrant.com> Date: Fri, 12 Aug 2016 15:42:12 +0800 Subject: [PATCH] Emit a HINT when COPY can't find a file Users often get confused between COPY and \copy and try to use client-side paths with COPY. The server of course cannot find the file. Emit a HINT in the most common cases to help users out. Craig Ringer, Tom Lane and Christoph Berg --- src/backend/commands/copy.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 5947e72..e7118df 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -1751,6 +1751,7 @@ BeginCopyTo(Relation rel, { mode_t oumask; /* Pre-existing umask value */ struct stat st; + int save_errno; /* * Prevent write to relative path ... too easy to shoot oneself in @@ -1759,16 +1760,21 @@ BeginCopyTo(Relation rel, if (!is_absolute_path(filename)) ereport(ERROR, (errcode(ERRCODE_INVALID_NAME), - errmsg("relative path not allowed for COPY to file"))); + errmsg("relative path not allowed for COPY to file"))); oumask = umask(S_IWGRP | S_IWOTH); cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_W); + save_errno = errno; umask(oumask); + if (cstate->copy_file == NULL) ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\" for writing: %m", - cstate->filename))); + cstate->filename), + ((save_errno == ENOENT || save_errno == EACCES) ? + errhint("COPY TO instructs the PostgreSQL server process to write a file. " + "You may want a client-side facility such as psql's \\copy.") : 0))); if (fstat(fileno(cstate->copy_file), &st)) ereport(ERROR, @@ -2786,13 +2792,21 @@ BeginCopyFrom(Relation rel, else { struct stat st; + int save_errno; cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_R); + + /* in case something in ereport changes errno: */ + save_errno = errno; + if (cstate->copy_file == NULL) ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\" for reading: %m", - cstate->filename))); + cstate->filename), + ((save_errno == ENOENT || save_errno == EACCES) ? + errhint("COPY FROM instructs the PostgreSQL server process to read a file. " + "You may want a client-side facility such as psql's \\copy.") : 0))); if (fstat(fileno(cstate->copy_file), &st)) ereport(ERROR, -- 2.5.5
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers