Re: Variable substitution in psql backtick expansion

Corey Huinker <corey.huinker@gmail.com>

From: Corey Huinker <corey.huinker@gmail.com>
To: Pavel Stehule <pavel.stehule@gmail.com>
Cc: Fabien COELHO <coelho@cri.ensmp.fr>, Daniel Verite <daniel@manitou-mail.org>, Tom Lane <tgl@sss.pgh.pa.us>, PostgreSQL Developers <pgsql-hackers@postgresql.org>
Date: 2017-04-02T15:59:27Z
Lists: pgsql-hackers
On Sun, Apr 2, 2017 at 11:16 AM, Pavel Stehule <pavel.stehule@gmail.com>
wrote:

>
>
> 2017-04-02 13:13 GMT+02:00 Fabien COELHO <coelho@cri.ensmp.fr>:
>
>>
>> Hello Pavel,
>>
>>   \echo :VERSION
>>>>   PostgreSQL 10devel on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
>>>> 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609, 64-bit
>>>>
>>>> Probably some :VERSION_NUM would make some sense. See attached PoC
>>>> patch.
>>>> Would it make sense?
>>>>
>>>
>>> Maybe better name for you CLIENT_VERSION_NUM
>>>
>>
>> If it was starting from nothing I would tend to agree with you, but there
>> is already an existing :VERSION variable, so it seemed logical to keep on
>> and create variants with the same prefix.
>
>
> you have true - so VERSION_NUM should be client side version
>
>
>>
>>
>> Can be SERVER_VERSION_NUM taken from connection info?
>>>
>>
>> Probably it could. It seems a little less straightforward than defining a
>> client-side string at compile time. The information is displayed when the
>> connection is established, so the information is there somewhere.
>>
>
> It is not too hard
>
> diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
> index 94a3cfce90..d1ae81646f 100644
> --- a/src/bin/psql/command.c
> +++ b/src/bin/psql/command.c
> @@ -3320,16 +3320,21 @@ checkWin32Codepage(void)
>  void
>  SyncVariables(void)
>  {
> +   char        buffer[100];
> +
>     /* get stuff from connection */
>     pset.encoding = PQclientEncoding(pset.db);
>     pset.popt.topt.encoding = pset.encoding;
>     pset.sversion = PQserverVersion(pset.db);
>
> +   snprintf(buffer, 100, "%d", pset.sversion);
> +
>     SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
>     SetVariable(pset.vars, "USER", PQuser(pset.db));
>     SetVariable(pset.vars, "HOST", PQhost(pset.db));
>     SetVariable(pset.vars, "PORT", PQport(pset.db));
>     SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encod
> ing));
> +   SetVariable(pset.vars, "SVERSION_NUM", buffer);
>
>     /* send stuff to it, too */
>     PQsetErrorVerbosity(pset.db, pset.verbosity);
>
> Regards
>
> Pavel
>
>
>>
>>  psql (10devel, server 9.6.2)
>>
>> --
>> Fabien.
>>
>
>

I'm anxious to help with these patches, but they seem a bit of a moving
target. Happy to jump in and review as soon as we've settled on what should
be done.

Commits

  1. Add psql variables showing server version and psql version.

  2. Reformat psql's --help=variables output.

  3. Remove reinvention of stringify macro.

  4. Allow psql variable substitution to occur in backtick command strings.