questionable code in heap_formtuple() - Mailing list pgsql-hackers

From Tatsuo Ishii
Subject questionable code in heap_formtuple()
Date
Msg-id 199809030652.PAA01058@srapc451.sra.co.jp
Whole thread Raw
In response to Re: [HACKERS] index fix report  (Bruce Momjian <maillist@candle.pha.pa.us>)
Responses Re: [HACKERS] questionable code in heap_formtuple()  (Bruce Momjian <maillist@candle.pha.pa.us>)
List pgsql-hackers
around line 812 in access/common/heaptuple.c:

    len = sizeof *tuple - sizeof tuple->t_bits;

This seems questionable for me.

tuple is a pointer to struct HeaptupleData.

typedef struct HeapTupleData
{
    unsigned int t_len;            /* length of entire tuple */

    [snip]

    uint8        t_hoff;            /* sizeof tuple header */

    bits8        t_bits[MinHeapTupleBitmapSize / 8];
    /* bit map of domains */

    /* MORE DATA FOLLOWS AT END OF STRUCT */
} HeapTupleData;

I think the code tries to calculate the offset from top of the
structure to t_bits. t_bits is the last structure member of
HeapTupleData, and that would give the offset...

No. since the size of the whole structure is aligned to 2-byte, there
is a "padding" byte after t_bits.

I think more acculate way to calculate the offset is:

    len = (char *)&tuple->t_bits[0] - (char *)tuple;

I ran a test and found the first one gives len = 36, while second one
gives 35.

I'm not sure how this affects. maybe nothing (len is aligned to 8-byte
boundary later).
--
Tatsuo Ishii
t-ishii@sra.co.jp

pgsql-hackers by date:

Previous
From: "Thomas G. Lockhart"
Date:
Subject: Re: [HACKERS] index fix report
Next
From: Tatsuo Ishii
Date:
Subject: Re: [HACKERS] LinuxPPC problems