From 938ee6d308b8168b76d1d47606d8e07679862d11 Mon Sep 17 00:00:00 2001 From: David Hall Date: Mon, 8 Jun 2020 16:09:46 -0500 Subject: [PATCH] MCOL-3536 collation --- utils/funcexp/func_concat_ws.cpp | 12 ++++++------ utils/funcexp/func_find_in_set.cpp | 28 ++++++++++++++-------------- utils/funcexp/func_insert.cpp | 5 +++-- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/utils/funcexp/func_concat_ws.cpp b/utils/funcexp/func_concat_ws.cpp index 4b93814aa..bb177e4fe 100644 --- a/utils/funcexp/func_concat_ws.cpp +++ b/utils/funcexp/func_concat_ws.cpp @@ -103,21 +103,21 @@ string Func_concat_ws::getStrVal(Row& row, #endif string str; string tmp; - // Work on reallocation. use std::string::resize() to - // grab larger chunks in some intellegent manner. for ( uint32_t i = 1 ; i < parm.size() ; i++) { - stringValue(parm[i], row, isNull, tmp); - str += tmp; - + stringValue(parm[i], row, isNull, tmp); if (isNull) { isNull = false; continue; } - if (!str.empty() && !isNull) + if (!str.empty()) str += delim; + + // TODO: Work on string reallocation. Use std::string::resize() to + // grab larger chunks in some intellegent manner. + str += tmp; } if (str.empty()) diff --git a/utils/funcexp/func_find_in_set.cpp b/utils/funcexp/func_find_in_set.cpp index 81513cb31..7c4a07bd2 100644 --- a/utils/funcexp/func_find_in_set.cpp +++ b/utils/funcexp/func_find_in_set.cpp @@ -69,18 +69,18 @@ int64_t Func_find_in_set::getIntVal(rowgroup::Row& row, if (searchStr.find(",") != string::npos) return 0; - if (setString.length() > searchStr.length()) + if (setString.length() < searchStr.length()) return 0; CHARSET_INFO *cs= op_ct.getCharset(); 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; + 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(); + size_t find_str_len = searchStr.length(); + int position = 0; static const char separator=','; while (1) { @@ -88,21 +88,21 @@ int64_t Func_find_in_set::getIntVal(rowgroup::Row& row, if ((symbol_len= cs->mb_wc(&wc, (uchar*) str_end, (uchar*) real_end)) > 0) { - const char *substr_end= str_end + symbol_len; + const char *substr_end = str_end + symbol_len; bool is_last_item= (substr_end == real_end); - bool is_separator= (wc == (my_wc_t) separator); + 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), + str_end = substr_end; + if (!cs->strnncoll(str_begin, (size_t) (str_end - str_begin), find_str, find_str_len)) - return (longlong) position; + return (int64_t) position; else - str_begin= substr_end; + str_begin = substr_end; } - str_end= substr_end; + str_end = substr_end; } else if (str_end - str_begin == 0 && find_str_len == 0 && diff --git a/utils/funcexp/func_insert.cpp b/utils/funcexp/func_insert.cpp index bcab9bc40..774d7c58d 100644 --- a/utils/funcexp/func_insert.cpp +++ b/utils/funcexp/func_insert.cpp @@ -88,7 +88,7 @@ std::string Func_insert::getStrVal(rowgroup::Row& row, int64_t strLen = cs->numchars(pos, end); // Return the original string if start isn't within the string. - if ((start <= 1) || start >= strLen) + if ((start < 1) || start >= strLen) return src; if ((length < 0) || (length > strLen)) @@ -103,7 +103,8 @@ std::string Func_insert::getStrVal(rowgroup::Row& row, out.append(src.c_str(), start); out.append(tnewstr.c_str(), tnewstr.length()); - out.append(src.c_str() + start + length, binLen - start - length); + if (binLen - start - length > 0) + out.append(src.c_str() + start + length, binLen - start - length); return out; }