Commit dd23a882 authored by Bruce Momjian's avatar Bruce Momjian

>> If a transaction marks a tuple for update and later commits without

>> actually having updated the tuple, [...] can we simply
>> set the HEAP_XMAX_INVALID hint bit of the tuple?
>
>AFAICS this is a reasonable thing to do.

Thanks for the confirmation.  Here's a patch which also contains some
more noncritical changes to tqual.c:
 .  make code more readable by introducing local variables for xvac
 .  no longer two separate branches for aborted and crashed.
    The actions were the same in all cases.

Manfred Koizar
parent fce529e1
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.14 2003/06/24 22:42:42 momjian Exp $"; static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.15 2003/06/25 01:08:13 momjian Exp $";
#endif #endif
#include "postgres.h" #include "postgres.h"
...@@ -270,9 +270,9 @@ inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size) ...@@ -270,9 +270,9 @@ inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
if (!double_colon) { if (!double_colon) {
if (bits < 128 - 32) if (bits < 128 - 32)
cp += SPRINTF((cp, "::%d", bits)); cp += SPRINTF((cp, "::"));
else if (bits < 128 - 16) else if (bits < 128 - 16)
cp += SPRINTF((cp, ":0%d", bits)); cp += SPRINTF((cp, ":0"));
} }
/* Format CIDR /width. */ /* Format CIDR /width. */
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.63 2003/06/12 01:42:20 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.64 2003/06/25 01:08:13 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -76,11 +76,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple) ...@@ -76,11 +76,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false; return false;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return false; return false;
...@@ -90,11 +91,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple) ...@@ -90,11 +91,12 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return false; return false;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -152,11 +154,14 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple) ...@@ -152,11 +154,14 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
} }
/* xmax transaction committed */ /* xmax transaction committed */
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
{
tuple->t_infomask |= HEAP_XMAX_INVALID;
return true; return true;
}
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
return false; return false;
} }
...@@ -212,11 +217,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) ...@@ -212,11 +217,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false; return false;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return false; return false;
...@@ -226,11 +232,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) ...@@ -226,11 +232,12 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return false; return false;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -297,11 +304,14 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple) ...@@ -297,11 +304,14 @@ HeapTupleSatisfiesNow(HeapTupleHeader tuple)
} }
/* xmax transaction committed */ /* xmax transaction committed */
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
{
tuple->t_infomask |= HEAP_XMAX_INVALID;
return true; return true;
}
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
return false; return false;
} }
...@@ -329,11 +339,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple) ...@@ -329,11 +339,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false; return false;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return false; return false;
...@@ -343,11 +354,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple) ...@@ -343,11 +354,12 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return false; return false;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -382,11 +394,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid) ...@@ -382,11 +394,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return HeapTupleInvisible; return HeapTupleInvisible;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return HeapTupleInvisible; return HeapTupleInvisible;
...@@ -396,11 +409,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid) ...@@ -396,11 +409,12 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return HeapTupleInvisible; return HeapTupleInvisible;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -475,11 +489,14 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid) ...@@ -475,11 +489,14 @@ HeapTupleSatisfiesUpdate(HeapTuple htuple, CommandId curcid)
} }
/* xmax transaction committed */ /* xmax transaction committed */
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
{
tuple->t_infomask |= HEAP_XMAX_INVALID;
return HeapTupleMayBeUpdated; return HeapTupleMayBeUpdated;
}
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
return HeapTupleUpdated; /* updated by other */ return HeapTupleUpdated; /* updated by other */
} }
...@@ -513,11 +530,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple) ...@@ -513,11 +530,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false; return false;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return false; return false;
...@@ -527,11 +545,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple) ...@@ -527,11 +545,12 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return false; return false;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -600,11 +619,14 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple) ...@@ -600,11 +619,14 @@ HeapTupleSatisfiesDirty(HeapTupleHeader tuple)
} }
/* xmax transaction committed */ /* xmax transaction committed */
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE) if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
{
tuple->t_infomask |= HEAP_XMAX_INVALID;
return true; return true;
}
tuple->t_infomask |= HEAP_XMAX_COMMITTED;
SnapshotDirty->tid = tuple->t_ctid; SnapshotDirty->tid = tuple->t_ctid;
return false; /* updated by other */ return false; /* updated by other */
} }
...@@ -644,11 +666,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot) ...@@ -644,11 +666,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
if (tuple->t_infomask & HEAP_MOVED_OFF) if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false; return false;
if (!TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (!TransactionIdIsInProgress(xvac))
{ {
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return false; return false;
...@@ -658,11 +681,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot) ...@@ -658,11 +681,12 @@ HeapTupleSatisfiesSnapshot(HeapTupleHeader tuple, Snapshot snapshot)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return false; return false;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -802,11 +826,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin) ...@@ -802,11 +826,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
return HEAPTUPLE_DEAD; return HEAPTUPLE_DEAD;
else if (tuple->t_infomask & HEAP_MOVED_OFF) else if (tuple->t_infomask & HEAP_MOVED_OFF)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return HEAPTUPLE_DELETE_IN_PROGRESS; return HEAPTUPLE_DELETE_IN_PROGRESS;
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return HEAPTUPLE_DELETE_IN_PROGRESS; return HEAPTUPLE_DELETE_IN_PROGRESS;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
{ {
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return HEAPTUPLE_DEAD; return HEAPTUPLE_DEAD;
...@@ -815,11 +840,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin) ...@@ -815,11 +840,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
} }
else if (tuple->t_infomask & HEAP_MOVED_IN) else if (tuple->t_infomask & HEAP_MOVED_IN)
{ {
if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXvac(tuple))) TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return HEAPTUPLE_INSERT_IN_PROGRESS; return HEAPTUPLE_INSERT_IN_PROGRESS;
if (TransactionIdIsInProgress(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdIsInProgress(xvac))
return HEAPTUPLE_INSERT_IN_PROGRESS; return HEAPTUPLE_INSERT_IN_PROGRESS;
if (TransactionIdDidCommit(HeapTupleHeaderGetXvac(tuple))) if (TransactionIdDidCommit(xvac))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else else
{ {
...@@ -831,16 +857,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin) ...@@ -831,16 +857,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
return HEAPTUPLE_INSERT_IN_PROGRESS; return HEAPTUPLE_INSERT_IN_PROGRESS;
else if (TransactionIdDidCommit(HeapTupleHeaderGetXmin(tuple))) else if (TransactionIdDidCommit(HeapTupleHeaderGetXmin(tuple)))
tuple->t_infomask |= HEAP_XMIN_COMMITTED; tuple->t_infomask |= HEAP_XMIN_COMMITTED;
else if (TransactionIdDidAbort(HeapTupleHeaderGetXmin(tuple)))
{
tuple->t_infomask |= HEAP_XMIN_INVALID;
return HEAPTUPLE_DEAD;
}
else else
{ {
/* /*
* Not in Progress, Not Committed, Not Aborted - so it's from * Not in Progress, Not Committed, so either Aborted or crashed
* crashed process. - vadim 11/26/96
*/ */
tuple->t_infomask |= HEAP_XMIN_INVALID; tuple->t_infomask |= HEAP_XMIN_INVALID;
return HEAPTUPLE_DEAD; return HEAPTUPLE_DEAD;
...@@ -868,11 +888,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin) ...@@ -868,11 +888,12 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
{ {
if (TransactionIdIsInProgress(HeapTupleHeaderGetXmax(tuple))) if (TransactionIdIsInProgress(HeapTupleHeaderGetXmax(tuple)))
return HEAPTUPLE_LIVE; return HEAPTUPLE_LIVE;
if (TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple))) /*
tuple->t_infomask |= HEAP_XMAX_COMMITTED; * We don't really care whether xmax did commit, abort or crash.
else * We know that xmax did mark the tuple for update, but it did not
/* it's either aborted or crashed */ * and will never actually update it.
tuple->t_infomask |= HEAP_XMAX_INVALID; */
tuple->t_infomask |= HEAP_XMAX_INVALID;
} }
return HEAPTUPLE_LIVE; return HEAPTUPLE_LIVE;
} }
...@@ -883,16 +904,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin) ...@@ -883,16 +904,10 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin)
return HEAPTUPLE_DELETE_IN_PROGRESS; return HEAPTUPLE_DELETE_IN_PROGRESS;
else if (TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple))) else if (TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple)))
tuple->t_infomask |= HEAP_XMAX_COMMITTED; tuple->t_infomask |= HEAP_XMAX_COMMITTED;
else if (TransactionIdDidAbort(HeapTupleHeaderGetXmax(tuple)))
{
tuple->t_infomask |= HEAP_XMAX_INVALID;
return HEAPTUPLE_LIVE;
}
else else
{ {
/* /*
* Not in Progress, Not Committed, Not Aborted - so it's from * Not in Progress, Not Committed, so either Aborted or crashed
* crashed process. - vadim 06/02/97
*/ */
tuple->t_infomask |= HEAP_XMAX_INVALID; tuple->t_infomask |= HEAP_XMAX_INVALID;
return HEAPTUPLE_LIVE; return HEAPTUPLE_LIVE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment