|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.291 2009/09/2618:24:49 tgl Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.292 2009/09/2623:08:22 tgl Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -203,8 +203,9 @@ static bool load_relcache_init_file(bool shared);
|
203 | 203 | staticvoidwrite_relcache_init_file(boolshared);
|
204 | 204 | staticvoidwrite_item(constvoid*data,Sizelen,FILE*fp);
|
205 | 205 |
|
206 |
| -staticvoidformrdesc(constchar*relationName,boolisshared, |
207 |
| -boolhasoids,intnatts,constFormData_pg_attribute*attrs); |
| 206 | +staticvoidformrdesc(constchar*relationName,OidrelationReltype, |
| 207 | +boolisshared,boolhasoids, |
| 208 | +intnatts,constFormData_pg_attribute*attrs); |
208 | 209 |
|
209 | 210 | staticHeapTupleScanPgRelation(OidtargetRelId,boolindexOK);
|
210 | 211 | staticRelationAllocateRelationDesc(Relationrelation,Form_pg_classrelp);
|
@@ -1374,8 +1375,9 @@ LookupOpclassInfo(Oid operatorClassOid,
|
1374 | 1375 | * NOTE: we assume we are already switched into CacheMemoryContext.
|
1375 | 1376 | */
|
1376 | 1377 | staticvoid
|
1377 |
| -formrdesc(constchar*relationName,boolisshared, |
1378 |
| -boolhasoids,intnatts,constFormData_pg_attribute*attrs) |
| 1378 | +formrdesc(constchar*relationName,OidrelationReltype, |
| 1379 | +boolisshared,boolhasoids, |
| 1380 | +intnatts,constFormData_pg_attribute*attrs) |
1379 | 1381 | {
|
1380 | 1382 | Relationrelation;
|
1381 | 1383 | inti;
|
@@ -1420,6 +1422,7 @@ formrdesc(const char *relationName, bool isshared,
|
1420 | 1422 |
|
1421 | 1423 | namestrcpy(&relation->rd_rel->relname,relationName);
|
1422 | 1424 | relation->rd_rel->relnamespace=PG_CATALOG_NAMESPACE;
|
| 1425 | +relation->rd_rel->reltype=relationReltype; |
1423 | 1426 |
|
1424 | 1427 | /*
|
1425 | 1428 | * It's important to distinguish between shared and non-shared relations,
|
@@ -1451,6 +1454,9 @@ formrdesc(const char *relationName, bool isshared,
|
1451 | 1454 | relation->rd_att=CreateTemplateTupleDesc(natts,hasoids);
|
1452 | 1455 | relation->rd_att->tdrefcount=1;/* mark as refcounted */
|
1453 | 1456 |
|
| 1457 | +relation->rd_att->tdtypeid=relationReltype; |
| 1458 | +relation->rd_att->tdtypmod=-1;/* unnecessary, but... */ |
| 1459 | + |
1454 | 1460 | /*
|
1455 | 1461 | * initialize tuple desc info
|
1456 | 1462 | */
|
@@ -2558,7 +2564,7 @@ RelationCacheInitializePhase2(void)
|
2558 | 2564 | */
|
2559 | 2565 | if (!load_relcache_init_file(true))
|
2560 | 2566 | {
|
2561 |
| -formrdesc("pg_database", true, |
| 2567 | +formrdesc("pg_database",DatabaseRelation_Rowtype_Id,true, |
2562 | 2568 | true,Natts_pg_database,Desc_pg_database);
|
2563 | 2569 |
|
2564 | 2570 | #defineNUM_CRITICAL_SHARED_RELS1/* fix if you change list above */
|
@@ -2604,13 +2610,13 @@ RelationCacheInitializePhase3(void)
|
2604 | 2610 | {
|
2605 | 2611 | needNewCacheFile= true;
|
2606 | 2612 |
|
2607 |
| -formrdesc("pg_class", false, |
| 2613 | +formrdesc("pg_class",RelationRelation_Rowtype_Id,false, |
2608 | 2614 | true,Natts_pg_class,Desc_pg_class);
|
2609 |
| -formrdesc("pg_attribute", false, |
| 2615 | +formrdesc("pg_attribute",AttributeRelation_Rowtype_Id,false, |
2610 | 2616 | false,Natts_pg_attribute,Desc_pg_attribute);
|
2611 |
| -formrdesc("pg_proc", false, |
| 2617 | +formrdesc("pg_proc",ProcedureRelation_Rowtype_Id,false, |
2612 | 2618 | true,Natts_pg_proc,Desc_pg_proc);
|
2613 |
| -formrdesc("pg_type", false, |
| 2619 | +formrdesc("pg_type",TypeRelation_Rowtype_Id,false, |
2614 | 2620 | true,Natts_pg_type,Desc_pg_type);
|
2615 | 2621 |
|
2616 | 2622 | #defineNUM_CRITICAL_LOCAL_RELS4/* fix if you change list above */
|
@@ -2738,11 +2744,14 @@ RelationCacheInitializePhase3(void)
|
2738 | 2744 | RelationParseRelOptions(relation,htup);
|
2739 | 2745 |
|
2740 | 2746 | /*
|
2741 |
| - * Also update the derived fields in rd_att. |
| 2747 | + * Check the values in rd_att were set up correctly. (We cannot |
| 2748 | + * just copy them over now: formrdesc must have set up the |
| 2749 | + * rd_att data correctly to start with, because it may already |
| 2750 | + * have been copied into one or more catcache entries.) |
2742 | 2751 | */
|
2743 |
| -relation->rd_att->tdtypeid=relp->reltype; |
2744 |
| -relation->rd_att->tdtypmod=-1;/* unnecessary, but... */ |
2745 |
| -relation->rd_att->tdhasoid=relp->relhasoids; |
| 2752 | +Assert(relation->rd_att->tdtypeid==relp->reltype); |
| 2753 | +Assert(relation->rd_att->tdtypmod==-1); |
| 2754 | +Assert(relation->rd_att->tdhasoid==relp->relhasoids); |
2746 | 2755 |
|
2747 | 2756 | ReleaseSysCache(htup);
|
2748 | 2757 |
|
|