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 afdb7d8e818d3824185902f93cdf5576231eee2e
Author: Chris Hajas <[email protected]>
AuthorDate: Thu Apr 13 14:34:39 2023 -0700

    Optimize Orca object serialization to be lazy
    
    With GPDB7, Orca now loads every individual partition into the relcache
    and uses this information when constructing a partition table
    internally. This is much more processing and memory storage than in 6X,
    and the time/memory to serialize/deserialize these objects for tables
    with many partitions and columns actually becomes quite significant.
    After commit 52743ad4e56dec1f91f79ec736943b8993d914e7, we no longer need
    to serialize/deserialization during relcache translation. However, we
    still serialized these objects when they were initialized in the
    constructor. Instead, only serialize these objects as needed, which
    usually is when we're creating a minidump and in certain cases for
    parsing certain expressions from GPDB. While this optimization is only
    really needed for CMDObjectGPDB, I went ahead and did this for other
    objects for uniformity.
    
    As an example, for a 1200 partition, 200 column table of type `int` with
    no dropped/swapped columns, a simple `select * from part_table` query
    went from 5.3s to 3.5s with this change with an empty relcache.
---
 .../include/naucrates/md/CDXLColStats.h            |  4 +--
 .../include/naucrates/md/CDXLExtStats.h            |  4 +--
 .../include/naucrates/md/CDXLExtStatsInfo.h        |  4 +--
 .../include/naucrates/md/CDXLRelStats.h            |  4 +--
 .../include/naucrates/md/CMDAggregateGPDB.h        |  8 ++----
 .../include/naucrates/md/CMDArrayCoerceCastGPDB.h  |  9 ++----
 .../include/naucrates/md/CMDCastGPDB.h             |  8 ++----
 .../include/naucrates/md/CMDCheckConstraintGPDB.h  |  8 ++----
 .../include/naucrates/md/CMDFunctionGPDB.h         |  8 ++----
 .../include/naucrates/md/CMDIndexGPDB.h            |  8 ++----
 .../include/naucrates/md/CMDRelationCtasGPDB.h     |  8 ++----
 .../include/naucrates/md/CMDRelationGPDB.h         |  8 ++----
 .../include/naucrates/md/CMDScCmpGPDB.h            |  8 ++----
 .../include/naucrates/md/CMDScalarOpGPDB.h         |  8 ++----
 .../include/naucrates/md/CMDTypeBoolGPDB.h         |  8 ++----
 .../include/naucrates/md/CMDTypeGenericGPDB.h      |  8 ++----
 .../include/naucrates/md/CMDTypeInt2GPDB.h         |  8 ++----
 .../include/naucrates/md/CMDTypeInt4GPDB.h         |  8 ++----
 .../include/naucrates/md/CMDTypeInt8GPDB.h         |  8 ++----
 .../include/naucrates/md/CMDTypeOidGPDB.h          |  8 ++----
 .../include/naucrates/md/IMDCacheObject.h          |  2 +-
 .../gporca/libnaucrates/src/md/CDXLColStats.cpp    | 32 ++++++++++------------
 .../gporca/libnaucrates/src/md/CDXLExtStats.cpp    | 14 +++++++---
 .../libnaucrates/src/md/CDXLExtStatsInfo.cpp       | 14 +++++++---
 .../gporca/libnaucrates/src/md/CDXLRelStats.cpp    | 32 ++++++++++------------
 .../libnaucrates/src/md/CMDAggregateGPDB.cpp       | 19 ++++++++++---
 .../libnaucrates/src/md/CMDArrayCoerceCastGPDB.cpp | 19 ++++++++++---
 .../gporca/libnaucrates/src/md/CMDCastGPDB.cpp     | 18 +++++++++---
 .../libnaucrates/src/md/CMDCheckConstraintGPDB.cpp | 18 +++++++++---
 .../gporca/libnaucrates/src/md/CMDFunctionGPDB.cpp | 17 ++++++++++--
 .../gporca/libnaucrates/src/md/CMDIndexGPDB.cpp    | 18 +++++++++---
 .../libnaucrates/src/md/CMDRelationCtasGPDB.cpp    | 18 ++++++++++--
 .../gporca/libnaucrates/src/md/CMDRelationGPDB.cpp | 18 ++++++++++--
 .../gporca/libnaucrates/src/md/CMDScCmpGPDB.cpp    | 18 +++++++++---
 .../gporca/libnaucrates/src/md/CMDScalarOpGPDB.cpp | 18 ++++++++++--
 .../gporca/libnaucrates/src/md/CMDTypeBoolGPDB.cpp | 19 ++++++++++---
 .../libnaucrates/src/md/CMDTypeGenericGPDB.cpp     | 17 ++++++++++--
 .../gporca/libnaucrates/src/md/CMDTypeInt2GPDB.cpp | 18 +++++++++---
 .../gporca/libnaucrates/src/md/CMDTypeInt4GPDB.cpp | 18 +++++++++---
 .../gporca/libnaucrates/src/md/CMDTypeInt8GPDB.cpp | 18 +++++++++---
 .../gporca/libnaucrates/src/md/CMDTypeOidGPDB.cpp  | 18 +++++++++---
 41 files changed, 322 insertions(+), 206 deletions(-)

diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLColStats.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLColStats.h
index 553150b457..e3d60d288f 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLColStats.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLColStats.h
@@ -70,7 +70,7 @@ private:
        BOOL m_is_col_stats_missing;
 
        // DXL string for object
-       CWStringDynamic *m_dxl_str;
+       CWStringDynamic *m_dxl_str = nullptr;
 
 public:
        CDXLColStats(const CDXLColStats &) = delete;
@@ -92,7 +92,7 @@ public:
        CMDName Mdname() const override;
 
        // DXL string representation of cache object
-       const CWStringDynamic *GetStrRepr() const override;
+       const CWStringDynamic *GetStrRepr() override;
 
        // number of buckets
        ULONG Buckets() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStats.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStats.h
index f77311d6ee..50f40b7f80 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStats.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStats.h
@@ -52,7 +52,7 @@ private:
        CMDName *m_mdname;
 
        // DXL string for object
-       CWStringDynamic *m_dxl_str;
+       CWStringDynamic *m_dxl_str = nullptr;
 
        CMDDependencyArray *m_dependency_array;
 
@@ -74,7 +74,7 @@ public:
        CMDName Mdname() const override;
 
        // DXL string representation of cache object
-       const CWStringDynamic *GetStrRepr() const override;
+       const CWStringDynamic *GetStrRepr() override;
 
        // serialize relation stats in DXL format given a serializer object
        void Serialize(gpdxl::CXMLSerializer *) const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStatsInfo.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStatsInfo.h
index 780ba5c0bf..59a5683115 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStatsInfo.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLExtStatsInfo.h
@@ -52,7 +52,7 @@ private:
        CMDName *m_mdname;
 
        // DXL string for object
-       CWStringDynamic *m_dxl_str;
+       CWStringDynamic *m_dxl_str = nullptr;
 
        CMDExtStatsInfoArray *m_extstats_info_array;
 
@@ -71,7 +71,7 @@ public:
        CMDName Mdname() const override;
 
        // DXL string representation of cache object
-       const CWStringDynamic *GetStrRepr() const override;
+       const CWStringDynamic *GetStrRepr() override;
 
        // serialize relation stats in DXL format given a serializer object
        void Serialize(gpdxl::CXMLSerializer *) const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLRelStats.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLRelStats.h
index b9733ce849..292e045874 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLRelStats.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CDXLRelStats.h
@@ -58,7 +58,7 @@ private:
        BOOL m_empty;
 
        // DXL string for object
-       CWStringDynamic *m_dxl_str;
+       CWStringDynamic *m_dxl_str = nullptr;
 
        // number of blocks (not always up to-to-date)
        ULONG m_relpages;
@@ -82,7 +82,7 @@ public:
        CMDName Mdname() const override;
 
        // DXL string representation of cache object
-       const CWStringDynamic *GetStrRepr() const override;
+       const CWStringDynamic *GetStrRepr() override;
 
        // number of rows
        CDouble Rows() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDAggregateGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDAggregateGPDB.h
index 51378c1281..3d8744874f 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDAggregateGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDAggregateGPDB.h
@@ -40,7 +40,7 @@ class CMDAggregateGPDB : public IMDAggregate
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // aggregate id
        IMDId *m_mdid;
@@ -80,11 +80,7 @@ public:
        ~CMDAggregateGPDB() override;
 
        // string representation of object
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // aggregate id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDArrayCoerceCastGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDArrayCoerceCastGPDB.h
index 1d53a9698f..b5fb416e6e 100644
--- 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDArrayCoerceCastGPDB.h
+++ 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDArrayCoerceCastGPDB.h
@@ -27,7 +27,7 @@ class CMDArrayCoerceCastGPDB : public CMDCastGPDB
 {
 private:
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type mod
        INT m_type_modifier;
@@ -58,12 +58,9 @@ public:
        // dtor
        ~CMDArrayCoerceCastGPDB() override;
 
+
        // accessors
-       virtual const CWStringDynamic *
-       Pstr() const
-       {
-               return m_dxl_str;
-       }
+       virtual const CWStringDynamic *Pstr();
 
        // return type modifier
        virtual INT TypeModifier() const;
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCastGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCastGPDB.h
index d469c6a344..70d0a99de0 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCastGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCastGPDB.h
@@ -37,7 +37,7 @@ protected:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // func id
        IMDId *m_mdid;
@@ -72,11 +72,7 @@ public:
        ~CMDCastGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // cast object id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCheckConstraintGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCheckConstraintGPDB.h
index 6f94f5c301..8ca073450e 100644
--- 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCheckConstraintGPDB.h
+++ 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDCheckConstraintGPDB.h
@@ -56,7 +56,7 @@ private:
        CDXLNode *m_dxl_node;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
 public:
        // ctor
@@ -88,11 +88,7 @@ public:
        }
 
        // DXL string for check constraint
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // the scalar expression of the check constraint
        CExpression *GetCheckConstraintExpr(
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDFunctionGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDFunctionGPDB.h
index 7ed65589a5..e7e39a2f5b 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDFunctionGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDFunctionGPDB.h
@@ -37,7 +37,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // func id
        IMDId *m_mdid;
@@ -101,11 +101,7 @@ public:
        ~CMDFunctionGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // function id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIndexGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIndexGPDB.h
index ccdebe592d..8bced512e1 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIndexGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIndexGPDB.h
@@ -68,7 +68,7 @@ private:
        IMdIdArray *m_mdid_opfamilies_array;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // Child index oids
        IMdIdArray *m_child_index_oids;
@@ -122,11 +122,7 @@ public:
        ULONG GetIncludedColPos(ULONG column) const override;
 
        // DXL string for index
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // serialize MD index in DXL format given a serializer object
        void Serialize(gpdxl::CXMLSerializer *) const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationCtasGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationCtasGPDB.h
index 0c2afdde03..9434e9df35 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationCtasGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationCtasGPDB.h
@@ -48,7 +48,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // relation mdid
        IMDId *m_mdid;
@@ -119,11 +119,7 @@ public:
        ~CMDRelationCtasGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // the metadata id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationGPDB.h
index d09b0c5f8d..4cc0573cae 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDRelationGPDB.h
@@ -48,7 +48,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // relation mdid
        IMDId *m_mdid;
@@ -140,11 +140,7 @@ public:
        ~CMDRelationGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // the metadata id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScCmpGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScCmpGPDB.h
index 7da66e01a2..89b32f1b06 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScCmpGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScCmpGPDB.h
@@ -37,7 +37,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // object id
        IMDId *m_mdid;
@@ -69,11 +69,7 @@ public:
        ~CMDScCmpGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // copmarison object id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScalarOpGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScalarOpGPDB.h
index ca78d9eb50..fed372eebd 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScalarOpGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDScalarOpGPDB.h
@@ -38,7 +38,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // operator id
        IMDId *m_mdid;
@@ -99,11 +99,7 @@ public:
        ~CMDScalarOpGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // operator id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeBoolGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeBoolGPDB.h
index 891a2ea06b..639014f6b4 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeBoolGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeBoolGPDB.h
@@ -99,7 +99,7 @@ private:
        IMDId *m_mdid_count;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type name and id
        static CWStringConst m_str;
@@ -118,11 +118,7 @@ public:
        ~CMDTypeBoolGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // type id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeGenericGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeGenericGPDB.h
index 573e52b211..bd116f812e 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeGenericGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeGenericGPDB.h
@@ -56,7 +56,7 @@ private:
        CMemoryPool *m_mp;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // metadata id
        IMDId *m_mdid;
@@ -165,11 +165,7 @@ public:
        ~CMDTypeGenericGPDB() override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        IMDId *MDId() const override;
 
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt2GPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt2GPDB.h
index 681da2912f..77ef5dea6f 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt2GPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt2GPDB.h
@@ -104,7 +104,7 @@ private:
        IMDId *m_mdid_count;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type name and type
        static CWStringConst m_str;
@@ -127,11 +127,7 @@ public:
                                                                BOOL is_null) 
const override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // accessor of metadata id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt4GPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt4GPDB.h
index 9512930a0f..24697a7e34 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt4GPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt4GPDB.h
@@ -104,7 +104,7 @@ private:
        IMDId *m_mdid_count;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type name and type
        static CWStringConst m_str;
@@ -127,11 +127,7 @@ public:
                                                                BOOL is_null) 
const override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        IMDId *MDId() const override;
 
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt8GPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt8GPDB.h
index cd4ec288c8..7590d1ab85 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt8GPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeInt8GPDB.h
@@ -105,7 +105,7 @@ private:
        IMDId *m_mdid_count;
 
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type name
        static CWStringConst m_str;
@@ -127,11 +127,7 @@ public:
                                                                BOOL is_null) 
const override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        // type id
        IMDId *MDId() const override;
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeOidGPDB.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeOidGPDB.h
index 37dbc54fa5..f53d123af8 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeOidGPDB.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDTypeOidGPDB.h
@@ -102,7 +102,7 @@ private:
        // count aggregate
        IMDId *m_mdid_count;
        // DXL for object
-       const CWStringDynamic *m_dxl_str;
+       const CWStringDynamic *m_dxl_str = nullptr;
 
        // type name and type
        static CWStringConst m_str;
@@ -124,11 +124,7 @@ public:
                                                          BOOL is_null) const 
override;
 
        // accessors
-       const CWStringDynamic *
-       GetStrRepr() const override
-       {
-               return m_dxl_str;
-       }
+       const CWStringDynamic *GetStrRepr() override;
 
        IMDId *MDId() const override;
 
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/md/IMDCacheObject.h 
b/src/backend/gporca/libnaucrates/include/naucrates/md/IMDCacheObject.h
index da77ded97c..62cd6640e0 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/md/IMDCacheObject.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/md/IMDCacheObject.h
@@ -90,7 +90,7 @@ public:
        virtual void Serialize(gpdxl::CXMLSerializer *) const = 0;
 
        // DXL string representation of cache object
-       virtual const CWStringDynamic *GetStrRepr() const = 0;
+       virtual const CWStringDynamic *GetStrRepr() = 0;
 
 
        // serialize the metadata id information as the attributes of an
