This is an automated email from the ASF dual-hosted git repository. maxyang pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 8d4b9d3ff576753763f1f3690d07551e68c1c121 Author: zhoujiaqi <[email protected]> AuthorDate: Wed Jan 15 14:39:05 2025 +0800 Fix: cherry-pick DynamicForeignscan - Fix directly call `*virt` functions after DynamicForeignscan - Fix attNumbers API changes - Fix serialization/deserialization functions missing some attribute - Fix COPY_EXECUTOR --- src/backend/commands/copyfrom.c | 8 ++++++++ src/backend/executor/nodeDynamicBitmapHeapscan.c | 2 +- src/backend/executor/nodeDynamicForeignscan.c | 17 +++++++++++------ src/backend/executor/nodeDynamicSeqscan.c | 2 +- src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp | 10 +++++----- .../gpopt/translate/CTranslatorRelcacheToDXL.cpp | 5 +++++ src/backend/nodes/outfuncs.c | 1 + src/backend/nodes/readfuncs.c | 5 +++-- 8 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index 712951cb66..3e12754889 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -2779,6 +2779,14 @@ BeginCopyFrom(ParseState *pstate, cstate->rel && cstate->rel->rd_cdbpolicy && cstate->rel->rd_cdbpolicy->ptype != POLICYTYPE_ENTRY) cstate->dispatch_mode = COPY_DISPATCH; + /* + * Handle case where fdw executes on coordinator while it's acting as a segment + * This occurs when fdw is under a redistribute on the coordinator + */ + else if (Gp_role == GP_ROLE_EXECUTE && + cstate->rel && cstate->rel->rd_cdbpolicy && + cstate->rel->rd_cdbpolicy->ptype == POLICYTYPE_ENTRY) + cstate->dispatch_mode = COPY_DIRECT; else if (Gp_role == GP_ROLE_EXECUTE) cstate->dispatch_mode = COPY_EXECUTOR; else diff --git a/src/backend/executor/nodeDynamicBitmapHeapscan.c b/src/backend/executor/nodeDynamicBitmapHeapscan.c index aa03c4f31d..95dc85d940 100644 --- a/src/backend/executor/nodeDynamicBitmapHeapscan.c +++ b/src/backend/executor/nodeDynamicBitmapHeapscan.c @@ -176,7 +176,7 @@ initNextTableToScan(DynamicBitmapHeapScanState *node) * the new varnos correspond to */ node->lastRelOid = pid; - pfree(attMap); + free_attrmap(attMap); } node->bhsState = ExecInitBitmapHeapScanForPartition(&plan->bitmapheapscan, estate, node->eflags, diff --git a/src/backend/executor/nodeDynamicForeignscan.c b/src/backend/executor/nodeDynamicForeignscan.c index a635b47a43..b73cf4fc70 100644 --- a/src/backend/executor/nodeDynamicForeignscan.c +++ b/src/backend/executor/nodeDynamicForeignscan.c @@ -70,6 +70,10 @@ ExecInitDynamicForeignScan(DynamicForeignScan *node, EState *estate, int eflags) Relation scanRel = ExecOpenScanRelation(estate, node->foreignscan.scan.scanrelid, eflags); ExecInitScanTupleSlot(estate, &state->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel)); + /* Dynamic foreign scan can't tell the ops of tupleslot */ + state->ss.ps.scanopsfixed = false; + state->ss.ps.scanopsset = true; + /* Initialize result tuple type. */ ExecInitResultTypeTL(&state->ss.ps); ExecAssignScanProjectionInfo(&state->ss); @@ -127,7 +131,7 @@ initNextTableToScan(DynamicForeignScanState *node) Relation lastScannedRel; TupleDesc partTupDesc; TupleDesc lastTupDesc; - AttrNumber *attMap; + AttrMap *attMap; Oid *pid; Relation currentRelation; @@ -158,23 +162,24 @@ initNextTableToScan(DynamicForeignScanState *node) * FIXME: should we use execute_attr_map_tuple instead? Seems like a * higher level abstraction that fits the bill */ - attMap = convert_tuples_by_name_map_if_req(partTupDesc, lastTupDesc, "unused msg"); + attMap = build_attrmap_by_name_if_req(partTupDesc, lastTupDesc); table_close(lastScannedRel, AccessShareLock); /* If attribute remapping is not necessary, then do not change the varattno */ if (attMap) { - change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid); - change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid); + change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap->attnums, node->scanrelid); + change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap->attnums, node->scanrelid); /* * Now that the varattno mapping has been changed, change the relation that * the new varnos correspond to */ node->lastRelOid = *pid; - pfree(attMap); + free_attrmap(attMap); } - RangeTblEntry *rte = estate->es_range_table_array[node->scanrelid-1]; + + RangeTblEntry *rte = exec_rt_fetch(node->scanrelid, estate); rte->relid = *pid; plan->foreignscan.fdw_private = node->fdw_private_array[node->whichPart]; node->foreignScanState = ExecInitForeignScanForPartition(&plan->foreignscan, estate, node->eflags, diff --git a/src/backend/executor/nodeDynamicSeqscan.c b/src/backend/executor/nodeDynamicSeqscan.c index a4eb8a0e9f..c13be0a1f1 100644 --- a/src/backend/executor/nodeDynamicSeqscan.c +++ b/src/backend/executor/nodeDynamicSeqscan.c @@ -165,7 +165,7 @@ initNextTableToScan(DynamicSeqScanState *node) * the new varnos correspond to */ node->lastRelOid = *pid; - pfree(attMap); + free_attrmap(attMap); } node->seqScanState = ExecInitSeqScanForPartition(&plan->seqscan, estate, diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp index d4f84ea569..8a40e924c0 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp @@ -4254,16 +4254,16 @@ static TupleDesc RemapAttrsFromTupDesc(TupleDesc fromDesc, TupleDesc toDesc, Index index, List *qual, List *targetlist) { - AttrNumber *attMap; - attMap = convert_tuples_by_name_map_if_req(toDesc, fromDesc, "unused msg"); + AttrMap *attMap; + attMap = build_attrmap_by_name_if_req(toDesc, fromDesc); /* If attribute remapping is not necessary, then do not change the varattno */ if (attMap) { - change_varattnos_of_a_varno((Node *) qual, attMap, index); - change_varattnos_of_a_varno((Node *) targetlist, attMap, index); + change_varattnos_of_a_varno((Node *) qual, attMap->attnums, index); + change_varattnos_of_a_varno((Node *) targetlist, attMap->attnums, index); fromDesc = toDesc; - pfree(attMap); + free_attrmap(attMap); } return fromDesc; } diff --git a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp index 63294c9e38..6c581c625d 100644 --- a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp @@ -1837,6 +1837,11 @@ CTranslatorRelcacheToDXL::RetrieveColStats(CMemoryPool *mp, num_rows = gpdb::CdbEstimatePartitionedNumTuples(gpdb::GetRelation(rel_oid).get()); + if (num_rows < 0) + { + num_rows = 0; + } + // extract column name and type CMDName *md_colname = GPOS_NEW(mp) CMDName(mp, md_col->Mdname().GetMDName()); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 6c087ac0b4..528f402f19 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -847,6 +847,7 @@ outForeignScanFields(StringInfo str, const ForeignScan *node) WRITE_BITMAPSET_FIELD(fs_relids); WRITE_BOOL_FIELD(fsSystemCol); } + static void _outForeignScan(StringInfo str, const ForeignScan *node) { diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 58f2d61a28..efab2a888a 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1602,8 +1602,6 @@ _readDefElem(void) * Stuff from plannodes.h. */ -static void readForeignScanFields(ForeignScan *local_node); - /* * _readPlannedStmt */ @@ -2211,6 +2209,7 @@ _readForeignScan(void) readForeignScanFields(local_node); READ_DONE(); } + static DynamicForeignScan * _readDynamicForeignScan(void) { @@ -2223,6 +2222,7 @@ _readDynamicForeignScan(void) READ_NODE_FIELD(fdw_private_list); READ_DONE(); } + static void readForeignScanFields(ForeignScan *local_node) { @@ -2231,6 +2231,7 @@ readForeignScanFields(ForeignScan *local_node) ReadCommonScan(&local_node->scan); READ_ENUM_FIELD(operation, CmdType); + READ_UINT_FIELD(resultRelation); READ_OID_FIELD(fs_server); READ_NODE_FIELD(fdw_exprs); READ_NODE_FIELD(fdw_private); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
