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]

Reply via email to