1616 * Portions Copyright (c) 1994, Regents of the University of California
1717 *
1818 * IDENTIFICATION
19- * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.63 2003/06/12 01:42:20 momjian Exp $
19+ * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.64 2003/06/25 01:08:13 momjian Exp $
2020 *
2121 *-------------------------------------------------------------------------
2222 */
@@ -76,11 +76,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
7676
7777if (tuple -> t_infomask & HEAP_MOVED_OFF )
7878{
79- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
79+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
80+ if (TransactionIdIsCurrentTransactionId (xvac ))
8081return false;
81- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
82+ if (!TransactionIdIsInProgress (xvac ))
8283{
83- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
84+ if (TransactionIdDidCommit (xvac ))
8485{
8586tuple -> t_infomask |=HEAP_XMIN_INVALID ;
8687return false;
@@ -90,11 +91,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
9091}
9192else if (tuple -> t_infomask & HEAP_MOVED_IN )
9293{
93- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
94+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
95+ if (!TransactionIdIsCurrentTransactionId (xvac ))
9496{
95- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
97+ if (TransactionIdIsInProgress (xvac ))
9698return false;
97- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
99+ if (TransactionIdDidCommit (xvac ))
98100tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
99101else
100102{
@@ -152,11 +154,14 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
152154}
153155
154156/* xmax transaction committed */
155- tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
156157
157158if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
159+ {
160+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
158161return true;
162+ }
159163
164+ tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
160165return false;
161166}
162167
@@ -212,11 +217,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
212217
213218if (tuple -> t_infomask & HEAP_MOVED_OFF )
214219{
215- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
220+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
221+ if (TransactionIdIsCurrentTransactionId (xvac ))
216222return false;
217- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
223+ if (!TransactionIdIsInProgress (xvac ))
218224{
219- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
225+ if (TransactionIdDidCommit (xvac ))
220226{
221227tuple -> t_infomask |=HEAP_XMIN_INVALID ;
222228return false;
@@ -226,11 +232,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
226232}
227233else if (tuple -> t_infomask & HEAP_MOVED_IN )
228234{
229- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
235+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
236+ if (!TransactionIdIsCurrentTransactionId (xvac ))
230237{
231- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
238+ if (TransactionIdIsInProgress (xvac ))
232239return false;
233- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
240+ if (TransactionIdDidCommit (xvac ))
234241tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
235242else
236243{
@@ -297,11 +304,14 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
297304}
298305
299306/* xmax transaction committed */
300- tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
301307
302308if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
309+ {
310+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
303311return true;
312+ }
304313
314+ tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
305315return false;
306316}
307317
@@ -329,11 +339,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
329339
330340if (tuple -> t_infomask & HEAP_MOVED_OFF )
331341{
332- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
342+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
343+ if (TransactionIdIsCurrentTransactionId (xvac ))
333344return false;
334- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
345+ if (!TransactionIdIsInProgress (xvac ))
335346{
336- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
347+ if (TransactionIdDidCommit (xvac ))
337348{
338349tuple -> t_infomask |=HEAP_XMIN_INVALID ;
339350return false;
@@ -343,11 +354,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
343354}
344355else if (tuple -> t_infomask & HEAP_MOVED_IN )
345356{
346- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
357+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
358+ if (!TransactionIdIsCurrentTransactionId (xvac ))
347359{
348- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
360+ if (TransactionIdIsInProgress (xvac ))
349361return false;
350- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
362+ if (TransactionIdDidCommit (xvac ))
351363tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
352364else
353365{
@@ -382,11 +394,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
382394
383395if (tuple -> t_infomask & HEAP_MOVED_OFF )
384396{
385- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
397+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
398+ if (TransactionIdIsCurrentTransactionId (xvac ))
386399return HeapTupleInvisible ;
387- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
400+ if (!TransactionIdIsInProgress (xvac ))
388401{
389- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
402+ if (TransactionIdDidCommit (xvac ))
390403{
391404tuple -> t_infomask |=HEAP_XMIN_INVALID ;
392405return HeapTupleInvisible ;
@@ -396,11 +409,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
396409}
397410else if (tuple -> t_infomask & HEAP_MOVED_IN )
398411{
399- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
412+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
413+ if (!TransactionIdIsCurrentTransactionId (xvac ))
400414{
401- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
415+ if (TransactionIdIsInProgress (xvac ))
402416return HeapTupleInvisible ;
403- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
417+ if (TransactionIdDidCommit (xvac ))
404418tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
405419else
406420{
@@ -475,11 +489,14 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
475489}
476490
477491/* xmax transaction committed */
478- tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
479492
480493if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
494+ {
495+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
481496return HeapTupleMayBeUpdated ;
497+ }
482498
499+ tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
483500return HeapTupleUpdated ;/* updated by other */
484501}
485502
@@ -513,11 +530,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
513530
514531if (tuple -> t_infomask & HEAP_MOVED_OFF )
515532{
516- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
533+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
534+ if (TransactionIdIsCurrentTransactionId (xvac ))
517535return false;
518- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
536+ if (!TransactionIdIsInProgress (xvac ))
519537{
520- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
538+ if (TransactionIdDidCommit (xvac ))
521539{
522540tuple -> t_infomask |=HEAP_XMIN_INVALID ;
523541return false;
@@ -527,11 +545,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
527545}
528546else if (tuple -> t_infomask & HEAP_MOVED_IN )
529547{
530- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
548+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
549+ if (!TransactionIdIsCurrentTransactionId (xvac ))
531550{
532- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
551+ if (TransactionIdIsInProgress (xvac ))
533552return false;
534- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
553+ if (TransactionIdDidCommit (xvac ))
535554tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
536555else
537556{
@@ -600,11 +619,14 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
600619}
601620
602621/* xmax transaction committed */
603- tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
604622
605623if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
624+ {
625+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
606626return true;
627+ }
607628
629+ tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
608630SnapshotDirty -> tid = tuple -> t_ctid ;
609631return false;/* updated by other */
610632}
@@ -644,11 +666,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
644666
645667if (tuple -> t_infomask & HEAP_MOVED_OFF )
646668{
647- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
669+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
670+ if (TransactionIdIsCurrentTransactionId (xvac ))
648671return false;
649- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
672+ if (!TransactionIdIsInProgress (xvac ))
650673{
651- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
674+ if (TransactionIdDidCommit (xvac ))
652675{
653676tuple -> t_infomask |=HEAP_XMIN_INVALID ;
654677return false;
@@ -658,11 +681,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
658681}
659682else if (tuple -> t_infomask & HEAP_MOVED_IN )
660683{
661- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
684+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
685+ if (!TransactionIdIsCurrentTransactionId (xvac ))
662686{
663- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
687+ if (TransactionIdIsInProgress (xvac ))
664688return false;
665- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
689+ if (TransactionIdDidCommit (xvac ))
666690tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
667691else
668692{
@@ -802,11 +826,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
802826return HEAPTUPLE_DEAD ;
803827else if (tuple -> t_infomask & HEAP_MOVED_OFF )
804828{
805- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
829+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
830+ if (TransactionIdIsCurrentTransactionId (xvac ))
806831return HEAPTUPLE_DELETE_IN_PROGRESS ;
807- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
832+ if (TransactionIdIsInProgress (xvac ))
808833return HEAPTUPLE_DELETE_IN_PROGRESS ;
809- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
834+ if (TransactionIdDidCommit (xvac ))
810835{
811836tuple -> t_infomask |=HEAP_XMIN_INVALID ;
812837return HEAPTUPLE_DEAD ;
@@ -815,11 +840,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
815840}
816841else if (tuple -> t_infomask & HEAP_MOVED_IN )
817842{
818- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
843+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
844+ if (TransactionIdIsCurrentTransactionId (xvac ))
819845return HEAPTUPLE_INSERT_IN_PROGRESS ;
820- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
846+ if (TransactionIdIsInProgress (xvac ))
821847return HEAPTUPLE_INSERT_IN_PROGRESS ;
822- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
848+ if (TransactionIdDidCommit (xvac ))
823849tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
824850else
825851{
@@ -831,16 +857,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
831857return HEAPTUPLE_INSERT_IN_PROGRESS ;
832858else if (TransactionIdDidCommit (HeapTupleHeaderGetXmin (tuple )))
833859tuple -> t_infomask |=HEAP_XMIN_COMMITTED ;
834- else if (TransactionIdDidAbort (HeapTupleHeaderGetXmin (tuple )))
835- {
836- tuple -> t_infomask |=HEAP_XMIN_INVALID ;
837- return HEAPTUPLE_DEAD ;
838- }
839860else
840861{
841862/*
842- * Not in Progress, Not Committed, Not Aborted - so it's from
843- * crashed process. - vadim 11/26/96
863+ * Not in Progress, Not Committed, so either Aborted or crashed
844864 */
845865tuple -> t_infomask |=HEAP_XMIN_INVALID ;
846866return HEAPTUPLE_DEAD ;
@@ -868,11 +888,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
868888{
869889if (TransactionIdIsInProgress (HeapTupleHeaderGetXmax (tuple )))
870890return HEAPTUPLE_LIVE ;
871- if (TransactionIdDidCommit (HeapTupleHeaderGetXmax (tuple )))
872- tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
873- else
874- /* it's either aborted or crashed */
875- tuple -> t_infomask |=HEAP_XMAX_INVALID ;
891+ /*
892+ * We don't really care whether xmax did commit, abort or crash.
893+ * We know that xmax did mark the tuple for update, but it did not
894+ * and will never actually update it.
895+ */
896+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
876897}
877898return HEAPTUPLE_LIVE ;
878899}
@@ -883,16 +904,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
883904return HEAPTUPLE_DELETE_IN_PROGRESS ;
884905else if (TransactionIdDidCommit (HeapTupleHeaderGetXmax (tuple )))
885906tuple -> t_infomask |=HEAP_XMAX_COMMITTED ;
886- else if (TransactionIdDidAbort (HeapTupleHeaderGetXmax (tuple )))
887- {
888- tuple -> t_infomask |=HEAP_XMAX_INVALID ;
889- return HEAPTUPLE_LIVE ;
890- }
891907else
892908{
893909/*
894- * Not in Progress, Not Committed, Not Aborted - so it's from
895- * crashed process. - vadim 06/02/97
910+ * Not in Progress, Not Committed, so either Aborted or crashed
896911 */
897912tuple -> t_infomask |=HEAP_XMAX_INVALID ;
898913return HEAPTUPLE_LIVE ;