Customize psql prompt to show current_role

Started by Dominique Devienneover 1 year ago16 messagesgeneral
Jump to latest
#1Dominique Devienne
ddevienne@gmail.com

Hi. I've successfully customized my psql PROMPT1,
using %n for session_user, but I'd like to see
current_role as well. And I can't seem to find a way.

I didn't find a direct \x for it.
I didn't find a %'X' variable for it.
I didn't find a command to %`X` either.
(and X = `select current_role` does not work).

Surely there's a way, no? Thanks, --DD

#2Asad Ali
asadalinagri@gmail.com
In reply to: Dominique Devienne (#1)
Re: Customize psql prompt to show current_role

Hi Dominique,

There is no direct prompt escape sequence like %n for displaying the
current_role in the psql prompt. However, you can work around this by using
a \set command to define a custom prompt that includes the result of
current_role.
You can use the following command to set your psql PROMPT1 to include both
the session_user and current_role:

Here’s how you can achieve this:

You can define a function in your psqlrc file that captures the current
role.

Use \set to set a custom prompt that includes both the session user (%n)
and the current_role.
Here's an example of how you can do it:

Edit your .psqlrc file to include a custom query and set a prompt:

-- Query to set the current role into a psql variable
\set current_role 'SELECT current_role;'

-- Define a custom prompt with both the session user and the current role
\set PROMPT1 '%n@%/ (%`current_role`)=%# '

Load the .psqlrc or start a new psql session, and your prompt will now show
the session user and current role.

The key here is that \set allows you to run SQL commands within the prompt,
which can be used to extract the current_role.

This approach requires you to execute it manually or include it in your
.psqlrc file for automatic loading with each session.

I hope this helps!

Best regards,
Asad Ali

On Mon, Sep 23, 2024 at 2:31 PM Dominique Devienne <ddevienne@gmail.com>
wrote:

Show quoted text

Hi. I've successfully customized my psql PROMPT1,
using %n for session_user, but I'd like to see
current_role as well. And I can't seem to find a way.

I didn't find a direct \x for it.
I didn't find a %'X' variable for it.
I didn't find a command to %`X` either.
(and X = `select current_role` does not work).

Surely there's a way, no? Thanks, --DD

#3Dominique Devienne
ddevienne@gmail.com
In reply to: Asad Ali (#2)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 2:22 PM Asad Ali <asadalinagri@gmail.com> wrote:

There is no direct prompt escape sequence like %n for displaying the current_role in the psql prompt.
However, you can work around this by using a \set command to define a custom prompt that includes the result of current_role.

Hi Ali. Doesn't seem to be working for me. Did I do something wrong? --DD

```
D:\>psql service=pau16
psql (17beta3, server 16.1)
Type "help" for help.

ddevienne=> \set current_role 'SELECT current_role;'
ddevienne=> \set PROMPT1 '%n@%/ (%`current_role`)=%# '
'current_role' is not recognized as an internal or external command,
operable program or batch file.
ddevienne@ddevienne ()=> select 1;
...
'current_role' is not recognized as an internal or external command,
operable program or batch file.
ddevienne@ddevienne ()=>
```

#4Noname
gparc@free.fr
In reply to: Dominique Devienne (#3)
Re: Customize psql prompt to show current_role

----- Mail original -----

De: "Dominique Devienne" <ddevienne@gmail.com>
À: "Asad Ali" <asadalinagri@gmail.com>
Cc: pgsql-general@postgresql.org
Envoyé: Lundi 23 Septembre 2024 14:34:39
Objet: Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 2:22 PM Asad Ali <asadalinagri@gmail.com> wrote:

There is no direct prompt escape sequence like %n for displaying the
current_role in the psql prompt.
However, you can work around this by using a \set command to define a custom
prompt that includes the result of current_role.

Hi Ali. Doesn't seem to be working for me. Did I do something wrong? --DD

```
D:\>psql service=pau16
psql (17beta3, server 16.1)
Type "help" for help.

ddevienne=> \set current_role 'SELECT current_role;'
ddevienne=> \set PROMPT1 '%n@%/ (%`current_role`)=%# '
'current_role' is not recognized as an internal or external command,
operable program or batch file.
ddevienne@ddevienne ()=> select 1;
...
'current_role' is not recognized as an internal or external command,
operable program or batch file.
ddevienne@ddevienne ()=>
```

Hello Dominique,

I will use psql \gset command for this

Regards
Gilles

#5Erik Wienhold
ewie@ewie.name
In reply to: Asad Ali (#2)
Re: Customize psql prompt to show current_role

On 2024-09-23 14:22 +0200, Asad Ali wrote:

There is no direct prompt escape sequence like %n for displaying the
current_role in the psql prompt. However, you can work around this by using
a \set command to define a custom prompt that includes the result of
current_role.
You can use the following command to set your psql PROMPT1 to include both
the session_user and current_role:

Here’s how you can achieve this:

You can define a function in your psqlrc file that captures the current
role.

Use \set to set a custom prompt that includes both the session user (%n)
and the current_role.
Here's an example of how you can do it:

Edit your .psqlrc file to include a custom query and set a prompt:

-- Query to set the current role into a psql variable
\set current_role 'SELECT current_role;'

-- Define a custom prompt with both the session user and the current role
\set PROMPT1 '%n@%/ (%`current_role`)=%# '

Load the .psqlrc or start a new psql session, and your prompt will now show
the session user and current role.

The key here is that \set allows you to run SQL commands within the prompt,
which can be used to extract the current_role.

This is wrong. First of all, \set does not run any SQL commands.
Secondly, %`current_role` will be sent to the shell and execute command
current_role.

You could instead use this:

SELECT current_role \gset
\set PROMPT1 '%n@%/ (%:current_role:)=%# '

But that won't work with subsequent SET ROLE commands.

This approach requires you to execute it manually or include it in your
.psqlrc file for automatic loading with each session.

On Mon, Sep 23, 2024 at 2:31 PM Dominique Devienne <ddevienne@gmail.com>
wrote:

Hi. I've successfully customized my psql PROMPT1,
using %n for session_user, but I'd like to see
current_role as well. And I can't seem to find a way.

I didn't find a direct \x for it.
I didn't find a %'X' variable for it.
I didn't find a command to %`X` either.
(and X = `select current_role` does not work).

Surely there's a way, no? Thanks, --DD

--
Erik

#6Dominique Devienne
ddevienne@gmail.com
In reply to: Erik Wienhold (#5)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 2:51 PM Erik Wienhold <ewie@ewie.name> wrote:

You could instead use this:

SELECT current_role \gset
\set PROMPT1 '%n@%/ (%:current_role:)=%# '

But that won't work with subsequent SET ROLE commands.

Bummer... That was kinda the point, that it updates automatically.

Then I'd like to respectfully request a small enhancement to psql
to support a new \r (or some other letter) for current_role in the prompt.

Thanks, --DD

#7Greg Sabino Mullane
greg@turnstep.com
In reply to: Asad Ali (#2)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 8:22 AM Asad Ali <asadalinagri@gmail.com> wrote:

There is no direct prompt escape sequence like %n for displaying the
current_role in the psql prompt. However, you can work around this by using
a \set command to define a custom prompt that includes the result of
current_role.

Please do not use chatgpt or other LLMs to answer questions on this mailing
list! If you had even done the bare minimum of trying your own
lazily-generated answer, you would have found it did not work.

Greg

#8Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Dominique Devienne (#6)
Re: Customize psql prompt to show current_role

On Mon, 2024-09-23 at 14:59 +0200, Dominique Devienne wrote:

On Mon, Sep 23, 2024 at 2:51 PM Erik Wienhold <ewie@ewie.name> wrote:

You could instead use this:

SELECT current_role \gset
\set PROMPT1 '%n@%/ (%:current_role:)=%# '

But that won't work with subsequent SET ROLE commands.

Bummer... That was kinda the point, that it updates automatically.

Then I'd like to respectfully request a small enhancement to psql
to support a new \r (or some other letter) for current_role in the prompt.

To get the current role, psql would have to query the database whenever
it displays the prompt. That would be rather expensive...

Yours,
Laurenz Albe

#9Dominique Devienne
ddevienne@gmail.com
In reply to: Laurenz Albe (#8)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 3:05 PM Laurenz Albe <laurenz.albe@cybertec.at> wrote:

On Mon, 2024-09-23 at 14:59 +0200, Dominique Devienne wrote:

On Mon, Sep 23, 2024 at 2:51 PM Erik Wienhold <ewie@ewie.name> wrote:

You could instead use this:

SELECT current_role \gset
\set PROMPT1 '%n@%/ (%:current_role:)=%# '

But that won't work with subsequent SET ROLE commands.

Bummer... That was kinda the point, that it updates automatically.

Then I'd like to respectfully request a small enhancement to psql
to support a new \r (or some other letter) for current_role in the prompt.

To get the current role, psql would have to query the database whenever
it displays the prompt. That would be rather expensive...

Hi Laurenz. Sure, although expensive might be a bit strong a word.
But that would be opt-in anyway, so just a small warning in the doc
about that new option would suffice, no? --DD

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Laurenz Albe (#8)
Re: Customize psql prompt to show current_role

Laurenz Albe <laurenz.albe@cybertec.at> writes:

To get the current role, psql would have to query the database whenever
it displays the prompt. That would be rather expensive...

See previous discussion:

/messages/by-id/CAFj8pRBFU-WzzQhNrwRHn67N0Ug8a9-0-9BOo69PPtcHiBDQMA@mail.gmail.com

At the time I didn't like the idea too much, but now that we've seen
a second independent request, maybe our opinion of its value should
go up a notch.

regards, tom lane

#11Dominique Devienne
ddevienne@gmail.com
In reply to: Tom Lane (#10)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 4:55 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Laurenz Albe <laurenz.albe@cybertec.at> writes:

To get the current role, psql would have to query the database whenever
it displays the prompt. That would be rather expensive...

See previous discussion:
/messages/by-id/CAFj8pRBFU-WzzQhNrwRHn67N0Ug8a9-0-9BOo69PPtcHiBDQMA@mail.gmail.com

At the time I didn't like the idea too much, but now that we've seen
a second independent request, maybe our opinion of its value should
go up a notch.

Thanks for the reference Tom. I don't follow -hackers, so missed it.

Obviously I disagree with your "it's not useful enough" comment :)

I often lose track of which ROLE is active, in my many
long-lived psql sessions, on various servers (mainly v14 and v16 these days),
especially during my recent struggle to adapt our system to v16.
I often resort to \conninfo, but it's less automatic and
harder to visually parse (IMHO) compared to a custom ad-hoc prompt.

Therefore I want to respectfully re-iterate my interest in this enhancement.

Thanks, --DD

#12Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Dominique Devienne (#11)
Re: Customize psql prompt to show current_role

On 9/23/24 08:07, Dominique Devienne wrote:

On Mon, Sep 23, 2024 at 4:55 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Laurenz Albe <laurenz.albe@cybertec.at> writes:

To get the current role, psql would have to query the database whenever
it displays the prompt. That would be rather expensive...

See previous discussion:
/messages/by-id/CAFj8pRBFU-WzzQhNrwRHn67N0Ug8a9-0-9BOo69PPtcHiBDQMA@mail.gmail.com

At the time I didn't like the idea too much, but now that we've seen
a second independent request, maybe our opinion of its value should
go up a notch.

Thanks for the reference Tom. I don't follow -hackers, so missed it.

Obviously I disagree with your "it's not useful enough" comment :)

I often lose track of which ROLE is active, in my many
long-lived psql sessions, on various servers (mainly v14 and v16 these days),
especially during my recent struggle to adapt our system to v16.
I often resort to \conninfo, but it's less automatic and
harder to visually parse (IMHO) compared to a custom ad-hoc prompt.

For me that shows the user that connected(session_user) not the
current_user.

Therefore I want to respectfully re-iterate my interest in this enhancement.

Thanks, --DD

--
Adrian Klaver
adrian.klaver@aklaver.com

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Adrian Klaver (#12)
Re: Customize psql prompt to show current_role

Adrian Klaver <adrian.klaver@aklaver.com> writes:

On 9/23/24 08:07, Dominique Devienne wrote:

I often resort to \conninfo, but it's less automatic and
harder to visually parse (IMHO) compared to a custom ad-hoc prompt.

For me that shows the user that connected(session_user) not the
current_user.

Worse than that: what it reports is libpq's PQuser(), that is the
name that was used to log in with. But if what you want is the
session_user, psql prompts already have %n for that.

regards, tom lane

#14Dominique Devienne
ddevienne@gmail.com
In reply to: Adrian Klaver (#12)
Re: Customize psql prompt to show current_role

On Mon, Sep 23, 2024 at 5:16 PM Adrian Klaver <adrian.klaver@aklaver.com> wrote:

On 9/23/24 08:07, Dominique Devienne wrote:

I often resort to \conninfo, but it's less automatic and
harder to visually parse (IMHO) compared to a custom ad-hoc prompt.

For me that shows the user that connected(session_user) not the current_user.

yeah, sure, I realized that just after sending my last post...
I resort to using both \conninfo *and* `select current_role`.
I used \conninfo to tell me which server I'm on (since not
on the default prompt, before I played with it today), which
session_user I'm connected with (ddevienne or dd_login
in my recent example), and finally `select current_role`
which matters in my use-cases (session_user or dd_admin or dd_user).

I'd like not to have to type those commands/queries all the time,
and have them in the prompt at all time. I get that it's not for everyone,
nor even necessary all the time, but I sincerely think it is definitely useful.

I'd be glad to use Pavel's proposed %N. --DD

#15Raphael Salguero Aragón
raphael.salguero@enterprisedb.com
In reply to: Dominique Devienne (#14)
Re: Customize psql prompt to show current_role

Am 23.09.2024 um 17:37 schrieb Dominique Devienne <ddevienne@gmail.com>:

On Mon, Sep 23, 2024 at 5:16 PM Adrian Klaver <adrian.klaver@aklaver.com> wrote:

On 9/23/24 08:07, Dominique Devienne wrote:

I often resort to \conninfo, but it's less automatic and
harder to visually parse (IMHO) compared to a custom ad-hoc prompt.

For me that shows the user that connected(session_user) not the current_user.

yeah, sure, I realized that just after sending my last post...
I resort to using both \conninfo *and* `select current_role`.
I used \conninfo to tell me which server I'm on (since not
on the default prompt, before I played with it today), which
session_user I'm connected with (ddevienne or dd_login
in my recent example), and finally `select current_role`
which matters in my use-cases (session_user or dd_admin or dd_user).

I'd like not to have to type those commands/queries all the time,
and have them in the prompt at all time. I get that it's not for everyone,
nor even necessary all the time, but I sincerely think it is definitely useful.

I'd be glad to use Pavel's proposed %N. —DD

Hi all,

I just wanted to add that we are also supporting a larger customer with exactly the same request.
Perhaps this increases the value of the adjustment a little more :)

Best regards!
Raphael Salguero

#16Dominique Devienne
ddevienne@gmail.com
In reply to: Raphael Salguero Aragón (#15)
Re: Customize psql prompt to show current_role

On Wed, Nov 27, 2024 at 3:14 PM Raphael Salguero Aragón
<raphael.salguero@enterprisedb.com> wrote:

Am 23.09.2024 um 17:37 schrieb Dominique Devienne <ddevienne@gmail.com>:

I'd be glad to use Pavel's proposed %N. —DD

I just wanted to add that we are also supporting a larger customer with exactly the same request.
Perhaps this increases the value of the adjustment a little more :)

Hi. Thanks for sharing Raphael. That's a 3rd notch Tom! :)
So is it the proverbial "third time's a charm" and the community would
revise its initial rejection?
I keep making that point, but the fact this is entirely opt-in,
mitigates the "expensive" argument IMHO.
FWIW. Thank you for considering this RFC again, especially since
there's a patch for it. Respectfully, --DD