diff --git a/doc/src/sgml/errcodes.sgml b/doc/src/sgml/errcodes.sgml
index 3a1baf5883..d19de947b4 100644
--- a/doc/src/sgml/errcodes.sgml
+++ b/doc/src/sgml/errcodes.sgml
@@ -985,6 +985,11 @@
deadlock_detected
+
+40P02
+DATABASE DROPPED
+database_dropped
+
Class 42 — Syntax Error or Access Rule Violation>
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 535926a937..f6ccbb9524 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2912,9 +2912,11 @@ ProcessInterrupts(void)
}
else if (RecoveryConflictPending)
{
+ /* Currently there is only one non-retryable recovery conflict */
+ Assert(RecoveryConflictReason == PROCSIG_RECOVERY_CONFLICT_DATABASE);
pgstat_report_recovery_conflict(RecoveryConflictReason);
ereport(FATAL,
- (errcode(ERRCODE_ADMIN_SHUTDOWN),
+ (errcode(ERRCODE_T_R_DATABASE_DROPPED),
errmsg("terminating connection due to conflict with recovery"),
errdetail_recovery_conflict()));
}
diff --git a/src/include/utils/errcodes.h b/src/include/utils/errcodes.h
index 7f2d589f14..8a9a8d460a 100644
--- a/src/include/utils/errcodes.h
+++ b/src/include/utils/errcodes.h
@@ -243,6 +243,7 @@
#define ERRCODE_T_R_SERIALIZATION_FAILURE MAKE_SQLSTATE('4','0', '0','0','1')
#define ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN MAKE_SQLSTATE('4','0', '0','0','3')
#define ERRCODE_T_R_DEADLOCK_DETECTED MAKE_SQLSTATE('4','0', 'P','0','1')
+#define ERRCODE_T_R_DATABASE_DROPPED MAKE_SQLSTATE('4','0', 'P','0','2')
/* Class 42 - Syntax Error or Access Rule Violation */
#define ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION MAKE_SQLSTATE('4','2', '0','0','0')
diff --git a/src/pl/plpgsql/src/plerrcodes.h b/src/pl/plpgsql/src/plerrcodes.h
index 812446ffdf..50f5741379 100644
--- a/src/pl/plpgsql/src/plerrcodes.h
+++ b/src/pl/plpgsql/src/plerrcodes.h
@@ -483,6 +483,10 @@
"deadlock_detected", ERRCODE_T_R_DEADLOCK_DETECTED
},
+{
+ "database_dropped", ERRCODE_T_R_DATABASE_DROPPED
+},
+
{
"syntax_error_or_access_rule_violation", ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION
},