diff options
author | Marc G. Fournier <scrappy@hub.org> | 1996-10-24 07:38:22 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1996-10-24 07:38:22 +0000 |
commit | 5d90a0037e8b7f7e573c3b700d46b269d8a874f3 (patch) | |
tree | 806d063bd2fab2103bbac1daef2f99a97207a54b | |
parent | ee0ef186ac2830614bed1370b727b63982cfc547 (diff) | |
download | postgresql-5d90a0037e8b7f7e573c3b700d46b269d8a874f3.tar.gz |
Fixes: Errors when PQexec() in backend creates temp
relations and transaction is aborted
Submitted by: wieck@sapserv.debis.de (Jan Wieck)
-rw-r--r-- | src/backend/catalog/heap.c | 19 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 4 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 11 | ||||
-rw-r--r-- | src/backend/utils/rel.h | 4 |
4 files changed, 30 insertions, 8 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 6e9634aa95..1fbe99331b 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.1.1.1 1996/07/09 06:21:15 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.1.1.1.2.1 1996/10/24 07:37:31 scrappy Exp $ * * INTERFACE ROUTINES * heap_creatr() - Create an uncataloged heap relation @@ -316,6 +316,13 @@ heap_creatr(char *name, } /* ---------------- + * remember if this is a temp relation + * ---------------- + */ + + rdesc->rd_istemp = isTemp; + + /* ---------------- * have the storage manager create the relation. * ---------------- */ @@ -1306,6 +1313,9 @@ heap_destroy(char *relname) * ---------------- */ (void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc); + if(rdesc->rd_istemp) { + rdesc->rd_tmpunlinked = TRUE; + } heap_close(rdesc); } @@ -1320,6 +1330,9 @@ heap_destroyr(Relation rdesc) { ReleaseTmpRelBuffers(rdesc); (void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc); + if(rdesc->rd_istemp) { + rdesc->rd_tmpunlinked = TRUE; + } heap_close(rdesc); RemoveFromTempRelList(rdesc); } @@ -1357,7 +1370,7 @@ InitTempRelList() tempRels = (TempRelList*)malloc(sizeof(TempRelList)); tempRels->size = TEMP_REL_LIST_SIZE; tempRels->rels = (Relation*)malloc(sizeof(Relation) * tempRels->size); - memset(tempRels->rels, sizeof(Relation) * tempRels->size , 0); + memset(tempRels->rels, 0, sizeof(Relation) * tempRels->size); tempRels->num = 0; } @@ -1418,7 +1431,7 @@ DestroyTempRels() for (i=0;i<tempRels->num;i++) { rdesc = tempRels->rels[i]; /* rdesc may be NULL if it has been removed from the list already */ - if (rdesc) + if (rdesc) heap_destroyr(rdesc); } free(tempRels->rels); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ef33d2fd13..29d7f2e591 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.3.2.4 1996/10/07 07:19:38 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.3.2.5 1996/10/24 07:37:49 scrappy Exp $ * * NOTES * @@ -807,7 +807,7 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */ static char envEntry[4][2 * ARGV_SIZE]; for (i = 0; i < 4; ++i) { - memset(envEntry[i], 2*ARGV_SIZE,0); + memset(envEntry[i], 0, 2*ARGV_SIZE); } /* * Set up the necessary environment variables for the backend diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 4e3f28491b..dfb13876de 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.1.1.1 1996/07/09 06:22:06 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.1.1.1.2.1 1996/10/24 07:38:22 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -1412,7 +1412,14 @@ RelationPurgeLocalRelation(bool xactCommitted) * remove the file if we abort. This is so that files for * tables created inside a transaction block get removed. */ - smgrunlink(reln->rd_rel->relsmgr, reln); + if(reln->rd_istemp) { + if(!(reln->rd_tmpunlinked)) { + smgrunlink(reln->rd_rel->relsmgr, reln); + reln->rd_tmpunlinked = TRUE; + } + } else { + smgrunlink(reln->rd_rel->relsmgr, reln); + } } reln->rd_islocal = FALSE; diff --git a/src/backend/utils/rel.h b/src/backend/utils/rel.h index d1d5a78dba..7323bf16ef 100644 --- a/src/backend/utils/rel.h +++ b/src/backend/utils/rel.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: rel.h,v 1.1.1.1 1996/07/09 06:22:02 scrappy Exp $ + * $Id: rel.h,v 1.1.1.1.2.1 1996/10/24 07:38:08 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -31,6 +31,8 @@ typedef struct RelationData { uint16 rd_refcnt; /* reference count */ bool rd_islocal; /* uses the local buffer mgr */ bool rd_isnailed; /* rel is nailed in cache */ + bool rd_istemp; /* rel is a temp rel */ + bool rd_tmpunlinked; /* temp rel already unlinked */ Form_pg_am rd_am; /* AM tuple */ Form_pg_class rd_rel; /* RELATION tuple */ Oid rd_id; /* relations's object id */ |