From 1d82fed9672b8de115e679bc6b4d4d4a52c34f8f Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Wed, 26 Feb 2020 15:38:18 -0500 Subject: [PATCH] change commit semantics to throw an error and then rollback instead of silently rolling back --- src/backend/tcop/postgres.c | 15 +++++++++++---- src/backend/utils/error/elog.c | 3 +++ src/include/utils/elog.h | 10 ++++++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 0a6f80963b..53fa507d7d 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -1093,14 +1093,21 @@ exec_simple_query(const char *query_string) * might be safe to allow some additional utility commands in this * state, but not many...) */ - if (IsAbortedTransactionBlockState() && - !IsTransactionExitStmt(parsetree->stmt)) - ereport(ERROR, + if (IsAbortedTransactionBlockState()) { + if (!IsTransactionExitStmt(parsetree->stmt)) + ereport(ERROR, (errcode(ERRCODE_IN_FAILED_SQL_TRANSACTION), errmsg("current transaction is aborted, " "commands ignored until end of transaction block"), errdetail_abort())); - + else { + ereport(USER_ERROR, + (errcode(ERRCODE_IN_FAILED_SQL_TRANSACTION), + errmsg("current transaction failed, " + "rolling back"), + errdetail_abort())); + } + } /* Make sure we are in a transaction command */ start_xact_command(); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index f5b0211f66..20cfcfa61d 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -3460,6 +3460,9 @@ error_severity(int elevel) case WARNING: prefix = gettext_noop("WARNING"); break; + case USER_ERROR: + prefix = gettext_noop("USER_ERROR"); + break; case ERROR: prefix = gettext_noop("ERROR"); break; diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 0a4ef029ce..8f5cfc4b33 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -40,17 +40,19 @@ #define WARNING 19 /* Warnings. NOTICE is for expected messages * like implicit sequence creation by SERIAL. * WARNING is for unexpected messages. */ -#define ERROR 20 /* user error - abort transaction; return to +#define USER_ERROR 20 /* user error - abort transaction; return to * known state */ +#define ERROR 21 + /* Save ERROR value in PGERROR so it can be restored when Win32 includes * modify it. We have to use a constant rather than ERROR because macros * are expanded only when referenced outside macros. */ #ifdef WIN32 -#define PGERROR 20 +#define PGERROR 21 #endif -#define FATAL 21 /* fatal error - abort process */ -#define PANIC 22 /* take down the other backends with me */ +#define FATAL 22 /* fatal error - abort process */ +#define PANIC 23 /* take down the other backends with me */ /* #define DEBUG DEBUG1 */ /* Backward compatibility with pre-7.3 */ -- 2.20.1 (Apple Git-117)