public inbox for [email protected]
help / color / mirror / Atom feedFrom: Chao Li <[email protected]>
To: PostgreSQL Hackers <[email protected]>
Subject: psql: make %P prompt option consistent when not connected
Date: Wed, 28 Jan 2026 16:38:08 +0800
Message-ID: <[email protected]> (raw)
Hi Hackers,
While reviewing and testing patch [1], I noticed that psql’s %P prompt option does not check pset.db, which makes it inconsistent with other prompt options. As a result, when there is no database connection, other prompt elements are suppressed, but the pipeline status is still shown. For example:
```
evantest=# \set PROMPT1 '[%P] %R '
[off] = \c
connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?
Previous connection kept
[off] = ;
FATAL: terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
The connection to the server was lost. Attempting reset: Failed.
[off] !
[off] !
```
To confirm whether this behavior is intentional, I went through the original discussion for adding %P [2], but didn’t find this case mentioned, so it seems this detail was simply not considered at the time.
This patch adds a pset.db check to align %P with the other prompt options, keeping the prompt display consistent when not connected. With the patch applied, all psql TAP tests pass:
```
# +++ tap check in src/bin/psql +++
t/001_basic.pl ........... ok
t/010_tab_completion.pl .. ok
t/020_cancel.pl .......... ok
t/030_pager.pl ........... ok
All tests successful.
Files=4, Tests=221, 5 wallclock secs ( 0.01 usr 0.01 sys + 1.05 cusr 1.38 csys = 2.45 CPU)
Result: PASS
```
[1] https://www.postgresql.org/message-id/flat/[email protected]
[2] https://www.postgresql.org/message-id/[email protected]...
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/
Attachments:
[application/octet-stream] v1-0001-psql-make-P-prompt-escape-consistent-when-not-con.patch (1.3K, ../[email protected]/2-v1-0001-psql-make-P-prompt-escape-consistent-when-not-con.patch)
download | inline diff:
From 0fa5336d5da7ec7ff2b0dd087a3aac6644979ab9 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <[email protected]>
Date: Wed, 28 Jan 2026 16:19:47 +0800
Subject: [PATCH v1] psql: make %P prompt escape consistent when not connected
The %P prompt escape shows the current pipeline status. Unlike most
other prompt escapes, it was evaluated even when psql was not connected
to a database.
Make %P behave consistently with the other prompt options by only
expanding it when a database connection exists. This keeps the prompt
display consistent in the not-connected state.
Author: Chao Li <[email protected]>
Reviewed-by:
Discussion:
---
src/bin/psql/prompt.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index 44eae59641e..891cd6374f0 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -199,6 +199,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
break;
/* pipeline status */
case 'P':
+ if (pset.db)
{
PGpipelineStatus status = PQpipelineStatus(pset.db);
@@ -208,9 +209,8 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
strlcpy(buf, "abort", sizeof(buf));
else
strlcpy(buf, "off", sizeof(buf));
- break;
}
-
+ break;
case '0':
case '1':
case '2':
--
2.50.1 (Apple Git-155)
view thread (3+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected]
Subject: Re: psql: make %P prompt option consistent when not connected
In-Reply-To: <[email protected]>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox