1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

MCOL-4100 Use correct collation for certain functions

LOCATE, INSTR, STRCMP and FIND_IN_SET
This commit is contained in:
David Hall
2020-06-24 15:32:22 -05:00
parent 960c07a647
commit 3f15ed1303
2 changed files with 15 additions and 2 deletions

View File

@ -4087,8 +4087,21 @@ ReturnedColumn* buildFunctionColumn(
fc->operationType(functor->operationType(funcParms, fc->resultType()));
fc->expressionId(ci->expressionId++);
// A few functions use a different collation than that found in
// the base ifp class
if (funcName == "locate" ||
funcName == "find_in_set" ||
funcName == "strcmp")
{
DTCollation dt;
ifp->Type_std_attributes::agg_arg_charsets_for_comparison(dt, ifp->func_name(), ifp->arguments(), 1, 1);
fc->charsetNumber(dt.collation->number);
}
else
{
fc->charsetNumber(ifp->collation.collation->number);
}
}
else if (ifp->type() == Item::COND_ITEM ||
ifp->functype() == Item_func::EQ_FUNC ||
ifp->functype() == Item_func::NE_FUNC ||

View File

@ -74,7 +74,7 @@ int64_t Func_strcmp::getIntVal(rowgroup::Row& row,
const string& str = fp[0]->data()->getStrVal(row, isNull);
const string& str1 = fp[1]->data()->getStrVal(row, isNull);
int ret = cs->strnncoll(str.c_str(), str.length(), str1.c_str(), str1.length());
int ret = cs->strnncollsp(str.c_str(), str.length(), str1.c_str(), str1.length());
// mysql's strcmp returns only -1, 0, and 1
return (ret < 0 ? -1 : (ret > 0 ? 1 : 0));
}