aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2009-12-24 22:09:24 +0000
committerBruce Momjian <bruce@momjian.us>2009-12-24 22:09:24 +0000
commitc44327afa4f22fc5f9dfef83b7ec377f001f0930 (patch)
tree1bd28dfe4ada9dde5305a8d0be93610e67d7bf6e /src/backend
parent668e37d13853b29f5549e78aaf678a32d19b9b8e (diff)
downloadpostgresql-c44327afa4f22fc5f9dfef83b7ec377f001f0930.tar.gz
postgresql-c44327afa4f22fc5f9dfef83b7ec377f001f0930.zip
Binary upgrade:
Modify pg_dump --binary-upgrade and add backend support routines to support the preservation of pg_type oids when doing a binary upgrade. This allows user-defined composite types and arrays to be binary upgraded.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/catalog/heap.c10
-rw-r--r--src/backend/catalog/pg_type.c19
-rw-r--r--src/backend/catalog/toasting.c12
-rw-r--r--src/backend/commands/typecmds.c42
4 files changed, 59 insertions, 24 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 8b8fcea7343..0f33c525b61 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.361 2009/12/07 05:22:21 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.362 2009/12/24 22:09:23 momjian Exp $
*
*
* INTERFACE ROUTINES
@@ -1001,13 +1001,7 @@ heap_create_with_catalog(const char *relname,
if (IsUnderPostmaster && (relkind == RELKIND_RELATION ||
relkind == RELKIND_VIEW ||
relkind == RELKIND_COMPOSITE_TYPE))
- {
- /* OK, so pre-assign a type OID for the array type */
- Relation pg_type = heap_open(TypeRelationId, AccessShareLock);
-
- new_array_oid = GetNewOid(pg_type);
- heap_close(pg_type, AccessShareLock);
- }
+ new_array_oid = AssignTypeArrayOid();
/*
* Since defining a relation also defines a complex type, we add a new
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 8bdea061538..1f548cc94b6 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.127 2009/08/16 18:14:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.128 2009/12/24 22:09:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -32,6 +32,7 @@
#include "utils/rel.h"
#include "utils/syscache.h"
+Oid binary_upgrade_next_pg_type_oid = InvalidOid;
/* ----------------------------------------------------------------
* TypeShellMake
@@ -119,6 +120,12 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
*/
tup = heap_form_tuple(tupDesc, values, nulls);
+ if (OidIsValid(binary_upgrade_next_pg_type_oid))
+ {
+ HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
+ binary_upgrade_next_pg_type_oid = InvalidOid;
+ }
+
/*
* insert the tuple in the relation and get the tuple's oid.
*/
@@ -409,10 +416,16 @@ TypeCreate(Oid newTypeOid,
values,
nulls);
- /* Force the OID if requested by caller, else heap_insert does it */
+ /* Force the OID if requested by caller */
if (OidIsValid(newTypeOid))
HeapTupleSetOid(tup, newTypeOid);
-
+ else if (OidIsValid(binary_upgrade_next_pg_type_oid))
+ {
+ HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
+ binary_upgrade_next_pg_type_oid = InvalidOid;
+ }
+ /* else allow system to assign oid */
+
typeObjectId = simple_heap_insert(pg_type_desc, tup);
}
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
index a8c2da66dc3..eef47dd5328 100644
--- a/src/backend/catalog/toasting.c
+++ b/src/backend/catalog/toasting.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/toasting.c,v 1.22 2009/12/23 02:35:18 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/toasting.c,v 1.23 2009/12/24 22:09:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -31,6 +31,7 @@
#include "utils/builtins.h"
#include "utils/syscache.h"
+Oid binary_upgrade_next_pg_type_toast_oid = InvalidOid;
static bool create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
Datum reloptions, bool force);
@@ -121,6 +122,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
Relation class_rel;
Oid toast_relid;
Oid toast_idxid;
+ Oid toast_typid = InvalidOid;
Oid namespaceid;
char toast_relname[NAMEDATALEN];
char toast_idxname[NAMEDATALEN];
@@ -199,11 +201,17 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
else
namespaceid = PG_TOAST_NAMESPACE;
+ if (OidIsValid(binary_upgrade_next_pg_type_toast_oid))
+ {
+ toast_typid = binary_upgrade_next_pg_type_toast_oid;
+ binary_upgrade_next_pg_type_toast_oid = InvalidOid;
+ }
+
toast_relid = heap_create_with_catalog(toast_relname,
namespaceid,
rel->rd_rel->reltablespace,
toastOid,
- InvalidOid,
+ toast_typid,
rel->rd_rel->relowner,
tupdesc,
NIL,
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index a11825c8a91..11990c0e106 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.140 2009/12/19 00:47:57 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.141 2009/12/24 22:09:23 momjian Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
@@ -74,6 +74,7 @@ typedef struct
/* atts[] is of allocated length RelationGetNumberOfAttributes(rel) */
} RelToCheck;
+Oid binary_upgrade_next_pg_type_array_oid = InvalidOid;
static Oid findTypeInputFunction(List *procname, Oid typeOid);
static Oid findTypeOutputFunction(List *procname, Oid typeOid);
@@ -143,7 +144,6 @@ DefineType(List *names, List *parameters)
Oid array_oid;
Oid typoid;
Oid resulttype;
- Relation pg_type;
ListCell *pl;
/*
@@ -522,10 +522,7 @@ DefineType(List *names, List *parameters)
NameListToString(analyzeName));
#endif
- /* Preassign array type OID so we can insert it in pg_type.typarray */
- pg_type = heap_open(TypeRelationId, AccessShareLock);
- array_oid = GetNewOid(pg_type);
- heap_close(pg_type, AccessShareLock);
+ array_oid = AssignTypeArrayOid();
/*
* now have TypeCreate do all the real work.
@@ -1101,7 +1098,6 @@ DefineEnum(CreateEnumStmt *stmt)
AclResult aclresult;
Oid old_type_oid;
Oid enumArrayOid;
- Relation pg_type;
/* Convert list of names to a name and namespace */
enumNamespace = QualifiedNameGetCreationNamespace(stmt->typeName,
@@ -1129,10 +1125,7 @@ DefineEnum(CreateEnumStmt *stmt)
errmsg("type \"%s\" already exists", enumName)));
}
- /* Preassign array type OID so we can insert it in pg_type.typarray */
- pg_type = heap_open(TypeRelationId, AccessShareLock);
- enumArrayOid = GetNewOid(pg_type);
- heap_close(pg_type, AccessShareLock);
+ enumArrayOid = AssignTypeArrayOid();
/* Create the pg_type entry */
enumTypeOid =
@@ -1470,6 +1463,33 @@ findTypeAnalyzeFunction(List *procname, Oid typeOid)
return procOid;
}
+/*
+ * AssignTypeArrayOid
+ *
+ * Pre-assign the type's array OID for use in pg_type.typarray
+ */
+Oid
+AssignTypeArrayOid(void)
+{
+ Oid type_array_oid;
+
+ /* Pre-assign the type's array OID for use in pg_type.typarray */
+ if (OidIsValid(binary_upgrade_next_pg_type_array_oid))
+ {
+ type_array_oid = binary_upgrade_next_pg_type_array_oid;
+ binary_upgrade_next_pg_type_array_oid = InvalidOid;
+ }
+ else
+ {
+ Relation pg_type = heap_open(TypeRelationId, AccessShareLock);
+
+ type_array_oid = GetNewOid(pg_type);
+ heap_close(pg_type, AccessShareLock);
+ }
+
+ return type_array_oid;
+}
+
/*-------------------------------------------------------------------
* DefineCompositeType