加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原】Postgresql数据库源码中操作foreign table的常用函数

(2017-03-29 20:34:33)
标签:

postgresql

数据库

外部表

foreigntable

postgresql源码

分类: Postgres和数据库
本文针对Postgres数据库源码中操作外部表的函数进行总结。
这些函数是Postgres源码中操作Foreign Table / Foreign Server / Foreign Data Wrapper 的常用函数
 
1)获取foreign表的表名(heap_open)
1.1)   对于本地表
首先要获取到表所对应的relid
然后可以通过 relation_open 打开rel 通过 RelationGetRelationName 获取表名,结束后记得调用 relation_close关闭relation
       Relation rel = relation_open(relid, NoLock);
       name = (char*)quote_identifier(RelationGetRelationName(rel));
       if(name == RelationGetRelationName(rel))
           name = pstrdup(name);
       relation_close(rel, NoLock);

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);
       foreach(lc, options)
       {
           DefElem    *def = (DefElem *) lfirst(lc);
           if (strcmp(def->defname, "force_not_null") == 0)
           {
               if (defGetBoolean(def))
               {
                   char       *attname = pstrdup(NameStr(attr->attname));
                   opt->fnncolumns = lappend(opt->fnncolumns, makeString(attname));
               }
           }
           else if(strcmp(def->defname, "column") == 0 ){
               if( strcmp(defGetString(def),"null") == 0 ){
                   char       *attname = pstrdup(NameStr(attr->attname));
                   opt->nullcolumns= lappend(opt->fnncolumns, makeString(attname));
               }
           }
       }


       5)通过调用 GetForeignTableVarAttr 获取远端字段的各个属性
void GetForeignTableVarAttr(Relation rel, ForeignVarAttribute *attr, int varattno ) (这个是我们自己加的函数)
例如: GetForeignTableVarAttr(rel, &(col_out->attr), i);


6)根据serveroid获取server和usermapping
    server = GetForeignServer(table->serverid);
    user = GetUserMapping(GetUserId(), table->serverid);


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有