David Fetter wrote: > On Fri, May 16, 2008 at 01:22:55AM -0400, Tom Lane wrote: > > David Fetter <[EMAIL PROTECTED]> writes: > > > I believe there's a bug in this patch, namely that the warnings when > > > there's a server-client mismatch only appear at startup time. > > > > Please do not blame this patch for a problem that has been there all > > along. > > > > I don't say that the point doesn't need investigation, but blaming > > the patch-at-hand for the issue is just misleading. > > The patch at hand, as you point out, emphasizes a problem that's been > there all along, namely that \c doesn't do the same things that > command line connection does. > > I'm volunteering to make them use the same methods :)
David, I have fixed this problem with the attached, applied patch. Thanks for the observation. (The patch also removes a duplicate definition of parse_version().) -- Bruce Momjian <[EMAIL PROTECTED]> http://momjian.us EnterpriseDB http://enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/command.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v retrieving revision 1.191 diff -c -c -r1.191 command.c *** src/bin/psql/command.c 26 Jun 2008 01:35:45 -0000 1.191 --- src/bin/psql/command.c 30 Jun 2008 23:56:53 -0000 *************** *** 29,34 **** --- 29,37 ---- #include <sys/types.h> /* for umask() */ #include <sys/stat.h> /* for stat() */ #endif + #ifdef USE_SSL + #include <openssl/ssl.h> + #endif #include "portability/instr_time.h" *************** *** 57,62 **** --- 60,74 ---- static bool do_connect(char *dbname, char *user, char *host, char *port); static bool do_shell(const char *command); + #ifdef USE_SSL + static void printSSLInfo(void); + #endif + + #ifdef WIN32 + static void checkWin32Codepage(void); + #endif + + /*---------- * HandleSlashCmds: *************** *** 1185,1190 **** --- 1197,1203 ---- * Replace the old connection with the new one, and update * connection-dependent variables. */ + connection_warnings(); PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL); pset.db = n_conn; SyncVariables(); *************** *** 1212,1217 **** --- 1225,1324 ---- } + void + connection_warnings(void) + { + if (!pset.quiet && !pset.notty) + { + int client_ver = parse_version(PG_VERSION); + + if (pset.sversion != client_ver) + { + const char *server_version; + char server_ver_str[16]; + + /* Try to get full text form, might include "devel" etc */ + server_version = PQparameterStatus(pset.db, "server_version"); + if (!server_version) + { + snprintf(server_ver_str, sizeof(server_ver_str), + "%d.%d.%d", + pset.sversion / 10000, + (pset.sversion / 100) % 100, + pset.sversion % 100); + server_version = server_ver_str; + } + + printf(_("%s (%s, server %s)\n"), + pset.progname, PG_VERSION, server_version); + } + else + printf("%s (%s)\n", pset.progname, PG_VERSION); + + if (pset.sversion / 100 != client_ver / 100) + printf(_("WARNING: %s version %d.%d, server version %d.%d.\n" + " Some psql features might not work.\n"), + pset.progname, client_ver / 10000, (client_ver / 100) % 100, + pset.sversion / 10000, (pset.sversion / 100) % 100); + + #ifdef WIN32 + checkWin32Codepage(); + #endif + #ifdef USE_SSL + printSSLInfo(); + #endif + } + } + + + /* + * printSSLInfo + * + * Prints information about the current SSL connection, if SSL is in use + */ + #ifdef USE_SSL + static void + printSSLInfo(void) + { + int sslbits = -1; + SSL *ssl; + + ssl = PQgetssl(pset.db); + if (!ssl) + return; /* no SSL */ + + SSL_get_cipher_bits(ssl, &sslbits); + printf(_("SSL connection (cipher: %s, bits: %i)\n"), + SSL_get_cipher(ssl), sslbits); + } + #endif + + + /* + * checkWin32Codepage + * + * Prints a warning when win32 console codepage differs from Windows codepage + */ + #ifdef WIN32 + static void + checkWin32Codepage(void) + { + unsigned int wincp, + concp; + + wincp = GetACP(); + concp = GetConsoleCP(); + if (wincp != concp) + { + printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n" + " 8-bit characters might not work correctly. See psql reference\n" + " page \"Notes for Windows users\" for details.\n"), + concp, wincp); + } + } + #endif + + /* * SyncVariables * Index: src/bin/psql/command.h =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/command.h,v retrieving revision 1.30 diff -c -c -r1.30 command.h *** src/bin/psql/command.h 1 Jan 2008 19:45:55 -0000 1.30 --- src/bin/psql/command.h 30 Jun 2008 23:56:53 -0000 *************** *** 34,39 **** --- 34,41 ---- printQueryOpt *popt, bool quiet); + extern void connection_warnings(void); + extern void SyncVariables(void); extern void UnsyncVariables(void); Index: src/bin/psql/startup.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/startup.c,v retrieving revision 1.148 diff -c -c -r1.148 startup.c *** src/bin/psql/startup.c 16 May 2008 17:17:00 -0000 1.148 --- src/bin/psql/startup.c 30 Jun 2008 23:56:53 -0000 *************** *** 8,16 **** #include "postgres_fe.h" #include <sys/types.h> - #ifdef USE_SSL - #include <openssl/ssl.h> - #endif #ifndef WIN32 #include <unistd.h> --- 8,13 ---- *************** *** 78,84 **** bool single_txn; }; - static int parse_version(const char *versionString); static void parse_psql_options(int argc, char *argv[], struct adhoc_opts * options); static void process_psqlrc(char *argv0); --- 75,80 ---- *************** *** 86,99 **** static void showVersion(void); static void EstablishVariableSpace(void); - #ifdef USE_SSL - static void printSSLInfo(void); - #endif - - #ifdef WIN32 - static void checkWin32Codepage(void); - #endif - /* * * main --- 82,87 ---- *************** *** 296,344 **** if (!options.no_psqlrc) process_psqlrc(argv[0]); if (!pset.quiet && !pset.notty) - { - int client_ver = parse_version(PG_VERSION); - - if (pset.sversion != client_ver) - { - const char *server_version; - char server_ver_str[16]; - - /* Try to get full text form, might include "devel" etc */ - server_version = PQparameterStatus(pset.db, "server_version"); - if (!server_version) - { - snprintf(server_ver_str, sizeof(server_ver_str), - "%d.%d.%d", - pset.sversion / 10000, - (pset.sversion / 100) % 100, - pset.sversion % 100); - server_version = server_ver_str; - } - - printf(_("%s (%s, server %s)\n"), - pset.progname, PG_VERSION, server_version); - } - else - printf("%s (%s)\n", pset.progname, PG_VERSION); - - if (pset.sversion / 100 != client_ver / 100) - printf(_("WARNING: %s version %d.%d, server version %d.%d.\n" - " Some psql features might not work.\n"), - pset.progname, client_ver / 10000, (client_ver / 100) % 100, - pset.sversion / 10000, (pset.sversion / 100) % 100); - - #ifdef WIN32 - checkWin32Codepage(); - #endif - #ifdef USE_SSL - printSSLInfo(); - #endif - printf(_("Type \"help\" for help.\n\n")); - } - if (!pset.notty) initializeInput(options.no_readline ? 0 : 1); if (options.action_string) /* -f - was used */ --- 284,292 ---- if (!options.no_psqlrc) process_psqlrc(argv[0]); + connection_warnings(); if (!pset.quiet && !pset.notty) printf(_("Type \"help\" for help.\n\n")); if (!pset.notty) initializeInput(options.no_readline ? 0 : 1); if (options.action_string) /* -f - was used */ *************** *** 358,386 **** /* - * Convert a version string into a number. - */ - static int - parse_version(const char *versionString) - { - int cnt; - int vmaj, - vmin, - vrev; - - cnt = sscanf(versionString, "%d.%d.%d", &vmaj, &vmin, &vrev); - - if (cnt < 2) - return -1; - - if (cnt == 2) - vrev = 0; - - return (100 * vmaj + vmin) * 100 + vrev; - } - - - /* * Parse command line options */ --- 306,311 ---- *************** *** 684,737 **** /* - * printSSLInfo - * - * Prints information about the current SSL connection, if SSL is in use - */ - #ifdef USE_SSL - static void - printSSLInfo(void) - { - int sslbits = -1; - SSL *ssl; - - ssl = PQgetssl(pset.db); - if (!ssl) - return; /* no SSL */ - - SSL_get_cipher_bits(ssl, &sslbits); - printf(_("SSL connection (cipher: %s, bits: %i)\n"), - SSL_get_cipher(ssl), sslbits); - } - #endif - - - /* - * checkWin32Codepage - * - * Prints a warning when win32 console codepage differs from Windows codepage - */ - #ifdef WIN32 - static void - checkWin32Codepage(void) - { - unsigned int wincp, - concp; - - wincp = GetACP(); - concp = GetConsoleCP(); - if (wincp != concp) - { - printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n" - " 8-bit characters might not work correctly. See psql reference\n" - " page \"Notes for Windows users\" for details.\n"), - concp, wincp); - } - } - #endif - - - /* * Assign hooks for psql variables. * * This isn't an amazingly good place for them, but neither is anywhere else. --- 609,614 ----
-- Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-patches