pg_upgrade: check for types removed in pg12
authorAlvaro Herrera
Mon, 25 Sep 2023 12:27:33 +0000 (14:27 +0200)
committerAlvaro Herrera
Mon, 25 Sep 2023 12:27:33 +0000 (14:27 +0200)
Commit cda6a8d01d39 removed a few datatypes, but didn't update
pg_upgrade --check to throw error if these types are used.  So the users
find that pg_upgrade --check tells them that everything is fine, only to
fail when the real upgrade is attempted.

Reviewed-by: Tristan Partin
Reviewed-by: Suraj Kharage
Discussion: https://postgr.es/m/202309201654[email protected]

src/bin/pg_upgrade/check.c

index 56e313f562affee0a3a76a753a01d72d8803e4cb..21a0ff9e42d60fa20e831b953355f7cad1cfb680 100644 (file)
@@ -26,6 +26,9 @@ static void check_for_tables_with_oids(ClusterInfo *cluster);
 static void check_for_composite_data_type_usage(ClusterInfo *cluster);
 static void check_for_reg_data_type_usage(ClusterInfo *cluster);
 static void check_for_aclitem_data_type_usage(ClusterInfo *cluster);
+static void check_for_removed_data_type_usage(ClusterInfo *cluster,
+                                             const char *version,
+                                             const char *datatype);
 static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
 static void check_for_pg_role_prefix(ClusterInfo *cluster);
 static void check_for_new_tablespace_dir(void);
@@ -111,6 +114,16 @@ check_and_dump_old_cluster(bool live_check)
    if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1500)
        check_for_aclitem_data_type_usage(&old_cluster);
 
+   /*
+    * PG 12 removed types abstime, reltime, tinterval.
+    */
+   if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+   {
+       check_for_removed_data_type_usage(&old_cluster, "12", "abstime");
+       check_for_removed_data_type_usage(&old_cluster, "12", "reltime");
+       check_for_removed_data_type_usage(&old_cluster, "12", "tinterval");
+   }
+
    /*
     * PG 14 changed the function signature of encoding conversion functions.
     * Conversions from older versions cannot be upgraded automatically
@@ -1215,7 +1228,8 @@ check_for_aclitem_data_type_usage(ClusterInfo *cluster)
 {
    char        output_path[MAXPGPATH];
 
-   prep_status("Checking for incompatible \"aclitem\" data type in user tables");
+   prep_status("Checking for incompatible \"%s\" data type in user tables",
+               "aclitem");
 
    snprintf(output_path, sizeof(output_path), "tables_using_aclitem.txt");
 
@@ -1233,6 +1247,41 @@ check_for_aclitem_data_type_usage(ClusterInfo *cluster)
        check_ok();
 }
 
+/*
+ * check_for_removed_data_type_usage
+ *
+ * Check for in-core data types that have been removed.  Callers know
+ * the exact list.
+ */
+static void
+check_for_removed_data_type_usage(ClusterInfo *cluster, const char *version,
+                                 const char *datatype)
+{
+   char        output_path[MAXPGPATH];
+   char        typename[NAMEDATALEN];
+
+   prep_status("Checking for removed \"%s\" data type in user tables",
+               datatype);
+
+   snprintf(output_path, sizeof(output_path), "tables_using_%s.txt",
+            datatype);
+   snprintf(typename, sizeof(typename), "pg_catalog.%s", datatype);
+
+   if (check_for_data_type_usage(cluster, typename, output_path))
+   {
+       pg_log(PG_REPORT, "fatal");
+       pg_fatal("Your installation contains the \"%s\" data type in user tables.\n"
+                "The \"%s\" type has been removed in PostgreSQL version %s,\n"
+                "so this cluster cannot currently be upgraded.  You can drop the\n"
+                "problem columns, or change them to another data type, and restart\n"
+                "the upgrade.  A list of the problem columns is in the file:\n"
+                "    %s", datatype, datatype, version, output_path);
+   }
+   else
+       check_ok();
+}
+
+
 /*
  * check_for_jsonb_9_4_usage()
  *