From af988635d49495fe622ab92578c88073524689f4 Mon Sep 17 00:00:00 2001 From: Gagan Goel Date: Sun, 1 Sep 2019 23:22:10 -0400 Subject: [PATCH] 1. Execution plan now sets limitNum and limitOffset for all cases if an explicit limit is supplied in the query. 2. Fallback to using sql_select_limit system variable value if an explicit limit is not supplied. 3. Remove checks that did not allow (2^64 - 1) as a valid limit value. --- dbcon/joblist/jlf_subquery.cpp | 4 ---- dbcon/joblist/joblistfactory.cpp | 35 +++++++++++++---------------- dbcon/mysql/ha_calpont_execplan.cpp | 23 +++++-------------- 3 files changed, 20 insertions(+), 42 deletions(-) diff --git a/dbcon/joblist/jlf_subquery.cpp b/dbcon/joblist/jlf_subquery.cpp index d08f700c4..3adfdb508 100644 --- a/dbcon/joblist/jlf_subquery.cpp +++ b/dbcon/joblist/jlf_subquery.cpp @@ -767,10 +767,6 @@ int doFromSubquery(CalpontExecutionPlan* ep, const string& alias, const string& void addOrderByAndLimit(CalpontSelectExecutionPlan* csep, JobInfo& jobInfo) { - // make sure there is a LIMIT - if (csep->orderByCols().size() > 0 && csep->limitNum() == (uint64_t) - 1) - return; - jobInfo.limitStart = csep->limitStart(); jobInfo.limitCount = csep->limitNum(); diff --git a/dbcon/joblist/joblistfactory.cpp b/dbcon/joblist/joblistfactory.cpp index b4cbafee0..26242640e 100644 --- a/dbcon/joblist/joblistfactory.cpp +++ b/dbcon/joblist/joblistfactory.cpp @@ -1712,29 +1712,24 @@ void parseExecutionPlan(CalpontSelectExecutionPlan* csep, JobInfo& jobInfo, void makeVtableModeSteps(CalpontSelectExecutionPlan* csep, JobInfo& jobInfo, JobStepVector& querySteps, JobStepVector& projectSteps, DeliveredTableMap& deliverySteps) { - // @bug4848, enhance and unify limit handling. - if (csep->limitNum() != (uint64_t) - 1) + // special case for outer query order by limit -- return all + if (jobInfo.subId == 0 && csep->hasOrderBy() && !csep->specHandlerProcessed()) { - // special case for outer query order by limit -- return all - 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 or - // GROUP BY handler processed outer query order - else if (csep->orderByCols().size() > 0) - { - addOrderByAndLimit(csep, jobInfo); - } - - // limit without order by in any query - else - { - jobInfo.limitStart = csep->limitStart(); - jobInfo.limitCount = csep->limitNum(); - } + // support order by and limit in sub-query/union or + // GROUP BY handler processed outer query order + else if (csep->orderByCols().size() > 0) + { + addOrderByAndLimit(csep, jobInfo); + } + // limit without order by in any query + else + { + jobInfo.limitStart = csep->limitStart(); + jobInfo.limitCount = csep->limitNum(); } // Bug 2123. Added overrideLargeSideEstimate parm below. True if the query was written diff --git a/dbcon/mysql/ha_calpont_execplan.cpp b/dbcon/mysql/ha_calpont_execplan.cpp index 93ce8a46e..4fb54198f 100644 --- a/dbcon/mysql/ha_calpont_execplan.cpp +++ b/dbcon/mysql/ha_calpont_execplan.cpp @@ -7842,26 +7842,13 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, } } - // relate to bug4848. let mysql drive limit when limit session variable set. - // do not set in csep. @bug5096. ignore session limit setting for dml - if (gwi.thd->variables.select_limit == (uint64_t) - 1 && - !csep->hasOrderBy()) - { - csep->limitStart(limitOffset); - csep->limitNum(limitNum); - } - // Pushdown queries w ORDER BY and LIMIT - else if (isPushdownHand && csep->hasOrderBy()) - { - csep->limitStart(limitOffset); - csep->limitNum(limitNum); - } + csep->limitStart(limitOffset); + csep->limitNum(limitNum); } - // Pushdown queries with ORDER BY w/o explicit limit - else if (isPushdownHand && csep->hasOrderBy()) + // If an explicit limit is not specified, use the system variable value + else { - // We must set this to activate LimitedOrderBy in ExeMgr - csep->limitNum((uint64_t) - 2); + csep->limitNum(gwi.thd->variables.select_limit); } // We don't currently support limit with correlated subquery