88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.85 2002/12/06 05:00:10 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.86 2003/01/08 21:40:39 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -105,6 +105,21 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
105105
106106CatalogUpdateIndexes (pg_type_desc ,tup );
107107
108+ /*
109+ * Create dependencies. We can/must skip this in bootstrap mode.
110+ */
111+ if (!IsBootstrapProcessingMode ())
112+ GenerateTypeDependencies (typeNamespace ,
113+ typoid ,
114+ InvalidOid ,
115+ 0 ,
116+ InvalidOid ,
117+ InvalidOid ,
118+ InvalidOid ,
119+ InvalidOid ,
120+ NULL ,
121+ false);
122+
108123/*
109124 * clean up and return the type-oid
110125 */
129144TypeCreate (const char * typeName ,
130145Oid typeNamespace ,
131146Oid assignedTypeOid ,
132- Oid relationOid ,/* only for 'c'atalogtypeType */
147+ Oid relationOid ,/* only for 'c'atalogtypes */
133148char relationKind ,/* ditto */
134149int16 internalSize ,
135150char typeType ,
@@ -149,6 +164,7 @@ TypeCreate(const char *typeName,
149164{
150165Relation pg_type_desc ;
151166Oid typeObjectId ;
167+ bool rebuildDeps = false;
152168HeapTuple tup ;
153169char nulls [Natts_pg_type ];
154170char replaces [Natts_pg_type ];
@@ -268,6 +284,8 @@ TypeCreate(const char *typeName,
268284simple_heap_update (pg_type_desc ,& tup -> t_self ,tup );
269285
270286typeObjectId = HeapTupleGetOid (tup );
287+
288+ rebuildDeps = true;/* get rid of shell type's dependencies */
271289}
272290else
273291{
@@ -290,7 +308,6 @@ TypeCreate(const char *typeName,
290308 * Create dependencies. We can/must skip this in bootstrap mode.
291309 */
292310if (!IsBootstrapProcessingMode ())
293- {
294311GenerateTypeDependencies (typeNamespace ,
295312typeObjectId ,
296313relationOid ,
@@ -299,9 +316,10 @@ TypeCreate(const char *typeName,
299316outputProcedure ,
300317elementType ,
301318baseType ,
302- defaultTypeBin ,
303- false);
304- }
319+ (defaultTypeBin ?
320+ stringToNode (defaultTypeBin ) :
321+ (void * )NULL ),
322+ rebuildDeps );
305323
306324/*
307325 * finish up
@@ -311,26 +329,30 @@ TypeCreate(const char *typeName,
311329return typeObjectId ;
312330}
313331
332+ /*
333+ * GenerateTypeDependencies: build the dependencies needed for a type
334+ *
335+ * If rebuild is true, we remove existing dependencies and rebuild them
336+ * from scratch. This is needed for ALTER TYPE, and also when replacing
337+ * a shell type.
338+ *
339+ * NOTE: a shell type will have a dependency to its namespace, and no others.
340+ */
314341void
315342GenerateTypeDependencies (Oid typeNamespace ,
316343Oid typeObjectId ,
317- Oid relationOid ,/* only for 'c'atalogtypeType */
318- char relationKind ,
344+ Oid relationOid ,/* only for 'c'atalogtypes */
345+ char relationKind ,/* ditto */
319346Oid inputProcedure ,
320347Oid outputProcedure ,
321348Oid elementType ,
322349Oid baseType ,
323- char * defaultTypeBin , /* cooked rep */
350+ Node * defaultExpr ,
324351bool rebuild )
325352{
326353ObjectAddress myself ,
327354referenced ;
328355
329- /*
330- * If true, we need to remove all current dependencies that the type
331- * holds, and rebuild them from scratch. This allows us to easily
332- * implement alter type, and alter domain statements.
333- */
334356if (rebuild )
335357deleteDependencyRecordsFor (RelOid_pg_type ,
336358typeObjectId );
@@ -350,15 +372,21 @@ GenerateTypeDependencies(Oid typeNamespace,
350372}
351373
352374/* Normal dependencies on the I/O functions */
353- referenced .classId = RelOid_pg_proc ;
354- referenced .objectId = inputProcedure ;
355- referenced .objectSubId = 0 ;
356- recordDependencyOn (& myself ,& referenced ,DEPENDENCY_NORMAL );
375+ if (OidIsValid (inputProcedure ))
376+ {
377+ referenced .classId = RelOid_pg_proc ;
378+ referenced .objectId = inputProcedure ;
379+ referenced .objectSubId = 0 ;
380+ recordDependencyOn (& myself ,& referenced ,DEPENDENCY_NORMAL );
381+ }
357382
358- referenced .classId = RelOid_pg_proc ;
359- referenced .objectId = outputProcedure ;
360- referenced .objectSubId = 0 ;
361- recordDependencyOn (& myself ,& referenced ,DEPENDENCY_NORMAL );
383+ if (OidIsValid (outputProcedure ))
384+ {
385+ referenced .classId = RelOid_pg_proc ;
386+ referenced .objectId = outputProcedure ;
387+ referenced .objectSubId = 0 ;
388+ recordDependencyOn (& myself ,& referenced ,DEPENDENCY_NORMAL );
389+ }
362390
363391/*
364392 * If the type is a rowtype for a relation, mark it as internally
@@ -406,10 +434,9 @@ GenerateTypeDependencies(Oid typeNamespace,
406434recordDependencyOn (& myself ,& referenced ,DEPENDENCY_NORMAL );
407435}
408436
409- /* Dependency on the default expression */
410- if (defaultTypeBin )
411- recordDependencyOnExpr (& myself ,stringToNode (defaultTypeBin ),
412- NIL ,DEPENDENCY_NORMAL );
437+ /* Normal dependency on the default expression. */
438+ if (defaultExpr )
439+ recordDependencyOnExpr (& myself ,defaultExpr ,NIL ,DEPENDENCY_NORMAL );
413440}
414441
415442/*