summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-10-24 07:38:22 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-10-24 07:38:22 +0000
commit5d90a0037e8b7f7e573c3b700d46b269d8a874f3 (patch)
tree806d063bd2fab2103bbac1daef2f99a97207a54b
parentee0ef186ac2830614bed1370b727b63982cfc547 (diff)
downloadpostgresql-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.c19
-rw-r--r--src/backend/postmaster/postmaster.c4
-rw-r--r--src/backend/utils/cache/relcache.c11
-rw-r--r--src/backend/utils/rel.h4
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 */