181 lines
5.2 KiB
C++
181 lines
5.2 KiB
C++
/* -------------------------------------------------------------------------
|
|
*
|
|
* nodeStub.cpp
|
|
* routines to Sub function of Init/Proc/End
|
|
*
|
|
* Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/gausskernel/runtime/executor/nodeStub.cpp
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
#include "knl/knl_variable.h"
|
|
#include "executor/executor.h"
|
|
#include "executor/nodeStub.h"
|
|
#include "vecexecutor/vecnodes.h"
|
|
#include "executor/nodeSeqscan.h"
|
|
#include "executor/nodeIndexscan.h"
|
|
#include "executor/nodeIndexonlyscan.h"
|
|
#include "executor/nodeBitmapIndexscan.h"
|
|
#include "executor/nodeBitmapHeapscan.h"
|
|
#include "executor/nodeTidscan.h"
|
|
|
|
extern char* nodeTagToString(NodeTag type);
|
|
|
|
PlanState* ExecInitNodeStubNorm(Plan* node, EState* estate, int eflags)
|
|
{
|
|
Plan* inner = NULL;
|
|
Plan* outer = NULL;
|
|
PlanState* ps = NULL;
|
|
|
|
Assert(node != NULL);
|
|
|
|
/* Create base PlanState data structure */
|
|
switch (nodeTag(node)) {
|
|
case T_ModifyTable:
|
|
case T_VecModifyTable: {
|
|
ModifyTable* mtplan = (ModifyTable*)node;
|
|
|
|
if (mtplan->is_dist_insertselect) {
|
|
ps = (PlanState*)makeNode(DistInsertSelectState);
|
|
} else {
|
|
ps = (PlanState*)makeNode(ModifyTableState);
|
|
}
|
|
} break;
|
|
case T_SubqueryScan:
|
|
ps = (PlanState*)makeNode(SubqueryScanState);
|
|
break;
|
|
default: {
|
|
ps = (PlanState*)makeNode(PlanState);
|
|
break;
|
|
}
|
|
}
|
|
|
|
ps->plan = node;
|
|
ps->state = estate;
|
|
ps->stubType = PST_Norm;
|
|
inner = innerPlan(node);
|
|
outer = outerPlan(node);
|
|
|
|
/* Do specific node initilization */
|
|
switch (nodeTag(node)) {
|
|
case T_ModifyTable:
|
|
case T_VecModifyTable: {
|
|
ModifyTable* mtplan = (ModifyTable*)node;
|
|
ModifyTableState* mtstate = (ModifyTableState*)ps;
|
|
int nplans = 0;
|
|
ListCell* l = NULL;
|
|
int i = 0;
|
|
|
|
mtstate->operation = mtplan->operation;
|
|
mtstate->mt_done = false;
|
|
nplans = list_length(mtplan->plans);
|
|
mtstate->mt_nplans = nplans;
|
|
|
|
TupleDesc tupDesc = ExecTypeFromTL(NIL, false);
|
|
ExecInitResultTupleSlot(estate, &mtstate->ps);
|
|
ExecAssignResultType(&mtstate->ps, tupDesc);
|
|
|
|
mtstate->mt_plans = (PlanState**)palloc0(sizeof(PlanState*) * nplans);
|
|
foreach (l, mtplan->plans) {
|
|
Plan* _plan = (Plan*)lfirst(l);
|
|
mtstate->mt_plans[i] = ExecInitNode(_plan, estate, eflags);
|
|
i++;
|
|
}
|
|
|
|
return (PlanState*)mtstate;
|
|
} break;
|
|
|
|
case T_SubqueryScan: {
|
|
SubqueryScan* sbplan = (SubqueryScan*)node;
|
|
SubqueryScanState* sbstate = (SubqueryScanState*)ps;
|
|
sbstate->subplan = ExecInitNode(sbplan->subplan, estate, eflags);
|
|
} break;
|
|
|
|
default: {
|
|
/* Initialize inner/outer plannode if necessary */
|
|
innerPlanState(ps) = ExecInitNode(inner, estate, eflags);
|
|
outerPlanState(ps) = ExecInitNode(outer, estate, eflags);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Result tuple initialization */
|
|
ExecInitResultTupleSlot(estate, ps);
|
|
ExecAssignResultTypeFromTL(ps, TAM_HEAP);
|
|
|
|
return ps;
|
|
}
|
|
|
|
TupleTableSlot* ExecProcNodeStub(PlanState* node)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void ExecEndNodeStubNorm(PlanState* node)
|
|
{
|
|
PlanState *inner, *outer;
|
|
|
|
/* common operations */
|
|
inner = innerPlanState(node);
|
|
outer = outerPlanState(node);
|
|
|
|
/* do node specific finialization */
|
|
switch (nodeTag(node->plan)) {
|
|
case T_ModifyTable: {
|
|
ModifyTableState* mtstate = (ModifyTableState*)node;
|
|
for (int i = 0; i < mtstate->mt_nplans; i++) {
|
|
ExecEndNode(mtstate->mt_plans[i]);
|
|
}
|
|
} break;
|
|
|
|
case T_SubqueryScan: {
|
|
SubqueryScanState* sbstate = (SubqueryScanState*)node;
|
|
ExecEndNode(sbstate->subplan);
|
|
} break;
|
|
|
|
default: {
|
|
ExecEndNode(inner);
|
|
ExecEndNode(outer);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
void ExecEndNodeStubScan(PlanState* node)
|
|
{
|
|
switch (nodeTag(node->plan)) {
|
|
case T_SeqScan:
|
|
ExecEndSeqScan((SeqScanState*)node);
|
|
break;
|
|
case T_IndexScan:
|
|
ExecEndIndexScan((IndexScanState*)node);
|
|
break;
|
|
case T_IndexOnlyScan:
|
|
ExecEndIndexOnlyScan((IndexOnlyScanState*)node);
|
|
break;
|
|
case T_BitmapIndexScan:
|
|
ExecEndBitmapIndexScan((BitmapIndexScanState*)node);
|
|
break;
|
|
case T_BitmapHeapScan:
|
|
ExecEndBitmapHeapScan((BitmapHeapScanState*)node);
|
|
break;
|
|
case T_TidScan:
|
|
ExecEndTidScan((TidScanState*)node);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
void ExecEndNodeStub(PlanState* node)
|
|
{
|
|
if (node->stubType == PST_Scan) {
|
|
ExecEndNodeStubScan(node);
|
|
} else {
|
|
ExecEndNodeStubNorm(node);
|
|
}
|
|
}
|