Writing and Reading bytea
От | Amit Gupta |
---|---|
Тема | Writing and Reading bytea |
Дата | |
Msg-id | 8d79a95c0902120750s402f6ce1j1661d8513c1a6b5f@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Writing and Reading bytea
Re: Writing and Reading bytea |
Список | pgsql-hackers |
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
В списке pgsql-hackers по дате отправления: