@@ -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 */
220223old_cluster .major_version = get_major_server_version (& old_cluster );
221224new_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 newdatbase versions, only older versions.
241+ * pg_dumpall cannot operate on newdatabase versions, only older versions.
239242 */
240243if (old_cluster .major_version > new_cluster .major_version )
241244pg_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
755774fclose (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+