diff options
37 files changed, 191 insertions, 235 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index dac14ac3397..a8d7ca0c29f 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.134 2002/05/20 23:51:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.135 2002/05/21 22:05:53 tgl Exp $ * * * INTERFACE ROUTINES @@ -1059,15 +1059,14 @@ heap_get_latest_tid(Relation relation, return tid; } -/* ---------------- - * heap_insert - insert tuple into a heap +/* + * heap_insert - insert tuple into a heap * - * The assignment of t_min (and thus the others) should be - * removed eventually. - * ---------------- + * The new tuple is stamped with current transaction ID and the specified + * command ID. */ Oid -heap_insert(Relation relation, HeapTuple tup) +heap_insert(Relation relation, HeapTuple tup, CommandId cid) { Buffer buffer; @@ -1093,8 +1092,9 @@ heap_insert(Relation relation, HeapTuple tup) } TransactionIdStore(GetCurrentTransactionId(), &(tup->t_data->t_xmin)); - tup->t_data->t_cmin = GetCurrentCommandId(); + tup->t_data->t_cmin = cid; StoreInvalidTransactionId(&(tup->t_data->t_xmax)); + tup->t_data->t_cmax = FirstCommandId; tup->t_data->t_infomask &= ~(HEAP_XACT_MASK); tup->t_data->t_infomask |= HEAP_XMAX_INVALID; tup->t_tableOid = relation->rd_id; @@ -1179,13 +1179,27 @@ heap_insert(Relation relation, HeapTuple tup) } /* + * simple_heap_insert - insert a tuple + * + * Currently, this routine differs from heap_insert only in supplying + * a default command ID. But it should be used rather than using + * heap_insert directly in most places where we are modifying system catalogs. + */ +Oid +simple_heap_insert(Relation relation, HeapTuple tup) +{ + return heap_insert(relation, tup, GetCurrentCommandId()); +} + +/* * heap_delete - delete a tuple * * NB: do not call this directly unless you are prepared to deal with * concurrent-update conditions. Use simple_heap_delete instead. */ int -heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid) +heap_delete(Relation relation, ItemPointer tid, + ItemPointer ctid, CommandId cid) { ItemId lp; HeapTupleData tp; @@ -1215,7 +1229,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid) tp.t_tableOid = relation->rd_id; l1: - result = HeapTupleSatisfiesUpdate(&tp); + result = HeapTupleSatisfiesUpdate(&tp, cid); if (result == HeapTupleInvisible) { @@ -1265,7 +1279,7 @@ l1: START_CRIT_SECTION(); /* store transaction information of xact deleting the tuple */ TransactionIdStore(GetCurrentTransactionId(), &(tp.t_data->t_xmax)); - tp.t_data->t_cmax = GetCurrentCommandId(); + tp.t_data->t_cmax = cid; tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); /* XLOG stuff */ @@ -1336,7 +1350,7 @@ simple_heap_delete(Relation relation, ItemPointer tid) ItemPointerData ctid; int result; - result = heap_delete(relation, tid, &ctid); + result = heap_delete(relation, tid, &ctid, GetCurrentCommandId()); switch (result) { case HeapTupleSelfUpdated: @@ -1356,7 +1370,6 @@ simple_heap_delete(Relation relation, ItemPointer tid) elog(ERROR, "Unknown status %u from heap_delete", result); break; } - } /* @@ -1367,7 +1380,7 @@ simple_heap_delete(Relation relation, ItemPointer tid) */ int heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, - ItemPointer ctid) + ItemPointer ctid, CommandId cid) { ItemId lp; HeapTupleData oldtup; @@ -1407,7 +1420,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, */ l2: - result = HeapTupleSatisfiesUpdate(&oldtup); + result = HeapTupleSatisfiesUpdate(&oldtup, cid); if (result == HeapTupleInvisible) { @@ -1457,7 +1470,7 @@ l2: /* Fill in OID and transaction status data for newtup */ newtup->t_data->t_oid = oldtup.t_data->t_oid; TransactionIdStore(GetCurrentTransactionId(), &(newtup->t_data->t_xmin)); - newtup->t_data->t_cmin = GetCurrentCommandId(); + newtup->t_data->t_cmin = cid; StoreInvalidTransactionId(&(newtup->t_data->t_xmax)); newtup->t_data->t_infomask &= ~(HEAP_XACT_MASK); newtup->t_data->t_infomask |= (HEAP_XMAX_INVALID | HEAP_UPDATED); @@ -1496,7 +1509,7 @@ l2: TransactionIdStore(GetCurrentTransactionId(), &(oldtup.t_data->t_xmax)); - oldtup.t_data->t_cmax = GetCurrentCommandId(); + oldtup.t_data->t_cmax = cid; oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); @@ -1588,7 +1601,7 @@ l2: { TransactionIdStore(GetCurrentTransactionId(), &(oldtup.t_data->t_xmax)); - oldtup.t_data->t_cmax = GetCurrentCommandId(); + oldtup.t_data->t_cmax = cid; oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); @@ -1653,7 +1666,7 @@ simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup) ItemPointerData ctid; int result; - result = heap_update(relation, otid, tup, &ctid); + result = heap_update(relation, otid, tup, &ctid, GetCurrentCommandId()); switch (result) { case HeapTupleSelfUpdated: @@ -1679,7 +1692,8 @@ simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup) * heap_mark4update - mark a tuple for update */ int -heap_mark4update(Relation relation, HeapTuple tuple, Buffer *buffer) +heap_mark4update(Relation relation, HeapTuple tuple, Buffer *buffer, + CommandId cid) { ItemPointer tid = &(tuple->t_self); ItemId lp; @@ -1704,7 +1718,7 @@ heap_mark4update(Relation relation, HeapTuple tuple, Buffer *buffer) tuple->t_len = ItemIdGetLength(lp); l3: - result = HeapTupleSatisfiesUpdate(tuple); + result = HeapTupleSatisfiesUpdate(tuple, cid); if (result == HeapTupleInvisible) { @@ -1758,7 +1772,7 @@ l3: /* store transaction information of xact marking the tuple */ TransactionIdStore(GetCurrentTransactionId(), &(tuple->t_data->t_xmax)); - tuple->t_data->t_cmax = GetCurrentCommandId(); + tuple->t_data->t_cmax = cid; tuple->t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID); tuple->t_data->t_infomask |= HEAP_MARKED_FOR_UPDATE; @@ -2400,9 +2414,8 @@ _heap_unlock_tuple(void *data) htup = (HeapTupleHeader) PageGetItem(page, lp); - if (!TransactionIdEquals(htup->t_xmax, GetCurrentTransactionId()) || - htup->t_cmax != GetCurrentCommandId()) - elog(PANIC, "_heap_unlock_tuple: invalid xmax/cmax in rollback"); + if (!TransactionIdEquals(htup->t_xmax, GetCurrentTransactionId())) + elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback"); htup->t_infomask &= ~HEAP_XMAX_UNLOGGED; htup->t_infomask |= HEAP_XMAX_INVALID; UnlockAndWriteBuffer(buffer); diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 18bc99982a5..9ac1c69c8ea 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.29 2002/05/20 23:51:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.30 2002/05/21 22:05:53 tgl Exp $ * * * INTERFACE ROUTINES @@ -911,7 +911,7 @@ toast_save_datum(Relation rel, Datum value) if (!HeapTupleIsValid(toasttup)) elog(ERROR, "Failed to build TOAST tuple"); - heap_insert(toastrel, toasttup); + simple_heap_insert(toastrel, toasttup); /* * Create the index entry. We cheat a little here by not using diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 39e4afeb749..10de2f8a6d5 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.122 2002/05/17 20:53:33 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.123 2002/05/21 22:05:53 tgl Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -350,14 +350,6 @@ GetCurrentCommandId(void) return s->commandId; } -CommandId -GetScanCommandId(void) -{ - TransactionState s = CurrentTransactionState; - - return s->scanCommandId; -} - /* -------------------------------- * GetCurrentTransactionStartTime @@ -418,17 +410,6 @@ CommandIdIsCurrentCommandId(CommandId cid) return (cid == s->commandId) ? true : false; } -bool -CommandIdGEScanCommandId(CommandId cid) -{ - TransactionState s = CurrentTransactionState; - - if (AMI_OVERRIDE) - return false; - - return (cid >= s->scanCommandId) ? true : false; -} - /* -------------------------------- * CommandCounterIncrement @@ -437,11 +418,17 @@ CommandIdGEScanCommandId(CommandId cid) void CommandCounterIncrement(void) { - CurrentTransactionStateData.commandId += 1; - if (CurrentTransactionStateData.commandId == FirstCommandId) + TransactionState s = CurrentTransactionState; + + s->commandId += 1; + if (s->commandId == FirstCommandId) /* check for overflow */ elog(ERROR, "You may only have 2^32-1 commands per transaction"); - CurrentTransactionStateData.scanCommandId = CurrentTransactionStateData.commandId; + /* Propagate new command ID into query snapshots, if set */ + if (QuerySnapshot) + QuerySnapshot->curcid = s->commandId; + if (SerializableSnapshot) + SerializableSnapshot->curcid = s->commandId; /* * make cache changes visible to me. AtCommit_LocalCache() instead of @@ -451,11 +438,6 @@ CommandCounterIncrement(void) AtStart_Cache(); } -void -SetScanCommandId(CommandId savedId) -{ - CurrentTransactionStateData.scanCommandId = savedId; -} /* ---------------------------------------------------------------- * StartTransaction stuff @@ -889,10 +871,6 @@ StartTransaction(void) * initialize current transaction state fields */ s->commandId = FirstCommandId; - s->scanCommandId = FirstCommandId; -#if NOT_USED - s->startTime = GetCurrentAbsoluteTime(); -#endif s->startTime = GetCurrentAbsoluteTimeUsec(&(s->startTimeUsec)); /* diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 5f734ff5447..3d1784870e9 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.130 2002/05/20 23:51:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.131 2002/05/21 22:05:53 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -680,7 +680,7 @@ InsertOneTuple(Oid objectid) if (objectid != (Oid) 0) tuple->t_data->t_oid = objectid; - heap_insert(boot_reldesc, tuple); + simple_heap_insert(boot_reldesc, tuple); heap_freetuple(tuple); elog(DEBUG3, "row inserted"); diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 17697336330..c206196bfcc 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.200 2002/05/20 23:51:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.201 2002/05/21 22:05:53 tgl Exp $ * * * INTERFACE ROUTINES @@ -440,7 +440,7 @@ AddNewAttributeTuples(Oid new_rel_oid, ATTRIBUTE_TUPLE_SIZE, (void *) *dpp); - heap_insert(rel, tup); + simple_heap_insert(rel, tup); if (hasindex) CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup); @@ -474,7 +474,7 @@ AddNewAttributeTuples(Oid new_rel_oid, /* attStruct->attstattarget = 0; */ /* attStruct->attcacheoff = -1; */ - heap_insert(rel, tup); + simple_heap_insert(rel, tup); if (hasindex) CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup); @@ -574,7 +574,7 @@ AddNewRelationTuple(Relation pg_class_desc, /* * finally insert the new tuple and free it. */ - heap_insert(pg_class_desc, tup); + simple_heap_insert(pg_class_desc, tup); if (!IsIgnoringSystemIndexes()) { @@ -1308,7 +1308,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin) CStringGetDatum(adsrc)); adrel = heap_openr(AttrDefaultRelationName, RowExclusiveLock); tuple = heap_formtuple(adrel->rd_att, values, nulls); - heap_insert(adrel, tuple); + simple_heap_insert(adrel, tuple); CatalogOpenIndices(Num_pg_attrdef_indices, Name_pg_attrdef_indices, idescs); CatalogIndexInsert(idescs, Num_pg_attrdef_indices, adrel, tuple); @@ -1388,7 +1388,7 @@ StoreRelCheck(Relation rel, char *ccname, char *ccbin) CStringGetDatum(ccsrc)); rcrel = heap_openr(RelCheckRelationName, RowExclusiveLock); tuple = heap_formtuple(rcrel->rd_att, values, nulls); - heap_insert(rcrel, tuple); + simple_heap_insert(rcrel, tuple); CatalogOpenIndices(Num_pg_relcheck_indices, Name_pg_relcheck_indices, idescs); CatalogIndexInsert(idescs, Num_pg_relcheck_indices, rcrel, tuple); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 84cc2fe9b1d..a0f7f9b4cdf 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.178 2002/05/20 23:51:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.179 2002/05/21 22:05:53 tgl Exp $ * * * INTERFACE ROUTINES @@ -327,7 +327,7 @@ UpdateRelationRelation(Relation indexRelation) * sure would be embarrassing to do this sort of thing in polite company. */ tuple->t_data->t_oid = RelationGetRelid(indexRelation); - heap_insert(pg_class, tuple); + simple_heap_insert(pg_class, tuple); /* * During normal processing, we need to make sure that the system @@ -408,7 +408,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts) ATTRIBUTE_TUPLE_SIZE, (void *) indexTupDesc->attrs[i]); - heap_insert(pg_attribute, new_tuple); + simple_heap_insert(pg_attribute, new_tuple); if (hasind) CatalogIndexInsert(idescs, Num_pg_attr_indices, pg_attribute, new_tuple); @@ -500,7 +500,7 @@ UpdateIndexRelation(Oid indexoid, /* * insert the tuple into the pg_index */ - heap_insert(pg_index, tuple); + simple_heap_insert(pg_index, tuple); /* * add index tuples for it @@ -1010,7 +1010,8 @@ LockClassinfoForUpdate(Oid relid, HeapTuple rtup, ItemPointerData tidsave; ItemPointerCopy(&(rtup->t_self), &tidsave); - test = heap_mark4update(relationRelation, rtup, buffer); + test = heap_mark4update(relationRelation, rtup, buffer, + GetCurrentCommandId()); switch (test) { case HeapTupleSelfUpdated: diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 3e586f0b523..1853acda73c 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.46 2002/05/18 13:47:59 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.47 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -174,7 +174,7 @@ AggregateCreate(const char *aggName, tupDesc = aggdesc->rd_att; tup = heap_formtuple(tupDesc, values, nulls); - heap_insert(aggdesc, tup); + simple_heap_insert(aggdesc, tup); if (RelationGetForm(aggdesc)->relhasindex) { diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c index d4b5e6bfeb3..bc3c69f6e7f 100644 --- a/src/backend/catalog/pg_largeobject.c +++ b/src/backend/catalog/pg_largeobject.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.11 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.12 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -63,7 +63,7 @@ LargeObjectCreate(Oid loid) /* * Insert it */ - heap_insert(pg_largeobject, ntup); + simple_heap_insert(pg_largeobject, ntup); /* * Update indices diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c index e2cf0128dc8..f95dafd8ee8 100644 --- a/src/backend/catalog/pg_namespace.c +++ b/src/backend/catalog/pg_namespace.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.2 2002/03/31 06:26:30 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.3 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -61,13 +61,10 @@ NamespaceCreate(const char *nspName, int32 ownerSysId) nspdesc = heap_openr(NamespaceRelationName, RowExclusiveLock); tupDesc = nspdesc->rd_att; - if (!HeapTupleIsValid(tup = heap_formtuple(tupDesc, - values, - nulls))) - elog(ERROR, "NamespaceCreate: heap_formtuple failed"); - nspoid = heap_insert(nspdesc, tup); - if (!OidIsValid(nspoid)) - elog(ERROR, "NamespaceCreate: heap_insert failed"); + + tup = heap_formtuple(tupDesc, values, nulls); + nspoid = simple_heap_insert(nspdesc, tup); + Assert(OidIsValid(nspoid)); if (RelationGetForm(nspdesc)->relhasindex) { diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 53a5d61cd90..874626ac91b 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.68 2002/04/27 03:45:00 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.69 2002/05/21 22:05:54 tgl Exp $ * * NOTES * these routines moved here from commands/define.c and somewhat cleaned up. @@ -260,8 +260,7 @@ OperatorShellMake(const char *operatorName, /* * insert our "shell" operator tuple */ - heap_insert(pg_operator_desc, tup); - operatorObjectId = tup->t_data->t_oid; + operatorObjectId = simple_heap_insert(pg_operator_desc, tup); if (RelationGetForm(pg_operator_desc)->relhasindex) { @@ -360,7 +359,7 @@ OperatorShellMake(const char *operatorName, * get the t_self from the modified tuple and call RelationReplaceHeapTuple * else if a new operator is being created * create a tuple using heap_formtuple - * call heap_insert + * call simple_heap_insert */ void OperatorCreate(const char *operatorName, @@ -647,8 +646,7 @@ OperatorCreate(const char *operatorName, tupDesc = pg_operator_desc->rd_att; tup = heap_formtuple(tupDesc, values, nulls); - heap_insert(pg_operator_desc, tup); - operatorObjectId = tup->t_data->t_oid; + operatorObjectId = simple_heap_insert(pg_operator_desc, tup); } /* Must update the indexes in either case */ diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index 6fa6a4bf6fe..4d656d98ba2 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.72 2002/05/18 13:47:59 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.73 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -298,7 +298,7 @@ ProcedureCreate(const char *procedureName, nulls[Anum_pg_proc_proacl-1] = 'n'; tup = heap_formtuple(tupDesc, values, nulls); - heap_insert(rel, tup); + simple_heap_insert(rel, tup); } /* Need to update indices for either the insert or update case */ diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 15c24c077ad..d07e8c24390 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.70 2002/03/29 19:06:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.71 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -102,8 +102,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace) /* * insert the tuple in the relation and get the tuple's oid. */ - heap_insert(pg_type_desc, tup); - typoid = tup->t_data->t_oid; + typoid = simple_heap_insert(pg_type_desc, tup); if (RelationGetForm(pg_type_desc)->relhasindex) { @@ -286,9 +285,7 @@ TypeCreate(const char *typeName, /* preassign tuple Oid, if one was given */ tup->t_data->t_oid = assignedTypeOid; - heap_insert(pg_type_desc, tup); - - typeObjectId = tup->t_data->t_oid; + typeObjectId = simple_heap_insert(pg_type_desc, tup); } /* Update indices (not necessary if bootstrapping) */ diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index c0150438438..3f5cc96f41a 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.33 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.34 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1787,7 +1787,7 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats) { /* No, insert new tuple */ stup = heap_formtuple(sd->rd_att, values, nulls); - heap_insert(sd, stup); + simple_heap_insert(sd, stup); } /* update indices too */ diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 271be151195..7ed3663a48f 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.85 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.86 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -242,7 +242,7 @@ Async_Listen(char *relname, int pid) values[i++] = (Datum) 0; /* no notifies pending */ tuple = heap_formtuple(RelationGetDescr(lRel), values, nulls); - heap_insert(lRel, tuple); + simple_heap_insert(lRel, tuple); #ifdef NOT_USED /* currently there are no indexes */ if (RelationGetForm(lRel)->relhasindex) diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index a6215cb23f4..be602274028 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.80 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.81 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -241,7 +241,7 @@ rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) */ HeapTuple copiedTuple = heap_copytuple(LocalHeapTuple); - heap_insert(LocalNewHeap, copiedTuple); + simple_heap_insert(LocalNewHeap, copiedTuple); heap_freetuple(copiedTuple); CHECK_FOR_INTERRUPTS(); diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 9d48e33b2c0..72867206143 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -7,7 +7,7 @@ * Copyright (c) 1999-2001, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.47 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.48 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -199,7 +199,7 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment) { newtuple = heap_formtuple(RelationGetDescr(description), values, nulls); - heap_insert(description, newtuple); + simple_heap_insert(description, newtuple); } /* Update indexes, if necessary */ diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 1f9aef8fc0d..83ca5b32c54 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.154 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.155 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -947,7 +947,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, /* * OK, store the tuple and create index entries for it */ - heap_insert(rel, tuple); + simple_heap_insert(rel, tuple); if (resultRelInfo->ri_NumIndices > 0) ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false); diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index d4bc274ba29..bdba0dacfc0 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.90 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.91 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -293,7 +293,7 @@ createdb(const char *dbname, const char *dbowner, tuple->t_data->t_oid = dboid; /* override heap_insert's OID * selection */ - heap_insert(pg_database_rel, tuple); + simple_heap_insert(pg_database_rel, tuple); /* * Update indexes diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 6f690c0927c..754ea46246c 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.1 2002/04/15 05:22:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.2 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -74,7 +74,6 @@ PerformPortalFetch(char *name, EState *estate; MemoryContext oldcontext; ScanDirection direction; - CommandId savedId; bool temp_desc = false; /* initialize completion status in case of early exit */ @@ -132,14 +131,6 @@ PerformPortalFetch(char *name, } /* - * Restore the scanCommandId that was current when the cursor was - * opened. This ensures that we see the same tuples throughout the - * execution of the cursor. - */ - savedId = GetScanCommandId(); - SetScanCommandId(PortalGetCommandId(portal)); - - /* * Determine which direction to go in, and check to see if we're * already at the end of the available tuples in that direction. If * so, set the direction to NoMovement to avoid trying to fetch any @@ -186,11 +177,6 @@ PerformPortalFetch(char *name, estate->es_processed); /* - * Restore outer command ID. - */ - SetScanCommandId(savedId); - - /* * Clean up and switch back to old context. */ if (temp_desc) diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 2ad25fdbd4f..6cabbf0ec13 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.31 2002/04/15 05:22:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.32 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -102,7 +102,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt) tupDesc = rel->rd_att; tup = heap_formtuple(tupDesc, values, nulls); - heap_insert(rel, tup); + simple_heap_insert(rel, tup); if (RelationGetForm(rel)->relhasindex) { diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 0fa56fcfb7d..c79e6f97e1b 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.77 2002/04/15 05:22:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.78 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -197,7 +197,7 @@ DefineSequence(CreateSeqStmt *seq) /* Now form & insert sequence tuple */ tuple = heap_formtuple(tupDesc, value, null); - heap_insert(rel, tuple); + simple_heap_insert(rel, tuple); Assert(ItemPointerGetOffsetNumber(&(tuple->t_self)) == FirstOffsetNumber); diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f2bbdb01075..aff1590f11b 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.15 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.16 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -821,7 +821,7 @@ StoreCatalogInheritance(Oid relationId, List *supers) tuple = heap_formtuple(desc, datum, nullarr); - heap_insert(relation, tuple); + simple_heap_insert(relation, tuple); if (RelationGetForm(relation)->relhasindex) { @@ -1673,7 +1673,7 @@ AlterTableAddColumn(Oid myrelid, ReleaseSysCache(typeTuple); - heap_insert(attrdesc, attributeTuple); + simple_heap_insert(attrdesc, attributeTuple); /* Update indexes on pg_attribute */ if (RelationGetForm(attrdesc)->relhasindex) @@ -2890,7 +2890,8 @@ AlterTableCreateToastTable(Oid relOid, bool silent) classtuple.t_self = reltup->t_self; ReleaseSysCache(reltup); - switch (heap_mark4update(class_rel, &classtuple, &buffer)) + switch (heap_mark4update(class_rel, &classtuple, &buffer, + GetCurrentCommandId())) { case HeapTupleSelfUpdated: case HeapTupleMayBeUpdated: diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index a871c857880..e0b01b6fee5 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.117 2002/04/30 01:24:57 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.118 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -270,7 +270,7 @@ CreateTrigger(CreateTrigStmt *stmt) /* * Insert tuple into pg_trigger. */ - heap_insert(tgrel, tuple); + simple_heap_insert(tgrel, tuple); CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs); CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple); CatalogCloseIndices(Num_pg_trigger_indices, idescs); @@ -1183,7 +1183,8 @@ GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo, *newSlot = NULL; tuple.t_self = *tid; ltrmark:; - test = heap_mark4update(relation, &tuple, &buffer); + test = heap_mark4update(relation, &tuple, &buffer, + GetCurrentCommandId()); switch (test) { case HeapTupleSelfUpdated: diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index c7c3da9dd42..98f47dd98bb 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.102 2002/05/20 23:51:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.103 2002/05/21 22:05:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -596,7 +596,7 @@ CreateUser(CreateUserStmt *stmt) /* * Insert new record in the pg_shadow table */ - heap_insert(pg_shadow_rel, tuple); + simple_heap_insert(pg_shadow_rel, tuple); /* * Update indexes @@ -1213,9 +1213,9 @@ CreateGroup(CreateGroupStmt *stmt) tuple = heap_formtuple(pg_group_dsc, new_record, new_record_nulls); /* - * Insert a new record in the pg_group_table + * Insert a new record in the pg_group table */ - heap_insert(pg_group_rel, tuple); + simple_heap_insert(pg_group_rel, tuple); /* * Update indexes diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index a2c43bc0359..a8c776bab2c 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -27,7 +27,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.161 2002/05/12 20:10:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.162 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -101,6 +101,7 @@ TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate) { TupleDesc result; + Snapshot es_snapshot; /* sanity checks */ Assert(queryDesc != NULL); @@ -114,22 +115,28 @@ ExecutorStart(QueryDesc *queryDesc, EState *estate) } /* - * Make our own private copy of the current queries snapshot data + * Make our own private copy of the current query snapshot data. + * + * This "freezes" our idea of which tuples are good and which are not + * for the life of this query, even if it outlives the current command + * and current snapshot. */ - if (QuerySnapshot == NULL) - estate->es_snapshot = NULL; - else + if (QuerySnapshot == NULL) /* should be set already, but... */ + SetQuerySnapshot(); + + es_snapshot = (Snapshot) palloc(sizeof(SnapshotData)); + memcpy(es_snapshot, QuerySnapshot, sizeof(SnapshotData)); + if (es_snapshot->xcnt > 0) { - estate->es_snapshot = (Snapshot) palloc(sizeof(SnapshotData)); - memcpy(estate->es_snapshot, QuerySnapshot, sizeof(SnapshotData)); - if (estate->es_snapshot->xcnt > 0) - { - estate->es_snapshot->xip = (TransactionId *) - palloc(estate->es_snapshot->xcnt * sizeof(TransactionId)); - memcpy(estate->es_snapshot->xip, QuerySnapshot->xip, - estate->es_snapshot->xcnt * sizeof(TransactionId)); - } + es_snapshot->xip = (TransactionId *) + palloc(es_snapshot->xcnt * sizeof(TransactionId)); + memcpy(es_snapshot->xip, QuerySnapshot->xip, + es_snapshot->xcnt * sizeof(TransactionId)); } + else + es_snapshot->xip = NULL; + + estate->es_snapshot = es_snapshot; /* * Initialize the plan @@ -1031,7 +1038,8 @@ lnext: ; erm->resname); tuple.t_self = *((ItemPointer) DatumGetPointer(datum)); - test = heap_mark4update(erm->relation, &tuple, &buffer); + test = heap_mark4update(erm->relation, &tuple, &buffer, + estate->es_snapshot->curcid); ReleaseBuffer(buffer); switch (test) { @@ -1163,7 +1171,8 @@ ExecRetrieve(TupleTableSlot *slot, */ if (estate->es_into_relation_descriptor != NULL) { - heap_insert(estate->es_into_relation_descriptor, tuple); + heap_insert(estate->es_into_relation_descriptor, tuple, + estate->es_snapshot->curcid); IncrAppended(); } @@ -1239,7 +1248,8 @@ ExecAppend(TupleTableSlot *slot, /* * insert the tuple */ - newId = heap_insert(resultRelationDesc, tuple); + newId = heap_insert(resultRelationDesc, tuple, + estate->es_snapshot->curcid); IncrAppended(); (estate->es_processed)++; @@ -1301,7 +1311,9 @@ ExecDelete(TupleTableSlot *slot, * delete the tuple */ ldelete:; - result = heap_delete(resultRelationDesc, tupleid, &ctid); + result = heap_delete(resultRelationDesc, tupleid, + &ctid, + estate->es_snapshot->curcid); switch (result) { case HeapTupleSelfUpdated: @@ -1433,7 +1445,9 @@ lreplace:; /* * replace the heap tuple */ - result = heap_update(resultRelationDesc, tupleid, tuple, &ctid); + result = heap_update(resultRelationDesc, tupleid, tuple, + &ctid, + estate->es_snapshot->curcid); switch (result) { case HeapTupleSelfUpdated: diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index 938f7e17f93..1265bc78d4b 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.50 2002/05/12 20:10:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.51 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -465,7 +465,6 @@ fmgr_sql(PG_FUNCTION_ARGS) SQLFunctionCachePtr fcache; execution_state *es; Datum result = 0; - CommandId savedId; /* * Switch to context in which the fcache lives. This ensures that @@ -475,14 +474,6 @@ fmgr_sql(PG_FUNCTION_ARGS) oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt); /* - * Before we start do anything we must save CurrentScanCommandId to - * restore it before return to upper Executor. Also, we have to set - * CurrentScanCommandId equal to CurrentCommandId. - vadim 08/29/97 - */ - savedId = GetScanCommandId(); - SetScanCommandId(GetCurrentCommandId()); - - /* * Initialize fcache and execution state if first time through. */ fcache = (SQLFunctionCachePtr) fcinfo->flinfo->fn_extra; @@ -516,11 +507,6 @@ fmgr_sql(PG_FUNCTION_ARGS) } /* - * Restore outer command ID. - */ - SetScanCommandId(savedId); - - /* * If we've gone through every command in this function, we are done. */ if (es == (execution_state *) NULL) diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index b9bcce30e29..9c445650e54 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.69 2002/04/15 05:22:04 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.70 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -106,11 +106,7 @@ SPI_connect(void) /* ... and switch to procedure's context */ _SPI_current->savedcxt = MemoryContextSwitchTo(_SPI_current->procCxt); - _SPI_current->savedId = GetScanCommandId(); - SetScanCommandId(GetCurrentCommandId()); - return SPI_OK_CONNECT; - } int @@ -129,8 +125,6 @@ SPI_finish(void) MemoryContextDelete(_SPI_current->execCxt); MemoryContextDelete(_SPI_current->procCxt); - SetScanCommandId(_SPI_current->savedId); - /* * After _SPI_begin_call _SPI_connected == _SPI_curid. Now we are * closing connection to SPI and returning to upper Executor and so @@ -1233,7 +1227,6 @@ _SPI_cursor_operation(Portal portal, bool forward, int count, EState *estate; MemoryContext oldcontext; ScanDirection direction; - CommandId savedId; CommandDest olddest; /* Check that the portal is valid */ @@ -1260,14 +1253,6 @@ _SPI_cursor_operation(Portal portal, bool forward, int count, olddest = querydesc->dest; querydesc->dest = dest; - /* - * Restore the scanCommandId that was current when the cursor was - * opened. This ensures that we see the same tuples throughout the - * execution of the cursor. - */ - savedId = GetScanCommandId(); - SetScanCommandId(PortalGetCommandId(portal)); - /* Run the executor like PerformPortalFetch and remember states */ if (forward) { @@ -1300,11 +1285,6 @@ _SPI_cursor_operation(Portal portal, bool forward, int count, _SPI_current->processed = estate->es_processed; - /* - * Restore outer command ID. - */ - SetScanCommandId(savedId); - /* Restore the old command destination and switch back to callers */ /* memory context */ querydesc->dest = olddest; diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 4b1799ff2e9..81fd39df360 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.71 2002/05/20 23:51:43 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.72 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -88,9 +88,7 @@ InsertRule(char *rulname, values, nulls); - heap_insert(pg_rewrite_desc, tup); - - rewriteObjectId = tup->t_data->t_oid; + rewriteObjectId = simple_heap_insert(pg_rewrite_desc, tup); if (RelationGetForm(pg_rewrite_desc)->relhasindex) { diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index 865c96ed8fa..a32c8ae7035 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.45 2002/03/02 23:35:57 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.46 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -397,6 +397,9 @@ GetSnapshotData(bool serializable) Assert(TransactionIdIsValid(MyProc->xmin)); snapshot->xcnt = count; + + snapshot->curcid = GetCurrentCommandId(); + return snapshot; } diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index a470a870df7..fb0bf888093 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.91 2002/05/20 23:51:43 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.92 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -555,7 +555,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes) values[Anum_pg_largeobject_pageno - 1] = Int32GetDatum(pageno); values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf); newtup = heap_formtuple(obj_desc->heap_r->rd_att, values, nulls); - heap_insert(obj_desc->heap_r, newtup); + simple_heap_insert(obj_desc->heap_r, newtup); if (write_indices) CatalogIndexInsert(idescs, Num_pg_largeobject_indices, obj_desc->heap_r, newtup); diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 318827ed957..90e9ca6a71c 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.47 2002/03/06 06:10:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.48 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -168,7 +168,6 @@ PortalSetQuery(Portal portal, portal->queryDesc = queryDesc; portal->attinfo = attinfo; - portal->commandId = GetScanCommandId(); portal->state = state; portal->atStart = true; /* Allow fetch forward only */ portal->atEnd = false; @@ -214,7 +213,6 @@ CreatePortal(char *name) /* initialize portal query */ portal->queryDesc = NULL; portal->attinfo = NULL; - portal->commandId = 0; portal->state = NULL; portal->atStart = true; /* disallow fetches until query is set */ portal->atEnd = true; diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c index ba052e5f77b..58534159f7a 100644 --- a/src/backend/utils/time/tqual.c +++ b/src/backend/utils/time/tqual.c @@ -16,7 +16,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.50 2002/05/06 02:39:01 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.51 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -238,7 +238,7 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) } else if (TransactionIdIsCurrentTransactionId(tuple->t_xmin)) { - if (CommandIdGEScanCommandId(tuple->t_cmin)) + if (tuple->t_cmin >= GetCurrentCommandId()) return false; /* inserted after scan started */ if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid */ @@ -249,7 +249,7 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) return true; - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= GetCurrentCommandId()) return true; /* deleted after scan started */ else return false; /* deleted before scan started */ @@ -280,7 +280,7 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) { if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) return true; - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= GetCurrentCommandId()) return true; /* deleted after scan started */ else return false; /* deleted before scan started */ @@ -363,10 +363,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple) * HeapTupleSatisfiesUpdate * * Same logic as HeapTupleSatisfiesNow, but returns a more detailed result - * code, since UPDATE needs to know more than "is it visible?". + * code, since UPDATE needs to know more than "is it visible?". Also, + * tuples of my own xact are tested against the passed CommandId not + * CurrentCommandId. */ int -HeapTupleSatisfiesUpdate(HeapTuple htuple) +HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid) { HeapTupleHeader tuple = htuple->t_data; @@ -409,7 +411,7 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple) } else if (TransactionIdIsCurrentTransactionId(tuple->t_xmin)) { - if (CommandIdGEScanCommandId(tuple->t_cmin)) + if (tuple->t_cmin >= curcid) return HeapTupleInvisible; /* inserted after scan * started */ @@ -421,7 +423,7 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) return HeapTupleMayBeUpdated; - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= curcid) return HeapTupleSelfUpdated; /* updated after scan * started */ else @@ -454,7 +456,7 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple) { if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) return HeapTupleMayBeUpdated; - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= curcid) return HeapTupleSelfUpdated; /* updated after scan * started */ else @@ -677,7 +679,7 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot) } else if (TransactionIdIsCurrentTransactionId(tuple->t_xmin)) { - if (CommandIdGEScanCommandId(tuple->t_cmin)) + if (tuple->t_cmin >= snapshot->curcid) return false; /* inserted after scan started */ if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid */ @@ -688,7 +690,7 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) return true; - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= snapshot->curcid) return true; /* deleted after scan started */ else return false; /* deleted before scan started */ @@ -730,7 +732,7 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot) { if (TransactionIdIsCurrentTransactionId(tuple->t_xmax)) { - if (CommandIdGEScanCommandId(tuple->t_cmax)) + if (tuple->t_cmax >= snapshot->curcid) return true; /* deleted after scan started */ else return false; /* deleted before scan started */ @@ -950,6 +952,7 @@ SetQuerySnapshot(void) { free(QuerySnapshot->xip); free(QuerySnapshot); + QuerySnapshot = NULL; } if (XactIsoLevel == XACT_SERIALIZABLE) diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index b8f2394fc54..7bf75f512d3 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: heapam.h,v 1.74 2002/05/20 23:51:43 tgl Exp $ + * $Id: heapam.h,v 1.75 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -156,16 +156,23 @@ extern void heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tuple, Buffer *userbuf, PgStat_Info *pgstat_info); -extern ItemPointer heap_get_latest_tid(Relation relation, Snapshot snapshot, ItemPointer tid); +extern ItemPointer heap_get_latest_tid(Relation relation, Snapshot snapshot, + ItemPointer tid); extern void setLastTid(const ItemPointer tid); -extern Oid heap_insert(Relation relation, HeapTuple tup); -extern int heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid); + +extern Oid heap_insert(Relation relation, HeapTuple tup, CommandId cid); +extern int heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid, + CommandId cid); extern int heap_update(Relation relation, ItemPointer otid, HeapTuple tup, - ItemPointer ctid); -extern int heap_mark4update(Relation relation, HeapTuple tup, Buffer *userbuf); + ItemPointer ctid, CommandId cid); +extern int heap_mark4update(Relation relation, HeapTuple tup, + Buffer *userbuf, CommandId cid); + +extern Oid simple_heap_insert(Relation relation, HeapTuple tup); extern void simple_heap_delete(Relation relation, ItemPointer tid); extern void simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup); + extern void heap_markpos(HeapScanDesc scan); extern void heap_restrpos(HeapScanDesc scan); diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 0cfc1652f22..537d84b63db 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: xact.h,v 1.42 2002/04/01 03:34:27 tgl Exp $ + * $Id: xact.h,v 1.43 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -38,7 +38,6 @@ typedef struct TransactionStateData { TransactionId transactionIdData; CommandId commandId; - CommandId scanCommandId; AbsoluteTime startTime; int startTimeUsec; int state; @@ -101,13 +100,10 @@ extern bool IsTransactionState(void); extern bool IsAbortedTransactionBlockState(void); extern TransactionId GetCurrentTransactionId(void); extern CommandId GetCurrentCommandId(void); -extern CommandId GetScanCommandId(void); -extern void SetScanCommandId(CommandId); extern AbsoluteTime GetCurrentTransactionStartTime(void); extern AbsoluteTime GetCurrentTransactionStartTimeUsec(int *usec); extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); extern bool CommandIdIsCurrentCommandId(CommandId cid); -extern bool CommandIdGEScanCommandId(CommandId cid); extern void CommandCounterIncrement(void); extern void StartTransactionCommand(void); extern void CommitTransactionCommand(void); diff --git a/src/include/executor/spi_priv.h b/src/include/executor/spi_priv.h index dd8b1877502..c780c3656fa 100644 --- a/src/include/executor/spi_priv.h +++ b/src/include/executor/spi_priv.h @@ -3,7 +3,7 @@ * spi.c * Server Programming Interface private declarations * - * $Header: /cvsroot/pgsql/src/include/executor/spi_priv.h,v 1.11 2001/11/05 17:46:33 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/executor/spi_priv.h,v 1.12 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,7 +20,6 @@ typedef struct MemoryContext procCxt; /* procedure context */ MemoryContext execCxt; /* executor context */ MemoryContext savedcxt; - CommandId savedId; } _SPI_connection; typedef struct diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h index 9198b21feb9..491106fac37 100644 --- a/src/include/utils/portal.h +++ b/src/include/utils/portal.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: portal.h,v 1.32 2002/02/14 15:24:10 tgl Exp $ + * $Id: portal.h,v 1.33 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -31,7 +31,6 @@ typedef struct PortalData MemoryContext heap; /* subsidiary memory */ QueryDesc *queryDesc; /* Info about query associated with portal */ TupleDesc attinfo; - CommandId commandId; /* Command counter value for query */ EState *state; /* Execution state of query */ bool atStart; /* T => fetch backwards is not allowed */ bool atEnd; /* T => fetch forwards is not allowed */ @@ -49,7 +48,6 @@ typedef struct PortalData */ #define PortalGetQueryDesc(portal) ((portal)->queryDesc) #define PortalGetTupleDesc(portal) ((portal)->attinfo) -#define PortalGetCommandId(portal) ((portal)->commandId) #define PortalGetState(portal) ((portal)->state) #define PortalGetHeapMemory(portal) ((portal)->heap) diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h index a69851e6661..f5f03ea01af 100644 --- a/src/include/utils/tqual.h +++ b/src/include/utils/tqual.h @@ -8,7 +8,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: tqual.h,v 1.38 2002/01/16 20:29:02 tgl Exp $ + * $Id: tqual.h,v 1.39 2002/05/21 22:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -26,6 +26,7 @@ typedef struct SnapshotData uint32 xcnt; /* # of xact ids in xip[] */ TransactionId *xip; /* array of xact IDs in progress */ /* note: all ids in xip[] satisfy xmin <= xip[i] < xmax */ + CommandId curcid; /* in my xact, CID < curcid are visible */ ItemPointerData tid; /* required for Dirty snapshot -:( */ } SnapshotData; @@ -104,7 +105,8 @@ extern bool HeapTupleSatisfiesDirty(HeapTupleHeader tuple); extern bool HeapTupleSatisfiesToast(HeapTupleHeader tuple); extern bool HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot); -extern int HeapTupleSatisfiesUpdate(HeapTuple tuple); +extern int HeapTupleSatisfiesUpdate(HeapTuple tuple, + CommandId curcid); extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin); |