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/05 13:59:08 momjian Exp $
6
+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.122 2005/09/05 18: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
0 commit comments