summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql-common/client.c35
-rw-r--r--tests/mysql_client_test.c79
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 }