You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
Merge pull request #160 from mariadb-corporation/MCOL-686
MCOL-686 Fix BETWEEN performance
This commit is contained in:
@ -1148,40 +1148,37 @@ bool buildPredicateItem(Item_func* ifp, gp_walk_info* gwip)
|
|||||||
gwip->rcWorkStack.pop();
|
gwip->rcWorkStack.pop();
|
||||||
ReturnedColumn* lhs = gwip->rcWorkStack.top();
|
ReturnedColumn* lhs = gwip->rcWorkStack.top();
|
||||||
gwip->rcWorkStack.pop();
|
gwip->rcWorkStack.pop();
|
||||||
|
ReturnedColumn* filterCol = gwip->rcWorkStack.top();
|
||||||
gwip->rcWorkStack.pop(); // pop gwip->scsp;
|
gwip->rcWorkStack.pop(); // pop gwip->scsp;
|
||||||
Item_func_opt_neg* inp = (Item_func_opt_neg*)ifp;
|
Item_func_opt_neg* inp = (Item_func_opt_neg*)ifp;
|
||||||
ConstantFilter* cf = 0;
|
SimpleFilter* sfr = 0;
|
||||||
|
SimpleFilter* sfl = 0;
|
||||||
if (inp->negated)
|
if (inp->negated)
|
||||||
{
|
{
|
||||||
sop.reset(new PredicateOperator(">"));
|
sop.reset(new PredicateOperator(">"));
|
||||||
sop->setOpType(gwip->scsp->resultType(), rhs->resultType());
|
sop->setOpType(filterCol->resultType(), rhs->resultType());
|
||||||
cf = new ConstantFilter(sop, gwip->scsp->clone(), rhs);
|
sfr = new SimpleFilter(sop, filterCol, rhs);
|
||||||
sop.reset(new LogicOperator("or"));
|
|
||||||
cf->op(sop);
|
|
||||||
sop.reset(new PredicateOperator("<"));
|
sop.reset(new PredicateOperator("<"));
|
||||||
sop->setOpType(gwip->scsp->resultType(), rhs->resultType());
|
sop->setOpType(filterCol->resultType(), lhs->resultType());
|
||||||
|
sfl = new SimpleFilter(sop, filterCol->clone(), lhs);
|
||||||
|
ParseTree* ptp = new ParseTree(new LogicOperator("or"));
|
||||||
|
ptp->left(sfr);
|
||||||
|
ptp->right(sfl);
|
||||||
|
gwip->ptWorkStack.push(ptp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sop.reset(new PredicateOperator("<="));
|
sop.reset(new PredicateOperator("<="));
|
||||||
sop->setOpType(gwip->scsp->resultType(), rhs->resultType());
|
sop->setOpType(filterCol->resultType(), rhs->resultType());
|
||||||
cf = new ConstantFilter(sop, gwip->scsp->clone(), rhs);
|
sfr = new SimpleFilter(sop, filterCol, rhs);
|
||||||
sop.reset(new LogicOperator("and"));
|
|
||||||
cf->op(sop);
|
|
||||||
sop.reset(new PredicateOperator(">="));
|
sop.reset(new PredicateOperator(">="));
|
||||||
sop->setOpType(gwip->scsp->resultType(), rhs->resultType());
|
sop->setOpType(filterCol->resultType(), lhs->resultType());
|
||||||
|
sfl = new SimpleFilter(sop, filterCol->clone(), lhs);
|
||||||
|
ParseTree* ptp = new ParseTree(new LogicOperator("and"));
|
||||||
|
ptp->left(sfr);
|
||||||
|
ptp->right(sfl);
|
||||||
|
gwip->ptWorkStack.push(ptp);
|
||||||
}
|
}
|
||||||
cf->pushFilter(new SimpleFilter(sop, gwip->scsp->clone(), lhs));
|
|
||||||
cf->functionName(gwip->funcName);
|
|
||||||
String str;
|
|
||||||
// @bug5811. This filter string is for cross engine to use.
|
|
||||||
// Use real table name.
|
|
||||||
ifp->print(&str, QT_INFINIDB_DERIVED);
|
|
||||||
//IDEBUG(cout << str.c_ptr() << endl);
|
|
||||||
if (str.ptr())
|
|
||||||
cf->data(str.c_ptr());
|
|
||||||
ParseTree* ptp = new ParseTree(cf);
|
|
||||||
gwip->ptWorkStack.push(ptp);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (ifp->functype() == Item_func::IN_FUNC)
|
else if (ifp->functype() == Item_func::IN_FUNC)
|
||||||
@ -2751,7 +2748,8 @@ ReturnedColumn* buildFunctionColumn(Item_func* ifp, gp_walk_info& gwi, bool& non
|
|||||||
else if ((functor = funcExp->getFunctor(funcName)))
|
else if ((functor = funcExp->getFunctor(funcName)))
|
||||||
{
|
{
|
||||||
// where clause isnull still treated as predicate operator
|
// where clause isnull still treated as predicate operator
|
||||||
if ((funcName == "isnull" || funcName == "isnotnull") &&
|
// MCOL-686: between also a predicate operator so that extent elimination can happen
|
||||||
|
if ((funcName == "isnull" || funcName == "isnotnull" || funcName == "between") &&
|
||||||
(gwi.clauseType == WHERE || gwi.clauseType == HAVING))
|
(gwi.clauseType == WHERE || gwi.clauseType == HAVING))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (funcName == "in" || funcName == " IN " || funcName == "between")
|
if (funcName == "in" || funcName == " IN " || funcName == "between")
|
||||||
|
Reference in New Issue
Block a user