diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 1151c3ecc..950774bc9 100644 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -4177,9 +4177,7 @@ static void exec_bind_message(StringInfo input_message) opFusionObj->clean(); opFusionObj->updatePreAllocParamter(input_message); opFusionObj->setCurrentOpFusionObj(opFusionObj); - if (portal_name[0] != '\0') - opFusionObj->storeFusion(portal_name); - + opFusionObj->storeFusion(portal_name); CachedPlanSource* cps = opFusionObj->m_global->m_psrc; if (cps != NULL && cps->gplan) { setCachedPlanBucketId(cps->gplan, opFusionObj->m_local.m_params); @@ -4584,8 +4582,7 @@ static void exec_bind_message(StringInfo input_message) ((OpFusion*)psrc->opFusionObj)->useOuterParameter(params); ((OpFusion*)psrc->opFusionObj)->setCurrentOpFusionObj((OpFusion*)psrc->opFusionObj); ((OpFusion*)psrc->opFusionObj)->CopyFormats(rformats, numRFormats); - if (portal_name[0] != '\0') - ((OpFusion *)psrc->opFusionObj)->storeFusion(portal_name); + ((OpFusion *)psrc->opFusionObj)->storeFusion(portal_name); if (snapshot_set) PopActiveSnapshot(); @@ -9887,6 +9884,7 @@ static void exec_one_in_batch(CachedPlanSource* psrc, ParamListInfo params, int opFusionObj->bindClearPosition(); opFusionObj->useOuterParameter(params); opFusionObj->setCurrentOpFusionObj(opFusionObj); + opFusionObj->storeFusion(""); CachedPlanSource* cps = opFusionObj->m_global->m_psrc; if (cps != NULL && cps->gplan) { @@ -9993,6 +9991,7 @@ static void exec_one_in_batch(CachedPlanSource* psrc, ParamListInfo params, int ((OpFusion*)psrc->opFusionObj)->useOuterParameter(params); ((OpFusion*)psrc->opFusionObj)->setCurrentOpFusionObj((OpFusion*)psrc->opFusionObj); ((OpFusion*)psrc->opFusionObj)->CopyFormats(rformats, numRFormats); + ((OpFusion*)psrc->opFusionObj)->storeFusion(""); if (OpFusion::process(FUSION_EXECUTE, NULL, completionTag, true, NULL)) { CommandCounterIncrement(); diff --git a/src/gausskernel/runtime/executor/opfusion.cpp b/src/gausskernel/runtime/executor/opfusion.cpp index 28b33dd6a..365c38f9f 100644 --- a/src/gausskernel/runtime/executor/opfusion.cpp +++ b/src/gausskernel/runtime/executor/opfusion.cpp @@ -1102,6 +1102,10 @@ void OpFusion::clean() void OpFusion::storeFusion(const char *portalname) { + if (portalname == NULL || portalname[0] == '\0') { + pfree_ext(m_local.m_portalName); + return; + } pnFusionObj *entry = NULL; if (!u_sess->pcache_cxt.pn_fusion_htab) initFusionHtab(); @@ -1257,6 +1261,11 @@ bool SelectFusion::execute(long max_rows, char* completionTag) } else { m_local.m_isCompleted = true; } + /* for unnamed portal, should no need to wait for next E msg */ + if (m_local.m_portalName == NULL || m_local.m_portalName[0] == '\0') { + m_local.m_isCompleted = true; + } + success = true; /**************** @@ -2615,6 +2624,10 @@ bool SelectForUpdateFusion::execute(long max_rows, char* completionTag) } else { m_local.m_isCompleted = true; } + /* for unnamed portal, should no need to wait for next E msg */ + if (m_local.m_portalName == NULL || m_local.m_portalName[0] == '\0') { + m_local.m_isCompleted = true; + } (void)ExecClearTuple(m_local.m_reslot);