@@ -20,6 +20,7 @@ static void check_for_prepared_transactions(ClusterInfo *cluster);
2020static void check_for_isn_and_int8_passing_mismatch (ClusterInfo * cluster );
2121static void check_for_reg_data_type_usage (ClusterInfo * cluster );
2222static void check_for_support_lib (ClusterInfo * cluster );
23+ static void get_bin_version (ClusterInfo * cluster );
2324
2425
2526void
@@ -216,6 +217,8 @@ output_completion_banner(char *deletion_script_file_name)
216217void
217218check_cluster_versions (void )
218219{
220+ prep_status ("Checking cluster versions" );
221+
219222 /* get old and new cluster versions */
220223 old_cluster .major_version = get_major_server_version (& old_cluster );
221224 new_cluster .major_version = get_major_server_version (& new_cluster );
@@ -235,10 +238,26 @@ check_cluster_versions(void)
235238
236239 /*
237240 * 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.
239242 */
240243 if (old_cluster .major_version > new_cluster .major_version )
241244 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 ();
242261}
243262
244263
@@ -754,3 +773,32 @@ check_for_support_lib(ClusterInfo *cluster)
754773
755774 fclose (lib_test );
756775}
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