Skip to content

Commit

Permalink
pg_upgrade: check for types removed in pg12
Browse files Browse the repository at this point in the history
Commit cda6a8d 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 <tristan@neon.tech>
Reviewed-by: Suraj Kharage <suraj.kharage@enterprisedb.com>
Discussion: https://postgr.es/m/202309201654.ng4ksea25mti@alvherre.pgsql
  • Loading branch information
alvherre committed Sep 25, 2023
1 parent 07896f4 commit d3946c4
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions src/bin/pg_upgrade/check.c
Expand Up @@ -25,6 +25,9 @@ static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
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_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(ClusterInfo *new_cluster);
Expand Down Expand Up @@ -103,6 +106,16 @@ check_and_dump_old_cluster(bool live_check)
check_for_reg_data_type_usage(&old_cluster);
check_for_isn_and_int8_passing_mismatch(&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");
}

/*
* Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
* supported anymore. Verify there are none, iff applicable.
Expand Down Expand Up @@ -1120,6 +1133,40 @@ check_for_reg_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\n\n", datatype, datatype, version, output_path);
}
else
check_ok();
}


/*
* check_for_jsonb_9_4_usage()
Expand Down

0 comments on commit d3946c4

Please sign in to comment.