summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilhem Bichot <guilhem.bichot@oracle.com>2011-01-14 14:21:46 +0100
committerGuilhem Bichot <guilhem.bichot@oracle.com>2011-01-14 14:21:46 +0100
commit745a9f92ec7feb22071d5c867b020fb0fcd0251e (patch)
treebc637399c7e991ae74368ddb46ed5961d5067a94
parentc1b186f945ee4bb7151d72f2be9665f886a9f847 (diff)
downloadmariadb-git-745a9f92ec7feb22071d5c867b020fb0fcd0251e.tar.gz
Fix for BUG#59432 "--autocommit=on does not work (@@global.autocommit is 0)"
mysql-test/r/mysqld--help-notwin.result: consequence of introducing opt_autocommit and its default mysql-test/suite/sys_vars/r/autocommit_func4.result: Before this fix, this test would have shown @@global.autocommit == 0 in spite of --autocommit=on. mysql-test/suite/sys_vars/r/autocommit_func5.result: result unchanged by the fix sql/mysqld.cc: atoi(argument) was reliable for =0|1 parameters. Now that boolean options must support =on/off/true/false, atoi(argument) is wrong (being always 0 for those strings). Instead, let the internal logic of my_getopt (in particular get_bool_argument()) set a boolean opt_autocommit properly, and use that to set global_system_variables.option_bits.
-rw-r--r--mysql-test/r/mysqld--help-notwin.result2
-rw-r--r--mysql-test/r/mysqld--help-win.result2
-rw-r--r--mysql-test/suite/sys_vars/r/autocommit_func4.result46
-rw-r--r--mysql-test/suite/sys_vars/r/autocommit_func5.result42
-rw-r--r--mysql-test/suite/sys_vars/t/autocommit_func4-master.opt1
-rw-r--r--mysql-test/suite/sys_vars/t/autocommit_func4.test1
-rw-r--r--mysql-test/suite/sys_vars/t/autocommit_func5-master.opt1
-rw-r--r--mysql-test/suite/sys_vars/t/autocommit_func5.test1
-rw-r--r--sql/mysqld.cc23
-rw-r--r--sql/mysqld.h3
10 files changed, 107 insertions, 15 deletions
diff --git a/mysql-test/r/mysqld--help-notwin.result b/mysql-test/r/mysqld--help-notwin.result
index 60ba06c8f7e..6659a291e0b 100644
--- a/mysql-test/r/mysqld--help-notwin.result
+++ b/mysql-test/r/mysqld--help-notwin.result
@@ -20,6 +20,7 @@ The following options may be given as the first argument:
Offset added to Auto-increment columns. Used when
auto-increment-increment != 1
--autocommit Set default value for autocommit (0 or 1)
+ (Defaults to on; use --skip-autocommit to disable.)
--automatic-sp-privileges
Creating and dropping stored procedures alters ACLs
(Defaults to on; use --skip-automatic-sp-privileges to disable.)
@@ -732,6 +733,7 @@ abort-slave-event-count 0
allow-suspicious-udfs FALSE
auto-increment-increment 1
auto-increment-offset 1
+autocommit TRUE
automatic-sp-privileges TRUE
back-log 50
big-tables FALSE
diff --git a/mysql-test/r/mysqld--help-win.result b/mysql-test/r/mysqld--help-win.result
index dfb53937245..240c29294e2 100644
--- a/mysql-test/r/mysqld--help-win.result
+++ b/mysql-test/r/mysqld--help-win.result
@@ -20,6 +20,7 @@ The following options may be given as the first argument:
Offset added to Auto-increment columns. Used when
auto-increment-increment != 1
--autocommit Set default value for autocommit (0 or 1)
+ (Defaults to on; use --skip-autocommit to disable.)
--automatic-sp-privileges
Creating and dropping stored procedures alters ACLs
(Defaults to on; use --skip-automatic-sp-privileges to disable.)
@@ -736,6 +737,7 @@ abort-slave-event-count 0
allow-suspicious-udfs FALSE
auto-increment-increment 1
auto-increment-offset 1
+autocommit TRUE
automatic-sp-privileges TRUE
back-log 50
big-tables FALSE
diff --git a/mysql-test/suite/sys_vars/r/autocommit_func4.result b/mysql-test/suite/sys_vars/r/autocommit_func4.result
new file mode 100644
index 00000000000..5fcb50526f2
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/autocommit_func4.result
@@ -0,0 +1,46 @@
+CREATE TABLE t1
+(
+id INT NOT NULL auto_increment,
+PRIMARY KEY (id),
+name varchar(30)
+) ENGINE = INNODB;
+SELECT @@global.autocommit;
+@@global.autocommit
+1
+SELECT @@autocommit;
+@@autocommit
+1
+INSERT into t1(name) values('Record_1');
+INSERT into t1(name) values('Record_2');
+SELECT * from t1;
+id name
+1 Record_1
+2 Record_2
+ROLLBACK;
+SELECT * from t1;
+id name
+1 Record_1
+2 Record_2
+set @@global.autocommit = 1-@@global.autocommit;
+set @@autocommit = 1-@@autocommit;
+SELECT @@global.autocommit;
+@@global.autocommit
+0
+SELECT @@autocommit;
+@@autocommit
+0
+INSERT into t1(name) values('Record_1');
+INSERT into t1(name) values('Record_2');
+SELECT * from t1;
+id name
+1 Record_1
+2 Record_2
+3 Record_1
+4 Record_2
+ROLLBACK;
+SELECT * from t1;
+id name
+1 Record_1
+2 Record_2
+DROP TABLE t1;
+set @@global.autocommit = 1-@@global.autocommit;
diff --git a/mysql-test/suite/sys_vars/r/autocommit_func5.result b/mysql-test/suite/sys_vars/r/autocommit_func5.result
new file mode 100644
index 00000000000..6807c594cb1
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/autocommit_func5.result
@@ -0,0 +1,42 @@
+CREATE TABLE t1
+(
+id INT NOT NULL auto_increment,
+PRIMARY KEY (id),
+name varchar(30)
+) ENGINE = INNODB;
+SELECT @@global.autocommit;
+@@global.autocommit
+0
+SELECT @@autocommit;
+@@autocommit
+0
+INSERT into t1(name) values('Record_1');
+INSERT into t1(name) values('Record_2');
+SELECT * from t1;
+id name
+1 Record_1
+2 Record_2
+ROLLBACK;
+SELECT * from t1;
+id name
+set @@global.autocommit = 1-@@global.autocommit;
+set @@autocommit = 1-@@autocommit;
+SELECT @@global.autocommit;
+@@global.autocommit
+1
+SELECT @@autocommit;
+@@autocommit
+1
+INSERT into t1(name) values('Record_1');
+INSERT into t1(name) values('Record_2');
+SELECT * from t1;
+id name
+3 Record_1
+4 Record_2
+ROLLBACK;
+SELECT * from t1;
+id name
+3 Record_1
+4 Record_2
+DROP TABLE t1;
+set @@global.autocommit = 1-@@global.autocommit;
diff --git a/mysql-test/suite/sys_vars/t/autocommit_func4-master.opt b/mysql-test/suite/sys_vars/t/autocommit_func4-master.opt
new file mode 100644
index 00000000000..788990274dd
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/autocommit_func4-master.opt
@@ -0,0 +1 @@
+--autocommit=on
diff --git a/mysql-test/suite/sys_vars/t/autocommit_func4.test b/mysql-test/suite/sys_vars/t/autocommit_func4.test
new file mode 100644
index 00000000000..9bb4c26d5d5
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/autocommit_func4.test
@@ -0,0 +1 @@
+--source suite/sys_vars/inc/autocommit_func2.inc
diff --git a/mysql-test/suite/sys_vars/t/autocommit_func5-master.opt b/mysql-test/suite/sys_vars/t/autocommit_func5-master.opt
new file mode 100644
index 00000000000..409cb3ec891
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/autocommit_func5-master.opt
@@ -0,0 +1 @@
+--autocommit=off
diff --git a/mysql-test/suite/sys_vars/t/autocommit_func5.test b/mysql-test/suite/sys_vars/t/autocommit_func5.test
new file mode 100644
index 00000000000..9bb4c26d5d5
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/autocommit_func5.test
@@ -0,0 +1 @@
+--source suite/sys_vars/inc/autocommit_func2.inc
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c3afa1a5399..d670a076ecd 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -283,6 +283,7 @@ const char *first_keyword= "first", *binary_keyword= "BINARY";
const char *my_localhost= "localhost", *delayed_user= "DELAYED";
bool opt_large_files= sizeof(my_off_t) > 4;
+static my_bool opt_autocommit; ///< for --autocommit command-line option
/*
Used with --help for detailed option
@@ -5655,8 +5656,9 @@ struct my_option my_long_options[]=
Because Sys_var_bit does not support command-line options, we need to
explicitely add one for --autocommit
*/
- {"autocommit", OPT_AUTOCOMMIT, "Set default value for autocommit (0 or 1)",
- NULL, NULL, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, NULL},
+ {"autocommit", 0, "Set default value for autocommit (0 or 1)",
+ &opt_autocommit, &opt_autocommit, 0,
+ GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, NULL},
{"bind-address", OPT_BIND_ADDRESS, "IP address to bind to.",
&my_bind_addr_str, &my_bind_addr_str, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -7111,13 +7113,6 @@ mysqld_get_one_option(int optid,
if (argument == NULL) /* no argument */
log_error_file_ptr= const_cast<char*>("");
break;
- case OPT_AUTOCOMMIT:
- const ulonglong turn_bit_on= (argument && (atoi(argument) == 0)) ?
- OPTION_NOT_AUTOCOMMIT : OPTION_AUTOCOMMIT;
- global_system_variables.option_bits=
- (global_system_variables.option_bits &
- ~(OPTION_NOT_AUTOCOMMIT | OPTION_AUTOCOMMIT)) | turn_bit_on;
- break;
}
return 0;
}
@@ -7268,10 +7263,12 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
else
global_system_variables.option_bits&= ~OPTION_BIG_SELECTS;
- if (global_system_variables.option_bits & OPTION_AUTOCOMMIT)
- global_system_variables.option_bits&= ~OPTION_NOT_AUTOCOMMIT;
- else
- global_system_variables.option_bits|= OPTION_NOT_AUTOCOMMIT;
+ // Synchronize @@global.autocommit on --autocommit
+ const ulonglong turn_bit_on= opt_autocommit ?
+ OPTION_AUTOCOMMIT : OPTION_NOT_AUTOCOMMIT;
+ global_system_variables.option_bits=
+ (global_system_variables.option_bits &
+ ~(OPTION_NOT_AUTOCOMMIT | OPTION_AUTOCOMMIT)) | turn_bit_on;
global_system_variables.sql_mode=
expand_sql_mode(global_system_variables.sql_mode);
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 9218503d477..2099e57e96d 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -394,8 +394,7 @@ enum options_mysqld
OPT_UPDATE_LOG,
OPT_WANT_CORE,
OPT_ENGINE_CONDITION_PUSHDOWN,
- OPT_LOG_ERROR,
- OPT_AUTOCOMMIT
+ OPT_LOG_ERROR
};