【原】Postgresql数据库源码中操作foreign table的常用函数
(2017-03-29 20:34:33)
标签:
postgresql数据库外部表foreigntablepostgresql源码 |
分类: Postgres和数据库 |
本文针对Postgres数据库源码中操作外部表的函数进行总结。
这些函数是Postgres源码中操作Foreign
Table / Foreign Server / Foreign Data Wrapper
的常用函数
1)获取foreign表的表名(heap_open)
1.1)
对于本地表
首先要获取到表所对应的relid
然后可以通过 relation_open 打开rel
通过 RelationGetRelationName 获取表名,结束后记得调用 relation_close关闭relation
relid
可以在
T_TargetEntry 的 resorigtbl 字段获取到。
当然, 也可以用
rel = heap_open(rte->relid, NoLock);
的方式打开relation ,和 relation_open 没什么区别。 heap_open是relation_open
的补充版本
一般来说,relation打开之后查完就关,但是在执行器执行的时候,会把一个relation打开,直到最后再关,例如函数:ExecOpenScanRelation
1.2)对于foreign
table
通过调用
GetForeignTableRemoteName 获取远端表名
这个函数首先读取这张表的option里面的
table参数, 如果找不到,就打开这个表,读取它的表名
2)获取foreign表的字段名和字段属性
通过调用 const
char* GetForeignTableRemoteColumnName(Relation rel, int
varattno)
获取远端字段名称
这个函数利用的是 Relation
,relation可以理解为一张表的缓存条目。一般通过 heap_open()
或者 relation_open 打开。
单后通过scan等方式扫描。
3) 获取foreign表对应的server
GetForeignTableServerOid(RelationGetRelid(node->ss.ss_currentRelation))
4) 获取foreign表某个字段的options
options = GetForeignColumnOptions(relid,
attnum);
void GetForeignTableVarAttr(Relation rel,
ForeignVarAttribute *attr, int varattno )
(这个是我们自己加的函数)
例如: GetForeignTableVarAttr(rel,
&(col_out->attr), i);
6)根据serveroid获取server和usermapping