diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index dc846332a..a596e6e03 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -719,12 +719,70 @@ bool MySQL_Session::handler_special_queries(PtrSize_t *pkt) { bool collation_specified = false; //unsigned int charsetnr = 0; const CHARSET_INFO * c; + char * collation_name_unstripped = NULL; char * collation_name = NULL; if (strcasestr(csname," COLLATE ")) { collation_specified = true; - collation_name = strcasestr(csname," COLLATE ") + strlen(" COLLATE "); - char *_s=index(csname,' '); - *_s = '\0'; + collation_name_unstripped = strcasestr(csname," COLLATE ") + strlen(" COLLATE "); + collation_name = trim_spaces_and_quotes_in_place(collation_name_unstripped); + char *_s1=index(csname,' '); + char *_s2=index(csname,'\''); + char *_s3=index(csname,'"'); + char *_s = NULL; + if (_s1) { + _s = _s1; + } + if (_s2) { + if (_s) { + if (_s2 < _s) { + _s = _s2; + } + } else { + _s = _s2; + } + } + if (_s3) { + if (_s) { + if (_s3 < _s) { + _s = _s3; + } + } else { + _s = _s3; + } + } + if (_s) { + *_s = '\0'; + } + + _s1 = index(collation_name,' '); + _s2 = index(collation_name,'\''); + _s3 = index(collation_name,'"'); + _s = NULL; + if (_s1) { + _s = _s1; + } + if (_s2) { + if (_s) { + if (_s2 < _s) { + _s = _s2; + } + } else { + _s = _s2; + } + } + if (_s3) { + if (_s) { + if (_s3 < _s) { + _s = _s3; + } + } else { + _s = _s3; + } + } + if (_s) { + *_s = '\0'; + } + c = proxysql_find_charset_collate_names(csname,collation_name); } else { c = proxysql_find_charset_name(csname);