aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/pg_type.c79
-rw-r--r--src/backend/commands/typecmds.c6
-rw-r--r--src/include/catalog/pg_type.h29
3 files changed, 71 insertions, 43 deletions
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 476bfa61be6..66b6788eeef 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.85 2002/12/06 05:00:10 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.86 2003/01/08 21:40:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -106,6 +106,21 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
CatalogUpdateIndexes(pg_type_desc, tup);
/*
+ * Create dependencies. We can/must skip this in bootstrap mode.
+ */
+ if (!IsBootstrapProcessingMode())
+ GenerateTypeDependencies(typeNamespace,
+ typoid,
+ InvalidOid,
+ 0,
+ InvalidOid,
+ InvalidOid,
+ InvalidOid,
+ InvalidOid,
+ NULL,
+ false);
+
+ /*
* clean up and return the type-oid
*/
heap_freetuple(tup);
@@ -129,7 +144,7 @@ Oid
TypeCreate(const char *typeName,
Oid typeNamespace,
Oid assignedTypeOid,
- Oid relationOid, /* only for 'c'atalog typeType */
+ Oid relationOid, /* only for 'c'atalog types */
char relationKind, /* ditto */
int16 internalSize,
char typeType,
@@ -149,6 +164,7 @@ TypeCreate(const char *typeName,
{
Relation pg_type_desc;
Oid typeObjectId;
+ bool rebuildDeps = false;
HeapTuple tup;
char nulls[Natts_pg_type];
char replaces[Natts_pg_type];
@@ -268,6 +284,8 @@ TypeCreate(const char *typeName,
simple_heap_update(pg_type_desc, &tup->t_self, tup);
typeObjectId = HeapTupleGetOid(tup);
+
+ rebuildDeps = true; /* get rid of shell type's dependencies */
}
else
{
@@ -290,7 +308,6 @@ TypeCreate(const char *typeName,
* Create dependencies. We can/must skip this in bootstrap mode.
*/
if (!IsBootstrapProcessingMode())
- {
GenerateTypeDependencies(typeNamespace,
typeObjectId,
relationOid,
@@ -299,9 +316,10 @@ TypeCreate(const char *typeName,
outputProcedure,
elementType,
baseType,
- defaultTypeBin,
- false);
- }
+ (defaultTypeBin ?
+ stringToNode(defaultTypeBin) :
+ (void *) NULL),
+ rebuildDeps);
/*
* finish up
@@ -311,26 +329,30 @@ TypeCreate(const char *typeName,
return typeObjectId;
}
+/*
+ * GenerateTypeDependencies: build the dependencies needed for a type
+ *
+ * If rebuild is true, we remove existing dependencies and rebuild them
+ * from scratch. This is needed for ALTER TYPE, and also when replacing
+ * a shell type.
+ *
+ * NOTE: a shell type will have a dependency to its namespace, and no others.
+ */
void
GenerateTypeDependencies(Oid typeNamespace,
Oid typeObjectId,
- Oid relationOid, /* only for 'c'atalog typeType */
- char relationKind,
+ Oid relationOid, /* only for 'c'atalog types */
+ char relationKind, /* ditto */
Oid inputProcedure,
Oid outputProcedure,
Oid elementType,
Oid baseType,
- char *defaultTypeBin, /* cooked rep */
+ Node *defaultExpr,
bool rebuild)
{
ObjectAddress myself,
referenced;
- /*
- * If true, we need to remove all current dependencies that the type
- * holds, and rebuild them from scratch. This allows us to easily
- * implement alter type, and alter domain statements.
- */
if (rebuild)
deleteDependencyRecordsFor(RelOid_pg_type,
typeObjectId);
@@ -350,15 +372,21 @@ GenerateTypeDependencies(Oid typeNamespace,
}
/* Normal dependencies on the I/O functions */
- referenced.classId = RelOid_pg_proc;
- referenced.objectId = inputProcedure;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ if (OidIsValid(inputProcedure))
+ {
+ referenced.classId = RelOid_pg_proc;
+ referenced.objectId = inputProcedure;
+ referenced.objectSubId = 0;
+ recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ }
- referenced.classId = RelOid_pg_proc;
- referenced.objectId = outputProcedure;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ if (OidIsValid(outputProcedure))
+ {
+ referenced.classId = RelOid_pg_proc;
+ referenced.objectId = outputProcedure;
+ referenced.objectSubId = 0;
+ recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ }
/*
* If the type is a rowtype for a relation, mark it as internally
@@ -406,10 +434,9 @@ GenerateTypeDependencies(Oid typeNamespace,
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
}
- /* Dependency on the default expression */
- if (defaultTypeBin)
- recordDependencyOnExpr(&myself, stringToNode(defaultTypeBin),
- NIL, DEPENDENCY_NORMAL);
+ /* Normal dependency on the default expression. */
+ if (defaultExpr)
+ recordDependencyOnExpr(&myself, defaultExpr, NIL, DEPENDENCY_NORMAL);
}
/*
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index bd29033c729..7d4ff1f0b64 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.27 2003/01/06 00:31:44 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.28 2003/01/08 21:40:39 tgl Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
@@ -1012,12 +1012,12 @@ AlterDomainDefault(List *names, Node *defaultRaw)
GenerateTypeDependencies(typTup->typnamespace,
domainoid,
typTup->typrelid,
- InvalidOid,
+ 0, /* relation kind is n/a */
typTup->typinput,
typTup->typoutput,
typTup->typelem,
typTup->typbasetype,
- nodeToString(defaultExpr),
+ defaultExpr,
true); /* Rebuild is true */
/* Clean up */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index dc8b9f617e0..fa19d84508a 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_type.h,v 1.137 2002/12/06 05:00:31 momjian Exp $
+ * $Id: pg_type.h,v 1.138 2003/01/08 21:40:39 tgl Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@@ -19,6 +19,8 @@
#ifndef PG_TYPE_H
#define PG_TYPE_H
+#include "nodes/nodes.h"
+
/* ----------------
* postgres.h contains the system type definitions and the
* CATALOG(), BOOTSTRAP and DATA() sugar words so this file
@@ -537,7 +539,7 @@ DATA(insert OID = 2282 ( opaque PGNSP PGUID 4 t p t \054 0 0 opaque_in opaque
*/
extern Oid TypeShellMake(const char *typeName, Oid typeNamespace);
-extern Oid TypeCreate(const char *typeName,
+extern Oid TypeCreate(const char *typeName,
Oid typeNamespace,
Oid assignedTypeOid,
Oid relationOid,
@@ -558,21 +560,20 @@ extern Oid TypeCreate(const char *typeName,
int32 typNDims,
bool typeNotNull);
-extern void
-GenerateTypeDependencies(Oid typeNamespace,
- Oid typeObjectId,
- Oid relationOid, /* only for 'c'atalog typeType */
- char relationKind,
- Oid inputProcedure,
- Oid outputProcedure,
- Oid elementType,
- Oid baseType,
- char *defaultTypeBin, /* cooked rep */
- bool rebuild);
-
+extern void GenerateTypeDependencies(Oid typeNamespace,
+ Oid typeObjectId,
+ Oid relationOid,
+ char relationKind,
+ Oid inputProcedure,
+ Oid outputProcedure,
+ Oid elementType,
+ Oid baseType,
+ Node *defaultExpr,
+ bool rebuild);
extern void TypeRename(const char *oldTypeName, Oid typeNamespace,
const char *newTypeName);
+
extern char *makeArrayTypeName(const char *typeName);
#endif /* PG_TYPE_H */