PostgreSQL 的 target_list分析(六)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

进一步分析 ColumnRef:

查了一下, 原来 makeColumnRef 就在 gram.y 里面:

复制代码
static Node *                                                                
makeColumnRef(char *colname, List *indirection, 
              int location, core_yyscan_t yyscanner)
{                                                                
    /*                                                            
     * Generate a ColumnRef node, with an A_Indirection node added if there 
     * is any subscripting in the specified indirection list.  However,
     * any field selection at the start of the indirection list must be 
     * transposed into the "fields" part of the ColumnRef node. 
     */                                                            
    ColumnRef  *c = makeNode(ColumnRef);                                                            
    int        nfields = 0;                                                    
    ListCell *l;                                                            
                                                                
    c->location = location; 
    foreach(l, indirection)
    {                                                            
        if (IsA(lfirst(l), A_Indices)) 
        {                                                        
            A_Indirection *i = makeNode(A_Indirection);        
            if (nfields == 0)                                                    
            {                                                    
                /* easy case - all indirection goes to A_Indirection */ 
                c->fields = list_make1(makeString(colname));
                i->indirection = check_indirection(indirection, yyscanner);                                                
            }                                                    
            else                                                    
            {                                                    
                /* got to split the list in two */
                i->indirection = check_indirection(
list_copy_tail(indirection, nfields),yyscanner); indirection
= list_truncate(indirection, nfields); c->fields = lcons(makeString(colname), indirection); } i->arg = (Node *) c; return (Node *) i; } else if (IsA(lfirst(l), A_Star)) { /* We only allow '*' at the end of a ColumnRef */ if (lnext(l) != NULL) parser_yyerror("improper use of \"*\""); } nfields++; } /* No subscripting, so all indirection gets added to field list */ c->fields = lcons(makeString(colname), indirection); return (Node *) c; }
复制代码

这个

ColumnRef  *c = makeNode(ColumnRef);

c->fields = list_make1(makeString(colname)); 将 字段 赋予了 ColumnRef。

makeString 来自于 value.c:

复制代码
00047 /*
00048  *  makeString
00049  *
00050  * Caller is responsible for passing a palloc'd string.
00051  */
00052 Value *
00053 makeString(char *str)
00054 {
00055     Value      *v = makeNode(Value);
00056 
00057     v->type = T_String;
00058     v->val.str = str;
00059     return v;
00060 }
复制代码

Value 的定义来自于 value.h:

复制代码
00042 typedef struct Value
00043 {
00044     NodeTag     type;           /* tag appropriately (eg. T_String) */
00045     union ValUnion
00046     {
00047         long        ival;       /* machine integer */
00048         char       *str;        /* string */
00049     }           val;
00050 } Value;
复制代码

再看 pg_list.h 中的 list_make1:

00142 #define list_make1(x1)              lcons(x1, NIL)

再看 list.c中的  lcons:

复制代码
00259 lcons(void *datum, List *list)
00260 {
00261     Assert(IsPointerList(list));
00262 
00263     if (list == NIL)
00264         list = new_list(T_List);
00265     else
00266         new_head_cell(list);
00267 
00268     lfirst(list->head) = datum;
00269     check_list_invariants(list);
00270     return list;
00271 }
00272
复制代码

再看 list==NIL 时的 new_list(T_List):

复制代码
00063 new_list(NodeTag type)
00064 {
00065     List       *new_list;
00066     ListCell   *new_head;
00067 
00068     new_head = (ListCell *) palloc(sizeof(*new_head));
00069     new_head->next = NULL;
00070     /* new_head->data is left undefined! */
00071 
00072     new_list = (List *) palloc(sizeof(*new_list));
00073     new_list->type = type;
00074     new_list->length = 1;
00075     new_list->head = new_head;
00076     new_list->tail = new_head;
00077 
00078     return new_list;
00079 }
复制代码

如下图:



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


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
21天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
16 0
|
27天前
|
关系型数据库 MySQL 数据挖掘
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
|
2月前
|
SQL 存储 Oracle
mysql中Group By 分析
mysql中Group By 分析
22 0
|
2月前
|
Apache 索引
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
17 0
|
4月前
|
关系型数据库 MySQL Serverless
高顿教育:大数据抽数分析业务引入polardb mysql serverless
高顿教育通过使用polardb serverless形态进行数据汇总,然后统一进行数据同步到数仓,业务有明显高低峰期,灵活的弹性伸缩能力,大大降低了客户使用成本。
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
98 0
|
21天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
87 1
|
27天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
29天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程
|
2月前
|
缓存 网络协议 关系型数据库
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)(二)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)
34 0