初始化节点时每个节点的estate指向一样的东西吗以及estate的作用?
发布日期:2021-06-29 18:53:33 浏览次数:2 分类:技术文章

本文共 3276 字,大约阅读时间需要 10 分钟。

文章目录

初始化节点时每个节点的estate指向一样的东西吗?

  • 其实肯定一样的
  • 因为初始化节点的最外层是被这个函数包裹着
PlanState *ExecInitNode(Plan *node, EState *estate, int eflags){

  • 那这个estate到底起到什么作用呢?
  • 例如在ExecInitNestLoop中
    • 这个estate会在
- ExecAssignExprContext(estate, &nlstate->js.ps);  - ExecInitResultTupleSlotTL(estate, &nlstate->js.ps);  - ExecInitNullTupleSlot(estate,									  ExecGetResultType(innerPlanState(nlstate)));
  • 上面三个地方用到。

  • 下面这个函数似乎给出了estate的作用哦!

  • 有点想要在estate->es_tupleTable这个list上面加一点TupleTableSlots

    • 然后把这个槽赋给planstate->ps_ResultTupleSlot
  • 有意思的是他的第一个参数不就是list **吗!!

/* ---------------- *		ExecInitResultTupleSlotTL * *		Initialize result tuple slot, using the plan node's targetlist. * ---------------- */voidExecInitResultTupleSlotTL(EState *estate, PlanState *planstate){
bool hasoid; TupleDesc tupDesc; if (ExecContextForcesOids(planstate, &hasoid)) {
/* context forces OID choice; hasoid is now set correctly */ } else {
/* given free choice, don't leave space for OIDs in result tuples */ hasoid = false; } tupDesc = ExecTypeFromTL(planstate->plan->targetlist, hasoid); planstate->ps_ResultTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable, tupDesc);}

  • ExecInitScanTupleSlot更是直接的展示了
    • 我认识的一个真理
    • 每一个节点的容器都是放在estate->es_tupleTable中的啊!
/* ---------------- *		ExecInitScanTupleSlot * ---------------- */voidExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc){
scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable, tupledesc); scanstate->ps.scandesc = tupledesc;}/* -------------------------------- * ExecAllocTableSlot * * Create a tuple table slot within a tuple table (which is just a List). * -------------------------------- */TupleTableSlot *ExecAllocTableSlot(List **tupleTable, TupleDesc desc){
TupleTableSlot *slot = MakeTupleTableSlot(desc); *tupleTable = lappend(*tupleTable, slot); return slot;}

MakeTupleTableSlot

/* -------------------------------- *		MakeTupleTableSlot * *		Basic routine to make an empty TupleTableSlot. If tupleDesc is *		specified the slot's descriptor is fixed for it's lifetime, gaining *		some efficiency. If that's undesirable, pass NULL. * -------------------------------- */TupleTableSlot *MakeTupleTableSlot(TupleDesc tupleDesc){
Size sz; TupleTableSlot *slot; /* * When a fixed descriptor is specified, we can reduce overhead by * allocating the entire slot in one go. */ if (tupleDesc) sz = MAXALIGN(sizeof(TupleTableSlot)) + MAXALIGN(tupleDesc->natts * sizeof(Datum)) + MAXALIGN(tupleDesc->natts * sizeof(bool)); else sz = sizeof(TupleTableSlot); slot = palloc0(sz); slot->type = T_TupleTableSlot; slot->tts_isempty = true; slot->tts_shouldFree = false; slot->tts_shouldFreeMin = false; slot->tts_tuple = NULL; slot->tts_fixedTupleDescriptor = tupleDesc != NULL; slot->tts_tupleDescriptor = tupleDesc; slot->tts_mcxt = CurrentMemoryContext; slot->tts_buffer = InvalidBuffer; slot->tts_nvalid = 0; slot->tts_values = NULL; slot->tts_isnull = NULL; slot->tts_mintuple = NULL; if (tupleDesc != NULL) {
slot->tts_values = (Datum *) (((char *) slot) + MAXALIGN(sizeof(TupleTableSlot))); slot->tts_isnull = (bool *) (((char *) slot) + MAXALIGN(sizeof(TupleTableSlot)) + MAXALIGN(tupleDesc->natts * sizeof(Datum))); PinTupleDesc(tupleDesc); } return slot;}

转载地址:https://cyj666.blog.csdn.net/article/details/108418178 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:初始化节点时每个节点时候观察estate->es_tupleTable
下一篇:Path和 RelOptInfo结构体的感悟

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月05日 04时51分32秒