/* * pg_upgrade_support.c * * server-side functions to set backend global variables * to control oid and relfilenode assignment, and do other special * hacks needed for pg_upgrade. * * Copyright (c) 2010-2012, PostgreSQL Global Development Group * contrib/pg_upgrade_support/pg_upgrade_support.c */ #include "postgres.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/extension.h" #include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" /* THIS IS USED ONLY FOR PG >= 9.0 */ #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_array_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_heap_pg_class_oid; extern PGDLLIMPORT Oid binary_upgrade_next_index_pg_class_oid; extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_class_oid; extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid; extern PGDLLIMPORT Oid binary_upgrade_next_pg_authid_oid; Datum set_next_pg_type_oid(PG_FUNCTION_ARGS); Datum set_next_array_pg_type_oid(PG_FUNCTION_ARGS); Datum set_next_toast_pg_type_oid(PG_FUNCTION_ARGS); Datum set_next_heap_pg_class_oid(PG_FUNCTION_ARGS); Datum set_next_index_pg_class_oid(PG_FUNCTION_ARGS); Datum set_next_toast_pg_class_oid(PG_FUNCTION_ARGS); Datum set_next_pg_enum_oid(PG_FUNCTION_ARGS); Datum set_next_pg_authid_oid(PG_FUNCTION_ARGS); Datum create_empty_extension(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(set_next_pg_type_oid); PG_FUNCTION_INFO_V1(set_next_array_pg_type_oid); PG_FUNCTION_INFO_V1(set_next_toast_pg_type_oid); PG_FUNCTION_INFO_V1(set_next_heap_pg_class_oid); PG_FUNCTION_INFO_V1(set_next_index_pg_class_oid); PG_FUNCTION_INFO_V1(set_next_toast_pg_class_oid); PG_FUNCTION_INFO_V1(set_next_pg_enum_oid); PG_FUNCTION_INFO_V1(set_next_pg_authid_oid); PG_FUNCTION_INFO_V1(create_empty_extension); Datum set_next_pg_type_oid(PG_FUNCTION_ARGS) { Oid typoid = PG_GETARG_OID(0); binary_upgrade_next_pg_type_oid = typoid; PG_RETURN_VOID(); } Datum set_next_array_pg_type_oid(PG_FUNCTION_ARGS) { Oid typoid = PG_GETARG_OID(0); binary_upgrade_next_array_pg_type_oid = typoid; PG_RETURN_VOID(); } Datum set_next_toast_pg_type_oid(PG_FUNCTION_ARGS) { Oid typoid = PG_GETARG_OID(0); binary_upgrade_next_toast_pg_type_oid = typoid; PG_RETURN_VOID(); } Datum set_next_heap_pg_class_oid(PG_FUNCTION_ARGS) { Oid reloid = PG_GETARG_OID(0); binary_upgrade_next_heap_pg_class_oid = reloid; PG_RETURN_VOID(); } Datum set_next_index_pg_class_oid(PG_FUNCTION_ARGS) { Oid reloid = PG_GETARG_OID(0); binary_upgrade_next_index_pg_class_oid = reloid; PG_RETURN_VOID(); } Datum set_next_toast_pg_class_oid(PG_FUNCTION_ARGS) { Oid reloid = PG_GETARG_OID(0); binary_upgrade_next_toast_pg_class_oid = reloid; PG_RETURN_VOID(); } Datum set_next_pg_enum_oid(PG_FUNCTION_ARGS) { Oid enumoid = PG_GETARG_OID(0); binary_upgrade_next_pg_enum_oid = enumoid; PG_RETURN_VOID(); } Datum set_next_pg_authid_oid(PG_FUNCTION_ARGS) { Oid authoid = PG_GETARG_OID(0); binary_upgrade_next_pg_authid_oid = authoid; PG_RETURN_VOID(); } Datum create_empty_extension(PG_FUNCTION_ARGS) { text *extName = PG_GETARG_TEXT_PP(0); text *schemaName = PG_GETARG_TEXT_PP(1); bool relocatable = PG_GETARG_BOOL(2); text *extVersion = PG_GETARG_TEXT_PP(3); Datum extConfig; Datum extCondition; List *requiredExtensions; if (PG_ARGISNULL(4)) extConfig = PointerGetDatum(NULL); else extConfig = PG_GETARG_DATUM(4); if (PG_ARGISNULL(5)) extCondition = PointerGetDatum(NULL); else extCondition = PG_GETARG_DATUM(5); requiredExtensions = NIL; if (!PG_ARGISNULL(6)) { ArrayType *textArray = PG_GETARG_ARRAYTYPE_P(6); Datum *textDatums; int ndatums; int i; deconstruct_array(textArray, TEXTOID, -1, false, 'i', &textDatums, NULL, &ndatums); for (i = 0; i < ndatums; i++) { text *txtname = DatumGetTextPP(textDatums[i]); char *extName = text_to_cstring(txtname); Oid extOid = get_extension_oid(extName, false); requiredExtensions = lappend_oid(requiredExtensions, extOid); } } InsertExtensionTuple(text_to_cstring(extName), GetUserId(), get_namespace_oid(text_to_cstring(schemaName), false), relocatable, text_to_cstring(extVersion), extConfig, extCondition, requiredExtensions); PG_RETURN_VOID(); }