aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-11-06 19:46:52 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2017-11-06 19:46:52 -0500
commitd0c80c17f1a6d0b93d2ca14fe47d83b131ce9108 (patch)
tree588da68978586a05294d294513aabeea79d58407
parent92d830f4bff643953a09563abaa106af42625207 (diff)
downloadpostgresql-d0c80c17f1a6d0b93d2ca14fe47d83b131ce9108.tar.gz
postgresql-d0c80c17f1a6d0b93d2ca14fe47d83b131ce9108.zip
Fix version numbering foulups exposed by 10.1.
configure computed PG_VERSION_NUM incorrectly. (Coulda sworn I tested that logic back when, but it had an obvious thinko.) pg_upgrade had not been taught about the new dispensation with just one part in the major version number. Both things accidentally failed to fail with 10.0, but with 10.1 we got the wrong results. Per buildfarm.
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--src/bin/pg_upgrade/exec.c23
-rw-r--r--src/bin/pg_upgrade/server.c18
4 files changed, 29 insertions, 16 deletions
diff --git a/configure b/configure
index 4ecd2e19224..b8995ad5476 100755
--- a/configure
+++ b/configure
@@ -16807,7 +16807,7 @@ _ACEOF
# awk -F is a regex on some platforms, and not on others, so make "." a tab
PG_VERSION_NUM="`echo "$PACKAGE_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' ' ' |
-$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`"
+$AWK '{printf "%d%04d", $1, $2}'`"
cat >>confdefs.h <<_ACEOF
#define PG_VERSION_NUM $PG_VERSION_NUM
diff --git a/configure.in b/configure.in
index cea7fd07553..2b209d80ab3 100644
--- a/configure.in
+++ b/configure.in
@@ -2181,7 +2181,7 @@ AC_DEFINE_UNQUOTED(PG_VERSION_STR,
# awk -F is a regex on some platforms, and not on others, so make "." a tab
[PG_VERSION_NUM="`echo "$PACKAGE_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' ' ' |
-$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`"]
+$AWK '{printf "%d%04d", $1, $2}'`"]
AC_DEFINE_UNQUOTED(PG_VERSION_NUM, $PG_VERSION_NUM, [PostgreSQL version as a number])
AC_SUBST(PG_VERSION_NUM)
diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c
index 1cf64e1a450..59ddc16d6b8 100644
--- a/src/bin/pg_upgrade/exec.c
+++ b/src/bin/pg_upgrade/exec.c
@@ -26,7 +26,7 @@ static int win32_check_directory_write_permissions(void);
/*
* get_bin_version
*
- * Fetch versions of binaries for cluster.
+ * Fetch major version of binaries for cluster.
*/
static void
get_bin_version(ClusterInfo *cluster)
@@ -34,8 +34,8 @@ get_bin_version(ClusterInfo *cluster)
char cmd[MAXPGPATH],
cmd_output[MAX_STRING];
FILE *output;
- int pre_dot = 0,
- post_dot = 0;
+ int v1 = 0,
+ v2 = 0;
snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
@@ -46,14 +46,19 @@ get_bin_version(ClusterInfo *cluster)
pclose(output);
- /* Remove trailing newline */
- if (strchr(cmd_output, '\n') != NULL)
- *strchr(cmd_output, '\n') = '\0';
-
- if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) < 1)
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
pg_fatal("could not get pg_ctl version output from %s\n", cmd);
- cluster->bin_version = (pre_dot * 100 + post_dot) * 100;
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ cluster->bin_version = v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ cluster->bin_version = v1 * 10000;
+ }
}
diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c
index 3e3323a6e8a..a91f18916c7 100644
--- a/src/bin/pg_upgrade/server.c
+++ b/src/bin/pg_upgrade/server.c
@@ -156,8 +156,8 @@ get_major_server_version(ClusterInfo *cluster)
{
FILE *version_fd;
char ver_filename[MAXPGPATH];
- int integer_version = 0;
- int fractional_version = 0;
+ int v1 = 0,
+ v2 = 0;
snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
cluster->pgdata);
@@ -165,13 +165,21 @@ get_major_server_version(ClusterInfo *cluster)
pg_fatal("could not open version file: %s\n", ver_filename);
if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
- sscanf(cluster->major_version_str, "%d.%d", &integer_version,
- &fractional_version) < 1)
+ sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
pg_fatal("could not parse PG_VERSION file from %s\n", cluster->pgdata);
fclose(version_fd);
- return (100 * integer_version + fractional_version) * 100;
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ return v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ return v1 * 10000;
+ }
}