16
16
* Portions Copyright (c) 1994, Regents of the University of California
17
17
*
18
18
* 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 $
20
20
*
21
21
*-------------------------------------------------------------------------
22
22
*/
@@ -76,11 +76,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
76
76
77
77
if (tuple -> t_infomask & HEAP_MOVED_OFF )
78
78
{
79
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
79
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
80
+ if (TransactionIdIsCurrentTransactionId (xvac ))
80
81
return false;
81
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
82
+ if (!TransactionIdIsInProgress (xvac ))
82
83
{
83
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
84
+ if (TransactionIdDidCommit (xvac ))
84
85
{
85
86
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
86
87
return false;
@@ -90,11 +91,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
90
91
}
91
92
else if (tuple -> t_infomask & HEAP_MOVED_IN )
92
93
{
93
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
94
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
95
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
94
96
{
95
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
97
+ if (TransactionIdIsInProgress (xvac ))
96
98
return false;
97
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
99
+ if (TransactionIdDidCommit (xvac ))
98
100
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
99
101
else
100
102
{
@@ -152,11 +154,14 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
152
154
}
153
155
154
156
/* xmax transaction committed */
155
- tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
156
157
157
158
if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
159
+ {
160
+ tuple -> t_infomask |= HEAP_XMAX_INVALID ;
158
161
return true;
162
+ }
159
163
164
+ tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
160
165
return false;
161
166
}
162
167
@@ -212,11 +217,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
212
217
213
218
if (tuple -> t_infomask & HEAP_MOVED_OFF )
214
219
{
215
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
220
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
221
+ if (TransactionIdIsCurrentTransactionId (xvac ))
216
222
return false;
217
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
223
+ if (!TransactionIdIsInProgress (xvac ))
218
224
{
219
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
225
+ if (TransactionIdDidCommit (xvac ))
220
226
{
221
227
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
222
228
return false;
@@ -226,11 +232,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
226
232
}
227
233
else if (tuple -> t_infomask & HEAP_MOVED_IN )
228
234
{
229
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
235
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
236
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
230
237
{
231
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
238
+ if (TransactionIdIsInProgress (xvac ))
232
239
return false;
233
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
240
+ if (TransactionIdDidCommit (xvac ))
234
241
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
235
242
else
236
243
{
@@ -297,11 +304,14 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
297
304
}
298
305
299
306
/* xmax transaction committed */
300
- tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
301
307
302
308
if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
309
+ {
310
+ tuple -> t_infomask |= HEAP_XMAX_INVALID ;
303
311
return true;
312
+ }
304
313
314
+ tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
305
315
return false;
306
316
}
307
317
@@ -329,11 +339,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
329
339
330
340
if (tuple -> t_infomask & HEAP_MOVED_OFF )
331
341
{
332
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
342
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
343
+ if (TransactionIdIsCurrentTransactionId (xvac ))
333
344
return false;
334
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
345
+ if (!TransactionIdIsInProgress (xvac ))
335
346
{
336
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
347
+ if (TransactionIdDidCommit (xvac ))
337
348
{
338
349
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
339
350
return false;
@@ -343,11 +354,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
343
354
}
344
355
else if (tuple -> t_infomask & HEAP_MOVED_IN )
345
356
{
346
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
357
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
358
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
347
359
{
348
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
360
+ if (TransactionIdIsInProgress (xvac ))
349
361
return false;
350
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
362
+ if (TransactionIdDidCommit (xvac ))
351
363
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
352
364
else
353
365
{
@@ -382,11 +394,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
382
394
383
395
if (tuple -> t_infomask & HEAP_MOVED_OFF )
384
396
{
385
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
397
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
398
+ if (TransactionIdIsCurrentTransactionId (xvac ))
386
399
return HeapTupleInvisible ;
387
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
400
+ if (!TransactionIdIsInProgress (xvac ))
388
401
{
389
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
402
+ if (TransactionIdDidCommit (xvac ))
390
403
{
391
404
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
392
405
return HeapTupleInvisible ;
@@ -396,11 +409,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
396
409
}
397
410
else if (tuple -> t_infomask & HEAP_MOVED_IN )
398
411
{
399
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
412
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
413
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
400
414
{
401
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
415
+ if (TransactionIdIsInProgress (xvac ))
402
416
return HeapTupleInvisible ;
403
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
417
+ if (TransactionIdDidCommit (xvac ))
404
418
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
405
419
else
406
420
{
@@ -475,11 +489,14 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
475
489
}
476
490
477
491
/* xmax transaction committed */
478
- tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
479
492
480
493
if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
494
+ {
495
+ tuple -> t_infomask |= HEAP_XMAX_INVALID ;
481
496
return HeapTupleMayBeUpdated ;
497
+ }
482
498
499
+ tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
483
500
return HeapTupleUpdated ; /* updated by other */
484
501
}
485
502
@@ -513,11 +530,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
513
530
514
531
if (tuple -> t_infomask & HEAP_MOVED_OFF )
515
532
{
516
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
533
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
534
+ if (TransactionIdIsCurrentTransactionId (xvac ))
517
535
return false;
518
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
536
+ if (!TransactionIdIsInProgress (xvac ))
519
537
{
520
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
538
+ if (TransactionIdDidCommit (xvac ))
521
539
{
522
540
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
523
541
return false;
@@ -527,11 +545,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
527
545
}
528
546
else if (tuple -> t_infomask & HEAP_MOVED_IN )
529
547
{
530
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
548
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
549
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
531
550
{
532
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
551
+ if (TransactionIdIsInProgress (xvac ))
533
552
return false;
534
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
553
+ if (TransactionIdDidCommit (xvac ))
535
554
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
536
555
else
537
556
{
@@ -600,11 +619,14 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
600
619
}
601
620
602
621
/* xmax transaction committed */
603
- tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
604
622
605
623
if (tuple -> t_infomask & HEAP_MARKED_FOR_UPDATE )
624
+ {
625
+ tuple -> t_infomask |= HEAP_XMAX_INVALID ;
606
626
return true;
627
+ }
607
628
629
+ tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
608
630
SnapshotDirty -> tid = tuple -> t_ctid ;
609
631
return false; /* updated by other */
610
632
}
@@ -644,11 +666,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
644
666
645
667
if (tuple -> t_infomask & HEAP_MOVED_OFF )
646
668
{
647
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
669
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
670
+ if (TransactionIdIsCurrentTransactionId (xvac ))
648
671
return false;
649
- if (!TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
672
+ if (!TransactionIdIsInProgress (xvac ))
650
673
{
651
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
674
+ if (TransactionIdDidCommit (xvac ))
652
675
{
653
676
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
654
677
return false;
@@ -658,11 +681,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
658
681
}
659
682
else if (tuple -> t_infomask & HEAP_MOVED_IN )
660
683
{
661
- if (!TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
684
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
685
+ if (!TransactionIdIsCurrentTransactionId (xvac ))
662
686
{
663
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
687
+ if (TransactionIdIsInProgress (xvac ))
664
688
return false;
665
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
689
+ if (TransactionIdDidCommit (xvac ))
666
690
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
667
691
else
668
692
{
@@ -802,11 +826,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
802
826
return HEAPTUPLE_DEAD ;
803
827
else if (tuple -> t_infomask & HEAP_MOVED_OFF )
804
828
{
805
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
829
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
830
+ if (TransactionIdIsCurrentTransactionId (xvac ))
806
831
return HEAPTUPLE_DELETE_IN_PROGRESS ;
807
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
832
+ if (TransactionIdIsInProgress (xvac ))
808
833
return HEAPTUPLE_DELETE_IN_PROGRESS ;
809
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
834
+ if (TransactionIdDidCommit (xvac ))
810
835
{
811
836
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
812
837
return HEAPTUPLE_DEAD ;
@@ -815,11 +840,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
815
840
}
816
841
else if (tuple -> t_infomask & HEAP_MOVED_IN )
817
842
{
818
- if (TransactionIdIsCurrentTransactionId (HeapTupleHeaderGetXvac (tuple )))
843
+ TransactionId xvac = HeapTupleHeaderGetXvac (tuple );
844
+ if (TransactionIdIsCurrentTransactionId (xvac ))
819
845
return HEAPTUPLE_INSERT_IN_PROGRESS ;
820
- if (TransactionIdIsInProgress (HeapTupleHeaderGetXvac ( tuple ) ))
846
+ if (TransactionIdIsInProgress (xvac ))
821
847
return HEAPTUPLE_INSERT_IN_PROGRESS ;
822
- if (TransactionIdDidCommit (HeapTupleHeaderGetXvac ( tuple ) ))
848
+ if (TransactionIdDidCommit (xvac ))
823
849
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
824
850
else
825
851
{
@@ -831,16 +857,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
831
857
return HEAPTUPLE_INSERT_IN_PROGRESS ;
832
858
else if (TransactionIdDidCommit (HeapTupleHeaderGetXmin (tuple )))
833
859
tuple -> t_infomask |= HEAP_XMIN_COMMITTED ;
834
- else if (TransactionIdDidAbort (HeapTupleHeaderGetXmin (tuple )))
835
- {
836
- tuple -> t_infomask |= HEAP_XMIN_INVALID ;
837
- return HEAPTUPLE_DEAD ;
838
- }
839
860
else
840
861
{
841
862
/*
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
844
864
*/
845
865
tuple -> t_infomask |= HEAP_XMIN_INVALID ;
846
866
return HEAPTUPLE_DEAD ;
@@ -868,11 +888,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
868
888
{
869
889
if (TransactionIdIsInProgress (HeapTupleHeaderGetXmax (tuple )))
870
890
return 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 ;
876
897
}
877
898
return HEAPTUPLE_LIVE ;
878
899
}
@@ -883,16 +904,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
883
904
return HEAPTUPLE_DELETE_IN_PROGRESS ;
884
905
else if (TransactionIdDidCommit (HeapTupleHeaderGetXmax (tuple )))
885
906
tuple -> t_infomask |= HEAP_XMAX_COMMITTED ;
886
- else if (TransactionIdDidAbort (HeapTupleHeaderGetXmax (tuple )))
887
- {
888
- tuple -> t_infomask |= HEAP_XMAX_INVALID ;
889
- return HEAPTUPLE_LIVE ;
890
- }
891
907
else
892
908
{
893
909
/*
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
896
911
*/
897
912
tuple -> t_infomask |= HEAP_XMAX_INVALID ;
898
913
return HEAPTUPLE_LIVE ;
0 commit comments