diff options
Diffstat (limited to 'src/backend/catalog/heap.c')
-rw-r--r-- | src/backend/catalog/heap.c | 196 |
1 files changed, 15 insertions, 181 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 451eb7f7de2..7aeec8adb08 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.132 2000/06/17 23:41:31 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.133 2000/06/18 22:43:55 tgl Exp $ * * * INTERFACE ROUTINES @@ -70,14 +70,11 @@ static void AddNewRelationTuple(Relation pg_class_desc, Relation new_rel_desc, Oid new_rel_oid, int natts, char relkind, char *temp_relname); -static void AddToNoNameRelList(Relation r); - static void DeleteAttributeTuples(Relation rel); static void DeleteRelationTuple(Relation rel); static void DeleteTypeTuple(Relation rel); static void RelationRemoveIndexes(Relation relation); static void RelationRemoveInheritance(Relation relation); -static void RemoveFromNoNameRelList(Relation r); static void AddNewRelationType(char *typeName, Oid new_rel_oid); static void StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin, bool updatePgAttribute); @@ -141,22 +138,6 @@ static Form_pg_attribute HeapAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6}; * ---------------------------------------------------------------- */ -/* the tempRelList holds - the list of temporary uncatalogued relations that are created. - these relations should be destroyed at the end of transactions -*/ -typedef struct tempRelList -{ - Relation *rels; /* array of relation descriptors */ - int num; /* number of temporary relations */ - int size; /* size of space allocated for the rels - * array */ -} TempRelList; - -#define NONAME_REL_LIST_SIZE 32 - -static TempRelList *tempRels = NULL; - /* ---------------------------------------------------------------- * heap_create - Create an uncataloged heap relation @@ -170,15 +151,16 @@ static TempRelList *tempRels = NULL; * Eventually, must place information about this temporary relation * into the transaction context block. * + * NOTE: if istemp is TRUE then heap_create will overwrite relname with + * the unique "real" name chosen for the temp relation. * - * if heap_create is called with "" as the name, then heap_create will create - * a temporary name "pg_noname.$PID.$SEQUENCE" for the relation + * If storage_create is TRUE then heap_storage_create is called here, + * else caller must call heap_storage_create later. * ---------------------------------------------------------------- */ Relation heap_create(char *relname, TupleDesc tupDesc, - bool isnoname, bool istemp, bool storage_create) { @@ -245,18 +227,11 @@ heap_create(char *relname, else relid = newoid(); - if (isnoname) - { - Assert(!relname); - relname = palloc(NAMEDATALEN); - snprintf(relname, NAMEDATALEN, "pg_noname.%d.%u", - (int) MyProcPid, uniqueId++); - } - if (istemp) { - /* replace relname of caller */ - snprintf(relname, NAMEDATALEN, "pg_temp.%d.%u", MyProcPid, uniqueId++); + /* replace relname of caller with a unique name for a temp relation */ + snprintf(relname, NAMEDATALEN, "pg_temp.%d.%u", + (int) MyProcPid, uniqueId++); } /* ---------------- @@ -268,7 +243,7 @@ heap_create(char *relname, rel = (Relation) palloc(len); MemSet((char *) rel, 0, len); rel->rd_fd = -1; /* table is not open */ - rel->rd_unlinked = TRUE; /* table is not created yet */ + rel->rd_unlinked = true; /* table is not created yet */ /* * create a new tuple descriptor from the one passed in @@ -311,12 +286,6 @@ heap_create(char *relname, } /* ---------------- - * remember if this is a noname relation - * ---------------- - */ - rel->rd_isnoname = isnoname; - - /* ---------------- * have the storage manager create the relation. * ---------------- */ @@ -329,13 +298,6 @@ heap_create(char *relname, MemoryContextSwitchTo(oldcxt); - /* - * add all noname relations to the tempRels list so they can be - * properly disposed of at the end of transaction - */ - if (isnoname) - AddToNoNameRelList(rel); - return rel; } @@ -347,7 +309,7 @@ heap_storage_create(Relation rel) if (rel->rd_unlinked) { rel->rd_fd = (File) smgrcreate(DEFAULT_SMGR, rel); - rel->rd_unlinked = FALSE; + rel->rd_unlinked = false; smgrcall = true; } return smgrcall; @@ -810,7 +772,7 @@ heap_create_with_catalog(char *relname, * get_temp_rel_by_username() couldn't check the simultaneous * creation. Uniqueness will be really checked by unique * indexes of system tables but we couldn't check it here. - * We have to pospone to create the disk file for this + * We have to postpone creating the disk file for this * relation. * Another boolean parameter "storage_create" was added * to heap_create() function. If the parameter is false @@ -821,12 +783,12 @@ heap_create_with_catalog(char *relname, * relation descriptor. * * Note: The call to heap_create() changes relname for - * noname and temp tables. + * temp tables; it becomes the true physical relname. * The call to heap_storage_create() does all the "real" * work of creating the disk file for the relation. * ---------------- */ - new_rel_desc = heap_create(relname, tupdesc, false, istemp, false); + new_rel_desc = heap_create(relname, tupdesc, istemp, false); new_rel_oid = new_rel_desc->rd_att->attrs[0]->attrelid; @@ -1546,10 +1508,9 @@ heap_drop_with_catalog(const char *relname) * unlink the relation's physical file and finish up. * ---------------- */ - if (!(rel->rd_isnoname) || !(rel->rd_unlinked)) + if (! rel->rd_unlinked) smgrunlink(DEFAULT_SMGR, rel); - - rel->rd_unlinked = TRUE; + rel->rd_unlinked = true; /* * Close relcache entry, but *keep* AccessExclusiveLock on the @@ -1568,133 +1529,6 @@ heap_drop_with_catalog(const char *relname) remove_temp_relation(rid); } -/* - * heap_drop - * destroy and close temporary relations - * - */ - -void -heap_drop(Relation rel) -{ - Oid rid = RelationGetRelid(rel); - - ReleaseRelationBuffers(rel); - if (!(rel->rd_isnoname) || !(rel->rd_unlinked)) - smgrunlink(DEFAULT_SMGR, rel); - rel->rd_unlinked = TRUE; - heap_close(rel, NoLock); - RemoveFromNoNameRelList(rel); - RelationForgetRelation(rid); -} - - -/************************************************************** - functions to deal with the list of temporary relations -**************************************************************/ - -/* -------------- - InitTempRellist(): - - initialize temporary relations list - the tempRelList is a list of temporary relations that - are created in the course of the transactions - they need to be destroyed properly at the end of the transactions - - MODIFIES the global variable tempRels - - >> NOTE << - - malloc is used instead of palloc because we KNOW when we are - going to free these things. Keeps us away from the memory context - hairyness - -*/ -void -InitNoNameRelList(void) -{ - if (tempRels) - { - free(tempRels->rels); - free(tempRels); - } - - tempRels = (TempRelList *) malloc(sizeof(TempRelList)); - tempRels->size = NONAME_REL_LIST_SIZE; - tempRels->rels = (Relation *) malloc(sizeof(Relation) * tempRels->size); - MemSet(tempRels->rels, 0, sizeof(Relation) * tempRels->size); - tempRels->num = 0; -} - -/* - removes a relation from the TempRelList - - MODIFIES the global variable tempRels - we don't really remove it, just mark it as NULL - and DropNoNameRels will look for NULLs -*/ -static void -RemoveFromNoNameRelList(Relation r) -{ - int i; - - if (!tempRels) - return; - - for (i = 0; i < tempRels->num; i++) - { - if (tempRels->rels[i] == r) - { - tempRels->rels[i] = NULL; - break; - } - } -} - -/* - add a temporary relation to the TempRelList - - MODIFIES the global variable tempRels -*/ -static void -AddToNoNameRelList(Relation r) -{ - if (!tempRels) - return; - - if (tempRels->num == tempRels->size) - { - tempRels->size += NONAME_REL_LIST_SIZE; - tempRels->rels = realloc(tempRels->rels, - sizeof(Relation) * tempRels->size); - } - tempRels->rels[tempRels->num] = r; - tempRels->num++; -} - -/* - go through the tempRels list and destroy each of the relations -*/ -void -DropNoNameRels(void) -{ - int i; - Relation rel; - - if (!tempRels) - return; - - for (i = 0; i < tempRels->num; i++) - { - rel = tempRels->rels[i]; - /* rel may be NULL if it has been removed from the list already */ - if (rel) - heap_drop(rel); - } - free(tempRels->rels); - free(tempRels); - tempRels = NULL; -} /* * Store a default expression for column attnum of relation rel. |