3
3
*
4
4
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
5
5
*
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 $
7
7
*/
8
8
#include "postgres_fe.h"
9
9
@@ -78,6 +78,7 @@ struct adhoc_opts
78
78
bool no_psqlrc ;
79
79
};
80
80
81
+ static int parse_version (const char * versionString );
81
82
static void parse_psql_options (int argc ,char * argv [],
82
83
struct adhoc_opts * options );
83
84
static void process_psqlrc (char * argv0 );
@@ -312,51 +313,46 @@ main(int argc, char *argv[])
312
313
313
314
if (!QUIET ()&& !pset .notty )
314
315
{
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 );
335
317
336
- if (pset .sversion != client_ver_int )
318
+ if (pset .sversion != client_ver )
337
319
{
320
+ const char * server_version ;
338
321
char server_ver_str [16 ];
339
322
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 );
350
337
}
351
338
else
352
339
printf (_ ("Welcome to %s %s, the PostgreSQL interactive terminal.\n\n" ),
353
- pset .progname ,PG_VERSION );
340
+ pset .progname ,PG_VERSION );
354
341
355
342
printf (_ ("Type: \\copyright for distribution terms\n"
356
343
" \\h for help with SQL commands\n"
357
344
" \\? for help with psql commands\n"
358
345
" \\g or terminate with semicolon to execute query\n"
359
346
" \\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
+
360
356
#ifdef USE_SSL
361
357
printSSLInfo ();
362
358
#endif
@@ -383,6 +379,28 @@ main(int argc, char *argv[])
383
379
}
384
380
385
381
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
+
386
404
387
405
/*
388
406
* Parse command line options