From: Fujii Masao Date: Tue, 3 Feb 2026 01:03:19 +0000 (+0900) Subject: psql: Add %i prompt escape to indicate hot standby status. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dddbbc253b923ef27f724c6abb5a6a39e1254d54;p=thirdparty%2Fpostgresql.git psql: Add %i prompt escape to indicate hot standby status. This commit introduces a new prompt escape %i for psql, which shows whether the connected server is operating in hot standby mode. It expands to standby if the server reports in_hot_standby = on, and primary otherwise. This is useful for distinguishing standby servers from primary ones at a glance, especially when working with multiple connections in replicated environments where libpq's multi-host connection strings are used. Author: Jim Jones Reviewed-by: Fujii Masao Reviewed-by: Greg Sabino Mullane Reviewed-by: Srinath Reddy Sadipiralla Reviewed-by: Nathan Bossart Reviewed-by: Chao Li Reviewed-by: Andreas Karlsson Discussion: https://www.postgresql.org/message-id/flat/016f6738-f9a9-4e98-bb5a-e1e4b9591d46@uni-muenster.de --- diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index e464e3b13de..8b1d948ba05 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -5075,6 +5075,23 @@ testdb=> INSERT INTO my_table VALUES (:'content'); + + %i + + + Indicates whether the connected server is running in hot standby mode. + The value is shown as standby, if the server is + currently in hot standby and reports + as on, + and primary otherwise. This is useful when + connecting to multiple servers to quickly determine the role of + each connection. A value of ? is shown + when connected to a server running + PostgreSQL 13 or older. + + + + %x diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 891cd6374f0..9725d53dfe7 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -44,6 +44,8 @@ * or a ! if session is not connected to a database; * in prompt2 -, *, ', or "; * in prompt3 nothing + * %i - "standby" or "primary" depending on the server's in_hot_standby + * status, or "?" if unavailable (empty if unknown) * %x - transaction status: empty, *, !, ? (unknown or no connection) * %l - The line number inside the current statement, starting from 1. * %? - the error code of the last query (not yet implemented) @@ -258,7 +260,23 @@ get_prompt(promptStatus_t status, ConditionalStack cstack) break; } break; + case 'i': + if (pset.db) + { + const char *hs = PQparameterStatus(pset.db, "in_hot_standby"); + if (hs) + { + if (strcmp(hs, "on") == 0) + strlcpy(buf, "standby", sizeof(buf)); + else + strlcpy(buf, "primary", sizeof(buf)); + } + /* Use ? for versions that don't report in_hot_standby */ + else + buf[0] = '?'; + } + break; case 'x': if (!pset.db) buf[0] = '?';