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使用EOH_flatten_into后会拉平数据,输出到result中紧凑存放。
一般的处理逻辑都可以适配EOH或这种紧凑形式,无需互相转换。
这就是为什么EOH只有flatten接口,没有生成EOH的接口,因为使用者适配了。