摘要:
现在,将要进入最为重要的部分:分析如何制作执行计划的。先把它简化,看看NodeTag 在 PortalStart 之前,是如何得到的。先找到第一个相关程序:每一种执行计划(结点单位),都有一个对应的path。/***************************************************************************** * PATH NODE CREATION ROUTINES *****************************************************************************//*... 阅读全文
摘要:
回溯:PortalRun --> PortalRunSelectboolPortalRun(Portal portal, long count, bool isTopLevel, DestReceiver *dest, DestReceiver *altdest, char *completionTag){ ... portal->status = PORTAL_ACTIVE; ... PG_TRY(); { ActivePortal = portal; CurrentResourceOwner = ... 阅读全文
摘要:
再次上溯:可以知道,在 ExecutePlan入口参数里面,start_block 就已经是0了。/* ---------------------------------------------------------------- * ExecutePlan * * Processes the query plan until we have processed 'numberTuples' tuples, * moving in the specified direction. * * Runs to completion if nu... 阅读全文
摘要:
基本上是没有声明头文件造成可以 gcc 加 -E 参数然后,用文本编辑器打开生成的 .o文件,看其具体缺少哪些信息的状况。 阅读全文
摘要:
接前面,再次上溯。可以知道:ExecProcNode: 会根据情况不同,将PlanNode转为各种类型Node再参与运算:TupleTableSlot *ExecProcNode(PlanState *node){ //ExecProcNode fprintf(stderr,"ExecProcNode:node->ss_currentScanDesc->rs_startblock is: %d by process %d\n", ((SeqScanState *) node)->ss_currentScanDesc->rs_startblock,ge 阅读全文
摘要:
接前面,看被SeqNext所调用的heap_getnext:HeapTupleheap_getnext(HeapScanDesc scan, ScanDirection direction){ /* Note: no locking manipulations needed */ HEAPDEBUG_1; /* heap_getnext( info ) */ if (scan->rs_pageatatime) heapgettup_pagemode(scan, direction,scan->rs_nkeys, scan->rs_k... 阅读全文