diff options
-rw-r--r-- | sql-common/client.c | 35 | ||||
-rw-r--r-- | tests/mysql_client_test.c | 79 |
2 files changed, 95 insertions, 19 deletions
diff --git a/sql-common/client.c b/sql-common/client.c index 824d3705c23..e51d2bb848f 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -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; } @@ -1624,23 +1642,6 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, port=mysql->options.port; 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; diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index eb0a7ade390..e68e9c61000 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -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,80 @@ 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); +} + /* Bug #16144: mysql_stmt_attr_get type error */ static void test_bug16144() @@ -14964,7 +15037,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 }, + { "test_bug16144", test_bug16144 }, { "test_bug15613", test_bug15613 }, { 0, 0 } |