博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL在何处处理 sql查询之二十五
阅读量:6229 次
发布时间:2019-06-21

本文共 2090 字,大约阅读时间需要 6 分钟。

再次梳理  build_simple_rel 的执行内容:

/* * build_simple_rel *      Construct a new RelOptInfo for a base relation or 'other' relation. */RelOptInfo *build_simple_rel(PlannerInfo *root, int relid, RelOptKind reloptkind){    RelOptInfo *rel;    RangeTblEntry *rte;    /* Rel should not exist already */    Assert(relid > 0 && relid < root->simple_rel_array_size);    if (root->simple_rel_array[relid] != NULL)        elog(ERROR, "rel %d already exists", relid);    /* Fetch RTE for relation */    rte = root->simple_rte_array[relid];    Assert(rte != NULL);    rel = makeNode(RelOptInfo);    rel->reloptkind = reloptkind;    rel->relids = bms_make_singleton(relid);    rel->rows = 0;    ...    rel->has_eclass_joins = false;    /* Check type of rtable entry */    switch (rte->rtekind)    {        case RTE_RELATION:            /* Table --- retrieve statistics from the system catalogs */            get_relation_info(root, rte->relid, rte->inh, rel);            break;        case RTE_SUBQUERY:        case RTE_FUNCTION:        case RTE_VALUES:        case RTE_CTE:            /*             * Subquery, function, or values list --- set up attr range and             * arrays             *             * Note: 0 is included in range to support whole-row Vars             */            rel->min_attr = 0;            rel->max_attr = list_length(rte->eref->colnames);            rel->attr_needed = (Relids *)                palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(Relids));            rel->attr_widths = (int32 *)                palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(int32));            break;        default:            elog(ERROR, "unrecognized RTE kind: %d",                 (int) rte->rtekind);            break;    }    /* Save the finished struct in the query's simple_rel_array */    root->simple_rel_array[relid] = rel;    ...    return rel;}

可以看出,这是准备了 表信息的结构--RelOptInfo,然后再把它挂在计划树上:

root->simple_rel_array[relid] = rel;

 需要注意的是,这里 relid 是 simple_rel_array数组的下标,而非oid。

本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2013/05/28/3103866.html,如需转载请自行联系原作者

你可能感兴趣的文章
Ceph分布式存储-原理介绍及简单部署
查看>>
MYSQL数据库设计规范与原则
查看>>
UWP: 实现 UWP 应用自启动
查看>>
Windows内核之进程的终止和子进程
查看>>
Python 文件 readline() 方法
查看>>
String,到底创建了多少个对象?
查看>>
linux查找目录下的所有文件中是否含有某个字符串
查看>>
UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频
查看>>
各行业最受欢迎的编程语言,硬件最青睐C和C++
查看>>
监听用户的后退键,解决部分浏览器回退的bug
查看>>
Vivado+FPGA:如何使用Debug Cores(ILA)在线调试(烧录到flash里可以直接启动)
查看>>
[Preference] How to avoid Forced Synchronous Layout or FSL to improve site preference
查看>>
【laravel5.4】php artisan migrate报错:Specified key was too long; max key length is 767 bytes
查看>>
[转]外贸出口流程图
查看>>
微信小程序onLaunch修改globalData的值
查看>>
php实现简单算法3
查看>>
Always run a program in administrator mode in Windows 10
查看>>
打陀螺
查看>>
tcp echo server libuv
查看>>
Random Processes
查看>>