We need insert rows to a catalog table that would store partitions info:

CATALOG(pg_partition,2336) BKI_WITHOUT_OIDS
{
    Oid         partrelid;      /* partition table Oid */
    Oid         parentrelid;    /* Parent table Oid */
    int2        parttype;       /* Type of partition, list, hash, range */
    int2        partkey;        /* partition key */
    Oid         keytype;        /* type of partition key */
    int2        keyorder;       /* order of the key in multi-key partitions */
    bytea       minval;
    bytea       maxval;             /* min and max for range partition */
    bytea       listval;
    int2        hashval;            /* hash value */
} FormData_pg_partition;



The following code is used to write bytea:
    ...
    min_ba = (bytea *) palloc(len+VARHDRSZ);
    memcpy(VARDATA(min_ba), &b_min, len);
    SET_VARSIZE(min_ba, len+VARHDRSZ);
    values[Anum_pg_partition_minval        -1]= (Datum)min_ba ;
...
    Relation r = heap_open(PartitionRelationId, RowExclusiveLock);
   TupleDesc tupDesc = r->rd_att;
    HeapTuple tup = heap_form_tuple(tupDesc, values, nulls);
    simple_heap_insert(r, tup);
    CatalogUpdateIndexes(r, tup);
    heap_close(r, RowExclusiveLock);

We can see the correct bytes in the pg_partition table after exectuing
the above code. However, retrieving the bytea datatypes seems
problematic.
The following code didn't work:
....
    pg_partrel = heap_open(PartitionRelationId, AccessShareLock);
    pg_partscan = systable_beginscan(pg_partrel, PartitionParentIndexId, true,
                                SnapshotNow, 1, &skey);
    while (HeapTupleIsValid(pg_parttup= systable_getnext(pg_partscan)))
    {
        Form_pg_partition pg_part = (Form_pg_partition) GETSTRUCT(pg_parttup);
        Datum attr = heap_getattr(tuple, pg_part->partkey, rel->rd_att, &isnull)
        Datum min_part_attr = (Datum) (&pg_part->minval);
        Datum max_part_attr = (Datum) (&pg_part->maxval);
  ......

}

max_part_attr is not poining to right mem location.  After doing some
investgation, we found since minval extends to 10 bytes (instead of 5
bytes occupied by struct varlena), max_part_attr value is not correct.
We also tried doing a hack:
max_ part_attr = (Datum)
(((void*)(&pg_part->minval))+VARSIZE_ANY(&pg_part->minval));

but still we are facing problems.

Any pointers in this respect will be helpful.

Thanks,
Amit
Persistent Systems

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to