diff --git a/src/backend/gporca/libnaucrates/src/md/CDXLColStats.cpp 
b/src/backend/gporca/libnaucrates/src/md/CDXLColStats.cpp
index 8d231156d9..39c346c169 100644
--- a/src/backend/gporca/libnaucrates/src/md/CDXLColStats.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CDXLColStats.cpp
@@ -47,8 +47,6 @@ CDXLColStats::CDXLColStats(CMemoryPool *mp, CMDIdColStats 
*mdid_col_stats,
 {
        GPOS_ASSERT(mdid_col_stats->IsValid());
        GPOS_ASSERT(nullptr != dxl_stats_bucket_array);
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -62,11 +60,25 @@ CDXLColStats::CDXLColStats(CMemoryPool *mp, CMDIdColStats 
*mdid_col_stats,
 CDXLColStats::~CDXLColStats()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid_col_stats->Release();
        m_dxl_stats_bucket_array->Release();
 }
 
+const CWStringDynamic *
+CDXLColStats::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
+
 //---------------------------------------------------------------------------
 //     @function:
 //             CDXLColStats::MDId
@@ -95,20 +107,6 @@ CDXLColStats::Mdname() const
        return *m_mdname;
 }
 
-//---------------------------------------------------------------------------
-//     @function:
-//             CDXLColStats::GetMDName
-//
-//     @doc:
-//             Returns the DXL string for this object
-//
-//---------------------------------------------------------------------------
-const CWStringDynamic *
-CDXLColStats::GetStrRepr() const
-{
-       return m_dxl_str;
-}
-
 //---------------------------------------------------------------------------
 //     @function:
 //             CDXLColStats::Buckets
diff --git a/src/backend/gporca/libnaucrates/src/md/CDXLExtStats.cpp 
b/src/backend/gporca/libnaucrates/src/md/CDXLExtStats.cpp
index 87c4742eab..7e02a66534 100644
--- a/src/backend/gporca/libnaucrates/src/md/CDXLExtStats.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CDXLExtStats.cpp
@@ -33,14 +33,15 @@ CDXLExtStats::CDXLExtStats(CMemoryPool *mp, IMDId 
*rel_stats_mdid,
          m_ndistinct_array(ndistinct_array)
 {
        GPOS_ASSERT(rel_stats_mdid->IsValid());
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 CDXLExtStats::~CDXLExtStats()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_rel_stats_mdid->Release();
        m_dependency_array->Release();
        m_ndistinct_array->Release();
@@ -83,8 +84,13 @@ CDXLExtStats::Mdname() const
 //
 //---------------------------------------------------------------------------
 const CWStringDynamic *
-CDXLExtStats::GetStrRepr() const
+CDXLExtStats::GetStrRepr()
 {
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
        return m_dxl_str;
 }
 
diff --git a/src/backend/gporca/libnaucrates/src/md/CDXLExtStatsInfo.cpp 
b/src/backend/gporca/libnaucrates/src/md/CDXLExtStatsInfo.cpp
index 349a210270..64a1e014a7 100644
--- a/src/backend/gporca/libnaucrates/src/md/CDXLExtStatsInfo.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CDXLExtStatsInfo.cpp
@@ -32,14 +32,15 @@ CDXLExtStatsInfo::CDXLExtStatsInfo(CMemoryPool *mp, IMDId 
*mdid,
          m_extstats_info_array(extstats_info_array)
 {
        GPOS_ASSERT(mdid->IsValid());
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 CDXLExtStatsInfo::~CDXLExtStatsInfo()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid->Release();
        m_extstats_info_array->Release();
 }
@@ -81,8 +82,13 @@ CDXLExtStatsInfo::Mdname() const
 //
 //---------------------------------------------------------------------------
 const CWStringDynamic *
-CDXLExtStatsInfo::GetStrRepr() const
+CDXLExtStatsInfo::GetStrRepr()
 {
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
        return m_dxl_str;
 }
 
diff --git a/src/backend/gporca/libnaucrates/src/md/CDXLRelStats.cpp 
b/src/backend/gporca/libnaucrates/src/md/CDXLRelStats.cpp
index 6eb209e440..812c89e9ba 100644
--- a/src/backend/gporca/libnaucrates/src/md/CDXLRelStats.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CDXLRelStats.cpp
@@ -42,8 +42,6 @@ CDXLRelStats::CDXLRelStats(CMemoryPool *mp, CMDIdRelStats 
*rel_stats_mdid,
          m_relallvisible(relallvisible)
 {
        GPOS_ASSERT(rel_stats_mdid->IsValid());
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -57,10 +55,24 @@ CDXLRelStats::CDXLRelStats(CMemoryPool *mp, CMDIdRelStats 
*rel_stats_mdid,
 CDXLRelStats::~CDXLRelStats()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_rel_stats_mdid->Release();
 }
 
+const CWStringDynamic *
+CDXLRelStats::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
+
 //---------------------------------------------------------------------------
 //     @function:
 //             CDXLRelStats::MDId
@@ -89,20 +101,6 @@ CDXLRelStats::Mdname() const
        return *m_mdname;
 }
 
-//---------------------------------------------------------------------------
-//     @function:
-//             CDXLRelStats::GetMDName
-//
-//     @doc:
-//             Returns the DXL string for this object
-//
-//---------------------------------------------------------------------------
-const CWStringDynamic *
-CDXLRelStats::GetStrRepr() const
-{
-       return m_dxl_str;
-}
-
 //---------------------------------------------------------------------------
 //     @function:
 //             CDXLRelStats::Rows
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDAggregateGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDAggregateGPDB.cpp
index 0089dfe41a..a32f61f590 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDAggregateGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDAggregateGPDB.cpp
@@ -45,9 +45,6 @@ CMDAggregateGPDB::CMDAggregateGPDB(CMemoryPool *mp, IMDId 
*mdid,
          m_is_repsafe(is_repsafe)
 {
        GPOS_ASSERT(mdid->IsValid());
-
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -64,7 +61,21 @@ CMDAggregateGPDB::~CMDAggregateGPDB()
        m_mdid_type_intermediate->Release();
        m_mdid_type_result->Release();
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
+}
+
+const CWStringDynamic *
+CMDAggregateGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDArrayCoerceCastGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDArrayCoerceCastGPDB.cpp
index 8a71112d4f..ab9854c2bb 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDArrayCoerceCastGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDArrayCoerceCastGPDB.cpp
@@ -35,17 +35,28 @@ CMDArrayCoerceCastGPDB::CMDArrayCoerceCastGPDB(
          m_location(location),
          m_mdid_src_elemtype(mdid_src_elemtype)
 {
-       m_dxl_str = CDXLUtils::SerializeMDObj(mp, this, false 
/*fSerializeHeader*/,
-                                                                               
  false /*indentation*/);
 }
 
 // dtor
 CMDArrayCoerceCastGPDB::~CMDArrayCoerceCastGPDB()
 {
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid_src_elemtype->Release();
 }
-
+// accessors
+const CWStringDynamic *
+CMDArrayCoerceCastGPDB::Pstr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 // return type modifier
 INT
 CMDArrayCoerceCastGPDB::TypeModifier() const
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDCastGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDCastGPDB.cpp
index cbeaa21e23..4fb7b8db24 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDCastGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDCastGPDB.cpp
@@ -47,9 +47,6 @@ CMDCastGPDB::CMDCastGPDB(CMemoryPool *mp, IMDId *mdid, 
CMDName *mdname,
        GPOS_ASSERT(m_mdid_dest->IsValid());
        GPOS_ASSERT_IMP(!is_binary_coercible && m_path_type != EmdtCoerceViaIO,
                                        m_mdid_cast_func->IsValid());
-
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -67,9 +64,22 @@ CMDCastGPDB::~CMDCastGPDB()
        m_mdid_dest->Release();
        CRefCount::SafeRelease(m_mdid_cast_func);
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
 }
 
+const CWStringDynamic *
+CMDCastGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 
 //---------------------------------------------------------------------------
 //     @function:
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDCheckConstraintGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDCheckConstraintGPDB.cpp
index 9c25373d4d..8efcb8306b 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDCheckConstraintGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDCheckConstraintGPDB.cpp
@@ -41,9 +41,6 @@ CMDCheckConstraintGPDB::CMDCheckConstraintGPDB(CMemoryPool 
*mp, IMDId *mdid,
        GPOS_ASSERT(rel_mdid->IsValid());
        GPOS_ASSERT(nullptr != mdname);
        GPOS_ASSERT(nullptr != dxlnode);
-
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -57,12 +54,25 @@ CMDCheckConstraintGPDB::CMDCheckConstraintGPDB(CMemoryPool 
*mp, IMDId *mdid,
 CMDCheckConstraintGPDB::~CMDCheckConstraintGPDB()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid->Release();
        m_rel_mdid->Release();
        m_dxl_node->Release();
 }
 
+const CWStringDynamic *
+CMDCheckConstraintGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDCheckConstraintGPDB::GetCheckConstraintExpr
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDFunctionGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDFunctionGPDB.cpp
index e759577216..88c71d16f8 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDFunctionGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDFunctionGPDB.cpp
@@ -52,8 +52,6 @@ CMDFunctionGPDB::CMDFunctionGPDB(CMemoryPool *mp, IMDId 
*mdid, CMDName *mdname,
        GPOS_ASSERT(EfdaSentinel > func_data_access);
 
        InitDXLTokenArrays();
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -70,9 +68,22 @@ CMDFunctionGPDB::~CMDFunctionGPDB()
        m_mdid_type_result->Release();
        CRefCount::SafeRelease(m_mdid_types_array);
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
 }
 
+const CWStringDynamic *
+CMDFunctionGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDFunctionGPDB::InitDXLTokenArrays
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIndexGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDIndexGPDB.cpp
index aa7630585a..b61a4c2d1b 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDIndexGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDIndexGPDB.cpp
@@ -65,9 +65,6 @@ CMDIndexGPDB::CMDIndexGPDB(CMemoryPool *mp, IMDId *mdid, 
CMDName *mdname,
        GPOS_ASSERT_IMP(IMDIndex::EmdindBitmap == index_type,
                                        nullptr != mdid_item_type && 
mdid_item_type->IsValid());
        GPOS_ASSERT(nullptr != mdid_opfamilies_array);
-
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -81,7 +78,10 @@ CMDIndexGPDB::CMDIndexGPDB(CMemoryPool *mp, IMDId *mdid, 
CMDName *mdname,
 CMDIndexGPDB::~CMDIndexGPDB()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid->Release();
        CRefCount::SafeRelease(m_mdid_item_type);
        m_index_key_cols_array->Release();
@@ -90,6 +90,16 @@ CMDIndexGPDB::~CMDIndexGPDB()
        CRefCount::SafeRelease(m_child_index_oids);
 }
 
+const CWStringDynamic *
+CMDIndexGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDIndexGPDB::MDId
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDRelationCtasGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDRelationCtasGPDB.cpp
index 081257274d..b4a2ac9987 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDRelationCtasGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDRelationCtasGPDB.cpp
@@ -84,8 +84,6 @@ CMDRelationCtasGPDB::CMDRelationCtasGPDB(
 
                m_col_width_array->Append(GPOS_NEW(mp) 
CDouble(mdcol->Length()));
        }
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -100,7 +98,10 @@ CMDRelationCtasGPDB::~CMDRelationCtasGPDB()
 {
        GPOS_DELETE(m_mdname_schema);
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid->Release();
        m_md_col_array->Release();
        m_keyset_array->Release();
@@ -114,6 +115,17 @@ CMDRelationCtasGPDB::~CMDRelationCtasGPDB()
        m_distr_opclasses->Release();
 }
 
+const CWStringDynamic *
+CMDRelationCtasGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
+
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDRelationCtasGPDB::MDId
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDRelationGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDRelationGPDB.cpp
index cca61643a7..f184c674db 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDRelationGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDRelationGPDB.cpp
@@ -111,8 +111,6 @@ CMDRelationGPDB::CMDRelationGPDB(
 
                m_col_width_array->Append(GPOS_NEW(mp) 
CDouble(mdcol->Length()));
        }
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -126,7 +124,10 @@ CMDRelationGPDB::CMDRelationGPDB(
 CMDRelationGPDB::~CMDRelationGPDB()
 {
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid->Release();
        m_md_col_array->Release();
        CRefCount::SafeRelease(m_distr_col_array);
@@ -145,6 +146,17 @@ CMDRelationGPDB::~CMDRelationGPDB()
        CRefCount::SafeRelease(m_nondrop_col_pos_array);
 }
 
+const CWStringDynamic *
+CMDRelationGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
+
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDRelationGPDB::MDId
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDScCmpGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDScCmpGPDB.cpp
index f356e681ee..53086c2376 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDScCmpGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDScCmpGPDB.cpp
@@ -45,9 +45,6 @@ CMDScCmpGPDB::CMDScCmpGPDB(CMemoryPool *mp, IMDId *mdid, 
CMDName *mdname,
        GPOS_ASSERT(m_mdid_right->IsValid());
        GPOS_ASSERT(m_mdid_op->IsValid());
        GPOS_ASSERT(IMDType::EcmptOther != m_comparision_type);
-
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 //---------------------------------------------------------------------------
@@ -65,9 +62,22 @@ CMDScCmpGPDB::~CMDScCmpGPDB()
        m_mdid_right->Release();
        m_mdid_op->Release();
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
 }
 
+const CWStringDynamic *
+CMDScCmpGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 
 //---------------------------------------------------------------------------
 //     @function:
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDScalarOpGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDScalarOpGPDB.cpp
index 398328c0b6..7d3e7e25dd 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDScalarOpGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDScalarOpGPDB.cpp
@@ -53,8 +53,6 @@ CMDScalarOpGPDB::CMDScalarOpGPDB(
          m_is_ndv_preserving(is_ndv_preserving)
 {
        GPOS_ASSERT(nullptr != mdid_opfamilies_array);
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 }
 
 
@@ -80,10 +78,24 @@ CMDScalarOpGPDB::~CMDScalarOpGPDB()
        CRefCount::SafeRelease(m_mdid_legacy_hash_opfamily);
 
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_mdid_opfamilies_array->Release();
 }
 
+const CWStringDynamic *
+CMDScalarOpGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
+
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDScalarOpGPDB::MDId
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeBoolGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeBoolGPDB.cpp
index 6fa409060c..30eb53cd72 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeBoolGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeBoolGPDB.cpp
@@ -74,9 +74,6 @@ CMDTypeBoolGPDB::CMDTypeBoolGPDB(CMemoryPool *mp) : m_mp(mp)
        m_mdid_count =
                GPOS_NEW(mp) CMDIdGPDB(IMDId::EmdidGeneral, 
GPDB_BOOL_AGG_COUNT);
 
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
-
        m_mdid->AddRef();
 
        GPOS_ASSERT(GPDB_BOOL_OID == CMDIdGPDB::CastMdid(m_mdid)->Oid());
@@ -113,7 +110,21 @@ CMDTypeBoolGPDB::~CMDTypeBoolGPDB()
        m_mdid_sum->Release();
        m_mdid_count->Release();
        m_datum_null->Release();
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
+}
+
+const CWStringDynamic *
+CMDTypeBoolGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeGenericGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeGenericGPDB.cpp
index f14fa74044..1443881c32 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeGenericGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeGenericGPDB.cpp
@@ -104,8 +104,6 @@ CMDTypeGenericGPDB::CMDTypeGenericGPDB(
 {
        GPOS_ASSERT_IMP(m_is_fixed_length, 0 < m_length);
        GPOS_ASSERT_IMP(!m_is_fixed_length, 0 > m_gpdb_length);
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
 
        m_mdid->AddRef();
        m_datum_null = GPOS_NEW(m_mp) CDatumGenericGPDB(
@@ -142,10 +140,23 @@ CMDTypeGenericGPDB::~CMDTypeGenericGPDB()
        m_mdid_count->Release();
        CRefCount::SafeRelease(m_mdid_base_relation);
        GPOS_DELETE(m_mdname);
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
        m_datum_null->Release();
 }
 
+const CWStringDynamic *
+CMDTypeGenericGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 
 //---------------------------------------------------------------------------
 //     @function:
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt2GPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt2GPDB.cpp
index 56d558610f..fa612032cd 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt2GPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt2GPDB.cpp
@@ -73,9 +73,6 @@ CMDTypeInt2GPDB::CMDTypeInt2GPDB(CMemoryPool *mp) : m_mp(mp)
        m_mdid_count =
                GPOS_NEW(mp) CMDIdGPDB(IMDId::EmdidGeneral, 
GPDB_INT2_AGG_COUNT);
 
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
-
        GPOS_ASSERT(GPDB_INT2_OID == CMDIdGPDB::CastMdid(m_mdid)->Oid());
        m_mdid->AddRef();
        m_datum_null =
@@ -110,8 +107,21 @@ CMDTypeInt2GPDB::~CMDTypeInt2GPDB()
        m_mdid_sum->Release();
        m_mdid_count->Release();
        m_datum_null->Release();
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
+}
 
-       GPOS_DELETE(m_dxl_str);
+const CWStringDynamic *
+CMDTypeInt2GPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt4GPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt4GPDB.cpp
index 594126a2b2..656896c51f 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt4GPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt4GPDB.cpp
@@ -73,9 +73,6 @@ CMDTypeInt4GPDB::CMDTypeInt4GPDB(CMemoryPool *mp) : m_mp(mp)
        m_mdid_count =
                GPOS_NEW(mp) CMDIdGPDB(IMDId::EmdidGeneral, 
GPDB_INT4_AGG_COUNT);
 
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
-
        GPOS_ASSERT(GPDB_INT4_OID == CMDIdGPDB::CastMdid(m_mdid)->Oid());
        m_mdid->AddRef();
        m_datum_null =
@@ -110,8 +107,21 @@ CMDTypeInt4GPDB::~CMDTypeInt4GPDB()
        m_mdid_sum->Release();
        m_mdid_count->Release();
        m_datum_null->Release();
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
+}
 
-       GPOS_DELETE(m_dxl_str);
+const CWStringDynamic *
+CMDTypeInt4GPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt8GPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt8GPDB.cpp
index ec0f4e5a61..5c2aa1087d 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeInt8GPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeInt8GPDB.cpp
@@ -80,9 +80,6 @@ CMDTypeInt8GPDB::CMDTypeInt8GPDB(CMemoryPool *mp) : m_mp(mp)
        m_mdid_count =
                GPOS_NEW(mp) CMDIdGPDB(IMDId::EmdidGeneral, 
GPDB_INT8_AGG_COUNT);
 
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
-
        GPOS_ASSERT(GPDB_INT8_OID == CMDIdGPDB::CastMdid(m_mdid)->Oid());
        m_mdid->AddRef();
        m_datum_null =
@@ -118,8 +115,21 @@ CMDTypeInt8GPDB::~CMDTypeInt8GPDB()
        m_mdid_sum->Release();
        m_mdid_count->Release();
        m_datum_null->Release();
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
+}
 
-       GPOS_DELETE(m_dxl_str);
+const CWStringDynamic *
+CMDTypeInt8GPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/src/md/CMDTypeOidGPDB.cpp 
b/src/backend/gporca/libnaucrates/src/md/CMDTypeOidGPDB.cpp
index 976bf7c67f..e19d0f043b 100644
--- a/src/backend/gporca/libnaucrates/src/md/CMDTypeOidGPDB.cpp
+++ b/src/backend/gporca/libnaucrates/src/md/CMDTypeOidGPDB.cpp
@@ -74,9 +74,6 @@ CMDTypeOidGPDB::CMDTypeOidGPDB(CMemoryPool *mp) : m_mp(mp)
        m_mdid_count =
                GPOS_NEW(mp) CMDIdGPDB(IMDId::EmdidGeneral, GPDB_OID_AGG_COUNT);
 
-       m_dxl_str = CDXLUtils::SerializeMDObj(
-               m_mp, this, false /*fSerializeHeader*/, false /*indentation*/);
-
        GPOS_ASSERT(GPDB_OID_OID == CMDIdGPDB::CastMdid(m_mdid)->Oid());
        m_mdid->AddRef();
        m_datum_null =
@@ -113,9 +110,22 @@ CMDTypeOidGPDB::~CMDTypeOidGPDB()
        m_mdid_count->Release();
        m_datum_null->Release();
 
-       GPOS_DELETE(m_dxl_str);
+       if (nullptr != m_dxl_str)
+       {
+               GPOS_DELETE(m_dxl_str);
+       }
 }
 
+const CWStringDynamic *
+CMDTypeOidGPDB::GetStrRepr()
+{
+       if (nullptr == m_dxl_str)
+       {
+               m_dxl_str = CDXLUtils::SerializeMDObj(
+                       m_mp, this, false /*fSerializeHeader*/, false 
/*indentation*/);
+       }
+       return m_dxl_str;
+}
 //---------------------------------------------------------------------------
 //     @function:
 //             CMDTypeOidGPDB::GetDatum


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


Reply via email to