diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index a88d688559..469a5ba252 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.58 1999/07/19 07:07:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.59 1999/12/16 22:19:34 wieck Exp $ * * NOTES * The old interface functions have been converted to macros @@ -562,6 +562,7 @@ heap_copytuple(HeapTuple tuple) newTuple = (HeapTuple) palloc(HEAPTUPLESIZE + tuple->t_len); newTuple->t_len = tuple->t_len; newTuple->t_self = tuple->t_self; + newTuple->t_datamcxt = CurrentMemoryContext; newTuple->t_data = (HeapTupleHeader) ((char *) newTuple + HEAPTUPLESIZE); memmove((char *) newTuple->t_data, (char *) tuple->t_data, (int) tuple->t_len); @@ -585,6 +586,7 @@ heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest) dest->t_len = src->t_len; dest->t_self = src->t_self; + dest->t_datamcxt = CurrentMemoryContext; dest->t_data = (HeapTupleHeader) palloc(src->t_len); memmove((char *) dest->t_data, (char *) src->t_data, (int) src->t_len); @@ -682,6 +684,7 @@ heap_formtuple(TupleDesc tupleDescriptor, len += ComputeDataSize(tupleDescriptor, value, nulls); tuple = (HeapTuple) palloc(HEAPTUPLESIZE + len); + tuple->t_datamcxt = CurrentMemoryContext; td = tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE); MemSet((char *) td, 0, (int) len); @@ -792,6 +795,27 @@ heap_modifytuple(HeapTuple tuple, return newTuple; } + +/* ---------------- + * heap_freetuple + * ---------------- + */ +void +heap_freetuple(HeapTuple htup) +{ + extern int getpid(); + + if (htup->t_data != NULL) + if (htup->t_datamcxt != NULL && (char *)(htup->t_data) != + ((char *) htup + HEAPTUPLESIZE)) + { + elog(NOTICE, "TELL Jan Wieck: heap_freetuple() found separate t_data"); + } + + pfree(htup); +} + + /* ---------------------------------------------------------------- * other misc functions * ---------------------------------------------------------------- @@ -814,6 +838,7 @@ heap_addheader(uint32 natts, /* max domain index */ hoff = len = MAXALIGN(len); /* be conservative */ len += structlen; tuple = (HeapTuple) palloc(HEAPTUPLESIZE + len); + tuple->t_datamcxt = CurrentMemoryContext; td = tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE); MemSet((char *) td, 0, (int) len); diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 610066893b..7b03545bf1 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.60 1999/11/24 00:44:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.61 1999/12/16 22:19:36 wieck Exp $ * * * INTERFACE ROUTINES @@ -117,6 +117,8 @@ initscan(HeapScanDesc scan, * relation is empty * ---------------- */ + scan->rs_ntup.t_datamcxt = scan->rs_ctup.t_datamcxt = + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ntup.t_data = scan->rs_ctup.t_data = scan->rs_ptup.t_data = NULL; scan->rs_nbuf = scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer; @@ -127,8 +129,10 @@ initscan(HeapScanDesc scan, * reverse scan * ---------------- */ + scan->rs_ntup.t_datamcxt = scan->rs_ctup.t_datamcxt = NULL; scan->rs_ntup.t_data = scan->rs_ctup.t_data = NULL; scan->rs_nbuf = scan->rs_cbuf = InvalidBuffer; + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; scan->rs_pbuf = UnknownBuffer; } @@ -138,8 +142,10 @@ initscan(HeapScanDesc scan, * forward scan * ---------------- */ + scan->rs_ctup.t_datamcxt = scan->rs_ptup.t_datamcxt = NULL; scan->rs_ctup.t_data = scan->rs_ptup.t_data = NULL; scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer; + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; scan->rs_nbuf = UnknownBuffer; } /* invalid too */ @@ -272,6 +278,7 @@ heapgettup(Relation relation, */ if (!(pages = relation->rd_nblocks)) { + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } @@ -290,6 +297,7 @@ heapgettup(Relation relation, if (ItemPointerIsValid(tid) == false) { *buffer = InvalidBuffer; + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } @@ -306,6 +314,7 @@ heapgettup(Relation relation, lineoff = ItemPointerGetOffsetNumber(tid); lpp = PageGetItemId(dp, lineoff); + tuple->t_datamcxt = NULL; tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp); tuple->t_len = ItemIdGetLength(lpp); LockBuffer(*buffer, BUFFER_LOCK_UNLOCK); @@ -376,6 +385,7 @@ heapgettup(Relation relation, if (page >= pages) { *buffer = InvalidBuffer; + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } @@ -415,6 +425,7 @@ heapgettup(Relation relation, { if (ItemIdIsUsed(lpp)) { + tuple->t_datamcxt = NULL; tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp); tuple->t_len = ItemIdGetLength(lpp); ItemPointerSet(&(tuple->t_self), page, lineoff); @@ -466,6 +477,7 @@ heapgettup(Relation relation, if (BufferIsValid(*buffer)) ReleaseBuffer(*buffer); *buffer = InvalidBuffer; + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } @@ -836,6 +848,7 @@ heap_getnext(HeapScanDesc scandesc, int backw) { if (BufferIsValid(scan->rs_nbuf)) ReleaseBuffer(scan->rs_nbuf); + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; scan->rs_nbuf = UnknownBuffer; return NULL; @@ -892,10 +905,12 @@ heap_getnext(HeapScanDesc scandesc, int backw) { if (BufferIsValid(scan->rs_pbuf)) ReleaseBuffer(scan->rs_pbuf); + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; scan->rs_pbuf = InvalidBuffer; if (BufferIsValid(scan->rs_nbuf)) ReleaseBuffer(scan->rs_nbuf); + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; scan->rs_nbuf = InvalidBuffer; return NULL; @@ -903,6 +918,7 @@ heap_getnext(HeapScanDesc scandesc, int backw) if (BufferIsValid(scan->rs_pbuf)) ReleaseBuffer(scan->rs_pbuf); + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; scan->rs_pbuf = UnknownBuffer; @@ -918,6 +934,7 @@ heap_getnext(HeapScanDesc scandesc, int backw) { if (BufferIsValid(scan->rs_pbuf)) ReleaseBuffer(scan->rs_pbuf); + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; scan->rs_pbuf = UnknownBuffer; HEAPDEBUG_3; /* heap_getnext returns NULL at end */ @@ -976,10 +993,12 @@ heap_getnext(HeapScanDesc scandesc, int backw) { if (BufferIsValid(scan->rs_nbuf)) ReleaseBuffer(scan->rs_nbuf); + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; scan->rs_nbuf = InvalidBuffer; if (BufferIsValid(scan->rs_pbuf)) ReleaseBuffer(scan->rs_pbuf); + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; scan->rs_pbuf = InvalidBuffer; HEAPDEBUG_6; /* heap_getnext returning EOS */ @@ -988,6 +1007,7 @@ heap_getnext(HeapScanDesc scandesc, int backw) if (BufferIsValid(scan->rs_nbuf)) ReleaseBuffer(scan->rs_nbuf); + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; scan->rs_nbuf = UnknownBuffer; } @@ -1066,10 +1086,12 @@ heap_fetch(Relation relation, { ReleaseBuffer(buffer); *userbuf = InvalidBuffer; + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } + tuple->t_datamcxt = NULL; tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); tuple->t_len = ItemIdGetLength(lp); @@ -1156,6 +1178,7 @@ heap_get_latest_tid(Relation relation, * ---------------- */ + tp.t_datamcxt = NULL; t_data = tp.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); tp.t_len = ItemIdGetLength(lp); tp.t_self = *tid; @@ -1270,6 +1293,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid) dp = (PageHeader) BufferGetPage(buffer); lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid)); + tp.t_datamcxt = NULL; tp.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); tp.t_len = ItemIdGetLength(lp); tp.t_self = *tid; @@ -1365,6 +1389,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, dp = (PageHeader) BufferGetPage(buffer); lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(otid)); + oldtup.t_datamcxt = NULL; oldtup.t_data = (HeapTupleHeader) PageGetItem(dp, lp); oldtup.t_len = ItemIdGetLength(lp); oldtup.t_self = *otid; @@ -1488,6 +1513,7 @@ heap_mark4update(Relation relation, HeapTuple tuple, Buffer *buffer) dp = (PageHeader) BufferGetPage(*buffer); lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid)); + tuple->t_datamcxt = NULL; tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); tuple->t_len = ItemIdGetLength(lp); @@ -1665,10 +1691,14 @@ heap_restrpos(HeapScanDesc scan) scan->rs_nbuf = InvalidBuffer; if (!ItemPointerIsValid(&scan->rs_mptid)) + { + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = NULL; + } else { scan->rs_ptup.t_self = scan->rs_mptid; + scan->rs_ptup.t_datamcxt = NULL; scan->rs_ptup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */ heapgettup(scan->rs_rd, &(scan->rs_ptup), @@ -1680,10 +1710,14 @@ heap_restrpos(HeapScanDesc scan) } if (!ItemPointerIsValid(&scan->rs_mctid)) + { + scan->rs_ctup.t_datamcxt = NULL; scan->rs_ctup.t_data = NULL; + } else { scan->rs_ctup.t_self = scan->rs_mctid; + scan->rs_ctup.t_datamcxt = NULL; scan->rs_ctup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */ heapgettup(scan->rs_rd, &(scan->rs_ctup), @@ -1695,9 +1729,13 @@ heap_restrpos(HeapScanDesc scan) } if (!ItemPointerIsValid(&scan->rs_mntid)) + { + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_data = NULL; + } else { + scan->rs_ntup.t_datamcxt = NULL; scan->rs_ntup.t_self = scan->rs_mntid; scan->rs_ntup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */ heapgettup(scan->rs_rd, diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 1c44fe0edf..b55dd8dcc0 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -7,7 +7,7 @@ * Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.72 1999/11/24 00:58:48 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.73 1999/12/16 22:19:37 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -628,7 +628,7 @@ InsertOneTuple(Oid objectid) if (objectid != (Oid) 0) tuple->t_data->t_oid = objectid; heap_insert(reldesc, tuple); - pfree(tuple); + heap_freetuple(tuple); if (DebugMode) { printf("End InsertOneTuple, objectid=%u\n", objectid); diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 08107385b4..39974c30fa 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.112 1999/12/10 03:55:47 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.113 1999/12/16 22:19:38 wieck Exp $ * * * INTERFACE ROUTINES @@ -608,7 +608,7 @@ AddNewAttributeTuples(Oid new_rel_oid, if (hasindex) CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup); - pfree(tup); + heap_freetuple(tup); dpp++; } @@ -631,7 +631,7 @@ AddNewAttributeTuples(Oid new_rel_oid, if (hasindex) CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup); - pfree(tup); + heap_freetuple(tup); dpp++; } @@ -727,7 +727,7 @@ AddNewRelationTuple(Relation pg_class_desc, CatalogCloseIndices(Num_pg_class_indices, idescs); } - pfree(tup); + heap_freetuple(tup); } @@ -1084,7 +1084,7 @@ DeleteRelationTuple(Relation rel) * ---------------- */ heap_delete(pg_class_desc, &tup->t_self, NULL); - pfree(tup); + heap_freetuple(tup); heap_close(pg_class_desc, RowExclusiveLock); } @@ -1314,7 +1314,7 @@ DeleteAttributeTuples(Relation rel) DeleteComments(tup->t_data->t_oid); heap_delete(pg_attribute_desc, &tup->t_self, NULL); - pfree(tup); + heap_freetuple(tup); } } @@ -1753,7 +1753,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin, pfree(DatumGetPointer(values[Anum_pg_attrdef_adbin - 1])); pfree(DatumGetPointer(values[Anum_pg_attrdef_adsrc - 1])); - pfree(tuple); + heap_freetuple(tuple); pfree(adsrc); if (! updatePgAttribute) @@ -1778,7 +1778,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin, CatalogCloseIndices(Num_pg_attr_indices, attridescs); } heap_close(attrrel, RowExclusiveLock); - pfree(atttup); + heap_freetuple(atttup); } /* @@ -1833,7 +1833,7 @@ StoreRelCheck(Relation rel, char *ccname, char *ccbin) pfree(DatumGetPointer(values[Anum_pg_relcheck_rcname - 1])); pfree(DatumGetPointer(values[Anum_pg_relcheck_rcbin - 1])); pfree(DatumGetPointer(values[Anum_pg_relcheck_rcsrc - 1])); - pfree(tuple); + heap_freetuple(tuple); pfree(ccsrc); } @@ -2101,7 +2101,7 @@ AddRelationRawConstraints(Relation rel, CatalogCloseIndices(Num_pg_class_indices, relidescs); heap_close(relrel, RowExclusiveLock); - pfree(reltup); + heap_freetuple(reltup); /* * Force rebuild of our own relcache entry, otherwise subsequent commands diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index ef49a46bd7..2efdb9331d 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.99 1999/12/10 03:55:48 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.100 1999/12/16 22:19:39 wieck Exp $ * * * INTERFACE ROUTINES @@ -489,7 +489,7 @@ UpdateRelationRelation(Relation indexRelation, char *temp_relname) } tupleOid = tuple->t_data->t_oid; - pfree(tuple); + heap_freetuple(tuple); heap_close(pg_class, RowExclusiveLock); return tupleOid; @@ -581,7 +581,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts) value, nullv, replace); - pfree(init_tuple); + heap_freetuple(init_tuple); heap_insert(pg_attribute, cur_tuple); if (hasind) @@ -611,7 +611,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts) value, nullv, replace); - pfree(cur_tuple); + heap_freetuple(cur_tuple); heap_insert(pg_attribute, new_tuple); if (hasind) @@ -626,7 +626,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts) } if (cur_tuple) - pfree(cur_tuple); + heap_freetuple(cur_tuple); heap_close(pg_attribute, RowExclusiveLock); if (hasind) CatalogCloseIndices(Num_pg_attr_indices, idescs); @@ -768,7 +768,7 @@ UpdateIndexRelation(Oid indexoid, heap_close(pg_index, RowExclusiveLock); pfree(predText); pfree(indexForm); - pfree(tuple); + heap_freetuple(tuple); } /* ---------------------------------------------------------------- @@ -841,7 +841,7 @@ UpdateIndexPredicate(Oid indexoid, Node *oldPred, Node *predicate) heap_update(pg_index, &newtup->t_self, newtup, NULL); - pfree(newtup); + heap_freetuple(newtup); heap_close(pg_index, RowExclusiveLock); pfree(predText); } @@ -1170,7 +1170,7 @@ index_drop(Oid indexId) Assert(HeapTupleIsValid(tuple)); heap_delete(relationRelation, &tuple->t_self, NULL); - pfree(tuple); + heap_freetuple(tuple); heap_close(relationRelation, RowExclusiveLock); /* ---------------- @@ -1187,7 +1187,7 @@ index_drop(Oid indexId) 0, 0))) { heap_delete(attributeRelation, &tuple->t_self, NULL); - pfree(tuple); + heap_freetuple(tuple); attnum++; } heap_close(attributeRelation, RowExclusiveLock); @@ -1204,7 +1204,7 @@ index_drop(Oid indexId) Assert(HeapTupleIsValid(tuple)); heap_delete(indexRelation, &tuple->t_self, NULL); - pfree(tuple); + heap_freetuple(tuple); heap_close(indexRelation, RowExclusiveLock); /* @@ -1433,11 +1433,11 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs); CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup); CatalogCloseIndices(Num_pg_class_indices, idescs); - pfree(newtup); + heap_freetuple(newtup); } if (!IsBootstrapProcessingMode()) - pfree(tuple); + heap_freetuple(tuple); else heap_endscan(pg_class_scan); diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index 20e2f2d5e6..7918fbd6a7 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.53 1999/11/25 00:15:56 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.54 1999/12/16 22:19:39 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -178,7 +178,7 @@ CatalogIndexInsert(Relation *idescs, if (indexRes) pfree(indexRes); - pfree(index_tup); + heap_freetuple(index_tup); } } @@ -248,6 +248,7 @@ CatalogIndexFetchTuple(Relation heapRelation, Buffer buffer; sd = index_beginscan(idesc, false, num_keys, skey); + tuple.t_datamcxt = CurrentMemoryContext; tuple.t_data = NULL; while ((indexRes = index_getnext(sd, ForwardScanDirection))) { diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 5ce7655edd..da967a23df 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.44 1999/11/24 00:44:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.45 1999/12/16 22:19:39 wieck Exp $ * * NOTES * these routines moved here from commands/define.c and somewhat cleaned up. @@ -306,7 +306,7 @@ OperatorShellMakeWithOpenRelation(Relation pg_operator_desc, * free the tuple and return the operator oid * ---------------- */ - pfree(tup); + heap_freetuple(tup); return operatorObjectId; } diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 9ec3c3fd82..4a2bdca1c1 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.43 1999/11/24 00:44:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.44 1999/12/16 22:19:39 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -218,7 +218,7 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName) * free the tuple and return the type-oid * ---------------- */ - pfree(tup); + heap_freetuple(tup); return typoid; } @@ -551,7 +551,7 @@ TypeRename(char *oldTypeName, char *newTypeName) 0, 0, 0); if (HeapTupleIsValid(newtup)) { - pfree(oldtup); + heap_freetuple(oldtup); heap_close(pg_type_desc, RowExclusiveLock); elog(ERROR, "TypeRename: type %s already defined", newTypeName); } @@ -567,7 +567,7 @@ TypeRename(char *oldTypeName, char *newTypeName) CatalogIndexInsert(idescs, Num_pg_type_indices, pg_type_desc, oldtup); CatalogCloseIndices(Num_pg_type_indices, idescs); - pfree(oldtup); + heap_freetuple(oldtup); heap_close(pg_type_desc, RowExclusiveLock); } diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 2267a2415e..627ef19d28 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -6,7 +6,7 @@ * Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.56 1999/11/24 00:44:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.57 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -247,7 +247,7 @@ Async_Listen(char *relname, int pid) tupDesc = lRel->rd_att; newtup = heap_formtuple(tupDesc, values, nulls); heap_insert(lRel, newtup); - pfree(newtup); + heap_freetuple(newtup); heap_close(lRel, AccessExclusiveLock); diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index ded4c7ea61..0184d738dc 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.48 1999/12/10 03:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.49 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -328,6 +328,8 @@ rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) { LocalHeapTuple.t_self = ScanResult->heap_iptr; + LocalHeapTuple.t_datamcxt = NULL; + LocalHeapTuple.t_data = NULL; heap_fetch(LocalOldHeap, SnapshotNow, &LocalHeapTuple, &LocalBuffer); OIDNewHeapInsert = heap_insert(LocalNewHeap, &LocalHeapTuple); pfree(ScanResult); diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index ddf89b8d7d..30c2bc14e3 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.60 1999/12/14 03:35:20 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.61 1999/12/16 22:19:41 wieck Exp $ * * NOTES * The PortalExecutorHeapMemory crap needs to be eliminated @@ -481,7 +481,7 @@ PerformAddAttribute(char *relationName, CatalogIndexInsert(ridescs, Num_pg_class_indices, rel, reltup); CatalogCloseIndices(Num_pg_class_indices, ridescs); - pfree(reltup); + heap_freetuple(reltup); heap_close(rel, RowExclusiveLock); } diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 1b046a5f57..e98f4be885 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -190,7 +190,7 @@ void CreateComments(Oid oid, char *comment) { desctuple); CatalogCloseIndices(Num_pg_description_indices, idescs); } - pfree(desctuple); + heap_freetuple(desctuple); } diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 04ee4fc870..f42665a956 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.93 1999/12/14 00:08:13 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.94 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -837,7 +837,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null skip_tuple = true; else if (newtuple != tuple) /* modified by Trigger(s) */ { - pfree(tuple); + heap_freetuple(tuple); tuple = newtuple; } } @@ -905,7 +905,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null nulls[i] = ' '; } - pfree(tuple); + heap_freetuple(tuple); tuples_read++; if (!reading_to_eof && ntuples == tuples_read) diff --git a/src/backend/commands/creatinh.c b/src/backend/commands/creatinh.c index 4dded845af..8cf8918fa3 100644 --- a/src/backend/commands/creatinh.c +++ b/src/backend/commands/creatinh.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.53 1999/12/10 03:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.54 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -505,7 +505,7 @@ StoreCatalogInheritance(Oid relationId, List *supers) CatalogCloseIndices(Num_pg_inherits_indices, idescs); } - pfree(tuple); + heap_freetuple(tuple); seqNumber += 1; } @@ -620,7 +620,7 @@ again: tuple = heap_formtuple(desc, datum, nullarr); heap_insert(relation, tuple); - pfree(tuple); + heap_freetuple(tuple); seqNumber += 1; } diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index ab3badf970..e4607d93a5 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.15 1999/12/10 03:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.16 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -518,7 +518,7 @@ NormIndexAttrs(List *attList, /* list of IndexElem's */ attribute->class); } *classOidP++ = tuple->t_data->t_oid; - pfree(atttuple); + heap_freetuple(atttuple); } } diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index aad945bd6b..718e06dee4 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -183,6 +183,6 @@ DropProceduralLanguage(DropPLangStmt *stmt) heap_delete(rel, &langTup->t_self, NULL); - pfree(langTup); + heap_freetuple(langTup); heap_close(rel, RowExclusiveLock); } diff --git a/src/backend/commands/remove.c b/src/backend/commands/remove.c index 6cf94518e2..07b552dedd 100644 --- a/src/backend/commands/remove.c +++ b/src/backend/commands/remove.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.41 1999/12/10 03:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.42 1999/12/16 22:19:41 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -125,7 +125,7 @@ RemoveOperator(char *operatorName, /* operator name */ typeName2); } } - pfree(tup); + heap_freetuple(tup); heap_close(relation, RowExclusiveLock); } diff --git a/src/backend/commands/rename.c b/src/backend/commands/rename.c index b3f1e53989..8a94597770 100644 --- a/src/backend/commands/rename.c +++ b/src/backend/commands/rename.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.38 1999/12/14 03:35:20 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.39 1999/12/16 22:19:42 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -147,7 +147,7 @@ renameatt(char *relname, /* should not already exist */ if (HeapTupleIsValid(newatttup)) { - pfree(oldatttup); + heap_freetuple(oldatttup); elog(ERROR, "renameatt: attribute \"%s\" exists", newattname); } @@ -164,7 +164,7 @@ renameatt(char *relname, CatalogCloseIndices(Num_pg_attr_indices, irelations); } - pfree(oldatttup); + heap_freetuple(oldatttup); heap_close(attrelation, RowExclusiveLock); } diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 695b216fb5..2615ea43cc 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -235,7 +235,7 @@ CreateTrigger(CreateTrigStmt *stmt) CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs); CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple); CatalogCloseIndices(Num_pg_trigger_indices, idescs); - pfree(tuple); + heap_freetuple(tuple); heap_close(tgrel, RowExclusiveLock); pfree(DatumGetPointer(values[Anum_pg_trigger_tgname - 1])); @@ -255,7 +255,7 @@ CreateTrigger(CreateTrigStmt *stmt) CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs); CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple); CatalogCloseIndices(Num_pg_class_indices, ridescs); - pfree(tuple); + heap_freetuple(tuple); heap_close(pgrel, RowExclusiveLock); CommandCounterIncrement(); @@ -334,7 +334,7 @@ DropTrigger(DropTrigStmt *stmt) CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs); CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple); CatalogCloseIndices(Num_pg_class_indices, ridescs); - pfree(tuple); + heap_freetuple(tuple); heap_close(pgrel, RowExclusiveLock); CommandCounterIncrement(); @@ -690,7 +690,7 @@ ExecBRInsertTriggers(Relation rel, HeapTuple trigtuple) if (newtuple == NULL) break; else if (oldtuple != newtuple && oldtuple != trigtuple) - pfree(oldtuple); + heap_freetuple(oldtuple); } CurrentTriggerData = NULL; pfree(SaveTriggerData); @@ -735,11 +735,11 @@ ExecBRDeleteTriggers(EState *estate, ItemPointer tupleid) if (newtuple == NULL) break; if (newtuple != trigtuple) - pfree(newtuple); + heap_freetuple(newtuple); } CurrentTriggerData = NULL; pfree(SaveTriggerData); - pfree(trigtuple); + heap_freetuple(trigtuple); return (newtuple == NULL) ? false : true; } @@ -793,11 +793,11 @@ ExecBRUpdateTriggers(EState *estate, ItemPointer tupleid, HeapTuple newtuple) if (newtuple == NULL) break; else if (oldtuple != newtuple && oldtuple != intuple) - pfree(oldtuple); + heap_freetuple(oldtuple); } CurrentTriggerData = NULL; pfree(SaveTriggerData); - pfree(trigtuple); + heap_freetuple(trigtuple); return newtuple; } @@ -886,6 +886,7 @@ ltrmark:; Assert(ItemIdIsUsed(lp)); + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); tuple.t_len = ItemIdGetLength(lp); tuple.t_self = *tid; @@ -1150,7 +1151,7 @@ deferredTriggerExecute(DeferredTriggerEvent event, int itemno) rettuple = ExecCallTriggerFunc(SaveTriggerData.tg_trigger); CurrentTriggerData = NULL; if (rettuple != NULL && rettuple != &oldtuple && rettuple != &newtuple) - pfree(rettuple); + heap_freetuple(rettuple); /* ---------- * Might have been a referential integrity constraint trigger. diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 7e0c47ef4a..054a4ad6d6 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.130 1999/12/10 03:55:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.131 1999/12/16 22:19:42 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -710,6 +710,7 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel, continue; } + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); tuple.t_len = ItemIdGetLength(itemid); ItemPointerSet(&(tuple.t_self), blkno, offnum); @@ -1153,6 +1154,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, if (!ItemIdIsUsed(itemid)) continue; + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); tuple_len = tuple.t_len = ItemIdGetLength(itemid); ItemPointerSet(&(tuple.t_self), blkno, offnum); @@ -1264,6 +1266,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, elog(NOTICE, "Child itemid in update-chain marked as unused - can't continue vc_rpfheap"); break; } + tp.t_datamcxt = NULL; tp.t_data = (HeapTupleHeader) PageGetItem(Cpage, Citemid); tp.t_self = Ctid; tlen = tp.t_len = ItemIdGetLength(Citemid); @@ -1360,6 +1363,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, ItemPointerGetOffsetNumber(&(tp.t_self))); if (!ItemIdIsUsed(Pitemid)) elog(ERROR, "Parent itemid marked as unused"); + Ptp.t_datamcxt = NULL; Ptp.t_data = (HeapTupleHeader) PageGetItem(Ppage, Pitemid); Assert(ItemPointerEquals(&(vtld.new_tid), &(Ptp.t_data->t_ctid))); @@ -1409,6 +1413,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, continue; } #endif + tp.t_datamcxt = Ptp.t_datamcxt; tp.t_data = Ptp.t_data; tlen = tp.t_len = ItemIdGetLength(Pitemid); if (freeCbuf) @@ -1437,6 +1442,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, Cpage = BufferGetPage(Cbuf); Citemid = PageGetItemId(Cpage, ItemPointerGetOffsetNumber(&(tuple.t_self))); + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(Cpage, Citemid); tuple_len = tuple.t_len = ItemIdGetLength(Citemid); /* Get page to move in */ @@ -1468,6 +1474,7 @@ moving chain: failed to add item with len = %u to page %u", } newitemid = PageGetItemId(ToPage, newoff); pfree(newtup.t_data); + newtup.t_datamcxt = NULL; newtup.t_data = (HeapTupleHeader) PageGetItem(ToPage, newitemid); ItemPointerSet(&(newtup.t_self), vtmove[ti].vpd->vpd_blkno, newoff); @@ -1599,6 +1606,7 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)", } newitemid = PageGetItemId(ToPage, newoff); pfree(newtup.t_data); + newtup.t_datamcxt = NULL; newtup.t_data = (HeapTupleHeader) PageGetItem(ToPage, newitemid); ItemPointerSet(&(newtup.t_data->t_ctid), cur_page->vpd_blkno, newoff); newtup.t_self = newtup.t_data->t_ctid; @@ -1652,6 +1660,7 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)", itemid = PageGetItemId(page, off); if (!ItemIdIsUsed(itemid)) continue; + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); if (tuple.t_data->t_infomask & HEAP_XMIN_COMMITTED) continue; @@ -1756,6 +1765,7 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)", itemid = PageGetItemId(page, newoff); if (!ItemIdIsUsed(itemid)) continue; + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); if (!(tuple.t_data->t_infomask & HEAP_XMIN_COMMITTED)) { @@ -1827,6 +1837,7 @@ Elapsed %u/%u sec.", itemid = PageGetItemId(page, offnum); if (!ItemIdIsUsed(itemid)) continue; + tuple.t_datamcxt = NULL; tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); if (!(tuple.t_data->t_infomask & HEAP_XMIN_COMMITTED)) @@ -2332,7 +2343,7 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, /* get the buffer cache tuple */ rtup.t_self = ctup->t_self; heap_fetch(rd, SnapshotNow, &rtup, &buffer); - pfree(ctup); + heap_freetuple(ctup); /* overwrite the existing statistics in the tuple */ pgcform = (Form_pg_class) GETSTRUCT(&rtup); @@ -2521,7 +2532,7 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, pfree(DatumGetPointer(values[Anum_pg_statistic_stacommonval-1])); pfree(DatumGetPointer(values[Anum_pg_statistic_staloval-1])); pfree(DatumGetPointer(values[Anum_pg_statistic_stahival-1])); - pfree(stup); + heap_freetuple(stup); } } } diff --git a/src/backend/executor/_deadcode/nodeTee.c b/src/backend/executor/_deadcode/nodeTee.c index 1931ebcf53..983904bd23 100644 --- a/src/backend/executor/_deadcode/nodeTee.c +++ b/src/backend/executor/_deadcode/nodeTee.c @@ -14,7 +14,7 @@ * ExecInitTee * ExecEndTee * - * $Id: nodeTee.c,v 1.6 1999/12/10 03:55:52 momjian Exp $ + * $Id: nodeTee.c,v 1.7 1999/12/16 22:19:45 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -350,7 +350,7 @@ ExecTee(Tee * node, Plan *parent) heap_insert(bufferRel, heapTuple); if (slot->ttc_buffer != InvalidBuffer) - pfree(heapTuple); + heap_freetuple(heapTuple); /* * once there is data in the temporary relation, ensure that diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index bea42714aa..02f04912bd 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.102 1999/12/10 03:55:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.103 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -1147,7 +1147,7 @@ ExecAppend(TupleTableSlot *slot, if (newtuple != tuple) /* modified by Trigger(s) */ { Assert(slot->ttc_shouldFree); - pfree(tuple); + heap_freetuple(tuple); slot->val = tuple = newtuple; } } @@ -1334,7 +1334,7 @@ ExecReplace(TupleTableSlot *slot, if (newtuple != tuple) /* modified by Trigger(s) */ { Assert(slot->ttc_shouldFree); - pfree(tuple); + heap_freetuple(tuple); slot->val = tuple = newtuple; } } @@ -1472,7 +1472,7 @@ ExecAttrDefault(Relation rel, HeapTuple tuple) newtuple = heap_modifytuple(tuple, rel, replValue, replNull, repl); pfree(repl); - pfree(tuple); + heap_freetuple(tuple); pfree(replNull); pfree(replValue); @@ -1614,7 +1614,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid) /* stop execution */ ExecEndNode(epq->plan, epq->plan); epqstate->es_tupleTable->next = 0; - pfree(epqstate->es_evTuple[epq->rti - 1]); + heap_freetuple(epqstate->es_evTuple[epq->rti - 1]); epqstate->es_evTuple[epq->rti - 1] = NULL; /* push current PQ to freePQ stack */ oldepq->free = epq; @@ -1689,7 +1689,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid) /* free old RTE' tuple */ if (epqstate->es_evTuple[epq->rti - 1] != NULL) { - pfree(epqstate->es_evTuple[epq->rti - 1]); + heap_freetuple(epqstate->es_evTuple[epq->rti - 1]); epqstate->es_evTuple[epq->rti - 1] = NULL; } @@ -1738,7 +1738,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid) * Nice! We got tuple - now copy it. */ if (epqstate->es_evTuple[epq->rti - 1] != NULL) - pfree(epqstate->es_evTuple[epq->rti - 1]); + heap_freetuple(epqstate->es_evTuple[epq->rti - 1]); epqstate->es_evTuple[epq->rti - 1] = heap_copytuple(&tuple); ReleaseBuffer(buffer); break; @@ -1815,7 +1815,7 @@ lpqnext:; { ExecEndNode(epq->plan, epq->plan); epqstate->es_tupleTable->next = 0; - pfree(epqstate->es_evTuple[epq->rti - 1]); + heap_freetuple(epqstate->es_evTuple[epq->rti - 1]); epqstate->es_evTuple[epq->rti - 1] = NULL; /* pop old PQ from the stack */ oldepq = (evalPlanQual *) epqstate->es_evalPlanQual; diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index e31d7993a2..66b8909d55 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.33 1999/12/10 03:55:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.34 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -120,6 +120,7 @@ #undef ExecStoreTuple #include "catalog/pg_type.h" +#include "access/heapam.h" static TupleTableSlot *NodeGetResultTupleSlot(Plan *node); @@ -420,7 +421,7 @@ ExecClearTuple(TupleTableSlot *slot) /* slot in which to store tuple */ * ---------------- */ if (slot->ttc_shouldFree && oldtuple != NULL) - pfree(oldtuple); + heap_freetuple(oldtuple); slot->val = (HeapTuple) NULL; diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index 38f7a0365d..79edf78a27 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -13,7 +13,7 @@ * columns. (ie. tuples from the same group are consecutive) * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.30 1999/09/24 00:24:23 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.31 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -124,7 +124,7 @@ ExecGroupEveryTuple(Group *node) ExecGetScanType(&grpstate->csstate))) { grpstate->grp_useFirstTuple = TRUE; - pfree(firsttuple); + heap_freetuple(firsttuple); grpstate->grp_firstTuple = heap_copytuple(outerTuple); return NULL; /* signifies the end of the group */ @@ -242,7 +242,7 @@ ExecGroupOneTuple(Group *node) /* save outerTuple if we are not done yet */ if (!grpstate->grp_done) { - pfree(firsttuple); + heap_freetuple(firsttuple); grpstate->grp_firstTuple = heap_copytuple(outerTuple); } @@ -341,7 +341,7 @@ ExecEndGroup(Group *node) ExecClearTuple(grpstate->csstate.css_ScanTupleSlot); if (grpstate->grp_firstTuple != NULL) { - pfree(grpstate->grp_firstTuple); + heap_freetuple(grpstate->grp_firstTuple); grpstate->grp_firstTuple = NULL; } } @@ -429,7 +429,7 @@ ExecReScanGroup(Group *node, ExprContext *exprCtxt, Plan *parent) grpstate->grp_done = FALSE; if (grpstate->grp_firstTuple != NULL) { - pfree(grpstate->grp_firstTuple); + heap_freetuple(grpstate->grp_firstTuple); grpstate->grp_firstTuple = NULL; } diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 12dbcec122..3d5083a7ba 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -6,7 +6,7 @@ * Copyright (c) 1994, Regents of the University of California * * - * $Id: nodeHash.c,v 1.40 1999/12/10 03:55:51 momjian Exp $ + * $Id: nodeHash.c,v 1.41 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -482,6 +482,7 @@ ExecHashTableInsert(HashJoinTable hashtable, memcpy((char *) &hashTuple->htup, (char *) heapTuple, sizeof(hashTuple->htup)); + hashTuple->htup.t_datamcxt = hashtable->batchCxt; hashTuple->htup.t_data = (HeapTupleHeader) (((char *) hashTuple) + MAXALIGN(sizeof(*hashTuple))); memcpy((char *) hashTuple->htup.t_data, diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index ffda972318..9d5034307f 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.27 1999/10/13 15:02:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.28 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -485,6 +485,7 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate, elog(ERROR, "Read from hashjoin temp file failed"); heapTuple = palloc(HEAPTUPLESIZE + htup.t_len); memcpy((char *) heapTuple, (char *) &htup, sizeof(HeapTupleData)); + heapTuple->t_datamcxt = CurrentMemoryContext; heapTuple->t_data = (HeapTupleHeader) ((char *) heapTuple + HEAPTUPLESIZE); nread = BufFileRead(file, (void *) heapTuple->t_data, htup.t_len); diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 65c42b61b3..60b484d708 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -6,7 +6,7 @@ * Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v 1.17 1999/11/15 03:28:05 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v 1.18 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -117,7 +117,7 @@ ExecSubPlan(SubPlan *node, List *pvar, ExprContext *econtext, bool *isNull) */ tup = heap_copytuple(tup); if (node->curTuple) - pfree(node->curTuple); + heap_freetuple(node->curTuple); node->curTuple = tup; result = heap_getattr(tup, col, tdesc, isNull); /* keep scanning subplan to make sure there's only one tuple */ @@ -351,7 +351,7 @@ ExecSetParamPlan(SubPlan *node) */ tup = heap_copytuple(tup); if (node->curTuple) - pfree(node->curTuple); + heap_freetuple(node->curTuple); node->curTuple = tup; foreach(lst, node->setParam) @@ -408,7 +408,7 @@ ExecEndSubPlan(SubPlan *node) } if (node->curTuple) { - pfree(node->curTuple); + heap_freetuple(node->curTuple); node->curTuple = NULL; } } diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 8d6481bf8a..6a9e7e5e07 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.1 1999/11/23 20:06:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.2 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -148,6 +148,7 @@ TidNext(TidScan *node) bool slot_is_valid = false; itemptr = tidList[tidstate->tss_TidPtr]; + tuple->t_datamcxt = NULL; tuple->t_data = NULL; if (itemptr) { diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index c0231ce317..7c65c66814 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -3,7 +3,7 @@ * spi.c * Server Programming Interface * - * $Id: spi.c,v 1.43 1999/12/10 03:55:51 momjian Exp $ + * $Id: spi.c,v 1.44 1999/12/16 22:19:44 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -543,6 +543,26 @@ SPI_pfree(void *pointer) return; } +void +SPI_freetuple(HeapTuple tuple) +{ + MemoryContext oldcxt = NULL; + + if (_SPI_curid + 1 == _SPI_connected) /* connected */ + { + if (_SPI_current != &(_SPI_stack[_SPI_curid + 1])) + elog(FATAL, "SPI: stack corrupted"); + oldcxt = MemoryContextSwitchTo(_SPI_current->savedcxt); + } + + heap_freetuple(tuple); + + if (oldcxt) + MemoryContextSwitchTo(oldcxt); + + return; +} + /* =================== private functions =================== */ /* diff --git a/src/backend/nodes/freefuncs.c b/src/backend/nodes/freefuncs.c index 66368afd68..7e9ae5d06f 100644 --- a/src/backend/nodes/freefuncs.c +++ b/src/backend/nodes/freefuncs.c @@ -7,15 +7,15 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.28 1999/11/23 20:06:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.29 1999/12/16 22:19:47 wieck Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" - #include "optimizer/planmain.h" +#include "access/heapam.h" /* **************************************************************** * plannodes.h free functions @@ -465,7 +465,7 @@ _freeSubPlan(SubPlan *node) freeObject(node->sublink); if (node->curTuple) - pfree(node->curTuple); + heap_freetuple(node->curTuple); pfree(node); } diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 42143746b8..2a19723784 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.64 1999/12/10 07:37:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.65 1999/12/16 22:19:48 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -697,6 +697,8 @@ func_get_candidates(char *funcname, int nargs) { Buffer buffer; + tuple.t_datamcxt = NULL; + tuple.t_data = NULL; tuple.t_self = indexRes->heap_iptr; heap_fetch(heapRelation, SnapshotNow, &tuple, &buffer); pfree(indexRes); diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c index ec473fb471..a3f8eda940 100644 --- a/src/backend/rewrite/rewriteRemove.c +++ b/src/backend/rewrite/rewriteRemove.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.33 1999/11/22 17:56:23 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.34 1999/12/16 22:19:49 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -108,7 +108,7 @@ RemoveRewriteRule(char *ruleName) if (isNull) { /* XXX strange!!! */ - pfree(tuple); + heap_freetuple(tuple); elog(ERROR, "RemoveRewriteRule: internal error; null event target relation!"); } eventRelationOid = DatumGetObjectId(eventRelationOidDatum); @@ -133,7 +133,7 @@ RemoveRewriteRule(char *ruleName) */ heap_delete(RewriteRelation, &tuple->t_self, NULL); - pfree(tuple); + heap_freetuple(tuple); heap_close(RewriteRelation, RowExclusiveLock); } diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c index 08438d2ae6..02ae94b774 100644 --- a/src/backend/rewrite/rewriteSupport.c +++ b/src/backend/rewrite/rewriteSupport.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.39 1999/11/24 00:44:34 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.40 1999/12/16 22:19:50 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -113,7 +113,7 @@ setRelhasrulesInRelation(Oid relationId, bool relhasrules) CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple); CatalogCloseIndices(Num_pg_class_indices, idescs); - pfree(tuple); + heap_freetuple(tuple); heap_close(relationRelation, RowExclusiveLock); } diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index 9026e8124f..f066d418e7 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.62 1999/12/10 03:55:57 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.63 1999/12/16 22:19:51 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -654,6 +654,7 @@ inv_fetchtup(LargeObjectDesc *obj_desc, HeapTuple tuple, Buffer *buffer) if (res == (RetrieveIndexResult) NULL) { ItemPointerSetInvalid(&(obj_desc->htid)); + tuple->t_datamcxt = NULL; tuple->t_data = NULL; return; } @@ -797,7 +798,7 @@ inv_wrnew(LargeObjectDesc *obj_desc, char *buf, int nbytes) ntup = inv_newtuple(obj_desc, buffer, page, buf, nwritten); inv_indextup(obj_desc, ntup); - pfree(ntup); + heap_freetuple(ntup); /* new tuple is inserted */ WriteBuffer(buffer); @@ -971,7 +972,7 @@ inv_wrold(LargeObjectDesc *obj_desc, /* index the new tuple */ inv_indextup(obj_desc, ntup); - pfree(ntup); + heap_freetuple(ntup); /* * move the scandesc forward so we don't reread the newly inserted @@ -1059,6 +1060,7 @@ inv_newtuple(LargeObjectDesc *obj_desc, ph->pd_lower = lower; ph->pd_upper = upper; + ntup->t_datamcxt = NULL; ntup->t_data = (HeapTupleHeader) ((char *) page + upper); /* diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index f5ebcdf0eb..e346639994 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.45 1999/11/22 17:56:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.46 1999/12/16 22:19:52 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -84,6 +84,8 @@ regprocin(char *pro_name_or_oid) sd = index_beginscan(idesc, false, 1, skey); while ((indexRes = index_getnext(sd, ForwardScanDirection))) { + tuple.t_datamcxt = NULL; + tuple.t_data = NULL; tuple.t_self = indexRes->heap_iptr; heap_fetch(hdesc, SnapshotNow, &tuple, diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 96e8288916..e061e8feae 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.54 1999/11/22 17:56:31 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.55 1999/12/16 22:19:54 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -839,7 +839,7 @@ SearchSelfReferences(struct catcache * cache) elog(ERROR, "SearchSelfReferences: %s not found in %s", IndexRelidIndex, RelationRelationName); indexSelfOid = ntp->t_data->t_oid; - pfree(ntp); + heap_freetuple(ntp); heap_close(rel, AccessShareLock); } /* Looking for something other than pg_index_indexrelid_index? */ diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index c2f5a7d655..007adfb01f 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.81 1999/11/22 17:56:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.82 1999/12/16 22:19:54 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -871,7 +871,7 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo, * and for lock data pointed to by pg_class_tuple * ------------------- */ - pfree(pg_class_tuple); + heap_freetuple(pg_class_tuple); MemoryContextSwitchTo(oldcxt); @@ -1714,6 +1714,7 @@ AttrDefaultFetch(Relation relation) adrel = heap_openr(AttrDefaultRelationName, AccessShareLock); irel = index_openr(AttrDefaultIndex); sd = index_beginscan(irel, false, 1, &skey); + tuple.t_datamcxt = NULL; tuple.t_data = NULL; for (found = 0;;) @@ -1793,6 +1794,7 @@ RelCheckFetch(Relation relation) rcrel = heap_openr(RelCheckRelationName, AccessShareLock); irel = index_openr(RelCheckIndex); sd = index_beginscan(irel, false, 1, &skey); + tuple.t_datamcxt = NULL; tuple.t_data = NULL; for (found = 0;;) diff --git a/src/backend/utils/misc/database.c b/src/backend/utils/misc/database.c index c7cd9f838d..62a4303f71 100644 --- a/src/backend/utils/misc/database.c +++ b/src/backend/utils/misc/database.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.32 1999/11/07 23:08:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.33 1999/12/16 22:19:55 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -222,6 +222,7 @@ GetRawDatabaseInfo(char *name, Oid *db_id, char *path) /* get a pointer to the tuple itself */ offset = (int) ph->pd_linp[i].lp_off; + tup.t_datamcxt = NULL; tup.t_data = (HeapTupleHeader) (((char *) pg) + offset); /* diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 6e9a23f1cd..557843428c 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -77,7 +77,7 @@ * Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/sort/tuplesort.c,v 1.3 1999/12/13 01:27:04 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/sort/tuplesort.c,v 1.4 1999/12/16 22:19:56 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -1697,7 +1697,7 @@ writetup_heap(Tuplesortstate *state, int tapenum, void *tup) (void*) &tuplen, sizeof(tuplen)); FREEMEM(state, HEAPTUPLESIZE + tuple->t_len); - pfree(tuple); + heap_freetuple(tuple); } static void * @@ -1710,6 +1710,7 @@ readtup_heap(Tuplesortstate *state, int tapenum, unsigned int len) /* reconstruct the HeapTupleData portion */ tuple->t_len = len - sizeof(unsigned int); ItemPointerSetInvalid(&(tuple->t_self)); + tuple->t_datamcxt = CurrentMemoryContext; tuple->t_data = (HeapTupleHeader) (((char *) tuple) + HEAPTUPLESIZE); /* read in the tuple proper */ if (LogicalTapeRead(state->tapeset, tapenum, (void *) tuple->t_data, diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 239c3c468e..39da155329 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: heapam.h,v 1.48 1999/11/24 00:44:37 momjian Exp $ + * $Id: heapam.h,v 1.49 1999/12/16 22:19:58 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -281,6 +281,7 @@ extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor, Datum *value, char *nulls); extern HeapTuple heap_modifytuple(HeapTuple tuple, Relation relation, Datum *replValue, char *replNull, char *repl); +extern void heap_freetuple(HeapTuple tuple); HeapTuple heap_addheader(uint32 natts, int structlen, char *structure); /* in common/heap/stats.c */ diff --git a/src/include/access/htup.h b/src/include/access/htup.h index e091208e52..c81dcfd6a8 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: htup.h,v 1.25 1999/07/19 07:07:28 momjian Exp $ + * $Id: htup.h,v 1.26 1999/12/16 22:19:58 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -78,11 +78,17 @@ extern long heap_sysoffset[]; * updated version of tuple (required by MVCC); * 3. someday someone let tuple to cross block boundaries - * he have to add something below... + * + * Change for 7.0: + * Up to now t_data could be NULL, the memory location directly following + * HeapTupleData or pointing into a buffer. Now, it could also point to + * a separate allocation that was done in the t_datamcxt memory context. */ typedef struct HeapTupleData { uint32 t_len; /* length of *t_data */ ItemPointerData t_self; /* SelfItemPointer */ + MemoryContext t_datamcxt; /* */ HeapTupleHeader t_data; /* */ } HeapTupleData; diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index 9c5f8d5cfc..1c1e75876d 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -93,5 +93,6 @@ extern char *SPI_getrelname(Relation rel); extern void *SPI_palloc(Size size); extern void *SPI_repalloc(void *pointer, Size size); extern void SPI_pfree(void *pointer); +extern void SPI_freetuple(HeapTuple pointer); #endif /* SPI_H */ diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index 0904d01d1f..44172452d6 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1,5 +1,5 @@ /* - * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.34 1999/10/22 02:08:37 tgl Exp $ + * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.35 1999/12/16 22:20:03 wieck Exp $ */ #include /* faked on sunos */ @@ -608,7 +608,7 @@ ttdummy() tmptuple = SPI_copytuple(trigtuple); rettuple = SPI_modifytuple(rel, tmptuple, 1, &(attnum[1]), &newoff, NULL); - SPI_pfree(tmptuple); + SPI_freetuple(tmptuple); } else /* DELETE */