1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-12-15 12:09:09 +03:00

Merge pull request #682 from mariadb-corporation/MCOL-2050

MCOL-2050 ORDER BY with OFFSET in subquery now produces correct result.
This commit is contained in:
Andrew Hutchings
2019-02-04 18:38:07 +00:00
committed by GitHub

View File

@@ -173,10 +173,10 @@ void LimitedOrderBy::finalize()
if (fOrderByQueue.size() > 0) if (fOrderByQueue.size() > 0)
{ {
uint64_t newSize = fRowsPerRG * fRowGroup.getRowSize(); uint64_t memSizeInc = fRowsPerRG * fRowGroup.getRowSize();
fMemSize += newSize; fMemSize += memSizeInc;
if (!fRm->getMemory(newSize, fSessionMemLimit)) if (!fRm->getMemory(memSizeInc, fSessionMemLimit))
{ {
cerr << IDBErrorInfo::instance()->errorMsg(fErrorCode) cerr << IDBErrorInfo::instance()->errorMsg(fErrorCode)
<< " @" << __FILE__ << ":" << __LINE__; << " @" << __FILE__ << ":" << __LINE__;
@@ -185,10 +185,12 @@ void LimitedOrderBy::finalize()
uint64_t offset = 0; uint64_t offset = 0;
uint64_t i = 0; uint64_t i = 0;
// Reduce queue size by an offset value if it applicable.
uint64_t queueSizeWoOffset = fOrderByQueue.size() > fStart ?
fOrderByQueue.size() - fStart : 0;
list<RGData> tempRGDataList; list<RGData> tempRGDataList;
// Skip first LIMIT rows in the the RowGroup if ( fCount <= queueSizeWoOffset )
if ( fCount <= fOrderByQueue.size() )
{ {
offset = fCount % fRowsPerRG; offset = fCount % fRowsPerRG;
if(!offset && fCount > 0) if(!offset && fCount > 0)
@@ -196,11 +198,11 @@ void LimitedOrderBy::finalize()
} }
else else
{ {
offset = fOrderByQueue.size() % fRowsPerRG; offset = queueSizeWoOffset % fRowsPerRG;
if(!offset && fOrderByQueue.size() > 0) if(!offset && queueSizeWoOffset > 0)
offset = fRowsPerRG; offset = fRowsPerRG;
} }
list<RGData>::iterator tempListIter = tempRGDataList.begin(); list<RGData>::iterator tempListIter = tempRGDataList.begin();
i = 0; i = 0;
@@ -217,7 +219,6 @@ void LimitedOrderBy::finalize()
const OrderByRow& topRow = fOrderByQueue.top(); const OrderByRow& topRow = fOrderByQueue.top();
row1.setData(topRow.fData); row1.setData(topRow.fData);
copyRow(row1, &fRow0); copyRow(row1, &fRow0);
//cerr << "LimitedOrderBy::finalize fRow0 " << fRow0.toString() << endl;
fRowGroup.incRowCount(); fRowGroup.incRowCount();
offset--; offset--;
fRow0.prevRow(rSize); fRow0.prevRow(rSize);
@@ -226,9 +227,9 @@ void LimitedOrderBy::finalize()
if(offset == (uint64_t)-1) if(offset == (uint64_t)-1)
{ {
tempRGDataList.push_front(fData); tempRGDataList.push_front(fData);
fMemSize += newSize; fMemSize += memSizeInc;
if (!fRm->getMemory(newSize, fSessionMemLimit)) if (!fRm->getMemory(memSizeInc, fSessionMemLimit))
{ {
cerr << IDBErrorInfo::instance()->errorMsg(fErrorCode) cerr << IDBErrorInfo::instance()->errorMsg(fErrorCode)
<< " @" << __FILE__ << ":" << __LINE__; << " @" << __FILE__ << ":" << __LINE__;