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 80f4b8e26879e1375661bccacd0fd8507fc31a11
Author: Chris Hajas <[email protected]>
AuthorDate: Tue May 9 11:35:36 2023 -0700

    Fix various memory leaks in Orca
    
    These were identified by running the ICW pipeline in asserts build with
    `optimizer_use_gpdb_allocators` set to off. This is not recommended for
    production as it's less performant and doesn't obey memory limits, but
    it does allow us to find memory leaks. While we have mdp tests which
    catch most leaks, some of these leaks are in the translator, which
    aren't covered by mdp tests.
---
 .../gpopt/translate/CTranslatorQueryToDXL.cpp      |  2 ++
 .../gpopt/translate/CTranslatorScalarToDXL.cpp     |  1 +
 src/backend/gpopt/translate/CTranslatorUtils.cpp   |  2 ++
 .../libgpopt/include/gpopt/xforms/CXformUtils.h    |  1 +
 src/backend/gporca/libgpopt/src/base/CRange.cpp    |  2 ++
 src/backend/gporca/libgpopt/src/base/CUtils.cpp    |  1 +
 .../src/statistics/CExtendedStatsProcessor.cpp     |  2 ++
 .../libnaucrates/src/statistics/CHistogram.cpp     | 22 +++++++++++++++-------
 8 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp 
b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
index 4081833495..4e58884fe9 100644
--- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
@@ -2433,6 +2433,7 @@ 
CTranslatorQueryToDXL::CheckNoDuplicateAliasGroupingColumn(List *target_list,
        if (gpdb::ListLength(processed_list) < 1)
        {
                // no duplicates if no duplicates found in target list
+               bitset->Release();
                return;
        }
 
@@ -2469,6 +2470,7 @@ 
CTranslatorQueryToDXL::CheckNoDuplicateAliasGroupingColumn(List *target_list,
                        }
                }
        }
+       bitset->Release();
 }
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp 
b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
index 67cdf5d36f..16bef89858 100644
--- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
@@ -2286,6 +2286,7 @@ 
CTranslatorScalarToDXL::TranslateGenericDatumToDXL(CMemoryPool *mp,
                // base_mdid is used for text related domain types
                lint_value = ExtractLintValueFromDatum(md_type, is_null, bytes, 
length,
                                                                                
           base_mdid);
+               base_mdid->Release();
        }
 
        return CMDTypeGenericGPDB::CreateDXLDatumVal(
diff --git a/src/backend/gpopt/translate/CTranslatorUtils.cpp 
b/src/backend/gpopt/translate/CTranslatorUtils.cpp
index be57b7227f..65bfdbaa27 100644
--- a/src/backend/gpopt/translate/CTranslatorUtils.cpp
+++ b/src/backend/gpopt/translate/CTranslatorUtils.cpp
@@ -1028,6 +1028,7 @@ CTranslatorUtils::GetColumnAttnosForGroupBy(
                }
                else
                {
+                       col_attnos_arr->Release();
                        col_attnos_arr = col_attnos_arr_current;
                }
        }
@@ -1219,6 +1220,7 @@ CTranslatorUtils::CreateGroupingSetsForCube(CMemoryPool 
*mp,
                        current_result->Union(bset);
                        bset->Release();
                        col_attnos_arr->Append(GPOS_NEW(mp) CBitSet(mp, 
*current_result));
+                       current_result->Release();
                }
        }
        return col_attnos_arr;
diff --git a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h 
b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
index b1a5c5ec6a..cbc86d2ea6 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h
@@ -727,6 +727,7 @@ CXformUtils::ImplementHashJoin(CXformContext *pxfctxt, 
CXformResult *pxfres,
 
        if (GPOS_FTRACE(EopttraceConsiderOpfamiliesForDistribution))
        {
+               CRefCount::SafeRelease(join_opfamilies);
                join_opfamilies = GPOS_NEW(mp) IMdIdArray(mp);
        }
 
diff --git a/src/backend/gporca/libgpopt/src/base/CRange.cpp 
b/src/backend/gporca/libgpopt/src/base/CRange.cpp
index ef9022685b..8dbc78b023 100644
--- a/src/backend/gporca/libgpopt/src/base/CRange.cpp
+++ b/src/backend/gporca/libgpopt/src/base/CRange.cpp
@@ -113,6 +113,8 @@ CRange::CRange(const IComparator *pcomp, IMDType::ECmpType 
cmp_type,
                }
 
                default:
+                       // we don't assign datum here, so we need to release it 
to prevent a memory leak
+                       CRefCount::SafeRelease(datum);
                        // for anything else, create a (-inf, inf) range
                        break;
        }
diff --git a/src/backend/gporca/libgpopt/src/base/CUtils.cpp 
b/src/backend/gporca/libgpopt/src/base/CUtils.cpp
index 1ccd05ea41..63c1a7d1ff 100644
--- a/src/backend/gporca/libgpopt/src/base/CUtils.cpp
+++ b/src/backend/gporca/libgpopt/src/base/CUtils.cpp
@@ -734,6 +734,7 @@ CUtils::PexprScalarArrayCmp(CMemoryPool *mp,
                !IMDId::IsValid(pmdidCmpOp))
        {
                // cannot construct an ArrayCmp expression if any of these are 
invalid
+               pexprScalarChildren->Release();
                return nullptr;
        }
 
diff --git 
a/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp 
b/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp
index 85c38e7f48..97bcfc1ed7 100644
--- a/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp
+++ b/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp
@@ -287,6 +287,7 @@ 
CExtendedStatsProcessor::ApplyCorrelatedStatsToScaleFactorFilterCalculation(
         */
        if (clauses_attnums->Size() < 2)
        {
+               clauses_attnums->Release();
                return;
        }
 
@@ -297,6 +298,7 @@ 
CExtendedStatsProcessor::ApplyCorrelatedStatsToScaleFactorFilterCalculation(
 
        if (!stat)
        {
+               clauses_attnums->Release();
                return;
        }
 
diff --git a/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp 
b/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp
index 1768092b4d..b0c1053a11 100644
--- a/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp
+++ b/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp
@@ -2295,14 +2295,22 @@ CHistogram::AddDummyHistogramAndWidthInfo(
                CColRef *col_ref = col_factory->LookupColRef(colid);
                GPOS_ASSERT(nullptr != col_ref);
 
-               CHistogram *histogram =
-                       CHistogram::MakeDefaultHistogram(mp, col_ref, is_empty);
-               output_histograms->Insert(GPOS_NEW(mp) ULONG(colid), histogram);
+               if (nullptr == output_histograms->Find(&colid))
+               {
+                       CHistogram *histogram =
+                               CHistogram::MakeDefaultHistogram(mp, col_ref, 
is_empty);
+                       output_histograms->Insert(GPOS_NEW(mp) ULONG(colid), 
histogram);
+               }
 
-               CDouble width =
-                       
CStatisticsUtils::DefaultColumnWidth(col_ref->RetrieveType());
-               output_col_widths->Insert(GPOS_NEW(mp) ULONG(colid),
-                                                                 GPOS_NEW(mp) 
CDouble(width));
+
+
+               if (nullptr == output_col_widths->Find(&colid))
+               {
+                       CDouble width =
+                               
CStatisticsUtils::DefaultColumnWidth(col_ref->RetrieveType());
+                       output_col_widths->Insert(GPOS_NEW(mp) ULONG(colid),
+                                                                         
GPOS_NEW(mp) CDouble(width));
+               }
        }
 }
 


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

Reply via email to