Skip to content

Commit 50b7f85

Browse files
authored
Merge pull request #4850 from sysown/v2.7-4841
Fix issue #4841
2 parents 3c4eaa7 + 2731652 commit 50b7f85

File tree

4 files changed

+83
-9
lines changed

4 files changed

+83
-9
lines changed

lib/mysql_connection.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -774,18 +774,33 @@ void MySQL_Connection::connect_start_SetCharset() {
774774
csname = mysql_variables.client_get_value(myds->sess, SQL_CHARACTER_SET);
775775
}
776776

777-
const MARIADB_CHARSET_INFO * c = NULL;
777+
MARIADB_CHARSET_INFO * c = NULL;
778778
if (csname)
779-
c = proxysql_find_charset_nr(atoi(csname));
779+
c = (MARIADB_CHARSET_INFO *)proxysql_find_charset_nr(atoi(csname));
780780
else
781-
c = proxysql_find_charset_name(mysql_thread___default_variables[SQL_CHARACTER_SET]);
781+
c = (MARIADB_CHARSET_INFO *)proxysql_find_charset_name(mysql_thread___default_variables[SQL_CHARACTER_SET]);
782782

783783
if (!c) {
784784
// LCOV_EXCL_START
785785
proxy_error("Not existing charset number %s\n", mysql_thread___default_variables[SQL_CHARACTER_SET]);
786786
assert(0);
787787
// LCOV_EXCL_STOP
788788
}
789+
790+
if (c->nr > 255) {
791+
const char *csname_default = c->csname;
792+
c = NULL;
793+
c = (MARIADB_CHARSET_INFO *)proxysql_find_charset_name(csname_default);
794+
if (!c) {
795+
// LCOV_EXCL_START
796+
proxy_error("Not existing charset number %s\n", mysql_thread___default_variables[SQL_CHARACTER_SET]);
797+
assert(0);
798+
// LCOV_EXCL_STOP
799+
}
800+
}
801+
802+
803+
789804
{
790805
/* We are connecting to backend setting charset in mysql_options.
791806
* Client already has sent us a character set and client connection variables have been already set.

test/tap/tap/utils.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,15 @@ int mysql_query_t__(MYSQL* mysql, const char* query, const char* f, int ln, cons
243243
return mysql_query(mysql, query);
244244
}
245245

246-
int show_variable(MYSQL *mysql, const string& var_name, string& var_value) {
247-
char query[128];
246+
int show_variable(MYSQL *mysql, const string& var_name, string& var_value, bool new_connection) {
248247

249-
snprintf(query, sizeof(query),"show variables like '%s'", var_name.c_str());
250-
if (mysql_query(mysql, query)) {
248+
std::string query = "show variables ";
249+
query += (new_connection == true ? "/* create_new_connection=1 */ " : "");
250+
query += " like '" + var_name + "'";
251+
252+
if (mysql_query(mysql, query.c_str())) {
251253
fprintf(stderr, "Failed to execute query [%s] : no %d, %s\n",
252-
query, mysql_errno(mysql), mysql_error(mysql));
254+
query.c_str(), mysql_errno(mysql), mysql_error(mysql));
253255
return exit_status();
254256
}
255257

test/tap/tap/utils.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ int mysql_query_t__(MYSQL* mysql, const char* query, const char* f, int ln, cons
119119
} \
120120
} while(0)
121121

122-
int show_variable(MYSQL *mysql, const std::string& var_name, std::string& var_value);
122+
int show_variable(MYSQL *mysql, const std::string& var_name, std::string& var_value, bool new_connection=false);
123123
int show_admin_global_variable(MYSQL *mysql, const std::string& var_name, std::string& var_value);
124124
int set_admin_global_variable(MYSQL *mysql, const std::string& var_name, const std::string& var_value);
125125
int get_server_version(MYSQL *mysql, std::string& version);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* @file test_utf8mb4_as_ci-4841-t.cpp
3+
* @brief This test checks the use of collation 305 (utf8mb4_as_ci) .
4+
* @details The test performs a 'SET NAMES' query to set utf8mb4_as_ci collation, then run a query
5+
* on backend to verify the collation.
6+
*/
7+
8+
#include <cstdlib>
9+
#include <cstdio>
10+
#include <cstring>
11+
#include <unistd.h>
12+
13+
#include <string>
14+
#include "mysql.h"
15+
16+
#include "tap.h"
17+
#include "command_line.h"
18+
#include "utils.h"
19+
20+
int main(int argc, char** argv) {
21+
CommandLine cl;
22+
23+
if(cl.getEnv())
24+
return exit_status();
25+
26+
plan(1);
27+
diag("Testing SET NAMES utf8mb4 COLLATE utf8mb4_0900_as_ci");
28+
29+
MYSQL* mysql = mysql_init(NULL);
30+
if (!mysql)
31+
return exit_status();
32+
33+
if (!mysql_real_connect(mysql, cl.host, cl.username, cl.password, NULL, cl.port, NULL, 0)) {
34+
fprintf(stderr, "Failed to connect to database: Error: %s\n",
35+
mysql_error(mysql));
36+
return exit_status();
37+
}
38+
39+
char * query = (char *)"SET NAMES utf8mb4 COLLATE utf8mb4_0900_as_ci";
40+
if (mysql_query(mysql, query)) {
41+
fprintf(stderr, "%s: Error: %s\n",
42+
query,
43+
mysql_error(mysql));
44+
return exit_status();
45+
}
46+
47+
std::string var_collation_connection = "collation_connection";
48+
std::string var_value;
49+
50+
show_variable(mysql, var_collation_connection, var_value, true);
51+
ok(var_value.compare("utf8mb4_0900_as_ci") == 0, "collation_connection , Expected utf8mb4_0900_as_ci . Actual %s", var_value.c_str()); // ok_1
52+
53+
mysql_close(mysql);
54+
55+
return exit_status();
56+
}
57+

0 commit comments

Comments
 (0)