v1-0001-Add-i-prompt-escape-to-indicate-server-read-only-.patch
text/x-patch
Filename: v1-0001-Add-i-prompt-escape-to-indicate-server-read-only-.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Add %i prompt escape to indicate server read-only status
| File | + | − |
|---|---|---|
| doc/src/sgml/ref/psql-ref.sgml | 15 | 0 |
| src/bin/psql/prompt.c | 14 | 0 |
From 4e90176efda343c8ca8ced7ddb0b0b98ce4e016b Mon Sep 17 00:00:00 2001
From: Jim Jones <jim.jones@uni-muenster.de>
Date: Thu, 26 Jun 2025 09:07:27 +0200
Subject: [PATCH v1] Add %i prompt escape to indicate server read-only status
This patch introduces a new prompt escape `%i` for psql, which shows
whether the connected server is operating in read-only mode. It
expands to `read-only` if either the server is in hot standby mode
(`in_hot_standby = on`) or the session's default transaction mode is
read-only (`default_transaction_read_only = on`). Otherwise, it
displays `read/write`.
This is useful for distinguishing read-only sessions (e.g. connected
to a standby, or using a default read-only transaction mode) from
read/write ones at a glance, especially when working with multiple
connections in replicated or restricted environments.
---
doc/src/sgml/ref/psql-ref.sgml | 15 +++++++++++++++
src/bin/psql/prompt.c | 14 ++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 95f4cac246..ff853bb18f 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -4999,6 +4999,21 @@ testdb=> <userinput>INSERT INTO my_table VALUES (:'content');</userinput>
</listitem>
</varlistentry>
+ <varlistentry id="app-psql-prompting-i">
+ <term><literal>%i</literal></term>
+ <listitem>
+ <para>
+ Indicates whether the current session is read-only. The value is
+ shown as <literal>read-only</literal> if the server reports either
+ <literal>in_hot_standby</literal> or
+ <literal>default_transaction_read_only</literal> as <literal>on</literal>,
+ and <literal>read/write</literal> otherwise.
+ This prompt escape can be used to quickly identify sessions that
+ cannot perform write operations.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="app-psql-prompting-x">
<term><literal>%x</literal></term>
<listitem>
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index 3aa7d2d06c..61e02f63e7 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -243,7 +243,21 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
break;
}
break;
+ case 'i':
+ if (pset.db)
+ {
+ const char *hs = PQparameterStatus(pset.db, "in_hot_standby");
+ const char *ro = PQparameterStatus(pset.db, "default_transaction_read_only");
+ if ((hs && strcmp(hs, "on") == 0) ||
+ (ro && strcmp(ro, "on") == 0))
+ strlcpy(buf, "read-only", sizeof(buf));
+ else
+ strlcpy(buf, "read/write", sizeof(buf));
+ }
+ else
+ buf[0] = '\0';
+ break;
case 'x':
if (!pset.db)
buf[0] = '?';
--
2.43.0