You've already forked mariadb-columnstore-engine
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:
@@ -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__;
|
||||||
|
|||||||
Reference in New Issue
Block a user