summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMySQL Build Team <build@mysql.com>2009-06-24 19:16:32 +0200
committerMySQL Build Team <build@mysql.com>2009-06-24 19:16:32 +0200
commitcf1f35a1e1b5bed3a086dcbcf11112f739d8e7f2 (patch)
tree3b5068506ed1bbb5291f8e1b3fe818385f06c47b
parentf5883e8d69135559edbfc4282b08ef569ade16ef (diff)
downloadmariadb-git-cf1f35a1e1b5bed3a086dcbcf11112f739d8e7f2.tar.gz
Backport into build-200906240007-5.1.34sp1
> ------------------------------------------------------------ > revno: 2852.2.1 > revision-id: gni@mysql.com-20090403182157-de6ecrtzlgvpl5mk > parent: timothy.smith@sun.com-20090402083720-b7i3jr4dmvwjakcj > committer: Guangbao Ni <gni@mysql.com> > branch nick: bugteam-5.1-bug42640 > timestamp: Fri 2009-04-03 18:21:57 +0000 > message: > BUG#42640 mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLESmode) > > Mysql server crashes because unsafe statements warning is wrongly elevated to error, > which is set the error status of Diagnostics_area of the thread in THD::binlog_query(). > Yet the caller believes that binary logging shouldn't touch the status, so it will > set the status also later by my_ok(), my_error() or my_message() seperately > according to the execution result of the statement or transaction. > But the status of Diagnostics_area of the thread is allowed to set only once. > > Fixed to clear the error wrongly set by binary logging, but keep the warning message.
-rw-r--r--mysql-test/suite/binlog/r/binlog_stm_ps.result2
-rw-r--r--mysql-test/suite/binlog/r/binlog_unsafe.result128
-rw-r--r--mysql-test/suite/binlog/t/binlog_unsafe.test19
-rw-r--r--mysql-test/suite/rpl/r/rpl_skip_error.result2
-rw-r--r--mysql-test/suite/rpl/r/rpl_stm_loadfile.result4
-rw-r--r--mysql-test/suite/rpl/r/rpl_udf.result8
-rw-r--r--sql/sql_class.cc6
7 files changed, 105 insertions, 64 deletions
diff --git a/mysql-test/suite/binlog/r/binlog_stm_ps.result b/mysql-test/suite/binlog/r/binlog_stm_ps.result
index 1cf7429987e..ea7cc6f16df 100644
--- a/mysql-test/suite/binlog/r/binlog_stm_ps.result
+++ b/mysql-test/suite/binlog/r/binlog_stm_ps.result
@@ -11,7 +11,7 @@ prepare s from "insert into t1 select 100 limit ?";
set @a=100;
execute s using @a;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query # # use `test`; create table t1 (a int)
diff --git a/mysql-test/suite/binlog/r/binlog_unsafe.result b/mysql-test/suite/binlog/r/binlog_unsafe.result
index a0809c79fa2..675c327e9e7 100644
--- a/mysql-test/suite/binlog/r/binlog_unsafe.result
+++ b/mysql-test/suite/binlog/r/binlog_unsafe.result
@@ -10,25 +10,25 @@ INSERT DELAYED INTO t1 VALUES (5);
---- Insert directly ----
INSERT INTO t1 VALUES (@@global.sync_binlog);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t1 VALUES (@@session.insert_id);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t1 VALUES (@@global.auto_increment_increment);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t2 SELECT UUID();
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t2 VALUES (@@session.sql_mode);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t2 VALUES (@@global.init_slave);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
INSERT INTO t2 VALUES (@@hostname);
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
---- Insert from stored procedure ----
CREATE PROCEDURE proc()
BEGIN
@@ -42,13 +42,13 @@ INSERT INTO t2 VALUES (@@hostname);
END|
CALL proc();
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
---- Insert from stored function ----
CREATE FUNCTION func()
RETURNS INT
@@ -66,13 +66,13 @@ SELECT func();
func()
0
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
---- Insert from trigger ----
CREATE TRIGGER trig
BEFORE INSERT ON trigger_table
@@ -88,14 +88,14 @@ INSERT INTO t2 VALUES (@@hostname);
END|
INSERT INTO trigger_table VALUES ('bye.');
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
---- Insert from prepared statement ----
PREPARE p1 FROM 'INSERT INTO t1 VALUES (@@global.sync_binlog)';
PREPARE p2 FROM 'INSERT INTO t1 VALUES (@@session.insert_id)';
@@ -106,25 +106,25 @@ PREPARE p6 FROM 'INSERT INTO t2 VALUES (@@global.init_slave)';
PREPARE p7 FROM 'INSERT INTO t2 VALUES (@@hostname)';
EXECUTE p1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p2;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p3;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p4;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p5;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p6;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
EXECUTE p7;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
---- Insert from nested call of triggers / functions / procedures ----
CREATE PROCEDURE proc1()
INSERT INTO trigger_table VALUES ('ha!')|
@@ -154,13 +154,13 @@ EXECUTE prep6;
func5()
0
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
==== Variables that should *not* be unsafe ====
INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
@@ -195,16 +195,16 @@ DROP TABLE t1, t2, t3, trigger_table, trigger_table2;
CREATE TABLE t1(a INT, b INT, KEY(a), PRIMARY KEY(b));
INSERT INTO t1 SELECT * FROM t1 LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
REPLACE INTO t1 SELECT * FROM t1 LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
UPDATE t1 SET a=1 LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
DELETE FROM t1 LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
CREATE PROCEDURE p1()
BEGIN
INSERT INTO t1 SELECT * FROM t1 LIMIT 1;
@@ -214,10 +214,10 @@ DELETE FROM t1 LIMIT 1;
END|
CALL p1();
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
DROP PROCEDURE p1;
DROP TABLE t1;
DROP TABLE IF EXISTS t1;
@@ -225,7 +225,7 @@ CREATE TABLE t1 (a VARCHAR(100), b VARCHAR(100));
INSERT INTO t1 VALUES ('a','b');
UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
DROP TABLE t1;
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1(i INT PRIMARY KEY);
@@ -234,7 +234,7 @@ CREATE TABLE t3(i INT, ch CHAR(50));
"Should issue message Statement is not safe to log in statement format."
INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
CREATE FUNCTION func6()
RETURNS INT
BEGIN
@@ -246,7 +246,7 @@ END|
"Should issue message Statement is not safe to log in statement format only once"
INSERT INTO t3 VALUES(func6(), UUID());
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
"Check whether SET @@SQL_LOG_BIN = 0/1 doesn't work in substatements"
CREATE FUNCTION fun_check_log_bin() RETURNS INT
BEGIN
@@ -259,7 +259,7 @@ SELECT fun_check_log_bin();
fun_check_log_bin()
100
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
"SQL_LOG_BIN should be ON still"
SHOW VARIABLES LIKE "SQL_LOG_BIN";
Variable_name Value
@@ -309,4 +309,22 @@ DROP FUNCTION func7;
DROP TRIGGER trig;
DROP TABLE t1, t2, t3, trigger_table;
set @@SESSION.SQL_LOG_BIN = @save_log_bin;
+SET @save_sql_mode = @@SESSION.SQL_MODE;
+SET @@SESSION.SQL_MODE = STRICT_ALL_TABLES;
+CREATE TABLE t1(i INT PRIMARY KEY);
+CREATE TABLE t2(i INT PRIMARY KEY);
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+Warnings:
+Note 1592 Statement is not safe to log in statement format.
+INSERT INTO t1 VALUES(@@global.sync_binlog);
+Warnings:
+Note 1592 Statement is not safe to log in statement format.
+UPDATE t1 SET i = 999 LIMIT 1;
+Warnings:
+Note 1592 Statement is not safe to log in statement format.
+DELETE FROM t1 LIMIT 1;
+Warnings:
+Note 1592 Statement is not safe to log in statement format.
+DROP TABLE t1, t2;
+SET @@SESSION.SQL_MODE = @save_sql_mode;
"End of tests"
diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test
index 642dc3a46f7..1b0f0a6c30a 100644
--- a/mysql-test/suite/binlog/t/binlog_unsafe.test
+++ b/mysql-test/suite/binlog/t/binlog_unsafe.test
@@ -46,6 +46,7 @@
# BUG#34732: mysqlbinlog does not print default values for auto_increment variables
# BUG#34768: nondeterministic INSERT using LIMIT logged in stmt mode if binlog_format=mixed
# BUG#41980, SBL, INSERT .. SELECT .. LIMIT = ERROR, even when @@SQL_LOG_BIN is 0
+# BUG#42640: mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLES mode)
#
# ==== Related test cases ====
#
@@ -369,4 +370,22 @@ DROP FUNCTION func7;
DROP TRIGGER trig;
DROP TABLE t1, t2, t3, trigger_table;
set @@SESSION.SQL_LOG_BIN = @save_log_bin;
+
+#
+# For BUG#42640: mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLES mode)
+#
+SET @save_sql_mode = @@SESSION.SQL_MODE;
+SET @@SESSION.SQL_MODE = STRICT_ALL_TABLES;
+
+CREATE TABLE t1(i INT PRIMARY KEY);
+CREATE TABLE t2(i INT PRIMARY KEY);
+
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+INSERT INTO t1 VALUES(@@global.sync_binlog);
+
+UPDATE t1 SET i = 999 LIMIT 1;
+DELETE FROM t1 LIMIT 1;
+
+DROP TABLE t1, t2;
+SET @@SESSION.SQL_MODE = @save_sql_mode;
--echo "End of tests"
diff --git a/mysql-test/suite/rpl/r/rpl_skip_error.result b/mysql-test/suite/rpl/r/rpl_skip_error.result
index b90d8113e8e..205c7785349 100644
--- a/mysql-test/suite/rpl/r/rpl_skip_error.result
+++ b/mysql-test/suite/rpl/r/rpl_skip_error.result
@@ -76,7 +76,7 @@ create table t1(a int primary key);
insert into t1 values (1),(2);
delete from t1 where @@server_id=1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
set sql_mode=strict_trans_tables;
insert into t1 values (7), (8), (9);
[on slave]
diff --git a/mysql-test/suite/rpl/r/rpl_stm_loadfile.result b/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
index d18befe6e4c..72f58268d5f 100644
--- a/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
+++ b/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
@@ -10,7 +10,7 @@ CREATE TABLE test.t1 (a INT, blob_column LONGBLOB, PRIMARY KEY(a));
INSERT INTO test.t1 VALUES(1,'test');
UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=1;
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
create procedure test.p1()
begin
INSERT INTO test.t1 VALUES(2,'test');
@@ -18,7 +18,7 @@ UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=2;
end|
CALL test.p1();
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
SELECT * FROM test.t1 ORDER BY blob_column;
a blob_column
1 abase
diff --git a/mysql-test/suite/rpl/r/rpl_udf.result b/mysql-test/suite/rpl/r/rpl_udf.result
index 79a82b5fbc7..56df5b30d93 100644
--- a/mysql-test/suite/rpl/r/rpl_udf.result
+++ b/mysql-test/suite/rpl/r/rpl_udf.result
@@ -182,19 +182,19 @@ CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=MyISAM;
affected rows: 0
INSERT INTO t1 VALUES(myfunc_int(100), myfunc_double(50.00));
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(10), myfunc_double(5.00));
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(200), myfunc_double(25.00));
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(1), myfunc_double(500.00));
Warnings:
-Warning 1592 Statement is not safe to log in statement format.
+Note 1592 Statement is not safe to log in statement format.
affected rows: 1
SELECT * FROM t1 ORDER BY sum;
sum price
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 7f15508caa1..b73822f5a48 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -3676,7 +3676,11 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
if (sql_log_bin_toplevel && lex->is_stmt_unsafe() &&
variables.binlog_format == BINLOG_FORMAT_STMT)
{
- push_warning(this, MYSQL_ERROR::WARN_LEVEL_WARN,
+ /*
+ A warning can be elevated a error when STRICT sql mode.
+ But we don't want to elevate binlog warning to error here.
+ */
+ push_warning(this, MYSQL_ERROR::WARN_LEVEL_NOTE,
ER_BINLOG_UNSAFE_STATEMENT,
ER(ER_BINLOG_UNSAFE_STATEMENT));
if (!(binlog_flags & BINLOG_FLAG_UNSAFE_STMT_PRINTED))