You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-05 16:15:50 +03:00
MCOL-1510 CS prints IDB-1001 error when agregates used in non-supported functions, e.g. NOT(sum(i)).
This commit is contained in:
committed by
Roman Nozdrin
parent
cc474f429c
commit
a62a2e321e
@@ -191,7 +191,7 @@ bool nonConstFunc(Item_func* ifp)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnedColumn* findCorrespTempField(Item_ref* item, gp_walk_info& gwi)
|
ReturnedColumn* findCorrespTempField(Item_ref* item, gp_walk_info& gwi, bool clone = true)
|
||||||
{
|
{
|
||||||
ReturnedColumn* result = NULL;
|
ReturnedColumn* result = NULL;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
@@ -201,7 +201,10 @@ ReturnedColumn* findCorrespTempField(Item_ref* item, gp_walk_info& gwi)
|
|||||||
gwi.returnedCols[i]->alias().c_str() &&
|
gwi.returnedCols[i]->alias().c_str() &&
|
||||||
!strcasecmp(item->ref[0]->name, gwi.returnedCols[i]->alias().c_str()))
|
!strcasecmp(item->ref[0]->name, gwi.returnedCols[i]->alias().c_str()))
|
||||||
{
|
{
|
||||||
result = gwi.returnedCols[i]->clone();
|
if (clone)
|
||||||
|
result = gwi.returnedCols[i]->clone();
|
||||||
|
else
|
||||||
|
result = gwi.returnedCols[i].get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5455,7 +5458,10 @@ void gp_walk(const Item* item, void* arg)
|
|||||||
* the involved item_fields to the passed in vector. It's used in parsing
|
* the involved item_fields to the passed in vector. It's used in parsing
|
||||||
* functions or arithmetic expressions for vtable post process.
|
* functions or arithmetic expressions for vtable post process.
|
||||||
*/
|
*/
|
||||||
void parse_item (Item* item, vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16_t& parseInfo)
|
void parse_item (Item* item, vector<Item_field*>& field_vec,
|
||||||
|
bool& hasNonSupportItem,
|
||||||
|
uint16_t& parseInfo,
|
||||||
|
gp_walk_info* gwi)
|
||||||
{
|
{
|
||||||
Item::Type itype = item->type();
|
Item::Type itype = item->type();
|
||||||
|
|
||||||
@@ -5493,7 +5499,7 @@ void parse_item (Item* item, vector<Item_field*>& field_vec, bool& hasNonSupport
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < isp->argument_count(); i++)
|
for (uint32_t i = 0; i < isp->argument_count(); i++)
|
||||||
parse_item(isp->arguments()[i], field_vec, hasNonSupportItem, parseInfo);
|
parse_item(isp->arguments()[i], field_vec, hasNonSupportItem, parseInfo, gwi);
|
||||||
|
|
||||||
// parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo);
|
// parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo);
|
||||||
break;
|
break;
|
||||||
@@ -5538,8 +5544,20 @@ void parse_item (Item* item, vector<Item_field*>& field_vec, bool& hasNonSupport
|
|||||||
}
|
}
|
||||||
else if ((*(ref->ref))->type() == Item::FIELD_ITEM)
|
else if ((*(ref->ref))->type() == Item::FIELD_ITEM)
|
||||||
{
|
{
|
||||||
Item_field* ifp = reinterpret_cast<Item_field*>(*(ref->ref));
|
// MCOL-1510. This could be a non-supported function
|
||||||
field_vec.push_back(ifp);
|
// argument in form of a temp_table_field, so check
|
||||||
|
// and set hasNonSupportItem if it is so.
|
||||||
|
ReturnedColumn* rc = NULL;
|
||||||
|
if (gwi)
|
||||||
|
rc = findCorrespTempField(ref, *gwi, false);
|
||||||
|
|
||||||
|
if (!rc)
|
||||||
|
{
|
||||||
|
Item_field* ifp = reinterpret_cast<Item_field*>(*(ref->ref));
|
||||||
|
field_vec.push_back(ifp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hasNonSupportItem = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if ((*(ref->ref))->type() == Item::FUNC_ITEM)
|
else if ((*(ref->ref))->type() == Item::FUNC_ITEM)
|
||||||
@@ -8771,7 +8789,10 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, cal_gro
|
|||||||
{
|
{
|
||||||
hasNonSupportItem = false;
|
hasNonSupportItem = false;
|
||||||
uint32_t before_size = funcFieldVec.size();
|
uint32_t before_size = funcFieldVec.size();
|
||||||
parse_item(ifp, funcFieldVec, hasNonSupportItem, parseInfo);
|
// MCOL-1510 Use gwi pointer here to catch funcs with
|
||||||
|
// not supported aggregate args in projections,
|
||||||
|
// e.g. NOT(SUM(i)).
|
||||||
|
parse_item(ifp, funcFieldVec, hasNonSupportItem, parseInfo, &gwi);
|
||||||
uint32_t after_size = funcFieldVec.size();
|
uint32_t after_size = funcFieldVec.size();
|
||||||
|
|
||||||
// group by func and func in subquery can not be post processed
|
// group by func and func in subquery can not be post processed
|
||||||
@@ -8861,7 +8882,7 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, cal_gro
|
|||||||
redo = true;
|
redo = true;
|
||||||
// @bug 1706
|
// @bug 1706
|
||||||
String funcStr;
|
String funcStr;
|
||||||
//ifp->print(&funcStr, QT_INFINIDB);
|
ifp->print(&funcStr, QT_INFINIDB);
|
||||||
gwi.selectCols.push_back(string(funcStr.c_ptr()) + " `" + escapeBackTick(ifp->name) + "`");
|
gwi.selectCols.push_back(string(funcStr.c_ptr()) + " `" + escapeBackTick(ifp->name) + "`");
|
||||||
// clear the error set by buildFunctionColumn
|
// clear the error set by buildFunctionColumn
|
||||||
gwi.fatalParseError = false;
|
gwi.fatalParseError = false;
|
||||||
|
@@ -329,7 +329,7 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, execplan::SCSEP& cse
|
|||||||
void setError(THD* thd, uint32_t errcode, const std::string errmsg, gp_walk_info* gwi);
|
void setError(THD* thd, uint32_t errcode, const std::string errmsg, gp_walk_info* gwi);
|
||||||
void setError(THD* thd, uint32_t errcode, const std::string errmsg);
|
void setError(THD* thd, uint32_t errcode, const std::string errmsg);
|
||||||
void gp_walk(const Item* item, void* arg);
|
void gp_walk(const Item* item, void* arg);
|
||||||
void parse_item (Item* item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo);
|
void parse_item (Item* item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo, gp_walk_info* gwip = NULL);
|
||||||
const std::string bestTableName(const Item_field* ifp);
|
const std::string bestTableName(const Item_field* ifp);
|
||||||
bool isInfiniDB(TABLE* table_ptr);
|
bool isInfiniDB(TABLE* table_ptr);
|
||||||
|
|
||||||
@@ -348,7 +348,7 @@ void addIntervalArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
|||||||
void castCharArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
void castCharArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
||||||
void castDecimalArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
void castDecimalArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
||||||
void castTypeArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
void castTypeArgs(Item_func* ifp, funcexp::FunctionParm& functionParms);
|
||||||
void parse_item (Item* item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo);
|
//void parse_item (Item* item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo);
|
||||||
bool isPredicateFunction(Item* item, gp_walk_info* gwip);
|
bool isPredicateFunction(Item* item, gp_walk_info* gwip);
|
||||||
execplan::ParseTree* buildRowPredicate(execplan::RowColumn* lhs, execplan::RowColumn* rhs, std::string predicateOp);
|
execplan::ParseTree* buildRowPredicate(execplan::RowColumn* lhs, execplan::RowColumn* rhs, std::string predicateOp);
|
||||||
bool buildRowColumnFilter(gp_walk_info* gwip, execplan::RowColumn* rhs, execplan::RowColumn* lhs, Item_func* ifp);
|
bool buildRowColumnFilter(gp_walk_info* gwip, execplan::RowColumn* rhs, execplan::RowColumn* lhs, Item_func* ifp);
|
||||||
|
Reference in New Issue
Block a user