Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 32b99ef

Browse files
committed
Fix assorted places in psql to print version numbers >= 10 in new style.
This is somewhat cosmetic, since as long as you know what you are looking at, "10.0" is a serviceable substitute for "10". But there is a potential for confusion between version numbers with minor numbers and those without --- we don't want people asking "why is psql saying 10.0 when my server is 10.2". Therefore, back-patch as far as practical, which turns out to be 9.3. I could have redone the patch to use fprintf(stderr) in place of psql_error(), but it seems more work than is warranted for branches that will be EOL or nearly so by the time v10 comes out. Although only psql seems to contain any code that needs this, I chose to put the support function into fe_utils, since it seems likely we'll need it in other client programs in future. (In 9.3-9.5, use dumputils.c, the predecessor of fe_utils/string_utils.c.) In HEAD, also fix the backend code that whines about loadable-library version mismatch. I don't see much need to back-patch that.
1 parent 203bf7f commit 32b99ef

File tree

5 files changed

+154
-50
lines changed

5 files changed

+154
-50
lines changed

src/bin/psql/command.c

+32-18
Original file line numberDiff line numberDiff line change
@@ -635,8 +635,11 @@ exec_command(const char *cmd,
635635

636636
if (pset.sversion < 80400)
637637
{
638-
psql_error("The server (version %d.%d) does not support editing function source.\n",
639-
pset.sversion / 10000, (pset.sversion / 100) % 100);
638+
char sverbuf[32];
639+
640+
psql_error("The server (version %s) does not support editing function source.\n",
641+
formatPGVersionNumber(pset.sversion, false,
642+
sverbuf, sizeof(sverbuf)));
640643
status = PSQL_CMD_ERROR;
641644
}
642645
else if (!query_buf)
@@ -731,8 +734,11 @@ exec_command(const char *cmd,
731734

732735
if (pset.sversion < 70400)
733736
{
734-
psql_error("The server (version %d.%d) does not support editing view definitions.\n",
735-
pset.sversion / 10000, (pset.sversion / 100) % 100);
737+
char sverbuf[32];
738+
739+
psql_error("The server (version %s) does not support editing view definitions.\n",
740+
formatPGVersionNumber(pset.sversion, false,
741+
sverbuf, sizeof(sverbuf)));
736742
status = PSQL_CMD_ERROR;
737743
}
738744
else if (!query_buf)
@@ -1362,8 +1368,11 @@ exec_command(const char *cmd,
13621368
OT_WHOLE_LINE, NULL, true);
13631369
if (pset.sversion < 80400)
13641370
{
1365-
psql_error("The server (version %d.%d) does not support showing function source.\n",
1366-
pset.sversion / 10000, (pset.sversion / 100) % 100);
1371+
char sverbuf[32];
1372+
1373+
psql_error("The server (version %s) does not support showing function source.\n",
1374+
formatPGVersionNumber(pset.sversion, false,
1375+
sverbuf, sizeof(sverbuf)));
13671376
status = PSQL_CMD_ERROR;
13681377
}
13691378
else if (!func)
@@ -1441,8 +1450,11 @@ exec_command(const char *cmd,
14411450
OT_WHOLE_LINE, NULL, true);
14421451
if (pset.sversion < 70400)
14431452
{
1444-
psql_error("The server (version %d.%d) does not support showing view definitions.\n",
1445-
pset.sversion / 10000, (pset.sversion / 100) % 100);
1453+
char sverbuf[32];
1454+
1455+
psql_error("The server (version %s) does not support showing view definitions.\n",
1456+
formatPGVersionNumber(pset.sversion, false,
1457+
sverbuf, sizeof(sverbuf)));
14461458
status = PSQL_CMD_ERROR;
14471459
}
14481460
else if (!view)
@@ -2014,22 +2026,21 @@ connection_warnings(bool in_startup)
20142026
if (!pset.quiet && !pset.notty)
20152027
{
20162028
int client_ver = PG_VERSION_NUM;
2029+
char cverbuf[32];
2030+
char sverbuf[32];
20172031

20182032
if (pset.sversion != client_ver)
20192033
{
20202034
const char *server_version;
2021-
char server_ver_str[16];
20222035

20232036
/* Try to get full text form, might include "devel" etc */
20242037
server_version = PQparameterStatus(pset.db, "server_version");
2038+
/* Otherwise fall back on pset.sversion */
20252039
if (!server_version)
20262040
{
2027-
snprintf(server_ver_str, sizeof(server_ver_str),
2028-
"%d.%d.%d",
2029-
pset.sversion / 10000,
2030-
(pset.sversion / 100) % 100,
2031-
pset.sversion % 100);
2032-
server_version = server_ver_str;
2041+
formatPGVersionNumber(pset.sversion, true,
2042+
sverbuf, sizeof(sverbuf));
2043+
server_version = sverbuf;
20332044
}
20342045

20352046
printf(_("%s (%s, server %s)\n"),
@@ -2040,10 +2051,13 @@ connection_warnings(bool in_startup)
20402051
printf("%s (%s)\n", pset.progname, PG_VERSION);
20412052

20422053
if (pset.sversion / 100 > client_ver / 100)
2043-
printf(_("WARNING: %s major version %d.%d, server major version %d.%d.\n"
2054+
printf(_("WARNING: %s major version %s, server major version %s.\n"
20442055
" Some psql features might not work.\n"),
2045-
pset.progname, client_ver / 10000, (client_ver / 100) % 100,
2046-
pset.sversion / 10000, (pset.sversion / 100) % 100);
2056+
pset.progname,
2057+
formatPGVersionNumber(client_ver, false,
2058+
cverbuf, sizeof(cverbuf)),
2059+
formatPGVersionNumber(pset.sversion, false,
2060+
sverbuf, sizeof(sverbuf)));
20472061

20482062
#ifdef WIN32
20492063
checkWin32Codepage();

src/bin/psql/common.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <win32.h>
1919
#endif
2020

21+
#include "fe_utils/string_utils.h"
2122
#include "portability/instr_time.h"
2223

2324
#include "settings.h"
@@ -1202,8 +1203,11 @@ SendQuery(const char *query)
12021203
{
12031204
if (on_error_rollback_warning == false && pset.sversion < 80000)
12041205
{
1205-
psql_error("The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n",
1206-
pset.sversion / 10000, (pset.sversion / 100) % 100);
1206+
char sverbuf[32];
1207+
1208+
psql_error("The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n",
1209+
formatPGVersionNumber(pset.sversion, false,
1210+
sverbuf, sizeof(sverbuf)));
12071211
on_error_rollback_warning = true;
12081212
}
12091213
else

src/bin/psql/describe.c

+75-30
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,11 @@ describeAccessMethods(const char *pattern, bool verbose)
142142

143143
if (pset.sversion < 90600)
144144
{
145-
psql_error("The server (version %d.%d) does not support access methods.\n",
146-
pset.sversion / 10000, (pset.sversion / 100) % 100);
145+
char sverbuf[32];
146+
147+
psql_error("The server (version %s) does not support access methods.\n",
148+
formatPGVersionNumber(pset.sversion, false,
149+
sverbuf, sizeof(sverbuf)));
147150
return true;
148151
}
149152

@@ -205,8 +208,11 @@ describeTablespaces(const char *pattern, bool verbose)
205208

206209
if (pset.sversion < 80000)
207210
{
208-
psql_error("The server (version %d.%d) does not support tablespaces.\n",
209-
pset.sversion / 10000, (pset.sversion / 100) % 100);
211+
char sverbuf[32];
212+
213+
psql_error("The server (version %s) does not support tablespaces.\n",
214+
formatPGVersionNumber(pset.sversion, false,
215+
sverbuf, sizeof(sverbuf)));
210216
return true;
211217
}
212218

@@ -311,8 +317,11 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
311317

312318
if (showWindow && pset.sversion < 80400)
313319
{
314-
psql_error("\\df does not take a \"w\" option with server version %d.%d\n",
315-
pset.sversion / 10000, (pset.sversion / 100) % 100);
320+
char sverbuf[32];
321+
322+
psql_error("\\df does not take a \"w\" option with server version %s\n",
323+
formatPGVersionNumber(pset.sversion, false,
324+
sverbuf, sizeof(sverbuf)));
316325
return true;
317326
}
318327

@@ -962,8 +971,11 @@ listDefaultACLs(const char *pattern)
962971

963972
if (pset.sversion < 90000)
964973
{
965-
psql_error("The server (version %d.%d) does not support altering default privileges.\n",
966-
pset.sversion / 10000, (pset.sversion / 100) % 100);
974+
char sverbuf[32];
975+
976+
psql_error("The server (version %s) does not support altering default privileges.\n",
977+
formatPGVersionNumber(pset.sversion, false,
978+
sverbuf, sizeof(sverbuf)));
967979
return true;
968980
}
969981

@@ -3548,8 +3560,11 @@ listCollations(const char *pattern, bool verbose, bool showSystem)
35483560

35493561
if (pset.sversion < 90100)
35503562
{
3551-
psql_error("The server (version %d.%d) does not support collations.\n",
3552-
pset.sversion / 10000, (pset.sversion / 100) % 100);
3563+
char sverbuf[32];
3564+
3565+
psql_error("The server (version %s) does not support collations.\n",
3566+
formatPGVersionNumber(pset.sversion, false,
3567+
sverbuf, sizeof(sverbuf)));
35533568
return true;
35543569
}
35553570

@@ -3680,8 +3695,11 @@ listTSParsers(const char *pattern, bool verbose)
36803695

36813696
if (pset.sversion < 80300)
36823697
{
3683-
psql_error("The server (version %d.%d) does not support full text search.\n",
3684-
pset.sversion / 10000, (pset.sversion / 100) % 100);
3698+
char sverbuf[32];
3699+
3700+
psql_error("The server (version %s) does not support full text search.\n",
3701+
formatPGVersionNumber(pset.sversion, false,
3702+
sverbuf, sizeof(sverbuf)));
36853703
return true;
36863704
}
36873705

@@ -3915,8 +3933,11 @@ listTSDictionaries(const char *pattern, bool verbose)
39153933

39163934
if (pset.sversion < 80300)
39173935
{
3918-
psql_error("The server (version %d.%d) does not support full text search.\n",
3919-
pset.sversion / 10000, (pset.sversion / 100) % 100);
3936+
char sverbuf[32];
3937+
3938+
psql_error("The server (version %s) does not support full text search.\n",
3939+
formatPGVersionNumber(pset.sversion, false,
3940+
sverbuf, sizeof(sverbuf)));
39203941
return true;
39213942
}
39223943

@@ -3983,8 +4004,11 @@ listTSTemplates(const char *pattern, bool verbose)
39834004

39844005
if (pset.sversion < 80300)
39854006
{
3986-
psql_error("The server (version %d.%d) does not support full text search.\n",
3987-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4007+
char sverbuf[32];
4008+
4009+
psql_error("The server (version %s) does not support full text search.\n",
4010+
formatPGVersionNumber(pset.sversion, false,
4011+
sverbuf, sizeof(sverbuf)));
39884012
return true;
39894013
}
39904014

@@ -4051,8 +4075,11 @@ listTSConfigs(const char *pattern, bool verbose)
40514075

40524076
if (pset.sversion < 80300)
40534077
{
4054-
psql_error("The server (version %d.%d) does not support full text search.\n",
4055-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4078+
char sverbuf[32];
4079+
4080+
psql_error("The server (version %s) does not support full text search.\n",
4081+
formatPGVersionNumber(pset.sversion, false,
4082+
sverbuf, sizeof(sverbuf)));
40564083
return true;
40574084
}
40584085

@@ -4249,8 +4276,11 @@ listForeignDataWrappers(const char *pattern, bool verbose)
42494276

42504277
if (pset.sversion < 80400)
42514278
{
4252-
psql_error("The server (version %d.%d) does not support foreign-data wrappers.\n",
4253-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4279+
char sverbuf[32];
4280+
4281+
psql_error("The server (version %s) does not support foreign-data wrappers.\n",
4282+
formatPGVersionNumber(pset.sversion, false,
4283+
sverbuf, sizeof(sverbuf)));
42544284
return true;
42554285
}
42564286

@@ -4329,8 +4359,11 @@ listForeignServers(const char *pattern, bool verbose)
43294359

43304360
if (pset.sversion < 80400)
43314361
{
4332-
psql_error("The server (version %d.%d) does not support foreign servers.\n",
4333-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4362+
char sverbuf[32];
4363+
4364+
psql_error("The server (version %s) does not support foreign servers.\n",
4365+
formatPGVersionNumber(pset.sversion, false,
4366+
sverbuf, sizeof(sverbuf)));
43344367
return true;
43354368
}
43364369

@@ -4408,8 +4441,11 @@ listUserMappings(const char *pattern, bool verbose)
44084441

44094442
if (pset.sversion < 80400)
44104443
{
4411-
psql_error("The server (version %d.%d) does not support user mappings.\n",
4412-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4444+
char sverbuf[32];
4445+
4446+
psql_error("The server (version %s) does not support user mappings.\n",
4447+
formatPGVersionNumber(pset.sversion, false,
4448+
sverbuf, sizeof(sverbuf)));
44134449
return true;
44144450
}
44154451

@@ -4466,8 +4502,11 @@ listForeignTables(const char *pattern, bool verbose)
44664502

44674503
if (pset.sversion < 90100)
44684504
{
4469-
psql_error("The server (version %d.%d) does not support foreign tables.\n",
4470-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4505+
char sverbuf[32];
4506+
4507+
psql_error("The server (version %s) does not support foreign tables.\n",
4508+
formatPGVersionNumber(pset.sversion, false,
4509+
sverbuf, sizeof(sverbuf)));
44714510
return true;
44724511
}
44734512

@@ -4541,8 +4580,11 @@ listExtensions(const char *pattern)
45414580

45424581
if (pset.sversion < 90100)
45434582
{
4544-
psql_error("The server (version %d.%d) does not support extensions.\n",
4545-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4583+
char sverbuf[32];
4584+
4585+
psql_error("The server (version %s) does not support extensions.\n",
4586+
formatPGVersionNumber(pset.sversion, false,
4587+
sverbuf, sizeof(sverbuf)));
45464588
return true;
45474589
}
45484590

@@ -4595,8 +4637,11 @@ listExtensionContents(const char *pattern)
45954637

45964638
if (pset.sversion < 90100)
45974639
{
4598-
psql_error("The server (version %d.%d) does not support extensions.\n",
4599-
pset.sversion / 10000, (pset.sversion / 100) % 100);
4640+
char sverbuf[32];
4641+
4642+
psql_error("The server (version %s) does not support extensions.\n",
4643+
formatPGVersionNumber(pset.sversion, false,
4644+
sverbuf, sizeof(sverbuf)));
46004645
return true;
46014646
}
46024647

src/fe_utils/string_utils.c

+38
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,44 @@ fmtQualifiedId(int remoteVersion, const char *schema, const char *id)
168168
}
169169

170170

171+
/*
172+
* Format a Postgres version number (in the PG_VERSION_NUM integer format
173+
* returned by PQserverVersion()) as a string. This exists mainly to
174+
* encapsulate knowledge about two-part vs. three-part version numbers.
175+
*
176+
* For re-entrancy, caller must supply the buffer the string is put in.
177+
* Recommended size of the buffer is 32 bytes.
178+
*
179+
* Returns address of 'buf', as a notational convenience.
180+
*/
181+
char *
182+
formatPGVersionNumber(int version_number, bool include_minor,
183+
char *buf, size_t buflen)
184+
{
185+
if (version_number >= 100000)
186+
{
187+
/* New two-part style */
188+
if (include_minor)
189+
snprintf(buf, buflen, "%d.%d", version_number / 10000,
190+
version_number % 10000);
191+
else
192+
snprintf(buf, buflen, "%d", version_number / 10000);
193+
}
194+
else
195+
{
196+
/* Old three-part style */
197+
if (include_minor)
198+
snprintf(buf, buflen, "%d.%d.%d", version_number / 10000,
199+
(version_number / 100) % 100,
200+
version_number % 100);
201+
else
202+
snprintf(buf, buflen, "%d.%d", version_number / 10000,
203+
(version_number / 100) % 100);
204+
}
205+
return buf;
206+
}
207+
208+
171209
/*
172210
* Convert a string value to an SQL string literal and append it to
173211
* the given buffer. We assume the specified client_encoding and

src/include/fe_utils/string_utils.h

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ extern const char *fmtId(const char *identifier);
3030
extern const char *fmtQualifiedId(int remoteVersion,
3131
const char *schema, const char *id);
3232

33+
extern char *formatPGVersionNumber(int version_number, bool include_minor,
34+
char *buf, size_t buflen);
35+
3336
extern void appendStringLiteral(PQExpBuffer buf, const char *str,
3437
int encoding, bool std_strings);
3538
extern void appendStringLiteralConn(PQExpBuffer buf, const char *str,

0 commit comments

Comments
 (0)