我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL 源码解读(204)- 查询#117(数据结构SelectStmt&Value)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL 源码解读(204)- 查询#117(数据结构SelectStmt&Value)

本节简单介绍了PostgreSQL在执行parse中重要的两个数据结构:SelectStmt&Value.

一、数据结构

SelectStmt
“simple” SELECT可转换为SelectStmt节点.包含集合操作(UNION, INTERSECT, EXCEPT)的查询通过SelectStmt节点树来表示,在这棵树中,叶子节点是SELECTs组件,而内部节点表示UNION, INTERSECT, or EXCEPT操作符.内部节点和叶子节点是相同的节点类型.




typedef enum SetOperation
{
  SETOP_NONE = 0,
  SETOP_UNION,
  SETOP_INTERSECT,
  SETOP_EXCEPT
} SetOperation;
typedef struct SelectStmt
{
  NodeTag   type;
  
  //NULL,DISTINCT ON表达式链表,或者所有(SELECT DISTINCT)的lcons(NIL,NIL)
  List     *distinctClause; 
  //SELECT INTO的target
  IntoClause *intoClause;   
  //目标链表(元素为ResTarget)
  List     *targetList;   
  //FROM子句
  List     *fromClause;   
  //WHERE
  Node     *whereClause;  
  //GROUP BY 子句
  List     *groupClause;  
  //HAVING条件表达式
  Node     *havingClause; 
  //窗口函数链表
  List     *windowClause; 
  
  List     *valuesLists;  
  
  //排序子句
  List     *sortClause;   
  //limit偏移
  Node     *limitOffset;  
  //limit个数
  Node     *limitCount;   
  //FOR UPDATE
  List     *lockingClause;  
  //CTE
  WithClause *withClause;   
  
  //操作类型
  SetOperation op;      
  bool    all;      
  //左边树
  struct SelectStmt *larg;  
  //右边树
  struct SelectStmt *rarg;  
  
} SelectStmt;

Value
相同的Value结构体用于5中节点类型:T_Integer, T_Float, T_String, T_BitString, T_Null




#ifndef VALUE_H
#define VALUE_H
#include "nodes/nodes.h"

typedef struct Value
{
  NodeTag   type;     
  union ValUnion
  {
    int     ival;   
    char     *str;    
  }     val;
} Value;
#define intVal(v)   (((Value *)(v))->val.ival)
#define floatVal(v)   atof(((Value *)(v))->val.str)
#define strVal(v)   (((Value *)(v))->val.str)
extern Value *makeInteger(int i);
extern Value *makeFloat(char *numericStr);
extern Value *makeString(char *str);
extern Value *makeBitString(char *str);
#endif              

二、源码解读

N/A

三、跟踪分析

测试SQL语句:



-- 用于测试的查询语句
testdb=# select t_dwxx.dwmc,t_grxx.grbh,t_grxx.xm,t_jfxx.ny,t_jfxx.je
testdb-# from t_dwxx,t_grxx,t_jfxx
testdb-# where t_dwxx.dwbh = t_grxx.dwbh 
testdb-# and t_grxx.grbh = t_jfxx.grbh
testdb-# and t_dwxx.dwbh IN ('1001','1002')
testdb-# order by t_grxx.grbh
testdb-# limit 8;
   dwmc    | grbh |  xm  |   ny   |   je   
-----------+------+------+--------+--------
 X有限公司 | 901  | 张三 | 201801 |  401.3
 X有限公司 | 901  | 张三 | 201802 |  401.3
 X有限公司 | 901  | 张三 | 201803 |  401.3
 Y有限公司 | 902  | 李四 | 201801 |  513.1
 Y有限公司 | 902  | 李四 | 201802 |  513.3
 Y有限公司 | 902  | 李四 | 201804 |  513.3
 Y有限公司 | 903  | 王五 | 201801 | 372.22
 Y有限公司 | 903  | 王五 | 201804 | 372.22
(8 rows)

样例数据如下:



...
(gdb) p *(RawStmt *)(raw_parsetree_list->head.data->ptr_value)
$7 = {type = T_RawStmt, stmt = 0x1a48c00, stmt_location = 0, stmt_len = 232}
(gdb) p *((RawStmt *)(raw_parsetree_list->head.data->ptr_value))->stmt
$8 = {type = T_SelectStmt}
###### 实际类型SelectStmt 
(gdb)  p *(SelectStmt *)((RawStmt *)(raw_parsetree_list->head.data->ptr_value))->stmt
$16 = {type = T_SelectStmt, distinctClause = 0x0, intoClause = 0x0, targetList = 0x1a47b18, 
  fromClause = 0x1a48900, whereClause = 0x1a48b40, groupClause = 0x0, havingClause = 0x0, windowClause = 0x0, 
  valuesLists = 0x0, sortClause = 0x1afd858, limitOffset = 0x0, limitCount = 0x1afd888, lockingClause = 0x0, 
  withClause = 0x0, op = SETOP_NONE, all = false, larg = 0x0, rarg = 0x0}

四、参考资料

N/A

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL 源码解读(204)- 查询#117(数据结构SelectStmt&Value)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录