From 3cdb3512ec1cffbaeae00d0e3cc41c57021fd6ee Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Sat, 17 Feb 2024 05:43:19 +0000 Subject: [PATCH v2] Add detailed info when COPY skips soft errors This commit emits individual info like line number and column name when COPY skips soft errors. Because, the summary containing the total rows skipped isn't enough for the users to know what exactly are the malformed rows in the input data. It emits individual info and summary at NOTICE and INFO level respectively to let users switch of individual info by changing client_min_messages to WARNING. Also, one can get all of these information into server logs by changing log_min_messages. --- src/backend/commands/copyfrom.c | 2 +- src/backend/commands/copyfromparse.c | 12 +++++++++++- src/test/regress/expected/copy2.out | 6 +++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index 1fe70b9133..e11c2d1cff 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -1314,7 +1314,7 @@ CopyFrom(CopyFromState cstate) if (cstate->opts.on_error != COPY_ON_ERROR_STOP && cstate->num_errors > 0) - ereport(NOTICE, + ereport(INFO, errmsg_plural("%llu row was skipped due to data type incompatibility", "%llu rows were skipped due to data type incompatibility", (unsigned long long) cstate->num_errors, diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index 7cacd0b752..747e173d9c 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -969,7 +969,17 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext, &values[m])) { cstate->num_errors++; - return true; + + if (cstate->opts.on_error != COPY_ON_ERROR_STOP) + { + ereport(NOTICE, + errmsg("detected data type incompatibility at line number %llu for column %s; COPY %s", + (unsigned long long) cstate->cur_lineno, + cstate->cur_attname, + cstate->cur_relname)); + + return true; + } } cstate->cur_attname = NULL; diff --git a/src/test/regress/expected/copy2.out b/src/test/regress/expected/copy2.out index 25c401ce34..15a1da2eac 100644 --- a/src/test/regress/expected/copy2.out +++ b/src/test/regress/expected/copy2.out @@ -730,7 +730,11 @@ COPY check_ign_err FROM STDIN WITH (on_error stop); ERROR: invalid input syntax for type integer: "a" CONTEXT: COPY check_ign_err, line 2, column n: "a" COPY check_ign_err FROM STDIN WITH (on_error ignore); -NOTICE: 4 rows were skipped due to data type incompatibility +NOTICE: detected data type incompatibility at line number 2 for column n; COPY check_ign_err +NOTICE: detected data type incompatibility at line number 3 for column k; COPY check_ign_err +NOTICE: detected data type incompatibility at line number 4 for column m; COPY check_ign_err +NOTICE: detected data type incompatibility at line number 5 for column n; COPY check_ign_err +INFO: 4 rows were skipped due to data type incompatibility SELECT * FROM check_ign_err; n | m | k ---+-----+--- -- 2.34.1