注意通常拿到的指针不是EOH头
EOH是一种扩展数据结构,之前有几篇博客讨论过了,最近在改相关代码加深了一些理解。
EOH目前支持ER_methods、EA_methods两套实现,分别是record类型展开和数组类型展开。
在内存中的样子大概是(EA为例)
typedef struct ExpandedArrayHeader
{
ExpandedObjectHeader hdr;
int ea_magic;
int ndims; /* # of dimensions */
int *dims; /* array dimensions */
int *lbound; /* index lower bounds for each dimension */
Oid element_type; /* element type OID */
int16 typlen; /* needed info about element datatype */
bool typbyval;
char typalign;
...
...
...
- 注意:使用时传的不是指向EOH头部的指针,而是使用hdr->eoh_rw_ptr或hdr->eoh_ro_ptr中存放的指针(指向EOH头部)。
- 注意eoh_rw_ptr和eoh_ro_ptr是1be结构,用DatumGetEOHP函数取出其中存放的指针。
使用时经常需要一层转换,例如这里:
注意使用value的逻辑一般都兼容EOH或valena结构
EOH使用EOH_flatten_into后会拉平数据,输出到result中紧凑存放。
一般的处理逻辑都可以适配EOH或这种紧凑形式,无需互相转换。
这就是为什么EOH只有flatten接口,没有生成EOH的接口,因为使用者适配了。