You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/deps/mariadb-client-library/mariadb_lib.c.patch

144 lines
3.9 KiB

@@ -1515,9 +1515,16 @@
mysql->client_flag= client_flag;
+ {
+ volatile my_bool net_blocking = ma_pvio_is_blocking(net->pvio);
+ if (!net_blocking)
+ ma_pvio_blocking(net->pvio, TRUE, 0);
if (run_plugin_auth(mysql, scramble_data, scramble_len,
scramble_plugin, db))
goto error;
+ if (!net_blocking)
+ ma_pvio_blocking(net->pvio, FALSE, 0);
+ }
if (mysql->client_flag & CLIENT_COMPRESS)
net->compress= 1;
@@ -1568,6 +1575,15 @@
return(mysql);
error:
+ // fix for proxysql bug #2623
+ if (mysql->net.extension) {
+ free(mysql->net.extension);
+ mysql->net.extension=NULL;
+ }
+ if (mysql->extension) {
+ free(mysql->extension);
+ mysql->extension=NULL;
+ }
/* Free alloced memory */
end_server(mysql);
/* only free the allocated memory, user needs to call mysql_close */
@@ -1647,7 +1663,7 @@
if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,
mysql->db, mysql->port, mysql->unix_socket,
mysql->client_flag | CLIENT_REMEMBER_OPTIONS) ||
- mysql_set_character_set(&tmp_mysql, mysql->charset->csname))
+ mysql_set_character_set(&tmp_mysql, mysql->charset->csname, 0))
{
if (ctxt)
my_context_install_suspend_resume_hook(ctxt, NULL, NULL);
@@ -1693,6 +1709,7 @@
{
if (mysql->stmts)
{
+/*
LIST *li_stmt= mysql->stmts;
for (; li_stmt; li_stmt= li_stmt->next)
@@ -1701,6 +1718,7 @@
stmt->mysql= NULL;
SET_CLIENT_STMT_ERROR(stmt, CR_STMT_CLOSED, SQLSTATE_UNKNOWN, function_name);
}
+*/
mysql->stmts= NULL;
}
}
@@ -1970,6 +1988,33 @@
return;
}
+void STDCALL
+mysql_close_no_command(MYSQL *mysql)
+{
+ if (mysql) /* Some simple safety */
+ {
+
+ if (mysql->methods) {
+ if (mysql->net.pvio) {
+ free_old_query(mysql);
+ mysql->status=MYSQL_STATUS_READY; /* Force command */
+ mysql->options.reconnect=0;
+ end_server(mysql);
+ }
+ }
+ mysql_close_memory(mysql);
+ mysql_close_options(mysql);
+ mysql->host_info=mysql->user=mysql->passwd=mysql->db=0;
+
+ /* Clear pointers for better safety */
+ bzero((char*) &mysql->options,sizeof(mysql->options));
+ mysql->net.pvio= 0;
+ if (mysql->free_me)
+ free(mysql);
+ }
+ return;
+}
+
/**************************************************************************
** Do a query. If query returned rows, free old rows.
@@ -2036,6 +2081,8 @@
old_pos= pos;
si_type= (enum enum_session_state_type)net_field_length(&pos);
switch(si_type) {
+ case SESSION_TRACK_GTIDS:
+ net_field_length(&pos); /* skip encoding */
case SESSION_TRACK_SCHEMA:
case SESSION_TRACK_STATE_CHANGE:
case SESSION_TRACK_TRANSACTION_CHARACTERISTICS:
@@ -3474,18 +3521,27 @@
mariadb_get_charset_info(mysql, cs);
}
-int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname)
+int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname, uint charsetnr)
{
const MARIADB_CHARSET_INFO *cs;
- if (!csname)
+ if (!csname && !charsetnr)
goto error;
- if ((cs= mysql_find_charset_name(csname)))
- {
- char buff[64];
+ if (csname) {
+ cs = mysql_find_charset_name(csname);
+ } else {
+ cs = mysql_find_charset_nr(charsetnr);
+ }
+ if (cs)
+ {
+ char buff[128];
+ if (csname) { // default behavior
+ snprintf(buff, 127, "SET NAMES %s", cs->csname);
+ } else {
+ snprintf(buff, 127, "SET NAMES %s COLLATE '%s'", cs->csname, cs->name);
+ }
- snprintf(buff, 63, "SET NAMES %s", cs->csname);
if (!mysql_real_query(mysql, buff, (unsigned long)strlen(buff)))
{
mysql->charset= cs;
@@ -3494,6 +3550,7 @@
}
error:
+ if (!cs)
my_set_error(mysql, CR_CANT_READ_CHARSET, SQLSTATE_UNKNOWN,
0, csname, "compiled_in");
return(mysql->net.last_errno);