You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-4043 Fix memory leaks - 1 (second attempt)
simpleScalarFilterToParseTree() performs a dynamic allocation of a ParseTree object, but this memory is never freed later. We now keep track of this allocation and perform the delete in ~CSEP/CSEP::unserialize() after the query finishes.
This commit is contained in:
@ -173,6 +173,26 @@ CalpontSelectExecutionPlan::~CalpontSelectExecutionPlan()
|
||||
|
||||
fFilters = NULL;
|
||||
fHaving = NULL;
|
||||
|
||||
if (!fDynamicParseTreeVec.empty())
|
||||
{
|
||||
for (auto& parseTree : fDynamicParseTreeVec)
|
||||
{
|
||||
if (parseTree)
|
||||
{
|
||||
// 'delete fFilters;' above has already deleted objects pointed
|
||||
// to by parseTree->left()/right()/data(), so we set the
|
||||
// pointers to NULL here before calling 'delete parseTree;'
|
||||
parseTree->left((ParseTree*) (NULL));
|
||||
parseTree->right((ParseTree*) (NULL));
|
||||
parseTree->data((TreeNode*) (NULL));
|
||||
delete parseTree;
|
||||
parseTree = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
fDynamicParseTreeVec.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -537,6 +557,26 @@ void CalpontSelectExecutionPlan::unserialize(messageqcpp::ByteStream& b)
|
||||
fHaving = 0;
|
||||
}
|
||||
|
||||
if (!fDynamicParseTreeVec.empty())
|
||||
{
|
||||
for (auto& parseTree : fDynamicParseTreeVec)
|
||||
{
|
||||
if (parseTree)
|
||||
{
|
||||
// 'delete fFilters;' above has already deleted objects pointed
|
||||
// to by parseTree->left()/right()/data(), so we set the
|
||||
// pointers to NULL here before calling 'delete parseTree;'
|
||||
parseTree->left((ParseTree*) (NULL));
|
||||
parseTree->right((ParseTree*) (NULL));
|
||||
parseTree->data((TreeNode*) (NULL));
|
||||
delete parseTree;
|
||||
parseTree = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
fDynamicParseTreeVec.clear();
|
||||
}
|
||||
|
||||
messageqcpp::ByteStream::quadbyte size;
|
||||
messageqcpp::ByteStream::quadbyte i;
|
||||
|
||||
|
@ -772,6 +772,12 @@ public:
|
||||
return ((fSessionID & 0x80000000) != 0);
|
||||
}
|
||||
|
||||
virtual void setDynamicParseTreeVec(
|
||||
const std::vector<execplan::ParseTree*>& dynamicParseTreeVec)
|
||||
{
|
||||
fDynamicParseTreeVec = dynamicParseTreeVec;
|
||||
}
|
||||
|
||||
/**
|
||||
* Protected stuff
|
||||
*/
|
||||
@ -922,6 +928,8 @@ private:
|
||||
bool fIsDML;
|
||||
|
||||
std::string fTimeZone;
|
||||
|
||||
std::vector<execplan::ParseTree*> fDynamicParseTreeVec;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -150,8 +150,14 @@ SimpleFilter::SimpleFilter(const SimpleFilter& rhs) :
|
||||
SimpleFilter::~SimpleFilter()
|
||||
{
|
||||
//delete fOp;
|
||||
delete fLhs;
|
||||
delete fRhs;
|
||||
if (fLhs != NULL)
|
||||
delete fLhs;
|
||||
|
||||
if (fRhs != NULL)
|
||||
delete fRhs;
|
||||
|
||||
fLhs = NULL;
|
||||
fRhs = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user