diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index c592edac60a3e86801741dc84ebecc206b28350f..868de184184cff10dd31900f38bbadfc3ca5d9d8 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -3670,6 +3670,21 @@ bar </listitem> </varlistentry> + <varlistentry> + <term><varname>SERVER_VERSION_NAME</varname></term> + <term><varname>SERVER_VERSION_NUM</varname></term> + <listitem> + <para> + The server's version number as a string, for + example <literal>9.6.2</>, <literal>10.1</> or <literal>11beta1</>, + and in numeric form, for + example <literal>90602</> or <literal>100001</>. + These are set every time you connect to a database + (including program start-up), but can be changed or unset. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><varname>SHOW_CONTEXT</varname></term> <listitem> @@ -3733,10 +3748,15 @@ bar <varlistentry> <term><varname>VERSION</varname></term> + <term><varname>VERSION_NAME</varname></term> + <term><varname>VERSION_NUM</varname></term> <listitem> <para> - This variable is set at program start-up to - reflect <application>psql</>'s version. It can be changed or unset. + These variables are set at program start-up to reflect + <application>psql</>'s version, respectively as a verbose string, + a short string (e.g., <literal>9.6.2</>, <literal>10.1</>, + or <literal>11beta1</>), and a number (e.g., <literal>90602</> + or <literal>100001</>). They can be changed or unset. </para> </listitem> </varlistentry> diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 4e04459d45ea53a5104fe92814e37fe6cf00ffea..d427488748492815ed77b604fe7a5d99173ba9da 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -3337,6 +3337,9 @@ checkWin32Codepage(void) void SyncVariables(void) { + char vbuf[32]; + const char *server_version; + /* get stuff from connection */ pset.encoding = PQclientEncoding(pset.db); pset.popt.topt.encoding = pset.encoding; @@ -3348,6 +3351,20 @@ SyncVariables(void) SetVariable(pset.vars, "PORT", PQport(pset.db)); SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding)); + /* this bit should match connection_warnings(): */ + /* Try to get full text form of version, might include "devel" etc */ + server_version = PQparameterStatus(pset.db, "server_version"); + /* Otherwise fall back on pset.sversion */ + if (!server_version) + { + formatPGVersionNumber(pset.sversion, true, vbuf, sizeof(vbuf)); + server_version = vbuf; + } + SetVariable(pset.vars, "SERVER_VERSION_NAME", server_version); + + snprintf(vbuf, sizeof(vbuf), "%d", pset.sversion); + SetVariable(pset.vars, "SERVER_VERSION_NUM", vbuf); + /* send stuff to it, too */ PQsetErrorVerbosity(pset.db, pset.verbosity); PQsetErrorContextVisibility(pset.db, pset.show_context); @@ -3366,6 +3383,8 @@ UnsyncVariables(void) SetVariable(pset.vars, "HOST", NULL); SetVariable(pset.vars, "PORT", NULL); SetVariable(pset.vars, "ENCODING", NULL); + SetVariable(pset.vars, "SERVER_VERSION_NAME", NULL); + SetVariable(pset.vars, "SERVER_VERSION_NUM", NULL); } diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 57b826af1669a6ca710282a6e2a410e203f44948..c163d35df0447a7c760a702fdd32e03a8e4bb6c1 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -336,7 +336,7 @@ helpVariables(unsigned short int pager) * Windows builds currently print one more line than non-Windows builds. * Using the larger number is fine. */ - output = PageOutput(88, pager ? &(pset.popt.topt) : NULL); + output = PageOutput(93, pager ? &(pset.popt.topt) : NULL); fprintf(output, _("List of specially treated variables\n\n")); @@ -368,11 +368,16 @@ helpVariables(unsigned short int pager) fprintf(output, _(" PROMPT2 specifies the prompt used when a statement continues from a previous line\n")); fprintf(output, _(" PROMPT3 specifies the prompt used during COPY ... FROM STDIN\n")); fprintf(output, _(" QUIET run quietly (same as -q option)\n")); + fprintf(output, _(" SERVER_VERSION_NAME server's version (short string)\n")); + fprintf(output, _(" SERVER_VERSION_NUM server's version (numeric format)\n")); fprintf(output, _(" SHOW_CONTEXT controls display of message context fields [never, errors, always]\n")); fprintf(output, _(" SINGLELINE end of line terminates SQL command mode (same as -S option)\n")); fprintf(output, _(" SINGLESTEP single-step mode (same as -s option)\n")); fprintf(output, _(" USER the currently connected database user\n")); fprintf(output, _(" VERBOSITY controls verbosity of error reports [default, verbose, terse]\n")); + fprintf(output, _(" VERSION psql's version (verbose string)\n")); + fprintf(output, _(" VERSION_NAME psql's version (short string)\n")); + fprintf(output, _(" VERSION_NUM psql's version (numeric format)\n")); fprintf(output, _("\nDisplay settings:\n")); fprintf(output, _("Usage:\n")); diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 7f767976a5b76805d10c58f74f12fe4e7d44b925..1e48f4ad5adeacd7f91a738cf96e5ad700659ea2 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -160,7 +160,10 @@ main(int argc, char *argv[]) EstablishVariableSpace(); + /* Create variables showing psql version number */ SetVariable(pset.vars, "VERSION", PG_VERSION_STR); + SetVariable(pset.vars, "VERSION_NAME", PG_VERSION); + SetVariable(pset.vars, "VERSION_NUM", CppAsString2(PG_VERSION_NUM)); /* Default values for variables (that don't match the result of \unset) */ SetVariableBool(pset.vars, "AUTOCOMMIT");