> On May 14, 2020, at 11:34 AM, Ranier Vilela <ranier...@gmail.com> wrote:
> 
> Certainly.
> In the same file you can find the appropriate use of the API.
> ItemPointerSet(&heapTuple->t_self, blkno, offnum);

It took a couple reads through your patch to figure out what you were trying to 
accomplish, and I think you are uncomfortable with assigning one 
ItemPointerData variable from another.    ItemPointerData is just a struct with 
three int16 variables.  To make a standalone program that has the same 
structure without depending on any postgres headers, I'm using "short int" 
instead of "int16" and structs "TwoData" and "ThreeData" that are analogous to 
BlockIdData and OffsetNumber.

#include <stdio.h>

typedef struct TwoData {
    short int a;
    short int b;
} TwoData;

typedef struct ThreeData {
    TwoData left;
    short int right;
} ThreeData;

int main(int argc, char **argv)
{
    ThreeData x = { { 5, 10 }, 15 };
    ThreeData y = x;
    x.left.a = 0;
    x.left.b = 1;
    x.right = 2;

    printf("y = { { %d, %d }, %d }\n",
        y.left.a, y.left.b, y.right);

    return 0;
}

If you compile and run this, you'll notice it outputs:

y = { { 5, 10 }, 15 }

and not the { { 0, 1}, 2 } that you would expect if y were merely pointing at x.

—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company





Reply via email to