1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

MCOL-1052 LIMIT processing refactoring in getGroupPlan().

This commit is contained in:
Roman Nozdrin
2018-08-30 17:03:14 +03:00
parent 62f296b443
commit 07561c43d7
3 changed files with 26 additions and 10 deletions

View File

@ -575,6 +575,15 @@ public:
return fHasOrderBy; return fHasOrderBy;
} }
void specHandlerProcessed(const bool hand)
{
fSpecHandlerProcessed = hand;
}
const bool specHandlerProcessed() const
{
return fSpecHandlerProcessed;
}
void selectSubList(const SelectList& selectSubList) void selectSubList(const SelectList& selectSubList)
{ {
fSelectSubList = selectSubList; fSelectSubList = selectSubList;
@ -871,6 +880,9 @@ private:
uint32_t fPriority; uint32_t fPriority;
uint32_t fStringTableThreshold; uint32_t fStringTableThreshold;
// for specific handlers processing, e.g. GROUP BY
bool fSpecHandlerProcessed;
// Derived table involved in the query. For derived table optimization // Derived table involved in the query. For derived table optimization
std::vector<SCSEP> fSubSelectList; std::vector<SCSEP> fSubSelectList;

View File

@ -1846,12 +1846,13 @@ void makeVtableModeSteps(CalpontSelectExecutionPlan* csep, JobInfo& jobInfo,
if (csep->limitNum() != (uint64_t) - 1) if (csep->limitNum() != (uint64_t) - 1)
{ {
// special case for outer query order by limit -- return all // special case for outer query order by limit -- return all
if (jobInfo.subId == 0 && csep->hasOrderBy()) if (jobInfo.subId == 0 && csep->hasOrderBy() && !csep->specHandlerProcessed())
{ {
jobInfo.limitCount = (uint64_t) - 1; jobInfo.limitCount = (uint64_t) - 1;
} }
// support order by and limit in sub-query/union // support order by and limit in sub-query/union or
// GROUP BY handler processed outer query order
else if (csep->orderByCols().size() > 0) else if (csep->orderByCols().size() > 0)
{ {
addOrderByAndLimit(csep, jobInfo); addOrderByAndLimit(csep, jobInfo);

View File

@ -10164,25 +10164,28 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, cal_gro
} }
} }
if (ord_cols.length() > 0) // has order by if ( gwi.orderByCols.size() ) // has order by
{ {
gwi.thd->infinidb_vtable.has_order_by = true; gwi.thd->infinidb_vtable.has_order_by = true;
csep->hasOrderBy(true); csep->hasOrderBy(true);
ord_cols = " order by " + ord_cols; csep->specHandlerProcessed(true);
select_query += ord_cols;
} }
} }
// LIMIT and OFFSET are extracted from TABLE_LIST elements. // LIMIT and OFFSET are extracted from TABLE_LIST elements.
// All of JOIN-ed tables contain relevant limit and offset. // All of JOIN-ed tables contain relevant limit and offset.
if (gi.groupByTables->select_lex->select_limit) uint64_t limit = (uint64_t)-1;
if (gi.groupByTables->select_lex->select_limit &&
( limit = static_cast<Item_int*>(gi.groupByTables->select_lex->select_limit)->val_int() ) &&
limit != (uint64_t)-1 )
{ {
csep->limitNum(((Item_int*)gi.groupByTables->select_lex->select_limit)->val_int()); csep->limitNum(limit);
} }
else else if (csep->hasOrderBy())
{ {
if (csep->hasOrderBy()) // We use LimitedOrderBy so set the limit to
csep->limitNum((uint64_t) - 2); // go through the check in addOrderByAndLimit
csep->limitNum((uint64_t) - 2);
} }
if (gi.groupByTables->select_lex->offset_limit) if (gi.groupByTables->select_lex->offset_limit)