33 *
44 * Copyright (c) 2000-2005, PostgreSQL Global Development Group
55 *
6- * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.121 2005/09/0513:59:08 momjian Exp $
6+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.122 2005/09/0518:05:13 tgl Exp $
77 */
88#include "postgres_fe.h"
99
@@ -78,6 +78,7 @@ struct adhoc_opts
7878bool no_psqlrc ;
7979};
8080
81+ static int parse_version (const char * versionString );
8182static void parse_psql_options (int argc ,char * argv [],
8283struct adhoc_opts * options );
8384static void process_psqlrc (char * argv0 );
@@ -312,51 +313,46 @@ main(int argc, char *argv[])
312313
313314if (!QUIET ()&& !pset .notty )
314315{
315- /*
316- *Server value for 8.12 is 80102.
317- *This code does not handle release numbers like
318- *8.112. (Is that 8.1, version 12, or 8.11, version 2?
319- */
320- int client_ver_major_int = atoi (PG_VERSION )* 100 +
321- strchr (PG_VERSION ,'.' )[1 ]- '0' ;
322- int client_ver_int = atoi (PG_VERSION )* 10000 +
323- (strchr (PG_VERSION ,'.' )[1 ]- '0' )* 100 +
324- (isdigit (strchr (PG_VERSION ,'.' )[2 ]) ?
325- strchr (PG_VERSION ,'.' )[2 ]- '0' :'\0' );
326-
327- if (pset .sversion /100 != client_ver_major_int )
328- {
329- printf (_ ("WARNING: You are connected to a server with major version %d.%d,\n"
330- "but your %s client is major version %d.%d. Informational backslash\n"
331- "commands, like \\d, might not work properly.\n\n" ),
332- pset .sversion /10000 , (pset .sversion /100 ) %10 ,
333- pset .progname ,atoi (PG_VERSION ),strchr (PG_VERSION ,'.' )[1 ]- '0' );
334- }
316+ int client_ver = parse_version (PG_VERSION );
335317
336- if (pset .sversion != client_ver_int )
318+ if (pset .sversion != client_ver )
337319{
320+ const char * server_version ;
338321char server_ver_str [16 ];
339322
340- snprintf (server_ver_str ,16 ,"%d.%c%c" ,pset .sversion /10000 ,
341- (pset .sversion /100 ) %10 + '0' ,
342- /* print last digit? */
343- (pset .sversion %10 != 0 ) ?
344- pset .sversion %10 + '0' :'\0' );
345-
346- printf (_ ("Welcome to %s, the PostgreSQL interactive terminal.\n" ),
347- pset .progname );
348- printf (_ ("%s version %s, server version %s\n\n" ),
349- pset .progname ,PG_VERSION ,server_ver_str );
323+ /* Try to get full text form, might include "devel" etc */
324+ server_version = PQparameterStatus (pset .db ,"server_version" );
325+ if (!server_version )
326+ {
327+ snprintf (server_ver_str ,sizeof (server_ver_str ),
328+ "%d.%d.%d" ,
329+ pset .sversion /10000 ,
330+ (pset .sversion /100 ) %100 ,
331+ pset .sversion %100 );
332+ server_version = server_ver_str ;
333+ }
334+
335+ printf (_ ("Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n\n" ),
336+ pset .progname ,PG_VERSION ,server_version );
350337}
351338else
352339printf (_ ("Welcome to %s %s, the PostgreSQL interactive terminal.\n\n" ),
353- pset .progname ,PG_VERSION );
340+ pset .progname ,PG_VERSION );
354341
355342printf (_ ("Type: \\copyright for distribution terms\n"
356343" \\h for help with SQL commands\n"
357344" \\? for help with psql commands\n"
358345" \\g or terminate with semicolon to execute query\n"
359346" \\q to quit\n\n" ));
347+
348+ if (pset .sversion /100 != client_ver /100 )
349+ printf (_ ("WARNING: You are connected to a server with major version %d.%d,\n"
350+ "but your %s client is major version %d.%d. Some backslash commands,\n"
351+ "such as \\d, might not work properly.\n\n" ),
352+ pset .sversion /10000 , (pset .sversion /100 ) %100 ,
353+ pset .progname ,
354+ client_ver /10000 , (client_ver /100 ) %100 );
355+
360356#ifdef USE_SSL
361357printSSLInfo ();
362358#endif
@@ -383,6 +379,28 @@ main(int argc, char *argv[])
383379}
384380
385381
382+ /*
383+ * Convert a version string into a number.
384+ */
385+ static int
386+ parse_version (const char * versionString )
387+ {
388+ int cnt ;
389+ int vmaj ,
390+ vmin ,
391+ vrev ;
392+
393+ cnt = sscanf (versionString ,"%d.%d.%d" ,& vmaj ,& vmin ,& vrev );
394+
395+ if (cnt < 2 )
396+ return -1 ;
397+
398+ if (cnt == 2 )
399+ vrev = 0 ;
400+
401+ return (100 * vmaj + vmin )* 100 + vrev ;
402+ }
403+
386404
387405/*
388406 * Parse command line options