Renumber SnapshotNow and the other special snapshot codes so that
((Snapshot) NULL) can no longer be confused with a valid snapshot, as per my recent suggestion. Define a macro InvalidSnapshot for 0. Use InvalidSnapshot instead of SnapshotAny as the do-nothing special case for heap_update and heap_delete crosschecks; this seems a little cleaner even though the behavior is really the same.
This commit is contained in:
parent
9835944e54
commit
493f72606b
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.173 2004/08/29 05:06:40 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.174 2004/09/11 18:28:32 tgl Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
@ -1262,7 +1262,7 @@ simple_heap_insert(Relation relation, HeapTuple tup)
|
|||||||
* tid - TID of tuple to be deleted
|
* tid - TID of tuple to be deleted
|
||||||
* ctid - output parameter, used only for failure case (see below)
|
* ctid - output parameter, used only for failure case (see below)
|
||||||
* cid - delete command ID to use in verifying tuple visibility
|
* cid - delete command ID to use in verifying tuple visibility
|
||||||
* crosscheck - if not SnapshotAny, also check tuple against this
|
* crosscheck - if not InvalidSnapshot, also check tuple against this
|
||||||
* wait - true if should wait for any conflicting update to commit/abort
|
* wait - true if should wait for any conflicting update to commit/abort
|
||||||
*
|
*
|
||||||
* Normal, successful return value is HeapTupleMayBeUpdated, which
|
* Normal, successful return value is HeapTupleMayBeUpdated, which
|
||||||
@ -1274,7 +1274,8 @@ simple_heap_insert(Relation relation, HeapTuple tup)
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
heap_delete(Relation relation, ItemPointer tid,
|
heap_delete(Relation relation, ItemPointer tid,
|
||||||
ItemPointer ctid, CommandId cid, Snapshot crosscheck, bool wait)
|
ItemPointer ctid, CommandId cid,
|
||||||
|
Snapshot crosscheck, bool wait)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTupleData tp;
|
HeapTupleData tp;
|
||||||
@ -1339,7 +1340,7 @@ l1:
|
|||||||
result = HeapTupleUpdated;
|
result = HeapTupleUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crosscheck != SnapshotAny && result == HeapTupleMayBeUpdated)
|
if (crosscheck != InvalidSnapshot && result == HeapTupleMayBeUpdated)
|
||||||
{
|
{
|
||||||
/* Perform additional check for serializable RI updates */
|
/* Perform additional check for serializable RI updates */
|
||||||
if (!HeapTupleSatisfiesSnapshot(tp.t_data, crosscheck))
|
if (!HeapTupleSatisfiesSnapshot(tp.t_data, crosscheck))
|
||||||
@ -1443,7 +1444,7 @@ simple_heap_delete(Relation relation, ItemPointer tid)
|
|||||||
|
|
||||||
result = heap_delete(relation, tid,
|
result = heap_delete(relation, tid,
|
||||||
&ctid,
|
&ctid,
|
||||||
GetCurrentCommandId(), SnapshotAny,
|
GetCurrentCommandId(), InvalidSnapshot,
|
||||||
true /* wait for commit */ );
|
true /* wait for commit */ );
|
||||||
switch (result)
|
switch (result)
|
||||||
{
|
{
|
||||||
@ -1477,7 +1478,7 @@ simple_heap_delete(Relation relation, ItemPointer tid)
|
|||||||
* newtup - newly constructed tuple data to store
|
* newtup - newly constructed tuple data to store
|
||||||
* ctid - output parameter, used only for failure case (see below)
|
* ctid - output parameter, used only for failure case (see below)
|
||||||
* cid - update command ID to use in verifying old tuple visibility
|
* cid - update command ID to use in verifying old tuple visibility
|
||||||
* crosscheck - if not SnapshotAny, also check old tuple against this
|
* crosscheck - if not InvalidSnapshot, also check old tuple against this
|
||||||
* wait - true if should wait for any conflicting update to commit/abort
|
* wait - true if should wait for any conflicting update to commit/abort
|
||||||
*
|
*
|
||||||
* Normal, successful return value is HeapTupleMayBeUpdated, which
|
* Normal, successful return value is HeapTupleMayBeUpdated, which
|
||||||
@ -1491,7 +1492,8 @@ simple_heap_delete(Relation relation, ItemPointer tid)
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
|
heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
|
||||||
ItemPointer ctid, CommandId cid, Snapshot crosscheck, bool wait)
|
ItemPointer ctid, CommandId cid,
|
||||||
|
Snapshot crosscheck, bool wait)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTupleData oldtup;
|
HeapTupleData oldtup;
|
||||||
@ -1566,7 +1568,7 @@ l2:
|
|||||||
result = HeapTupleUpdated;
|
result = HeapTupleUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crosscheck != SnapshotAny && result == HeapTupleMayBeUpdated)
|
if (crosscheck != InvalidSnapshot && result == HeapTupleMayBeUpdated)
|
||||||
{
|
{
|
||||||
/* Perform additional check for serializable RI updates */
|
/* Perform additional check for serializable RI updates */
|
||||||
if (!HeapTupleSatisfiesSnapshot(oldtup.t_data, crosscheck))
|
if (!HeapTupleSatisfiesSnapshot(oldtup.t_data, crosscheck))
|
||||||
@ -1804,7 +1806,7 @@ simple_heap_update(Relation relation, ItemPointer otid, HeapTuple tup)
|
|||||||
|
|
||||||
result = heap_update(relation, otid, tup,
|
result = heap_update(relation, otid, tup,
|
||||||
&ctid,
|
&ctid,
|
||||||
GetCurrentCommandId(), SnapshotAny,
|
GetCurrentCommandId(), InvalidSnapshot,
|
||||||
true /* wait for commit */ );
|
true /* wait for commit */ );
|
||||||
switch (result)
|
switch (result)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.116 2004/09/06 23:32:54 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.117 2004/09/11 18:28:33 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -544,7 +544,7 @@ AtCommit_Notify(void)
|
|||||||
*/
|
*/
|
||||||
result = heap_update(lRel, &lTuple->t_self, rTuple,
|
result = heap_update(lRel, &lTuple->t_self, rTuple,
|
||||||
&ctid,
|
&ctid,
|
||||||
GetCurrentCommandId(), SnapshotAny,
|
GetCurrentCommandId(), InvalidSnapshot,
|
||||||
false /* no wait for commit */ );
|
false /* no wait for commit */ );
|
||||||
switch (result)
|
switch (result)
|
||||||
{
|
{
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.236 2004/08/29 05:06:42 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.237 2004/09/11 18:28:34 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -176,7 +176,7 @@ ExecutorStart(QueryDesc *queryDesc, bool useCurrentSnapshot, bool explainOnly)
|
|||||||
{
|
{
|
||||||
/* normal query --- use query snapshot, no crosscheck */
|
/* normal query --- use query snapshot, no crosscheck */
|
||||||
estate->es_snapshot = CopyQuerySnapshot();
|
estate->es_snapshot = CopyQuerySnapshot();
|
||||||
estate->es_crosscheck_snapshot = SnapshotAny;
|
estate->es_crosscheck_snapshot = InvalidSnapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.114 2004/08/29 05:06:42 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.115 2004/09/11 18:28:34 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -179,7 +179,7 @@ CreateExecutorState(void)
|
|||||||
*/
|
*/
|
||||||
estate->es_direction = ForwardScanDirection;
|
estate->es_direction = ForwardScanDirection;
|
||||||
estate->es_snapshot = SnapshotNow;
|
estate->es_snapshot = SnapshotNow;
|
||||||
estate->es_crosscheck_snapshot = SnapshotAny; /* means no crosscheck */
|
estate->es_crosscheck_snapshot = InvalidSnapshot; /* no crosscheck */
|
||||||
estate->es_range_table = NIL;
|
estate->es_range_table = NIL;
|
||||||
|
|
||||||
estate->es_result_relations = NULL;
|
estate->es_result_relations = NULL;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/utils/tqual.h,v 1.50 2004/08/29 04:13:11 momjian Exp $
|
* $PostgreSQL: pgsql/src/include/utils/tqual.h,v 1.51 2004/09/11 18:28:34 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -19,6 +19,20 @@
|
|||||||
#include "access/xact.h"
|
#include "access/xact.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "Regular" snapshots are pointers to a SnapshotData structure.
|
||||||
|
*
|
||||||
|
* We also have some "special" snapshot values that have fixed meanings
|
||||||
|
* and don't need any backing SnapshotData. These are encoded by small
|
||||||
|
* integer values, which of course is a gross violation of ANSI C, but
|
||||||
|
* it works fine on all known platforms.
|
||||||
|
*
|
||||||
|
* SnapshotDirty is an even more special case: its semantics are fixed,
|
||||||
|
* but there is a backing SnapshotData struct for it. That struct is
|
||||||
|
* actually used as *output* data from tqual.c, not input into it.
|
||||||
|
* (But hey, SnapshotDirty ought to have a dirty implementation, no? ;-))
|
||||||
|
*/
|
||||||
|
|
||||||
typedef struct SnapshotData
|
typedef struct SnapshotData
|
||||||
{
|
{
|
||||||
TransactionId xmin; /* XID < xmin are visible to me */
|
TransactionId xmin; /* XID < xmin are visible to me */
|
||||||
@ -32,10 +46,12 @@ typedef struct SnapshotData
|
|||||||
|
|
||||||
typedef SnapshotData *Snapshot;
|
typedef SnapshotData *Snapshot;
|
||||||
|
|
||||||
#define SnapshotNow ((Snapshot) 0x0)
|
/* Special snapshot values: */
|
||||||
#define SnapshotSelf ((Snapshot) 0x1)
|
#define InvalidSnapshot ((Snapshot) 0x0) /* same as NULL */
|
||||||
#define SnapshotAny ((Snapshot) 0x2)
|
#define SnapshotNow ((Snapshot) 0x1)
|
||||||
#define SnapshotToast ((Snapshot) 0x3)
|
#define SnapshotSelf ((Snapshot) 0x2)
|
||||||
|
#define SnapshotAny ((Snapshot) 0x3)
|
||||||
|
#define SnapshotToast ((Snapshot) 0x4)
|
||||||
|
|
||||||
extern DLLIMPORT Snapshot SnapshotDirty;
|
extern DLLIMPORT Snapshot SnapshotDirty;
|
||||||
extern DLLIMPORT Snapshot QuerySnapshot;
|
extern DLLIMPORT Snapshot QuerySnapshot;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user