PG12/GP7操作符+的实现

简介: PG12/GP7操作符+的实现

介绍PostgreSQL12/GeenPlum7的操作符“+”的实现机制。首先以select id1+id2 from t;为例解释其结构体之间的关系。


1、SeqScanState顺序扫描状态结构



SeqScanState为顺序扫描的节点状态结构,内有成员StateState ss:扫描状态信息,该结构有PlanState ps,有用的信息在这里。PlanState ps为计划节点状态结构,内有重要的计算节点信息Plan *plan和条件过滤计算步骤ExprState qual、投影信息ProjectionInfo *ps_ProjInfo

Plan结构中有2个重要成员链表:targetlist投影信息列表和qual过滤条件列表。这里仅关注投影,因为id1+id2在投影中。targetlist实际上是2TargetEntry,其中resno表示投影结果位于的结果列序号,resname为结果列名。Expr* expr指向Var结构,表示需要的是哪一列,varattno为用户定义表列的列序号。

接着看投影结构,PlanState中的ps_ProjInfo,内有重要成员ExprState pi_state,表示进行投影计算的步骤描述。pi_state有成员ExprEvalStep steps数组,对表达式计算的步骤描述。本例中有4步,分别为EEOP_SCAN_FETCHSOMEEOP_SCAN_VAREEOP_SCAN_VAREEOP_FUNCEXPR_STRICT。由函数ExecInterpExpr执行。

进行+符号计算的步骤是最后一步,其代码如下:


可以看到,计算前会对参数进行NULL校验,若由一个参数是NULL,则退出。

好,介绍到这里,下节解释+符号对于的函数怎么获取。

目录
相关文章
|
5月前
|
数据采集 SQL 关系型数据库
在 Postgres 中使用 Union
【8月更文挑战第11天】
72 0
在 Postgres 中使用 Union
|
SQL 关系型数据库 数据库
PG/GP group by expression语法
PG/GP group by expression语法
121 1
|
关系型数据库
PG/GP limit...offset...实现机制
PG/GP limit...offset...实现机制
127 0
|
Oracle 关系型数据库
|
监控 关系型数据库 数据库
Greenplum csvlog(日志数据)检索、释义(gp_toolkit.gp_log*)
标签 PostgreSQL , Greenplum , csvlog , gp_toolkit 背景 由于GP为分布式数据库,当查看它的一些日志时,如果到服务器上查看,会非常的繁琐,而且不好排查问题。
2624 0
|
SQL Oracle 关系型数据库
|
数据库
greenplum(gp)的常用命令
下面列举一些gp数据库的常用命令,这只是其中的一部分 连接gp命令: psql -d 库名 -h ip地址 -p 端口号 -U 用户名; gp 添加分区: alter table 表名 add partition d20190611 values('20190611') ; gp 添加字段: alter table 表名 add column update_flag varchar(255); gp 重命名: alter table 表名 rename column old_column_name to new_column_name;
|
Oracle 关系型数据库 MySQL
对比mysql学习oracle函数(五):oracle单行函数—nvl、nvl2、nullif、coalesce、case、decode函数
对比mysql学习oracle函数(五):oracle单行函数—nvl、nvl2、nullif、coalesce、case、decode函数
对比mysql学习oracle函数(五):oracle单行函数—nvl、nvl2、nullif、coalesce、case、decode函数
|
Oracle 关系型数据库
关于Oracle REGEXP_COUNT函数用法总结
关于Oracle REGEXP_COUNT函数用法总结
2561 0
|
关系型数据库 数据库 对象存储
PostgreSQL系统函数:pg_relation_filepath
pg_relation_filepath:数据对象存储位置 Name Return Type Description pg_relation_filepath text file path name of specified relation 创建表空间 postgres=# .
3270 0