PG_FUNCTION_INFO_V1(create_empty_extension);
+#define CHECK_IS_BINARY_UPGRADE \
+do { \
+ if (!IsBinaryUpgrade) \
+ ereport(ERROR, \
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), \
+ (errmsg("function can only be called when server is in binary upgrade mode")))); \
+} while (0)
Datum
set_next_pg_type_oid(PG_FUNCTION_ARGS)
{
Oid typoid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_pg_type_oid = typoid;
PG_RETURN_VOID();
{
Oid typoid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_array_pg_type_oid = typoid;
PG_RETURN_VOID();
{
Oid typoid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_toast_pg_type_oid = typoid;
PG_RETURN_VOID();
{
Oid reloid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_heap_pg_class_oid = reloid;
PG_RETURN_VOID();
{
Oid reloid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_index_pg_class_oid = reloid;
PG_RETURN_VOID();
{
Oid reloid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_toast_pg_class_oid = reloid;
PG_RETURN_VOID();
{
Oid enumoid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_pg_enum_oid = enumoid;
PG_RETURN_VOID();
{
Oid authoid = PG_GETARG_OID(0);
+ CHECK_IS_BINARY_UPGRADE;
binary_upgrade_next_pg_authid_oid = authoid;
PG_RETURN_VOID();
}
Datum extCondition;
List *requiredExtensions;
+ CHECK_IS_BINARY_UPGRADE;
+
if (PG_ARGISNULL(4))
extConfig = PointerGetDatum(NULL);
else
*/
if (!OidIsValid(relid))
{
- /*
- * Use binary-upgrade override for pg_class.oid/relfilenode, if
- * supplied.
- */
+ /* Use binary-upgrade override for pg_class.oid/relfilenode? */
if (IsBinaryUpgrade &&
- OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
relkind == RELKIND_VIEW || relkind == RELKIND_MATVIEW ||
relkind == RELKIND_COMPOSITE_TYPE || relkind == RELKIND_FOREIGN_TABLE))
{
+ if (!OidIsValid(binary_upgrade_next_heap_pg_class_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_class heap OID value not set when in binary upgrade mode")));
+
relid = binary_upgrade_next_heap_pg_class_oid;
binary_upgrade_next_heap_pg_class_oid = InvalidOid;
}
+ /* There might be no TOAST table, so we have to test for it. */
else if (IsBinaryUpgrade &&
OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
relkind == RELKIND_TOASTVALUE)
*/
if (!OidIsValid(indexRelationId))
{
- /*
- * Use binary-upgrade override for pg_class.oid/relfilenode, if
- * supplied.
- */
- if (IsBinaryUpgrade &&
- OidIsValid(binary_upgrade_next_index_pg_class_oid))
+ /* Use binary-upgrade override for pg_class.oid/relfilenode? */
+ if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_index_pg_class_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_class index OID value not set when in binary upgrade mode")));
+
indexRelationId = binary_upgrade_next_index_pg_class_oid;
binary_upgrade_next_index_pg_class_oid = InvalidOid;
}
}
/* Get a new OID for the new label */
- if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
+ if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_pg_enum_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_enum OID value not set when in binary upgrade mode")));
+
/*
* Use binary-upgrade override for pg_enum.oid, if supplied. During
* binary upgrade, all pg_enum.oid's are set this way so they are
*/
tup = heap_form_tuple(tupDesc, values, nulls);
- /* Use binary-upgrade override for pg_type.oid, if supplied. */
- if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
+ /* Use binary-upgrade override for pg_type.oid? */
+ if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_pg_type_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_type OID value not set when in binary upgrade mode")));
+
HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
binary_upgrade_next_pg_type_oid = InvalidOid;
}
if (OidIsValid(newTypeOid))
HeapTupleSetOid(tup, newTypeOid);
/* Use binary-upgrade override for pg_type.oid, if supplied. */
- else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
+ else if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_pg_type_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_type OID value not set when in binary upgrade mode")));
+
HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
binary_upgrade_next_pg_type_oid = InvalidOid;
}
else
namespaceid = PG_TOAST_NAMESPACE;
- /* Use binary-upgrade override for pg_type.oid, if supplied. */
+ /*
+ * Use binary-upgrade override for pg_type.oid, if supplied. We might
+ * be in the post-schema-restore phase where we are doing ALTER TABLE
+ * to create TOAST tables that didn't exist in the old cluster.
+ */
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
{
toast_typid = binary_upgrade_next_toast_pg_type_oid;
{
Oid type_array_oid;
- /* Use binary-upgrade override for pg_type.typarray, if supplied. */
- if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
+ /* Use binary-upgrade override for pg_type.typarray? */
+ if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_array_pg_type_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_type array OID value not set when in binary upgrade mode")));
+
type_array_oid = binary_upgrade_next_array_pg_type_oid;
binary_upgrade_next_array_pg_type_oid = InvalidOid;
}
/*
* pg_largeobject_metadata contains pg_authid.oid's, so we use the
- * binary-upgrade override, if specified.
+ * binary-upgrade override.
*/
- if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
+ if (IsBinaryUpgrade)
{
+ if (!OidIsValid(binary_upgrade_next_pg_authid_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_authid OID value not set when in binary upgrade mode")));
+
HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
binary_upgrade_next_pg_authid_oid = InvalidOid;
}