Add HINT for COPY TO when WHERE clause is used.

COPY TO does not support a WHERE clause, and currently fails with the error:

    ERROR:  WHERE clause not allowed with COPY TO

Since the intended behavior can be achieved by using
COPY (SELECT ... WHERE ...) TO, this commit adds a HINT
to the error message:

    HINT:  Try the COPY (SELECT ... WHERE ...) TO variant.

This makes the error more informative and helps users
quickly find the alternative usage.

Author: Atsushi Torikoshi <torikoshia@oss.nttdata.com>
Reviewed-by: Jim Jones <jim.jones@uni-muenster.de>
Discussion: https://postgr.es/m/3520c224c5ffac0113aef84a9179f37e@oss.nttdata.com
master
Fujii Masao 1 week ago
parent 510777a2d5
commit 229911c4bf
  1. 1
      src/backend/parser/gram.y
  2. 1
      src/test/regress/expected/copy2.out

@ -3442,6 +3442,7 @@ CopyStmt: COPY opt_binary qualified_name opt_column_list
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("WHERE clause not allowed with COPY TO"), errmsg("WHERE clause not allowed with COPY TO"),
errhint("Try the COPY (SELECT ... WHERE ...) TO variant."),
parser_errposition(@11))); parser_errposition(@11)));
n->options = NIL; n->options = NIL;

@ -163,6 +163,7 @@ COPY x TO stdout WHERE a = 1;
ERROR: WHERE clause not allowed with COPY TO ERROR: WHERE clause not allowed with COPY TO
LINE 1: COPY x TO stdout WHERE a = 1; LINE 1: COPY x TO stdout WHERE a = 1;
^ ^
HINT: Try the COPY (SELECT ... WHERE ...) TO variant.
COPY x from stdin WHERE a = 50004; COPY x from stdin WHERE a = 50004;
COPY x from stdin WHERE a > 60003; COPY x from stdin WHERE a > 60003;
COPY x from stdin WHERE f > 60003; COPY x from stdin WHERE f > 60003;

Loading…
Cancel
Save