@@ -20,6 +20,7 @@ static void check_for_prepared_transactions(ClusterInfo *cluster);
20
20
static void check_for_isn_and_int8_passing_mismatch (ClusterInfo * cluster );
21
21
static void check_for_reg_data_type_usage (ClusterInfo * cluster );
22
22
static void check_for_support_lib (ClusterInfo * cluster );
23
+ static void get_bin_version (ClusterInfo * cluster );
23
24
24
25
25
26
void
@@ -216,6 +217,8 @@ output_completion_banner(char *deletion_script_file_name)
216
217
void
217
218
check_cluster_versions (void )
218
219
{
220
+ prep_status ("Checking cluster versions" );
221
+
219
222
/* get old and new cluster versions */
220
223
old_cluster .major_version = get_major_server_version (& old_cluster );
221
224
new_cluster .major_version = get_major_server_version (& new_cluster );
@@ -235,10 +238,26 @@ check_cluster_versions(void)
235
238
236
239
/*
237
240
* We can't allow downgrading because we use the target pg_dumpall, and
238
- * pg_dumpall cannot operate on new datbase versions, only older versions.
241
+ * pg_dumpall cannot operate on new database versions, only older versions.
239
242
*/
240
243
if (old_cluster .major_version > new_cluster .major_version )
241
244
pg_log (PG_FATAL , "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" );
245
+
246
+ /* get old and new binary versions */
247
+ get_bin_version (& old_cluster );
248
+ get_bin_version (& new_cluster );
249
+
250
+ /* Ensure binaries match the designated data directories */
251
+ if (GET_MAJOR_VERSION (old_cluster .major_version ) !=
252
+ GET_MAJOR_VERSION (old_cluster .bin_version ))
253
+ pg_log (PG_FATAL ,
254
+ "Old cluster data and binary directories are from different major versions.\n" );
255
+ if (GET_MAJOR_VERSION (new_cluster .major_version ) !=
256
+ GET_MAJOR_VERSION (new_cluster .bin_version ))
257
+ pg_log (PG_FATAL ,
258
+ "New cluster data and binary directories are from different major versions.\n" );
259
+
260
+ check_ok ();
242
261
}
243
262
244
263
@@ -754,3 +773,32 @@ check_for_support_lib(ClusterInfo *cluster)
754
773
755
774
fclose (lib_test );
756
775
}
776
+
777
+
778
+ static void
779
+ get_bin_version (ClusterInfo * cluster )
780
+ {
781
+ char cmd [MAXPGPATH ], cmd_output [MAX_STRING ];
782
+ FILE * output ;
783
+ int pre_dot , post_dot ;
784
+
785
+ snprintf (cmd , sizeof (cmd ), "\"%s/pg_ctl\" --version" , cluster -> bindir );
786
+
787
+ if ((output = popen (cmd , "r" )) == NULL )
788
+ pg_log (PG_FATAL , "Could not get pg_ctl version data: %s\n" ,
789
+ getErrorText (errno ));
790
+
791
+ fgets (cmd_output , sizeof (cmd_output ), output );
792
+
793
+ pclose (output );
794
+
795
+ /* Remove trailing newline */
796
+ if (strchr (cmd_output , '\n' ) != NULL )
797
+ * strchr (cmd_output , '\n' ) = '\0' ;
798
+
799
+ if (sscanf (cmd_output , "%*s %*s %d.%d" , & pre_dot , & post_dot ) != 2 )
800
+ pg_log (PG_FATAL , "could not get version from %s\n" , cmd );
801
+
802
+ cluster -> bin_version = (pre_dot * 100 + post_dot ) * 100 ;
803
+ }
804
+
0 commit comments