88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.27 1997/09/24 17:44:24 thomas Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.28 1997/11/02 15:24:09 vadim Exp $
1212 *
1313 * NOTES
1414 * The old interface functions have been converted to macros
@@ -115,7 +115,7 @@ DataFill(char *data,
115115TupleDesc tupleDesc ,
116116Datum value [],
117117char nulls [],
118- char * infomask ,
118+ uint16 * infomask ,
119119bits8 * bit )
120120{
121121bits8 * bitP = 0 ;
@@ -246,11 +246,6 @@ heap_attisnull(HeapTuple tup, int attnum)
246246case MinCommandIdAttributeNumber :
247247case MaxTransactionIdAttributeNumber :
248248case MaxCommandIdAttributeNumber :
249- case ChainItemPointerAttributeNumber :
250- case AnchorItemPointerAttributeNumber :
251- case MinAbsoluteTimeAttributeNumber :
252- case MaxAbsoluteTimeAttributeNumber :
253- case VersionTypeAttributeNumber :
254249break ;
255250
256251case 0 :
@@ -293,18 +288,6 @@ heap_sysattrlen(AttrNumber attno)
293288return sizeof f -> t_xmax ;
294289case MaxCommandIdAttributeNumber :
295290return sizeof f -> t_cmax ;
296- case ChainItemPointerAttributeNumber :
297- return sizeof f -> t_chain ;
298- case MinAbsoluteTimeAttributeNumber :
299- return sizeof f -> t_tmin ;
300- case MaxAbsoluteTimeAttributeNumber :
301- return sizeof f -> t_tmax ;
302- case VersionTypeAttributeNumber :
303- return sizeof f -> t_vtype ;
304-
305- case AnchorItemPointerAttributeNumber :
306- elog (WARN ,"heap_sysattrlen: field t_anchor does not exist!" );
307- return 0 ;
308291
309292default :
310293elog (WARN ,"sysattrlen: System attribute number %d unknown." ,attno );
@@ -343,21 +326,6 @@ heap_sysattrbyval(AttrNumber attno)
343326case MaxCommandIdAttributeNumber :
344327byval = true;
345328break ;
346- case ChainItemPointerAttributeNumber :
347- byval = false;
348- break ;
349- case AnchorItemPointerAttributeNumber :
350- byval = false;
351- break ;
352- case MinAbsoluteTimeAttributeNumber :
353- byval = true;
354- break ;
355- case MaxAbsoluteTimeAttributeNumber :
356- byval = true;
357- break ;
358- case VersionTypeAttributeNumber :
359- byval = true;
360- break ;
361329default :
362330byval = true;
363331elog (WARN ,"sysattrbyval: System attribute number %d unknown." ,
@@ -377,7 +345,7 @@ heap_getsysattr(HeapTuple tup, Buffer b, int attnum)
377345{
378346switch (attnum )
379347{
380- case SelfItemPointerAttributeNumber :
348+ case SelfItemPointerAttributeNumber :
381349return ((Datum )& tup -> t_ctid );
382350case ObjectIdAttributeNumber :
383351return ((Datum ) (long )tup -> t_oid );
@@ -389,38 +357,6 @@ heap_getsysattr(HeapTuple tup, Buffer b, int attnum)
389357return ((Datum ) (long )tup -> t_xmax );
390358case MaxCommandIdAttributeNumber :
391359return ((Datum ) (long )tup -> t_cmax );
392- case ChainItemPointerAttributeNumber :
393- return ((Datum )& tup -> t_chain );
394- case AnchorItemPointerAttributeNumber :
395- elog (WARN ,"heap_getsysattr: t_anchor does not exist!" );
396- break ;
397-
398- /*
399- * For tmin and tmax, we need to do some extra work. These
400- * don't get filled in until the vacuum cleaner runs (or we
401- * manage to flush a page after setting the value correctly
402- * below).If the vacuum cleaner hasn't run yet, then the
403- * times stored in the tuple are wrong, and we need to look up
404- * the commit time of the transaction. We cache this value in
405- * the tuple to avoid doing the work more than once.
406- */
407-
408- case MinAbsoluteTimeAttributeNumber :
409- if (!AbsoluteTimeIsBackwardCompatiblyValid (tup -> t_tmin )&&
410- TransactionIdDidCommit (tup -> t_xmin ))
411- tup -> t_tmin = TransactionIdGetCommitTime (tup -> t_xmin );
412- return ((Datum ) (long )tup -> t_tmin );
413- case MaxAbsoluteTimeAttributeNumber :
414- if (!AbsoluteTimeIsBackwardCompatiblyReal (tup -> t_tmax ))
415- {
416- if (TransactionIdDidCommit (tup -> t_xmax ))
417- tup -> t_tmax = TransactionIdGetCommitTime (tup -> t_xmax );
418- else
419- tup -> t_tmax = CURRENT_ABSTIME ;
420- }
421- return ((Datum ) (long )tup -> t_tmax );
422- case VersionTypeAttributeNumber :
423- return ((Datum ) (long )tup -> t_vtype );
424360default :
425361elog (WARN ,"heap_getsysattr: undefined attnum %d" ,attnum );
426362}
@@ -858,8 +794,6 @@ heap_formtuple(TupleDesc tupleDescriptor,
858794tuple -> t_len = len ;
859795tuple -> t_natts = numberOfAttributes ;
860796tuple -> t_hoff = hoff ;
861- tuple -> t_tmin = INVALID_ABSTIME ;
862- tuple -> t_tmax = CURRENT_ABSTIME ;
863797
864798DataFill ((char * )tuple + tuple -> t_hoff ,
865799tupleDescriptor ,
@@ -868,6 +802,8 @@ heap_formtuple(TupleDesc tupleDescriptor,
868802& tuple -> t_infomask ,
869803 (hasnull ?tuple -> t_bits :NULL ));
870804
805+ tuple -> t_infomask |=HEAP_XMAX_INVALID ;
806+
871807return (tuple );
872808}
873809
@@ -970,9 +906,9 @@ heap_modifytuple(HeapTuple tuple,
970906 * ----------------
971907 */
972908infomask = newTuple -> t_infomask ;
973- memmove ((char * )& newTuple -> t_ctid ,/* XXX */
974- (char * )& tuple -> t_ctid ,
975- ((char * )& tuple -> t_hoff - (char * )& tuple -> t_ctid ));/* XXX */
909+ memmove ((char * )& newTuple -> t_oid ,/* XXX */
910+ (char * )& tuple -> t_oid ,
911+ ((char * )& tuple -> t_hoff - (char * )& tuple -> t_oid ));/* XXX */
976912newTuple -> t_infomask = infomask ;
977913newTuple -> t_natts = numberOfAttributes ;/* fix t_natts just in
978914 * case */
@@ -1013,10 +949,11 @@ heap_addheader(uint32 natts,/* max domain index */
1013949tup = (HeapTuple )tp ;
1014950MemSet ((char * )tup ,0 ,len );
1015951
1016- tup -> t_len = ( short ) len ;/* XXX */
952+ tup -> t_len = len ;
1017953tp += tup -> t_hoff = hoff ;
1018954tup -> t_natts = natts ;
1019955tup -> t_infomask = 0 ;
956+ tup -> t_infomask |=HEAP_XMAX_INVALID ;
1020957
1021958memmove (tp ,structure ,structlen );
1022959