diff --git a/dbcon/execplan/calpontsystemcatalog.cpp b/dbcon/execplan/calpontsystemcatalog.cpp index 96f43d8d0..3abb7154b 100644 --- a/dbcon/execplan/calpontsystemcatalog.cpp +++ b/dbcon/execplan/calpontsystemcatalog.cpp @@ -6138,7 +6138,7 @@ CalpontSystemCatalog::ColType& CalpontSystemCatalog::ColType::operator=(const Co CHARSET_INFO* CalpontSystemCatalog::ColType::getCharset() { if (!cs) - cs= get_charset(charsetNumber, MYF(MY_WME)); + cs= & datatypes::Charset(charsetNumber).getCharset(); return cs; } diff --git a/dbcon/execplan/calpontsystemcatalog.h b/dbcon/execplan/calpontsystemcatalog.h index 7cfec11d0..8ab9f3511 100644 --- a/dbcon/execplan/calpontsystemcatalog.h +++ b/dbcon/execplan/calpontsystemcatalog.h @@ -50,7 +50,7 @@ #undef max #include "mcs_datatype.h" - +#include "collation.h" class ExecPlanTest; diff --git a/dbcon/execplan/predicateoperator.cpp b/dbcon/execplan/predicateoperator.cpp index 02dc3a710..531a5c799 100644 --- a/dbcon/execplan/predicateoperator.cpp +++ b/dbcon/execplan/predicateoperator.cpp @@ -92,7 +92,7 @@ void PredicateOperator::unserialize(messageqcpp::ByteStream& b) ObjectReader::checkType(b, ObjectReader::PREDICATEOPERATOR); //b >> fData; Operator::unserialize(b); - cs = get_charset(fOperationType.charsetNumber, MYF(MY_WME)); + cs = & datatypes::Charset(fOperationType.charsetNumber).getCharset(); } bool PredicateOperator::operator==(const PredicateOperator& t) const @@ -342,7 +342,7 @@ void PredicateOperator::setOpType(Type& l, Type& r) fOperationType.colWidth = 8; } - cs = get_charset(fOperationType.charsetNumber, MYF(MY_WME)); + cs = & datatypes::Charset(fOperationType.charsetNumber).getCharset(); } inline bool PredicateOperator::strTrimCompare(const std::string& op1, const std::string& op2) diff --git a/dbcon/execplan/predicateoperator.h b/dbcon/execplan/predicateoperator.h index f28b289f1..8ff970777 100644 --- a/dbcon/execplan/predicateoperator.h +++ b/dbcon/execplan/predicateoperator.h @@ -44,8 +44,7 @@ #include "returnedcolumn.h" #include "dataconvert.h" -struct charset_info_st; -typedef const struct charset_info_st CHARSET_INFO; +#include "collation.h" namespace messageqcpp { diff --git a/dbcon/mysql/ha_mcs_pushdown.cpp b/dbcon/mysql/ha_mcs_pushdown.cpp index 450424c01..383e2d815 100644 --- a/dbcon/mysql/ha_mcs_pushdown.cpp +++ b/dbcon/mysql/ha_mcs_pushdown.cpp @@ -826,7 +826,7 @@ create_columnstore_select_handler(THD* thd, SELECT_LEX* select_lex) sel->first_cond_optimization= false; conds= simplify_joins_mcs(join, select_lex->join_list, - join->conds, TRUE, FALSE); + join->conds, true, false); build_bitmap_for_nested_joins_mcs(select_lex->join_list, 0); sel->where= conds; diff --git a/ddlproc/ddlproc.cpp b/ddlproc/ddlproc.cpp index 32ba5dba9..b71116acb 100644 --- a/ddlproc/ddlproc.cpp +++ b/ddlproc/ddlproc.cpp @@ -63,7 +63,7 @@ using namespace execplan; #include "crashtrace.h" #include "installdir.h" -#include "collation.h" +#include "mariadb_my_sys.h" #include "service.h" diff --git a/dmlproc/dmlproc.cpp b/dmlproc/dmlproc.cpp index f96e414e6..f59006036 100644 --- a/dmlproc/dmlproc.cpp +++ b/dmlproc/dmlproc.cpp @@ -83,7 +83,7 @@ using namespace joblist; #include "crashtrace.h" #include "installdir.h" -#include "collation.h" +#include "mariadb_my_sys.h" #include "service.h" diff --git a/exemgr/main.cpp b/exemgr/main.cpp index b9b02c908..ab6df70c1 100644 --- a/exemgr/main.cpp +++ b/exemgr/main.cpp @@ -77,7 +77,7 @@ #include "dbrm.h" -#include "collation.h" +#include "mariadb_my_sys.h" class Opt diff --git a/primitives/linux-port/dictionary.cpp b/primitives/linux-port/dictionary.cpp index 7404af7d4..6bde42b2e 100644 --- a/primitives/linux-port/dictionary.cpp +++ b/primitives/linux-port/dictionary.cpp @@ -145,7 +145,7 @@ void PrimitiveProcessor::p_TokenByScan(const TokenByScanRequestHeader* h, offsets = reinterpret_cast(&niceBlock[10]); niceInput = reinterpret_cast(h); - const CHARSET_INFO* cs = get_charset(h->charsetNumber, MYF(MY_WME)); + const CHARSET_INFO* cs = & datatypes::Charset(h->charsetNumber).getCharset(); // if LIKE is an operator, compile regexp's in advance. if ((h->NVALS > 0 && h->COP1 & COMPARE_LIKE) || @@ -662,7 +662,7 @@ void PrimitiveProcessor::p_Dictionary(const DictInput* in, uint16_t aggCount; bool cmpResult; DictOutput header; - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); + const CHARSET_INFO* cs = & datatypes::Charset(charsetNumber).getCharset(); // default size of the ouput to something sufficiently large to prevent // excessive reallocation and copy when resizing diff --git a/primitives/primproc/primproc.cpp b/primitives/primproc/primproc.cpp index 883503bf7..2e8e08c1c 100644 --- a/primitives/primproc/primproc.cpp +++ b/primitives/primproc/primproc.cpp @@ -74,7 +74,7 @@ using namespace idbdatafile; #include "crashtrace.h" #include "installdir.h" -#include "collation.h" +#include "mariadb_my_sys.h" #include "service.h" diff --git a/utils/common/collation.h b/utils/common/collation.h index e8eb809eb..1c0085e03 100644 --- a/utils/common/collation.h +++ b/utils/common/collation.h @@ -1,9 +1,101 @@ -// These are the common headers needed to use the MariaDB collation library +/* + Copyright (C) 2020 MariaDB Corporation -// This must be included after any boost headers, or anything that includes -// boost headers. and boost are not friends. -#include -#undef set_bits // mariadb.h defines set_bits, which is incompatible with boost -#include -#include -#include + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ +#ifndef COLLATION_H_INCLUDED +#define COLLATION_H_INCLUDED + + +/* + Redefine definitions used by MariaDB m_ctype.h. + This is needed to avoid including and , + which conflict with many MCS and boost headers. +*/ + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef DBUG_ASSERT +#define DBUG_ASSERT(x) idbassert(x) +#define DBUG_ASSERT_TEMPORARILY_DEFINED +#endif + +#ifndef MYSQL_PLUGIN_IMPORT +#if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) +#define MYSQL_PLUGIN_IMPORT __declspec(dllimport) +#else +#define MYSQL_PLUGIN_IMPORT +#endif +#endif + +typedef long long int longlong; +typedef unsigned long long int ulonglong; +typedef uint32_t uint32; +typedef uint16_t uint16; +typedef char my_bool; +typedef unsigned char uchar; + +#if defined(__GNUC__) && !defined(_lint) +typedef char pchar; /* Mixed prototypes can take char */ +typedef char puchar; /* Mixed prototypes can take char */ +typedef char pbool; /* Mixed prototypes can take char */ +typedef short pshort; /* Mixed prototypes can take short int */ +typedef float pfloat; /* Mixed prototypes can take float */ +#else +typedef int pchar; /* Mixed prototypes can't take char */ +typedef uint puchar; /* Mixed prototypes can't take char */ +typedef int pbool; /* Mixed prototypes can't take char */ +typedef int pshort; /* Mixed prototypes can't take short int */ +typedef double pfloat; /* Mixed prototypes can't take float */ +#endif + +typedef const struct charset_info_st CHARSET_INFO; +extern "C" MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; + +#include "m_ctype.h" + +#undef FALSE +#undef TRUE + +#ifdef DBUG_ASSERT_TEMPORARILY_DEFINED +#undef DBUG_ASSERT +#endif + + +namespace datatypes +{ + +// A reference to MariaDB CHARSET_INFO. + +class Charset +{ +protected: + const struct charset_info_st & mCharset; +public: + Charset(CHARSET_INFO & cs) :mCharset(cs) { } + Charset(uint32_t charsetNumber); + CHARSET_INFO & getCharset() const { return mCharset; } +}; + + +} // end of namespace datatypes + +#endif diff --git a/utils/common/mariadb_my_sys.h b/utils/common/mariadb_my_sys.h new file mode 100644 index 000000000..bd07556a9 --- /dev/null +++ b/utils/common/mariadb_my_sys.h @@ -0,0 +1,29 @@ +/* + Copyright (C) 2020 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ +#ifndef MARIADB_MY_SYS_H_INCLUDED +#define MARIADB_MY_SYS_H_INCLUDED + +// These are the common headers needed to use the MariaDB mysys library. + +// This must be included after any boost headers, or anything that includes +// boost headers. and boost are not friends. +#include +#undef set_bits // mariadb.h defines set_bits, which is incompatible with boost +#include + +#endif diff --git a/utils/common/utils_utf8.cpp b/utils/common/utils_utf8.cpp index d638e20d9..0d053dcf1 100644 --- a/utils/common/utils_utf8.cpp +++ b/utils/common/utils_utf8.cpp @@ -16,62 +16,24 @@ #include "utils_utf8.h" #include "collation.h" -namespace utf8 +#include "mariadb_my_sys.h" +#include + + +namespace datatypes { -/* - * mcs_strcoll -*/ -int mcs_strcoll(const char* str1, const char* str2, const uint32_t charsetNumber) +static inline CHARSET_INFO & get_charset_or_bin(int32_t charsetNumber) { - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(str1, strlen(str1), str2, strlen(str2)); + CHARSET_INFO *cs= get_charset(charsetNumber, MYF(MY_WME)); + return cs ? *cs : my_charset_bin; } -int mcs_strcoll(const char* str1, const uint32_t l1, const char* str2, const uint32_t l2, const uint32_t charsetNumber) + +Charset::Charset(uint32_t charsetNumber) + :mCharset(get_charset_or_bin(charsetNumber)) { - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(str1, l1, str2, l2); } -int mcs_strcoll(const std::string* str1, const std::string* str2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(str1->c_str(), str1->length(), str2->c_str(), str2->length()); -} -int mcs_strcoll(const std::string& str1, const std::string& str2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(str1.c_str(), str1.length(), str2.c_str(), str2.length()); } - -/* - * mcs_strcollsp -*/ -int mcs_strcollsp(const char* str1, const char* str2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncollsp(str1, strlen(str1), str2, strlen(str2)); -} - -int mcs_strcollsp(const char* str1, uint32_t l1, const char* str2, const uint32_t l2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncollsp(str1, l1, str2, l2); -} - -int mcs_strcollsp(const std::string* str1, const std::string* str2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncollsp(str1->c_str(), str1->length(), str2->c_str(), str2->length()); -} - -int mcs_strcollsp(const std::string& str1, const std::string& str2, const uint32_t charsetNumber) -{ - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncollsp(str1.c_str(), str1.length(), str2.c_str(), str2.length()); -} - -} //namespace utf8 - diff --git a/utils/funcexp/func_between.cpp b/utils/funcexp/func_between.cpp index f4c0eabf6..a7a6da074 100644 --- a/utils/funcexp/func_between.cpp +++ b/utils/funcexp/func_between.cpp @@ -56,16 +56,14 @@ inline bool numericLE(result_t op1, result_t op2) return op1 <= op2; } -inline bool strGE(uint32_t charsetNumber, const string& op1, const string& op2) +inline bool strGE(CHARSET_INFO &cs, const string& op1, const string& op2) { - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(op1.c_str(), op1.length(), op2.c_str(), op2.length()) >= 0; + return cs.strnncoll(op1.c_str(), op1.length(), op2.c_str(), op2.length()) >= 0; } -inline bool strLE(uint32_t charsetNumber, const string& op1, const string& op2) +inline bool strLE(CHARSET_INFO &cs, const string& op1, const string& op2) { - const CHARSET_INFO* cs = get_charset(charsetNumber, MYF(MY_WME)); - return cs->strnncoll(op1.c_str(), op1.length(), op2.c_str(), op2.length()) <= 0; + return cs.strnncoll(op1.c_str(), op1.length(), op2.c_str(), op2.length()) <= 0; } inline bool getBool(rowgroup::Row& row, @@ -258,19 +256,20 @@ inline bool getBool(rowgroup::Row& row, case execplan::CalpontSystemCatalog::TEXT: { const string& val = pm[0]->data()->getStrVal(row, isNull); + CHARSET_INFO &cs = datatypes::Charset(ct.charsetNumber).getCharset(); if (notBetween) { - if (!strGE(ct.charsetNumber, val, pm[1]->data()->getStrVal(row, isNull)) && !isNull) + if (!strGE(cs, val, pm[1]->data()->getStrVal(row, isNull)) && !isNull) return true; isNull = false; - return (!strLE(ct.charsetNumber, val, pm[2]->data()->getStrVal(row, isNull)) && !isNull); + return (!strLE(cs, val, pm[2]->data()->getStrVal(row, isNull)) && !isNull); } return !isNull && - strGE(ct.charsetNumber, val, pm[1]->data()->getStrVal(row, isNull)) && - strLE(ct.charsetNumber, val, pm[2]->data()->getStrVal(row, isNull)); + strGE(cs, val, pm[1]->data()->getStrVal(row, isNull)) && + strLE(cs, val, pm[2]->data()->getStrVal(row, isNull)); } default: diff --git a/utils/funcexp/func_char.cpp b/utils/funcexp/func_char.cpp index f76c36dea..8387953e5 100644 --- a/utils/funcexp/func_char.cpp +++ b/utils/funcexp/func_char.cpp @@ -39,6 +39,8 @@ using namespace rowgroup; using namespace logging; #include "collation.h" +#include "mariadb_my_sys.h" +#include // min_intXstore() #include "vlarray.h" diff --git a/utils/funcexp/func_lpad.cpp b/utils/funcexp/func_lpad.cpp index d66fe2541..737edef70 100644 --- a/utils/funcexp/func_lpad.cpp +++ b/utils/funcexp/func_lpad.cpp @@ -37,6 +37,8 @@ using namespace rowgroup; using namespace joblist; #include "collation.h" +#include // INT_MAX32 + namespace funcexp { diff --git a/utils/funcexp/func_nullif.cpp b/utils/funcexp/func_nullif.cpp index 886c58f9c..f71b62e5d 100644 --- a/utils/funcexp/func_nullif.cpp +++ b/utils/funcexp/func_nullif.cpp @@ -22,11 +22,6 @@ * ****************************************************************************/ -//#include -//#undef set_bits // mariadb.h defines set_bits, which is incompatible with boost -//#undef LONGLONG_MIN -//#include - #include #include #include diff --git a/utils/funcexp/func_reverse.cpp b/utils/funcexp/func_reverse.cpp index edda9cab6..3ab9bf9dd 100644 --- a/utils/funcexp/func_reverse.cpp +++ b/utils/funcexp/func_reverse.cpp @@ -35,6 +35,7 @@ using namespace rowgroup; using namespace joblist; #include "collation.h" +#include // DBUG_ASSERT namespace funcexp { diff --git a/utils/funcexp/func_rpad.cpp b/utils/funcexp/func_rpad.cpp index 65c249bbd..d521e8d41 100644 --- a/utils/funcexp/func_rpad.cpp +++ b/utils/funcexp/func_rpad.cpp @@ -36,6 +36,7 @@ using namespace rowgroup; using namespace joblist; #include "collation.h" +#include // INT_MAX32 namespace funcexp { diff --git a/utils/funcexp/func_strcmp.cpp b/utils/funcexp/func_strcmp.cpp index 474357704..95d786777 100644 --- a/utils/funcexp/func_strcmp.cpp +++ b/utils/funcexp/func_strcmp.cpp @@ -41,9 +41,6 @@ using namespace funcexp; #include "collation.h" -// Because including my_sys.h in a Columnstore header causes too many conflicts -struct charset_info_st; -typedef const struct charset_info_st CHARSET_INFO; namespace funcexp { diff --git a/utils/funcexp/func_substr.cpp b/utils/funcexp/func_substr.cpp index ddc0644b7..6b01f56a2 100644 --- a/utils/funcexp/func_substr.cpp +++ b/utils/funcexp/func_substr.cpp @@ -97,7 +97,7 @@ std::string Func_substr::getStrVal(rowgroup::Row& row, if (start == 0 && strLen == length) return str; - length= MY_MIN(length, strLen - start); + length= std::min(length, strLen - start); std::string ret(strptr + start, length); return ret; diff --git a/utils/funcexp/func_substring_index.cpp b/utils/funcexp/func_substring_index.cpp index da6e5d12d..2f318b0cc 100644 --- a/utils/funcexp/func_substring_index.cpp +++ b/utils/funcexp/func_substring_index.cpp @@ -88,7 +88,7 @@ std::string Func_substring_index::getStrVal(rowgroup::Row& row, char* ptr = const_cast(src); char *i,*j; uint32_t l; - int32 n = 0, c = count, pass; + int32_t n = 0, c = count, pass; // For count > 0, this loop goes once. // For count < 0, it goes twice for (pass = (count > 0 ? 1 : 0); pass<2; ++pass) diff --git a/utils/rowgroup/rowaggregation.h b/utils/rowgroup/rowaggregation.h index d41cd87f8..7d40faadd 100644 --- a/utils/rowgroup/rowaggregation.h +++ b/utils/rowgroup/rowaggregation.h @@ -53,9 +53,8 @@ #include "mcsv1_udaf.h" #include "constantcolumn.h" -// Because including my_sys.h in a Columnstore header causes too many conflicts -struct charset_info_st; -typedef const struct charset_info_st CHARSET_INFO; +#include "collation.h" + // To do: move code that depends on joblist to a proper subsystem. namespace joblist { diff --git a/utils/rowgroup/rowgroup.cpp b/utils/rowgroup/rowgroup.cpp index 2a6e92fbb..122850edc 100644 --- a/utils/rowgroup/rowgroup.cpp +++ b/utils/rowgroup/rowgroup.cpp @@ -1240,7 +1240,7 @@ const CHARSET_INFO* Row::getCharset(uint32_t col) const { if (charsets[col] == NULL) { - const_cast(charsets)[col] = get_charset(charsetNumbers[col], MYF(MY_WME)); + const_cast(charsets)[col] = & datatypes::Charset(charsetNumbers[col]).getCharset(); } return charsets[col]; } @@ -1761,7 +1761,7 @@ const CHARSET_INFO* RowGroup::getCharset(uint32_t col) { if (charsets[col] == NULL) { - charsets[col] = get_charset(charsetNumbers[col], MYF(MY_WME)); + charsets[col] = & datatypes::Charset(charsetNumbers[col]).getCharset(); } return charsets[col]; } diff --git a/utils/rowgroup/rowgroup.h b/utils/rowgroup/rowgroup.h index 45f2be327..484b29333 100644 --- a/utils/rowgroup/rowgroup.h +++ b/utils/rowgroup/rowgroup.h @@ -59,9 +59,7 @@ #include "../winport/winport.h" -// Because including my_sys.h in a Columnstore header causes too many conflicts -struct charset_info_st; -typedef const struct charset_info_st CHARSET_INFO; +#include "collation.h" // Workaround for my_global.h #define of isnan(X) causing a std::std namespace diff --git a/writeengine/server/we_server.cpp b/writeengine/server/we_server.cpp index 40f3ef5a2..f3233369a 100644 --- a/writeengine/server/we_server.cpp +++ b/writeengine/server/we_server.cpp @@ -52,7 +52,7 @@ using namespace oam; #include "crashtrace.h" -#include "collation.h" +#include "mariadb_my_sys.h" #include "service.h"