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


The following commit(s) were added to refs/heads/main by this push:
     new f87538c957c ORCA: Wrap bms_* function in C++
f87538c957c is described below

commit f87538c957c6a51d3c887bf31625e5acda8c54c6
Author: Hao Wu <[email protected]>
AuthorDate: Wed Jul 23 04:19:31 2025 +0000

    ORCA: Wrap bms_* function in C++
    
    ORCA uses exception to handle errors, it can't correctly handle long jump.
    It's a rule to use pg functions in a wrapper to adapt long jump and 
exceptions
    in C++.
---
 src/backend/gpopt/gpdbwrappers.cpp                       | 11 +++++++++++
 src/backend/gpopt/translate/CPartPruneStepsBuilder.cpp   |  2 +-
 src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp |  2 +-
 src/include/gpopt/gpdbwrappers.h                         |  3 +++
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/backend/gpopt/gpdbwrappers.cpp 
b/src/backend/gpopt/gpdbwrappers.cpp
index 84ff881da28..1deb53883d5 100644
--- a/src/backend/gpopt/gpdbwrappers.cpp
+++ b/src/backend/gpopt/gpdbwrappers.cpp
@@ -93,6 +93,17 @@ gpdb::BmsAddMember(Bitmapset *a, int x)
        return nullptr;
 }
 
+int
+gpdb::BmsNextMember(const Bitmapset *a, int prevbit)
+{
+       GP_WRAP_START;
+       {
+               return bms_next_member(a, prevbit);
+       }
+       GP_WRAP_END;
+       return -2;
+}
+
 void *
 gpdb::CopyObject(void *from)
 {
diff --git a/src/backend/gpopt/translate/CPartPruneStepsBuilder.cpp 
b/src/backend/gpopt/translate/CPartPruneStepsBuilder.cpp
index 33571f9368b..939d9f9c37b 100644
--- a/src/backend/gpopt/translate/CPartPruneStepsBuilder.cpp
+++ b/src/backend/gpopt/translate/CPartPruneStepsBuilder.cpp
@@ -90,7 +90,7 @@ 
CPartPruneStepsBuilder::CreatePartPruneInfoForOneLevel(CDXLNode *filterNode)
                        // partition did survive pruning
                        pinfo->subplan_map[i] = part_ptr;
                        pinfo->relid_map[i] = 
gpdb::RelationGetPartitionDesc(m_relation, true)->oids[i];
-                       pinfo->present_parts = 
bms_add_member(pinfo->present_parts, i);
+                       pinfo->present_parts = 
gpdb::BmsAddMember(pinfo->present_parts, i);
                        ++part_ptr;
                }
                else
diff --git a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp 
b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp
index 1b5f9962318..44c719d5412 100644
--- a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp
@@ -413,7 +413,7 @@ CTranslatorRelcacheToDXL::RetrieveExtStatsInfo(CMemoryPool 
*mp, IMDId *mdid)
                CBitSet *keys = GPOS_NEW(mp) CBitSet(mp);
 
                int attno = -1;
-               while ((attno = bms_next_member(info->keys, attno)) >= 0)
+               while ((attno = gpdb::BmsNextMember(info->keys, attno)) >= 0)
                {
                        keys->ExchangeSet(attno);
                }
diff --git a/src/include/gpopt/gpdbwrappers.h b/src/include/gpopt/gpdbwrappers.h
index ba710f994f7..fe387e471c0 100644
--- a/src/include/gpopt/gpdbwrappers.h
+++ b/src/include/gpopt/gpdbwrappers.h
@@ -227,6 +227,9 @@ bool AggregateExists(Oid oid);
 // add member to Bitmapset
 Bitmapset *BmsAddMember(Bitmapset *a, int x);
 
+// next member of Bitmapset
+int BmsNextMember(const Bitmapset *a, int prevbit);
+
 // create a copy of an object
 void *CopyObject(void *from);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to