Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit51d2e3b

Browse files
committed
Repair bug noticed by Deepak Bhole: a shell type should have a dependency
on its namespace, so that it will go away if the schema is dropped.
1 parentfe7f8f2 commit51d2e3b

File tree

3 files changed

+71
-43
lines changed

3 files changed

+71
-43
lines changed

‎src/backend/catalog/pg_type.c

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
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

106106
CatalogUpdateIndexes(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
*/
@@ -129,7 +144,7 @@ Oid
129144
TypeCreate(constchar*typeName,
130145
OidtypeNamespace,
131146
OidassignedTypeOid,
132-
OidrelationOid,/* only for 'c'atalogtypeType */
147+
OidrelationOid,/* only for 'c'atalogtypes */
133148
charrelationKind,/* ditto */
134149
int16internalSize,
135150
chartypeType,
@@ -149,6 +164,7 @@ TypeCreate(const char *typeName,
149164
{
150165
Relationpg_type_desc;
151166
OidtypeObjectId;
167+
boolrebuildDeps= false;
152168
HeapTupletup;
153169
charnulls[Natts_pg_type];
154170
charreplaces[Natts_pg_type];
@@ -268,6 +284,8 @@ TypeCreate(const char *typeName,
268284
simple_heap_update(pg_type_desc,&tup->t_self,tup);
269285

270286
typeObjectId=HeapTupleGetOid(tup);
287+
288+
rebuildDeps= true;/* get rid of shell type's dependencies */
271289
}
272290
else
273291
{
@@ -290,7 +308,6 @@ TypeCreate(const char *typeName,
290308
* Create dependencies. We can/must skip this in bootstrap mode.
291309
*/
292310
if (!IsBootstrapProcessingMode())
293-
{
294311
GenerateTypeDependencies(typeNamespace,
295312
typeObjectId,
296313
relationOid,
@@ -299,9 +316,10 @@ TypeCreate(const char *typeName,
299316
outputProcedure,
300317
elementType,
301318
baseType,
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,
311329
returntypeObjectId;
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+
*/
314341
void
315342
GenerateTypeDependencies(OidtypeNamespace,
316343
OidtypeObjectId,
317-
OidrelationOid,/* only for 'c'atalogtypeType */
318-
charrelationKind,
344+
OidrelationOid,/* only for 'c'atalogtypes */
345+
charrelationKind,/* ditto */
319346
OidinputProcedure,
320347
OidoutputProcedure,
321348
OidelementType,
322349
OidbaseType,
323-
char*defaultTypeBin,/* cooked rep */
350+
Node*defaultExpr,
324351
boolrebuild)
325352
{
326353
ObjectAddressmyself,
327354
referenced;
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-
*/
334356
if (rebuild)
335357
deleteDependencyRecordsFor(RelOid_pg_type,
336358
typeObjectId);
@@ -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,
406434
recordDependencyOn(&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
/*

‎src/backend/commands/typecmds.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.27 2003/01/06 00:31:44 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.28 2003/01/08 21:40:39 tgl Exp $
1212
*
1313
* DESCRIPTION
1414
* The "DefineFoo" routines take the parse tree and pick out the
@@ -1012,12 +1012,12 @@ AlterDomainDefault(List *names, Node *defaultRaw)
10121012
GenerateTypeDependencies(typTup->typnamespace,
10131013
domainoid,
10141014
typTup->typrelid,
1015-
InvalidOid,
1015+
0,/* relation kind is n/a */
10161016
typTup->typinput,
10171017
typTup->typoutput,
10181018
typTup->typelem,
10191019
typTup->typbasetype,
1020-
nodeToString(defaultExpr),
1020+
defaultExpr,
10211021
true);/* Rebuild is true */
10221022

10231023
/* Clean up */

‎src/include/catalog/pg_type.h

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
99
* Portions Copyright (c) 1994, Regents of the University of California
1010
*
11-
* $Id: pg_type.h,v 1.137 2002/12/06 05:00:31 momjian Exp $
11+
* $Id: pg_type.h,v 1.138 2003/01/08 21:40:39 tgl Exp $
1212
*
1313
* NOTES
1414
* the genbki.sh script reads this file and generates .bki
@@ -19,6 +19,8 @@
1919
#ifndefPG_TYPE_H
2020
#definePG_TYPE_H
2121

22+
#include"nodes/nodes.h"
23+
2224
/* ----------------
2325
*postgres.h contains the system type definitions and the
2426
*CATALOG(), BOOTSTRAP and DATA() sugar words so this file
@@ -537,7 +539,7 @@ DATA(insert OID = 2282 ( opaquePGNSP PGUID 4 t p t \054 0 0 opaque_in opaque
537539
*/
538540
externOidTypeShellMake(constchar*typeName,OidtypeNamespace);
539541

540-
externOidTypeCreate(constchar*typeName,
542+
externOidTypeCreate(constchar*typeName,
541543
OidtypeNamespace,
542544
OidassignedTypeOid,
543545
OidrelationOid,
@@ -558,21 +560,20 @@ extern Oid TypeCreate(const char *typeName,
558560
int32typNDims,
559561
booltypeNotNull);
560562

561-
externvoid
562-
GenerateTypeDependencies(OidtypeNamespace,
563-
OidtypeObjectId,
564-
OidrelationOid,/* only for 'c'atalog typeType */
565-
charrelationKind,
566-
OidinputProcedure,
567-
OidoutputProcedure,
568-
OidelementType,
569-
OidbaseType,
570-
char*defaultTypeBin,/* cooked rep */
571-
boolrebuild);
572-
563+
externvoidGenerateTypeDependencies(OidtypeNamespace,
564+
OidtypeObjectId,
565+
OidrelationOid,
566+
charrelationKind,
567+
OidinputProcedure,
568+
OidoutputProcedure,
569+
OidelementType,
570+
OidbaseType,
571+
Node*defaultExpr,
572+
boolrebuild);
573573

574574
externvoidTypeRename(constchar*oldTypeName,OidtypeNamespace,
575575
constchar*newTypeName);
576+
576577
externchar*makeArrayTypeName(constchar*typeName);
577578

578579
#endif/* PG_TYPE_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp