mirror of
https://github.com/postgres/postgres.git
synced 2025-05-12 16:21:30 +03:00
This follows recent discussions, so it's quite a bit different from Dimitri's original. There will probably be more changes once we get a bit of experience with it, but let's get it in and start playing with it. This is still just core code. I'll start converting contrib modules shortly. Dimitri Fontaine and Tom Lane
200 lines
4.5 KiB
C
200 lines
4.5 KiB
C
/*
|
|
* 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-2011, PostgreSQL Global Development Group
|
|
* contrib/pg_upgrade_support/pg_upgrade_support.c
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "fmgr.h"
|
|
#include "catalog/dependency.h"
|
|
#include "catalog/namespace.h"
|
|
#include "catalog/pg_class.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();
|
|
}
|