Commit d0c80c17 authored by Tom Lane's avatar Tom Lane

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.
parent 92d830f4
...@@ -16807,7 +16807,7 @@ _ACEOF ...@@ -16807,7 +16807,7 @@ _ACEOF
# awk -F is a regex on some platforms, and not on others, so make "." a tab # 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].*$//' | PG_VERSION_NUM="`echo "$PACKAGE_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' ' ' | tr '.' ' ' |
$AWK '{printf "%d%02d%02d", $1, $2, (NF >= 3) ? $3 : 0}'`" $AWK '{printf "%d%04d", $1, $2}'`"
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define PG_VERSION_NUM $PG_VERSION_NUM #define PG_VERSION_NUM $PG_VERSION_NUM
......
...@@ -2181,7 +2181,7 @@ AC_DEFINE_UNQUOTED(PG_VERSION_STR, ...@@ -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 # 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].*$//' | [PG_VERSION_NUM="`echo "$PACKAGE_VERSION" | sed 's/[A-Za-z].*$//' |
tr '.' ' ' | 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_DEFINE_UNQUOTED(PG_VERSION_NUM, $PG_VERSION_NUM, [PostgreSQL version as a number])
AC_SUBST(PG_VERSION_NUM) AC_SUBST(PG_VERSION_NUM)
......
...@@ -26,7 +26,7 @@ static int win32_check_directory_write_permissions(void); ...@@ -26,7 +26,7 @@ static int win32_check_directory_write_permissions(void);
/* /*
* get_bin_version * get_bin_version
* *
* Fetch versions of binaries for cluster. * Fetch major version of binaries for cluster.
*/ */
static void static void
get_bin_version(ClusterInfo *cluster) get_bin_version(ClusterInfo *cluster)
...@@ -34,8 +34,8 @@ get_bin_version(ClusterInfo *cluster) ...@@ -34,8 +34,8 @@ get_bin_version(ClusterInfo *cluster)
char cmd[MAXPGPATH], char cmd[MAXPGPATH],
cmd_output[MAX_STRING]; cmd_output[MAX_STRING];
FILE *output; FILE *output;
int pre_dot = 0, int v1 = 0,
post_dot = 0; v2 = 0;
snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir); snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
...@@ -46,14 +46,19 @@ get_bin_version(ClusterInfo *cluster) ...@@ -46,14 +46,19 @@ get_bin_version(ClusterInfo *cluster)
pclose(output); pclose(output);
/* Remove trailing newline */ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
if (strchr(cmd_output, '\n') != NULL)
*strchr(cmd_output, '\n') = '\0';
if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) < 1)
pg_fatal("could not get pg_ctl version output from %s\n", cmd); 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;
}
} }
......
...@@ -156,8 +156,8 @@ get_major_server_version(ClusterInfo *cluster) ...@@ -156,8 +156,8 @@ get_major_server_version(ClusterInfo *cluster)
{ {
FILE *version_fd; FILE *version_fd;
char ver_filename[MAXPGPATH]; char ver_filename[MAXPGPATH];
int integer_version = 0; int v1 = 0,
int fractional_version = 0; v2 = 0;
snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION", snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
cluster->pgdata); cluster->pgdata);
...@@ -165,13 +165,21 @@ get_major_server_version(ClusterInfo *cluster) ...@@ -165,13 +165,21 @@ get_major_server_version(ClusterInfo *cluster)
pg_fatal("could not open version file: %s\n", ver_filename); pg_fatal("could not open version file: %s\n", ver_filename);
if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 || if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
sscanf(cluster->major_version_str, "%d.%d", &integer_version, sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
&fractional_version) < 1)
pg_fatal("could not parse PG_VERSION file from %s\n", cluster->pgdata); pg_fatal("could not parse PG_VERSION file from %s\n", cluster->pgdata);
fclose(version_fd); 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;
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment