pgsql11.2源码
fgh431
非淡泊无以明志
展开
-
PostgreSQL里我用一下like
文章目录PostgreSQL里我用一下likePostgreSQL里我用一下likepostgres=# select * from test1 where id2 like '%fg%'; id1 | id2 | id3 -----+-------+----- 12 | dfg | 32 162 | fgdgd | 3 162 | sgfg | 302(3 rows)postgres=# explain analyze select * from test1原创 2021-05-17 21:30:19 · 247 阅读 · 0 评论 -
ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)如何传递参数给函数
我很好奇:为啥EEOP_FUNCEXPR_STRICT没有显著的取参数的过程!EEOP_INNER_FETCHSOMEEEOP_OUTER_FETCHSOMEEEOP_OUTER_VAR:(gdb) p op->resvalue$1 = (Datum *) 0x2dc0d48EEOP_INNER_VAR(gdb) p op->resvalue$5 = (Datum *) 0x2dc0d50EEOP_FUNCEXPR_STRICT(gdb) p fcinfo->arg.原创 2021-03-08 11:10:04 · 640 阅读 · 1 评论 -
11.2 源码里面的ExecProject
/* * ExecProject * * Projects a tuple based on projection info and stores it in the slot passed * to ExecBuildProjectInfo(). * * Note: the result is always a virtual tuple; therefore it may reference * the contents of the exprContext's scan tuples .原创 2021-03-07 21:08:25 · 256 阅读 · 0 评论 -
用gdb的call ExecProcNode(planstate)执行
select * from test1 inner join test2 on test1.id1=test2.id4; 断点设置在slot = ExecProcNode(planstate); for (;;) { /* Reset the per-output-tuple exprcontext */ ResetPerTupleExprContext(estate); /* * Execute the plan and obtain a tuple */ sl原创 2021-03-06 17:36:26 · 348 阅读 · 0 评论 -
查看avg是啥精度呢?
select avg (id1) from TEST_A group by id3;调试到ExecutePlan这个函数里的slot = ExecProcNode(planstate);之后然后我看到了居然有两个属性我不太理解啊! p slot->tts_nvalid$25 = 2(gdb) p slot->tts_tupleDescriptor->natts$26 = 2(gdb) p slot->tts_tupleDescriptor->attr.原创 2021-01-24 16:27:48 · 310 阅读 · 0 评论 -
明天记得干这个
明天记得干这个我觉得下层的slot这个指针指向的地址都是一样的肯定是下层的槽 我们没有必要搞清楚Hash Join的运行原理因为我们其实是想通过nestloop来了解他的上下层接口的!原创 2021-01-23 00:47:42 · 110 阅读 · 0 评论 -
\d报错
不加插件答案是这个temp=# \d List of relations Schema | Name | Type | Owner --------+--------+-------+-------- public | tb1 | table | ztz123 public | test_a | table | ztz123 public | test_b | table | ztz123(3 rows) 加了插件是这个temp=# \dER原创 2021-01-20 13:29:21 · 241 阅读 · 0 评论 -
select * from test1;执行表的连接吗?
文章目录select * from test1;执行表的连接吗??select * from test1;执行表的连接吗??首先在make_rel_from_joinlist中还是会把生成最底层的initial_rels结果他发现自己输入的joinlist只是一层也就是initial_rels只有一个元素那么他就直接返回initial_rels的首个rel否则的话就要么调用遗...原创 2020-05-04 11:39:43 · 580 阅读 · 0 评论 -
var系列
/* * Var - expression node representing a variable (ie, a table column) * * Note: during parsing/planning, varnoold/varoattno are always just copies * of varno/varattno. At the tail end of planning, Var nodes appearing in * upper-level plan nodes ...原创 2020-05-09 18:02:50 · 308 阅读 · 0 评论 -
GDB 调试的时候用这个方法!+ 如何从pg的list中找到第一个元素,第二个元素等
文章目录#define linitial(l) lfirst(list_head(l))#define linitial_int(l) lfirst_int(list_head(l))#define linitial_oid(l) lfirst_oid(list_head(l))#define linitial_node(type,l) castNode(type, lin...原创 2020-05-08 01:20:35 · 760 阅读 · 0 评论 -
create_seqscan_plan(PlannerInfo *root, Path *best_path,
/* * create_seqscan_plan * Returns a seqscan plan for the base relation scanned by 'best_path' * with restriction clauses 'scan_clauses' and targetlist 'tlist'. */static SeqScan *create_seqsca...原创 2020-03-11 22:31:50 · 252 阅读 · 0 评论 -
standard_planner
PlannedStmt *standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams){ PlannedStmt *result; PlannerGlobal *glob; double tuple_fraction; PlannerInfo *root; RelOptInfo *final...原创 2020-03-03 20:08:32 · 359 阅读 · 0 评论 -
每个结点都有四大容器
文章目录每个结点都有四大容器每个结点都有四大容器放置结果的左边孩子的返回结果右边孩子的返回结果扫描结果原创 2020-05-09 21:47:59 · 265 阅读 · 0 评论 -
看看CurrentMemoryContext里面有啥
文章目录看看CurrentMemoryContext里面有啥看看CurrentMemoryContext里面有啥typedef struct MemoryContextData{ NodeTag type; /* identifies exact kind of context */ /* these two fields are placed here to minimize alignment wastage: */ bool isReset; /* T = no space al原创 2020-05-13 19:09:15 · 224 阅读 · 0 评论 -
IS_OUTER_JOIN是啥?
IS_OUTER_JOIN是啥?/* * OUTER joins are those for which pushed-down quals must behave differently * from the join's own quals. This is in fact everything except INNER and * SEMI joins. However, this macro must also exclude the JOIN_UNIQUE symbols * sin原创 2020-09-01 13:50:49 · 244 阅读 · 0 评论 -
HeapTupleHeaderData和HeapTupleHeader
HeapTupleHeaderData是数据块HeapTupleHeader是指向他的指针啊!用来访问元组的头部信息!每个元组都有元组头信息,真浪费啊!原创 2021-01-04 21:42:21 · 394 阅读 · 0 评论 -
自定义实现Join节点概述 + Scan节点没有类似于custom_scan_tlist的东西
文章目录自定义实现Join节点概述Scan节点没有类似于custom_scan_tlist的东西自定义实现Join节点概述你用CustomScan节点实现CJoinCustomScan上面 的表达式和投影都是参照custom_scan_tlist的且我敢肯定这个scanstate->ss_ScanTupleSlot是根据custom_scan_tlist来初始化的因为没有表啊!没有表来初始化这个东西啊!Scan节点没有类似于custom_scan_tlist的东西那这个原创 2020-10-08 15:59:14 · 245 阅读 · 0 评论 -
group by 系列
文章目录select max(id2) from test1 group by id1 ;看看have_grouping这个变量的四个组成部分select max(id2) from test1 group by id1 ;刚进入create_plan的时候,你猜猜这个*best_path是啥呢?(gdb) print (*best_path)$1 = {type = T_AggPath, pathtype = T_Agg, parent = 0x13cc168, pathtarget =原创 2020-09-15 16:02:15 · 225 阅读 · 0 评论 -
外连接消除的重大发现
暗示法第三方第三方原创 2020-09-15 11:38:04 · 173 阅读 · 0 评论 -
grouping_planner这个函数
士大夫原创 2020-09-14 20:57:12 · 215 阅读 · 0 评论 -
order by系列
#pragma comment(lib,“lua54.lib”)原创 2020-09-14 20:24:17 · 225 阅读 · 0 评论 -
来自老邢的提问:select id2+id1 as sdfkd from test1 ;时候的parse->jointree->fromlist为空吗?
文章目录来自老邢的提问:select id2+id1 as sdfkd from test1 ;时候的parse->jointree->fromlist为空吗?来自老邢的提问:select id2+id1 as sdfkd from test1 ;时候的parse->jointree->fromlist为空吗?居然不为空,fromlist只有一个节点是/* * We could use direct pointers to the RT entries and原创 2020-09-11 14:46:10 · 160 阅读 · 0 评论 -
query_planner中的某些函数的作用
文章目录query_planner中的某些函数的作用setup_simple_rel_arraysquery_planner中的某些函数的作用setup_simple_rel_arrays这个函数的作用是Make a flattened version of the rangetable for faster access (this isOK because the rangetable won’t change any more)and set up an empty array f原创 2020-09-11 13:49:55 · 332 阅读 · 0 评论 -
看看slot的每个值
文章目录看看slot的每个值看看slot的每个值postgres=# select * from test1; id1 | id2 -----+----- 2 | 3 3 | 4断点打在ExecScan到了163行之后,看看(gdb) print(slot -> tts_nvalid)答案是0 (gdb) print (slot ->tts_values[0] )$9 = 2(gdb) print (slot ->tts_values[原创 2020-09-10 16:05:01 · 558 阅读 · 0 评论 -
初始化节点时每个节点时候观察estate->es_tupleTable
文章目录初始化节点时每个节点时候观察estate->es_tupleTable初始化节点时每个节点时候观察estate->es_tupleTableselect test1.id1,test1.id1 from test1 inner join test2 on test1.id1=test2.id3; 我设置了2个断点ExecInitNestLoopExecInitSeqScan 结果如下先进入ExecInitSeqScan其实是先进入ExecInitNest原创 2020-09-05 13:19:29 · 837 阅读 · 0 评论 -
初始化节点时每个节点的estate指向一样的东西吗以及estate的作用?
文章目录初始化节点时每个节点的estate指向一样的东西吗?初始化节点时每个节点的estate指向一样的东西吗?其实肯定一样的因为初始化节点的最外层是被这个函数包裹着PlanState *ExecInitNode(Plan *node, EState *estate, int eflags){ 那这个estate到底起到什么作用呢?例如在ExecInitNestLoop中这个estate会在 - ExecAssignExprContext(estate, &n原创 2020-09-05 12:50:04 · 285 阅读 · 0 评论 -
Path和 RelOptInfo结构体的感悟
文章目录Path和 RelOptInfo结构体的感悟Path和 RelOptInfo结构体的感悟一个Path结构体必然依附于一个RelOptInfo结构体 RelOptInfo和Path都有struct PathTarget *reltarget;结构体我觉得他们是一样的也就是每创建一个path的时候就来一个这样操作pathnode->path.pathtarget = rel->reltarget;...原创 2020-09-05 10:48:41 · 328 阅读 · 0 评论 -
CustomScan节点的targetlist、qual、custom_exprs是依赖于谁
文章目录CustomScan节点的targetlist、qual、custom_exprs是依赖于谁CustomScan节点的targetlist、qual、custom_exprs是依赖于谁答案:依赖于custom_scan_tliststatic voidset_customscan_references(PlannerInfo *root, CustomScan *cscan, int rtoffset){ ListCell *lc;原创 2020-09-04 21:30:01 · 305 阅读 · 0 评论 -
同一plan节点的targetlist和qual中是对同一var的指针吗?
文章目录同一plan节点的targetlist和qual中是对同一var的指针吗?同一plan节点的targetlist和qual中是对同一var的指针吗?select test3.id1 from test3 where test3.id1>1;先在create_seqplan/* * Returns a seqscan plan for the base relation scanned by 'best_path' * with restriction clause原创 2020-05-13 17:34:02 · 285 阅读 · 0 评论 -
我手动给他们加上了
文章目录我手动给他们加上了举例子看卡我手动给他们加上了typedef struct tlist_index_info{ int resno; int varno;//此var的原本varno int varattno;}tlist_index_info;tlist_index_info * construct_tlist_index(List *tlist){ int num=length(tlist); tlist_index_info *result=palloc(siz原创 2020-05-13 12:19:08 · 180 阅读 · 0 评论 -
create_nestloop_plan时的tlist是什么样子?
create_nestloop_plan时的tlist是什么样子?我们直到在set_plan_references的时候tlist会变成是对下层节点的参考那create_nestloop_plan的时候的tlist是不是绝对值呢?select test3.id2,test4.id2 from test3 , test4 where test3.id1=test4.id1;设置断点create_nestloop_plan(gdb) print length(tlist)$1 = 2(g原创 2020-05-12 11:58:56 · 212 阅读 · 0 评论 -
plan的targetlist是TargetEntry类型的list
文章目录plan的targetlist是什么东西plan的targetlist是什么东西select * from test3 , test4 where test3.id2=test4.id2 ;在ExecInitNestLoop设置断点(gdb) print node->join.plan.targetlist$1 = (List *) 0x1826bb8(gdb) print length($1)$2 = 4(gdb) print ((Node *)(list_he原创 2020-05-11 18:09:07 · 930 阅读 · 0 评论 -
join.joinqual是什么东西
join.joinqual是什么东西先看这个函数吧/* * Extract bare clauses from 'restrictinfo_list', returning either the * regular ones or the pseudoconstant ones per 'pseudoconstant'. */List *extract_actual_clauses(List *restrictinfo_list, bool pseudoconstant原创 2020-05-11 16:01:22 · 255 阅读 · 1 评论 -
ExecScan系列
ExecScan/* ---------------------------------------------------------------- * Scans the relation using the 'access method' indicated and * returns the next qualifying tuple in the direction specified * in the global variable ExecDirection. * The a原创 2020-05-10 20:26:08 · 379 阅读 · 0 评论 -
Custom系列
文章目录CustomPathCustomPath/* * represents a table scan done by extension. * * We provide a set of hooks here - which the provider must take care to set * up correctly - to allow extensions to supp...原创 2020-05-07 17:48:02 · 887 阅读 · 0 评论 -
nestloop系列
文章目录create_nestloop_planbuild_path_list是啥意思create_nestloop_planbuild_path_list是啥意思可以看出来这个东西主要跟path->pathtarget有关而记得我们在创建nestpath的时候这个值是根据这个赋值语句来的在create_nestloop_path里面的path->path....原创 2020-05-07 09:53:22 · 536 阅读 · 0 评论 -
create_plan函数怎么搞啊
文章目录create_plan函数怎么搞啊select * from test1 , test2 where test1.id2=test2.id2 ;create_plan函数怎么搞啊select * from test1 , test2 where test1.id2=test2.id2 ;刚进去create_plan的时候打印一下best_path长啥样子(gdb) print ...原创 2020-05-06 21:18:15 · 474 阅读 · 0 评论 -
pg执行的时候表达式咋处理的
pg执行的时候表达式咋处理的select * from test1 where test1.id2=12 ;在static TupleTableSlot *ExecSeqScan(PlanState *pstate)处设断点 /* ---------------------------------------------------------------- * ExecS...原创 2020-05-04 22:46:03 · 1016 阅读 · 0 评论 -
通过subquery_planner查看rtable是些什么东西
文章目录通过subquery_planner查看rtable是些什么东西第一个第2个第3个第四个第5个通过subquery_planner查看rtable是些什么东西他一共有五个RangeTblEntry第一个(gdb) print *rte$4 = {type = T_RangeTblEntry, rtekind = RTE_RELATION, relid = 16384, ...原创 2020-05-04 16:16:35 · 300 阅读 · 0 评论 -
pg_plan_queries调试分析
pg_plan_queries调试分析select * from test1 , test2 where test1.id2=test2.id2 ;querytrees里面只有一个Query结构体cursorOptions=256 print *query->jointree->quals$14 = {type = T_OpExpr} ->的优先级比*高啊...原创 2020-05-04 12:48:58 · 373 阅读 · 0 评论