mirror of https://github.com/sysown/proxysql
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.
158 lines
4.9 KiB
158 lines
4.9 KiB
diff --git libmariadb/mariadb_lib.c libmariadb/mariadb_lib.c
|
|
index 8c2a99b..cf6114a 100644
|
|
--- libmariadb/mariadb_lib.c
|
|
+++ libmariadb/mariadb_lib.c
|
|
@@ -1643,9 +1643,16 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
|
|
|
|
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;
|
|
@@ -1696,6 +1703,15 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
|
|
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 */
|
|
@@ -1775,7 +1791,7 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql)
|
|
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);
|
|
@@ -1821,6 +1837,7 @@ void ma_invalidate_stmts(MYSQL *mysql, const char *function_name)
|
|
{
|
|
if (mysql->stmts)
|
|
{
|
|
+/*
|
|
LIST *li_stmt= mysql->stmts;
|
|
|
|
for (; li_stmt; li_stmt= li_stmt->next)
|
|
@@ -1829,6 +1846,7 @@ void ma_invalidate_stmts(MYSQL *mysql, const char *function_name)
|
|
stmt->mysql= NULL;
|
|
SET_CLIENT_STMT_ERROR(stmt, CR_STMT_CLOSED, SQLSTATE_UNKNOWN, function_name);
|
|
}
|
|
+*/
|
|
mysql->stmts= NULL;
|
|
}
|
|
}
|
|
@@ -2115,6 +2133,44 @@ mysql_close(MYSQL *mysql)
|
|
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;
|
|
+
|
|
+ // fix for proxysql bug #3204
|
|
+ if (mysql->net.extension) {
|
|
+ free(mysql->net.extension);
|
|
+ mysql->net.extension=NULL;
|
|
+ }
|
|
+
|
|
+ if (mysql->extension) {
|
|
+ free(mysql->extension);
|
|
+ mysql->extension=NULL;
|
|
+ }
|
|
+
|
|
+ /* 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.
|
|
@@ -2189,6 +2245,8 @@ int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length)
|
|
char *data;
|
|
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:
|
|
@@ -3670,18 +3728,27 @@ void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs)
|
|
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)))
|
|
+ if (csname) {
|
|
+ cs = mysql_find_charset_name(csname);
|
|
+ } else {
|
|
+ cs = mysql_find_charset_nr(charsetnr);
|
|
+ }
|
|
+ if (cs)
|
|
{
|
|
- char buff[64];
|
|
+ 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;
|
|
@@ -3691,6 +3758,7 @@ int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname)
|
|
}
|
|
|
|
error:
|
|
+ if (!cs)
|
|
my_set_error(mysql, CR_CANT_READ_CHARSET, SQLSTATE_UNKNOWN,
|
|
0, csname, "compiled_in");
|
|
return(mysql->net.last_errno);
|