Fixes: Errors when PQexec() in backend creates temp
relations and transaction is aborted Submitted by: wieck@sapserv.debis.de (Jan Wieck)
This commit is contained in:
parent
e152661200
commit
20b4c46e26
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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.2 1996/10/24 07:54:45 scrappy Exp $
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
* heap_creatr() - Create an uncataloged heap relation
|
* heap_creatr() - Create an uncataloged heap relation
|
||||||
@ -315,6 +315,13 @@ heap_creatr(char *name,
|
|||||||
rdesc->rd_rel->reltype = relid;
|
rdesc->rd_rel->reltype = relid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* remember if this is a temp relation
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
rdesc->rd_istemp = isTemp;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* have the storage manager create the relation.
|
* have the storage manager create the relation.
|
||||||
* ----------------
|
* ----------------
|
||||||
@ -1306,6 +1313,9 @@ heap_destroy(char *relname)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
|
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
|
||||||
|
if(rdesc->rd_istemp) {
|
||||||
|
rdesc->rd_tmpunlinked = TRUE;
|
||||||
|
}
|
||||||
heap_close(rdesc);
|
heap_close(rdesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1320,6 +1330,9 @@ heap_destroyr(Relation rdesc)
|
|||||||
{
|
{
|
||||||
ReleaseTmpRelBuffers(rdesc);
|
ReleaseTmpRelBuffers(rdesc);
|
||||||
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
|
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
|
||||||
|
if(rdesc->rd_istemp) {
|
||||||
|
rdesc->rd_tmpunlinked = TRUE;
|
||||||
|
}
|
||||||
heap_close(rdesc);
|
heap_close(rdesc);
|
||||||
RemoveFromTempRelList(rdesc);
|
RemoveFromTempRelList(rdesc);
|
||||||
}
|
}
|
||||||
@ -1357,7 +1370,7 @@ InitTempRelList()
|
|||||||
tempRels = (TempRelList*)malloc(sizeof(TempRelList));
|
tempRels = (TempRelList*)malloc(sizeof(TempRelList));
|
||||||
tempRels->size = TEMP_REL_LIST_SIZE;
|
tempRels->size = TEMP_REL_LIST_SIZE;
|
||||||
tempRels->rels = (Relation*)malloc(sizeof(Relation) * tempRels->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;
|
tempRels->num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1418,7 +1431,7 @@ DestroyTempRels()
|
|||||||
for (i=0;i<tempRels->num;i++) {
|
for (i=0;i<tempRels->num;i++) {
|
||||||
rdesc = tempRels->rels[i];
|
rdesc = tempRels->rels[i];
|
||||||
/* rdesc may be NULL if it has been removed from the list already */
|
/* rdesc may be NULL if it has been removed from the list already */
|
||||||
if (rdesc)
|
if (rdesc)
|
||||||
heap_destroyr(rdesc);
|
heap_destroyr(rdesc);
|
||||||
}
|
}
|
||||||
free(tempRels->rels);
|
free(tempRels->rels);
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.15 1996/10/13 18:38:04 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.16 1996/10/24 07:55:07 scrappy Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
*
|
*
|
||||||
@ -876,7 +876,7 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
|
|||||||
static char envEntry[4][2 * ARGV_SIZE];
|
static char envEntry[4][2 * ARGV_SIZE];
|
||||||
|
|
||||||
for (i = 0; i < 4; ++i) {
|
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
|
* Set up the necessary environment variables for the backend
|
||||||
|
11
src/backend/utils/cache/relcache.c
vendored
11
src/backend/utils/cache/relcache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.2 1996/10/23 07:41:00 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.3 1996/10/24 07:55:29 scrappy Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1418,7 +1418,14 @@ RelationPurgeLocalRelation(bool xactCommitted)
|
|||||||
* remove the file if we abort. This is so that files for
|
* remove the file if we abort. This is so that files for
|
||||||
* tables created inside a transaction block get removed.
|
* 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;
|
reln->rd_islocal = FALSE;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: rel.h,v 1.3 1996/10/19 04:31:45 scrappy Exp $
|
* $Id: rel.h,v 1.4 1996/10/24 07:55:54 scrappy Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -26,6 +26,8 @@ typedef struct RelationData {
|
|||||||
uint16 rd_refcnt; /* reference count */
|
uint16 rd_refcnt; /* reference count */
|
||||||
bool rd_islocal; /* uses the local buffer mgr */
|
bool rd_islocal; /* uses the local buffer mgr */
|
||||||
bool rd_isnailed; /* rel is nailed in cache */
|
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_am rd_am; /* AM tuple */
|
||||||
Form_pg_class rd_rel; /* RELATION tuple */
|
Form_pg_class rd_rel; /* RELATION tuple */
|
||||||
Oid rd_id; /* relations's object id */
|
Oid rd_id; /* relations's object id */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user