public inbox for [email protected]  
help / color / mirror / Atom feed
From: 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