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]
