Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 20b4c46

Browse files
committed
Fixes: Errors when PQexec() in backend creates temp
relations and transaction is aborted Submitted by: wieck@sapserv.debis.de (Jan Wieck)
1 parent e152661 commit 20b4c46

File tree

4 files changed

+30
-8
lines changed

4 files changed

+30
-8
lines changed

src/backend/catalog/heap.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.1.1.1 1996/07/09 06:21:15 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.2 1996/10/24 07:54:45 scrappy Exp $
1111
*
1212
* INTERFACE ROUTINES
1313
* heap_creatr() - Create an uncataloged heap relation
@@ -315,6 +315,13 @@ heap_creatr(char *name,
315315
rdesc->rd_rel->reltype = relid;
316316
}
317317

318+
/* ----------------
319+
* remember if this is a temp relation
320+
* ----------------
321+
*/
322+
323+
rdesc->rd_istemp = isTemp;
324+
318325
/* ----------------
319326
* have the storage manager create the relation.
320327
* ----------------
@@ -1306,6 +1313,9 @@ heap_destroy(char *relname)
13061313
* ----------------
13071314
*/
13081315
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
1316+
if(rdesc->rd_istemp) {
1317+
rdesc->rd_tmpunlinked = TRUE;
1318+
}
13091319
heap_close(rdesc);
13101320
}
13111321

@@ -1320,6 +1330,9 @@ heap_destroyr(Relation rdesc)
13201330
{
13211331
ReleaseTmpRelBuffers(rdesc);
13221332
(void) smgrunlink(rdesc->rd_rel->relsmgr, rdesc);
1333+
if(rdesc->rd_istemp) {
1334+
rdesc->rd_tmpunlinked = TRUE;
1335+
}
13231336
heap_close(rdesc);
13241337
RemoveFromTempRelList(rdesc);
13251338
}
@@ -1357,7 +1370,7 @@ InitTempRelList()
13571370
tempRels = (TempRelList*)malloc(sizeof(TempRelList));
13581371
tempRels->size = TEMP_REL_LIST_SIZE;
13591372
tempRels->rels = (Relation*)malloc(sizeof(Relation) * tempRels->size);
1360-
memset(tempRels->rels, sizeof(Relation) * tempRels->size , 0);
1373+
memset(tempRels->rels, 0, sizeof(Relation) * tempRels->size);
13611374
tempRels->num = 0;
13621375
}
13631376

@@ -1418,7 +1431,7 @@ DestroyTempRels()
14181431
for (i=0;i<tempRels->num;i++) {
14191432
rdesc = tempRels->rels[i];
14201433
/* rdesc may be NULL if it has been removed from the list already */
1421-
if (rdesc)
1434+
if (rdesc)
14221435
heap_destroyr(rdesc);
14231436
}
14241437
free(tempRels->rels);

src/backend/postmaster/postmaster.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.15 1996/10/13 18:38:04 momjian Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.16 1996/10/24 07:55:07 scrappy Exp $
1414
*
1515
* NOTES
1616
*
@@ -876,7 +876,7 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
876876
static char envEntry[4][2 * ARGV_SIZE];
877877

878878
for (i = 0; i < 4; ++i) {
879-
memset(envEntry[i], 2*ARGV_SIZE,0);
879+
memset(envEntry[i], 0, 2*ARGV_SIZE);
880880
}
881881
/*
882882
* Set up the necessary environment variables for the backend

src/backend/utils/cache/relcache.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.2 1996/10/23 07:41:00 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.3 1996/10/24 07:55:29 scrappy Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1418,7 +1418,14 @@ RelationPurgeLocalRelation(bool xactCommitted)
14181418
* remove the file if we abort. This is so that files for
14191419
* tables created inside a transaction block get removed.
14201420
*/
1421-
smgrunlink(reln->rd_rel->relsmgr, reln);
1421+
if(reln->rd_istemp) {
1422+
if(!(reln->rd_tmpunlinked)) {
1423+
smgrunlink(reln->rd_rel->relsmgr, reln);
1424+
reln->rd_tmpunlinked = TRUE;
1425+
}
1426+
} else {
1427+
smgrunlink(reln->rd_rel->relsmgr, reln);
1428+
}
14221429
}
14231430

14241431
reln->rd_islocal = FALSE;

src/include/utils/rel.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: rel.h,v 1.3 1996/10/19 04:31:45 scrappy Exp $
9+
* $Id: rel.h,v 1.4 1996/10/24 07:55:54 scrappy Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -26,6 +26,8 @@ typedef struct RelationData {
2626
uint16 rd_refcnt; /* reference count */
2727
bool rd_islocal; /* uses the local buffer mgr */
2828
bool rd_isnailed; /* rel is nailed in cache */
29+
bool rd_istemp; /* rel is a temp rel */
30+
bool rd_tmpunlinked; /* temp rel already unlinked */
2931
Form_pg_am rd_am; /* AM tuple */
3032
Form_pg_class rd_rel; /* RELATION tuple */
3133
Oid rd_id; /* relations's object id */

0 commit comments

Comments
 (0)