You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-3536 Collation
This commit is contained in:
@ -20,6 +20,9 @@
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
#include <mariadb.h>
|
||||
#undef set_bits // mariadb.h defines set_bits, which is incompatible with boost
|
||||
#include <my_sys.h>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
@ -56,37 +59,58 @@ int64_t Func_find_in_set::getIntVal(rowgroup::Row& row,
|
||||
CalpontSystemCatalog::ColType& op_ct)
|
||||
{
|
||||
const string& searchStr = parm[0]->data()->getStrVal(row, isNull);
|
||||
|
||||
if (isNull)
|
||||
return 0;
|
||||
|
||||
const string& setString = parm[1]->data()->getStrVal(row, isNull);
|
||||
|
||||
if (isNull)
|
||||
return 0;
|
||||
|
||||
if (searchStr.find(",") != string::npos)
|
||||
return 0;
|
||||
|
||||
string newSearchStr(searchStr.substr(0, strlen(searchStr.c_str())));
|
||||
string newSetString(setString.substr(0, strlen(setString.c_str())));
|
||||
//tokenize the setStr with comma as seprator.
|
||||
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
|
||||
boost::char_separator<char> sep( ",");
|
||||
tokenizer tokens(newSetString, sep);
|
||||
if (setString.length() > searchStr.length())
|
||||
return 0;
|
||||
|
||||
CHARSET_INFO *cs= op_ct.getCharset();
|
||||
|
||||
unsigned i = 0;
|
||||
size_t pos = 0;
|
||||
|
||||
for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
|
||||
my_wc_t wc= 0;
|
||||
const char *str_begin= setString.c_str();
|
||||
const char *str_end= setString.c_str();
|
||||
const char *real_end= str_end + setString.length();
|
||||
const char *find_str= searchStr.c_str();
|
||||
uint find_str_len= searchStr.length();
|
||||
int position= 0;
|
||||
static const char separator=',';
|
||||
while (1)
|
||||
{
|
||||
pos = (*tok_iter).find(newSearchStr);
|
||||
i++;
|
||||
|
||||
if (( pos != string::npos) && (newSearchStr.length() == (*tok_iter).length()))
|
||||
return i;
|
||||
int symbol_len;
|
||||
if ((symbol_len= cs->mb_wc(&wc, (uchar*) str_end,
|
||||
(uchar*) real_end)) > 0)
|
||||
{
|
||||
const char *substr_end= str_end + symbol_len;
|
||||
bool is_last_item= (substr_end == real_end);
|
||||
bool is_separator= (wc == (my_wc_t) separator);
|
||||
if (is_separator || is_last_item)
|
||||
{
|
||||
position++;
|
||||
if (is_last_item && !is_separator)
|
||||
str_end= substr_end;
|
||||
if (!cs->strnncoll(str_begin, (uint) (str_end - str_begin),
|
||||
find_str, find_str_len))
|
||||
return (longlong) position;
|
||||
else
|
||||
str_begin= substr_end;
|
||||
}
|
||||
str_end= substr_end;
|
||||
}
|
||||
else if (str_end - str_begin == 0 &&
|
||||
find_str_len == 0 &&
|
||||
wc == (my_wc_t) separator)
|
||||
return (longlong) ++position;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user