PostgreSQL 的 target_list分析(一)

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

首先看 lappend

复制代码
00128 lappend(List *list, void *datum)
00129 {
00130     Assert(IsPointerList(list));
00131 
00132     if (list == NIL)
00133         list = new_list(T_List);
00134     else
00135         new_tail_cell(list);
00136 
00137     lfirst(list->tail) = datum;
00138     check_list_invariants(list);
00139     return list;
00140 }
复制代码

再看 list 的定义:

复制代码
typedef struct List
{
   NodeTag type;
   int length;
   ListCell  *head;
   ListCell  *tail;
} List;
复制代码

和 ListCell 的定义

复制代码
struct ListCell
{
    union
    {
         void  *ptr_value;
         int     int_value;
         Oid    oid_value;
    }data;

    ListCell  *next;
}
复制代码

再看 gram.y 中的 target_list 的定义:

target_list:                                    
            target_el                { $$ = list_make1($1); }        
            | target_list ',' target_el                { $$ = lappend($1, $3); }        
        ;                            

也就是说:target_lsit 中的 lappend 相当于:

$1->tail->data.ptr_value  =  $3

换句话说,$1 是一个 List, $2 是一个 ListCell。 

从最开始 的 target_el 的 listmake1($1) ,可以知道,

刚开始的时候,是List 的 head 指向 ListCell,而ListCell的 ptr_value指针,指向第一个ResTarget。

此ResTarget对应的就是 select id1, id2 中,id1 或 id2 。

然后,如果select 的字段不止一个,就会走到  

target_list  ','   target_el  {$$ = lappend($1, $3); }

也就是说:$1->tail->data.ptr_value  =  $3, 即 第一个ResTarget 已经关联到第二个 ResTarget。

这种情况具体说来:

复制代码
00108 new_tail_cell(List *list)
00109 {
00110     ListCell   *new_tail;
00111 
00112     new_tail = (ListCell *) palloc(sizeof(*new_tail));
00113     new_tail->next = NULL;
00114 
00115     list->tail->next = new_tail;
00116     list->tail = new_tail;
00117     list->length++;
00118 }
复制代码

如图:



本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/10/2678199.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