You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-10-30 07:25:34 +03:00
fix(CEJ, segfault): MCOL-6198 - segfault during crossengine join
* fix(CEJ, segfault): MCOL-6198 - segfault during crossengine join The patch moves joiners' initialization to a place after all possible allocations of smallSideRGs vector so pointer to it's data does not change anymore. This makes crash to cease. An appropriate test is added to bugfixes suite. * Change to test * Another dangling pointer * A change to test * A change to test
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
DROP DATABASE IF EXISTS MCOL_6198;
|
||||||
|
CREATE DATABASE MCOL_6198;
|
||||||
|
SELECT
|
||||||
|
v.c36 AS hst,
|
||||||
|
m.p6 AS g,
|
||||||
|
COALESCE(g0.eg_id,'MARIA') AS g01,
|
||||||
|
COALESCE(g1.eg_id,'MARIA') AS g02,
|
||||||
|
SUM(v.c758 * m.p42 / 100 + v.c759 * m.p42 / 100 + v.c760 * m.p42 / 100) AS sval
|
||||||
|
FROM
|
||||||
|
c AS v
|
||||||
|
JOIN p m on (v.c4 = m.a4)
|
||||||
|
LEFT OUTER JOIN group_g01 AS g0 ON g0.key_id=m.p6
|
||||||
|
LEFT OUTER JOIN group_g02 AS g1 ON g1.key_id=m.p6
|
||||||
|
WHERE
|
||||||
|
1=1
|
||||||
|
GROUP BY c36,p6,g01,g02;
|
||||||
|
DROP DATABASE MCOL_6198;
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -72,6 +72,24 @@ using namespace logging;
|
|||||||
using namespace utils;
|
using namespace utils;
|
||||||
using namespace joblist;
|
using namespace joblist;
|
||||||
|
|
||||||
|
#define idblog(x) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
std::ostringstream os; \
|
||||||
|
\
|
||||||
|
os << __FILE__ << "@" << __LINE__ << ": \'" << x << "\'"; \
|
||||||
|
std::cerr << os.str() << std::endl; \
|
||||||
|
logging::MessageLog logger((logging::LoggingID())); \
|
||||||
|
logging::Message message; \
|
||||||
|
logging::Message::Args args; \
|
||||||
|
\
|
||||||
|
args.add(os.str()); \
|
||||||
|
message.format(args); \
|
||||||
|
logger.logErrorMessage(message); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
namespace primitiveprocessor
|
namespace primitiveprocessor
|
||||||
{
|
{
|
||||||
#ifdef PRIMPROC_STOPWATCH
|
#ifdef PRIMPROC_STOPWATCH
|
||||||
@@ -386,15 +404,6 @@ void BatchPrimitiveProcessor::initBPP(ByteStream& bs)
|
|||||||
smallSideRGRecvd = true;
|
smallSideRGRecvd = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint j = 0; j < processorThreads; ++j)
|
|
||||||
{
|
|
||||||
auto tlHasher = TupleJoiner::TypelessDataHasher(&outputRG, &tlLargeSideKeyColumns[i],
|
|
||||||
mSmallSideKeyColumnsPtr, mSmallSideRGPtr);
|
|
||||||
auto tlComparator = TupleJoiner::TypelessDataComparator(&outputRG, &tlLargeSideKeyColumns[i],
|
|
||||||
mSmallSideKeyColumnsPtr, mSmallSideRGPtr);
|
|
||||||
tlJoiners[i][j].reset(new TLJoiner(10, tlHasher, tlComparator,
|
|
||||||
utils::STLPoolAllocator<TLJoiner::value_type>(resourceManager)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,6 +417,7 @@ void BatchPrimitiveProcessor::initBPP(ByteStream& bs)
|
|||||||
{
|
{
|
||||||
deserializeVector(bs, smallSideRGs);
|
deserializeVector(bs, smallSideRGs);
|
||||||
idbassert(smallSideRGs.size() == joinerCount);
|
idbassert(smallSideRGs.size() == joinerCount);
|
||||||
|
mSmallSideRGPtr = mSmallSideRGPtr ? &smallSideRGs[0] : nullptr;
|
||||||
smallSideRowLengths.reset(new uint32_t[joinerCount]);
|
smallSideRowLengths.reset(new uint32_t[joinerCount]);
|
||||||
smallSideRowData.reset(new RGData[joinerCount]);
|
smallSideRowData.reset(new RGData[joinerCount]);
|
||||||
smallNullRowData.reset(new RGData[joinerCount]);
|
smallNullRowData.reset(new RGData[joinerCount]);
|
||||||
@@ -438,6 +448,24 @@ void BatchPrimitiveProcessor::initBPP(ByteStream& bs)
|
|||||||
bs >> largeSideRG;
|
bs >> largeSideRG;
|
||||||
bs >> joinedRG;
|
bs >> joinedRG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < joinerCount; i++)
|
||||||
|
{
|
||||||
|
if (!typelessJoin[i])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (uint j = 0; j < processorThreads; ++j)
|
||||||
|
{
|
||||||
|
auto tlHasher = TupleJoiner::TypelessDataHasher(&outputRG, &tlLargeSideKeyColumns[i],
|
||||||
|
mSmallSideKeyColumnsPtr, mSmallSideRGPtr);
|
||||||
|
auto tlComparator = TupleJoiner::TypelessDataComparator(&outputRG, &tlLargeSideKeyColumns[i],
|
||||||
|
mSmallSideKeyColumnsPtr, mSmallSideRGPtr);
|
||||||
|
tlJoiners[i][j].reset(new TLJoiner(10, tlHasher, tlComparator,
|
||||||
|
utils::STLPoolAllocator<TLJoiner::value_type>(resourceManager)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&objLock);
|
pthread_mutex_unlock(&objLock);
|
||||||
@@ -2412,8 +2440,7 @@ SBPP BatchPrimitiveProcessor::duplicate()
|
|||||||
bpp->hasJoinFEFilters = hasJoinFEFilters;
|
bpp->hasJoinFEFilters = hasJoinFEFilters;
|
||||||
bpp->hasSmallOuterJoin = hasSmallOuterJoin;
|
bpp->hasSmallOuterJoin = hasSmallOuterJoin;
|
||||||
bpp->mJOINHasSkewedKeyColumn = mJOINHasSkewedKeyColumn;
|
bpp->mJOINHasSkewedKeyColumn = mJOINHasSkewedKeyColumn;
|
||||||
bpp->mSmallSideRGPtr = mSmallSideRGPtr;
|
bpp->mSmallSideKeyColumnsPtr = &(*bpp->tlSmallSideKeyColumns);
|
||||||
bpp->mSmallSideKeyColumnsPtr = mSmallSideKeyColumnsPtr;
|
|
||||||
if (!getTupleJoinRowGroupData && mJOINHasSkewedKeyColumn)
|
if (!getTupleJoinRowGroupData && mJOINHasSkewedKeyColumn)
|
||||||
{
|
{
|
||||||
idbassert(!smallSideRGs.empty());
|
idbassert(!smallSideRGs.empty());
|
||||||
@@ -2440,6 +2467,7 @@ SBPP BatchPrimitiveProcessor::duplicate()
|
|||||||
bpp->smallNullPointers = smallNullPointers;
|
bpp->smallNullPointers = smallNullPointers;
|
||||||
bpp->joinedRG = joinedRG;
|
bpp->joinedRG = joinedRG;
|
||||||
}
|
}
|
||||||
|
bpp->mSmallSideRGPtr = &bpp->smallSideRGs[0];
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
pthread_mutex_unlock(&bpp->objLock);
|
pthread_mutex_unlock(&bpp->objLock);
|
||||||
|
|||||||
Reference in New Issue
Block a user