Commit f220f892 authored by unknown's avatar unknown

Bug #15719 MYSQL_OPT_RECONNECT option is modified by mysql_real_connect

 - Move init of "reconnect" variable to mysql_init 
 - Add test case to mysql_client_test.


sql-common/client.c:
  Move initialisation of reconnect variable to mysql_init instead of doing it in mysql_real_connect.
tests/mysql_client_test.c:
  Add test to check that reconnect is not modified by a call to mysql_real_connect
parent db5fe0fc
......@@ -1456,6 +1456,24 @@ mysql_init(MYSQL *mysql)
mysql->options.methods_to_use= MYSQL_OPT_GUESS_CONNECTION;
mysql->options.report_data_truncation= TRUE; /* default */
/*
By default we don't reconnect because it could silently corrupt data (after
reconnection you potentially lose table locks, user variables, session
variables (transactions but they are specifically dealt with in
mysql_reconnect()).
This is a change: < 5.0.3 mysql->reconnect was set to 1 by default.
How this change impacts existing apps:
- existing apps which relyed on the default will see a behaviour change;
they will have to set reconnect=1 after mysql_real_connect().
- existing apps which explicitely asked for reconnection (the only way they
could do it was by setting mysql.reconnect to 1 after mysql_real_connect())
will not see a behaviour change.
- existing apps which explicitely asked for no reconnection
(mysql.reconnect=0) will not see a behaviour change.
*/
mysql->reconnect= 0;
return mysql;
}
......@@ -1625,23 +1643,6 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
if (!unix_socket)
unix_socket=mysql->options.unix_socket;
/*
By default we don't reconnect because it could silently corrupt data (after
reconnection you potentially lose table locks, user variables, session
variables (transactions but they are specifically dealt with in
mysql_reconnect()).
This is a change: < 5.0.3 mysql->reconnect was set to 1 by default.
How this change impacts existing apps:
- existing apps which relyed on the default will see a behaviour change;
they will have to set reconnect=1 after mysql_real_connect().
- existing apps which explicitely asked for reconnection (the only way they
could do it was by setting mysql.reconnect to 1 after mysql_real_connect())
will not see a behaviour change.
- existing apps which explicitely asked for no reconnection
(mysql.reconnect=0) will not see a behaviour change.
*/
mysql->reconnect= 0;
mysql->server_status=SERVER_STATUS_AUTOCOMMIT;
/*
......
......@@ -14598,7 +14598,6 @@ static void test_bug14845()
static void test_bug15510()
{
MYSQL_STMT *stmt;
MYSQL_RES *res;
int rc;
const char *query= "select 1 from dual where 1/0";
......@@ -14624,6 +14623,81 @@ static void test_bug15510()
myquery(rc);
}
/* Test MYSQL_OPT_RECONNECT, Bug#15719 */
static void test_opt_reconnect()
{
MYSQL *lmysql;
my_bool my_true= TRUE;
myheader("test_opt_reconnect");
if (!(lmysql= mysql_init(NULL)))
{
myerror("mysql_init() failed");
exit(1);
}
if (!opt_silent)
fprintf(stdout, "reconnect before mysql_options: %d\n", lmysql->reconnect);
DIE_UNLESS(lmysql->reconnect == 0);
if (mysql_options(lmysql, MYSQL_OPT_RECONNECT, &my_true))
{
myerror("mysql_options failed: unknown option MYSQL_OPT_RECONNECT\n");
exit(1);
}
/* reconnect should be 1 */
if (!opt_silent)
fprintf(stdout, "reconnect after mysql_options: %d\n", lmysql->reconnect);
DIE_UNLESS(lmysql->reconnect == 1);
if (!(mysql_real_connect(lmysql, opt_host, opt_user,
opt_password, current_db, opt_port,
opt_unix_socket, 0)))
{
myerror("connection failed");
exit(1);
}
/* reconnect should still be 1 */
if (!opt_silent)
fprintf(stdout, "reconnect after mysql_real_connect: %d\n",
lmysql->reconnect);
DIE_UNLESS(lmysql->reconnect == 1);
mysql_close(lmysql);
if (!(lmysql= mysql_init(NULL)))
{
myerror("mysql_init() failed");
exit(1);
}
if (!opt_silent)
fprintf(stdout, "reconnect before mysql_real_connect: %d\n", lmysql->reconnect);
DIE_UNLESS(lmysql->reconnect == 0);
if (!(mysql_real_connect(lmysql, opt_host, opt_user,
opt_password, current_db, opt_port,
opt_unix_socket, 0)))
{
myerror("connection failed");
exit(1);
}
/* reconnect should still be 0 */
if (!opt_silent)
fprintf(stdout, "reconnect after mysql_real_connect: %d\n",
lmysql->reconnect);
DIE_UNLESS(lmysql->reconnect == 0);
mysql_close(lmysql);
}
/*
Read and parse arguments and MySQL options from my.cnf
*/
......@@ -14883,7 +14957,9 @@ static struct my_tests_st my_tests[]= {
{ "test_bug13488", test_bug13488 },
{ "test_bug13524", test_bug13524 },
{ "test_bug14845", test_bug14845 },
{ "test_bug15510", test_bug15510},
{ "test_bug15510", test_bug15510 },
{ "test_opt_reconnect", test_opt_reconnect },
{ 0, 0 }
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment