List:Commits« Previous MessageNext Message »
From:Alexander Nozdrin Date:October 26 2010 11:51am
Subject:bzr push into mysql-trunk-bugfixing branch (alexander.nozdrin:3289 to 3290)
View as plain text  
 3290 Alexander Nozdrin	2010-10-26 [merge]
      Auto-merge from mysql-5.5-bugteam.

    modified:
      mysql-test/r/signal.result
      mysql-test/r/sp-error.result
      mysql-test/r/trigger.result
      mysql-test/suite/rpl/r/rpl_row_trig003.result
      mysql-test/t/sp-error.test
      sql/sp_head.cc
      sql/sp_head.h
 3289 Marc Alff	2010-10-26 [merge]
      Merge mysql-5.5-bugteam --> mysql-trunk-bugfixing

    modified:
      include/my_getopt.h
      mysys/my_getopt.c
=== modified file 'mysql-test/r/signal.result'
--- a/mysql-test/r/signal.result	2010-07-30 15:28:36 +0000
+++ b/mysql-test/r/signal.result	2010-10-26 11:48:08 +0000
@@ -1379,9 +1379,6 @@ MESSAGE_TEXT = msg,
 MYSQL_ERRNO = 1012;
 end $$
 insert into t1 values (1), (2) $$
-Warnings:
-Warning	1012	This trigger SIGNAL a warning, a=1
-Warning	1012	This trigger SIGNAL a warning, a=2
 drop trigger t1_ai $$
 create trigger t1_ai after insert on t1 for each row
 begin
@@ -1416,11 +1413,7 @@ MESSAGE_TEXT = NEW.msg,
 MYSQL_ERRNO = NEW.errno;
 end $$
 insert into t1 set errno=1012, msg='Warning message 1 in trigger' $$
-Warnings:
-Warning	1012	Warning message 1 in trigger
 insert into t1 set errno=1013, msg='Warning message 2 in trigger' $$
-Warnings:
-Warning	1013	Warning message 2 in trigger
 drop table t1 $$
 drop table if exists t1 $$
 drop procedure if exists p1 $$

=== modified file 'mysql-test/r/sp-error.result'
--- a/mysql-test/r/sp-error.result	2010-07-30 15:30:30 +0000
+++ b/mysql-test/r/sp-error.result	2010-10-26 11:50:55 +0000
@@ -1877,9 +1877,6 @@ DROP PROCEDURE p1;
 #
 # Bug#5889: Exit handler for a warning doesn't hide the warning in trigger
 #
-
-# - Case 1
-
 CREATE TABLE t1(a INT, b INT);
 INSERT INTO t1 VALUES (1, 2);
 CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
@@ -1889,40 +1886,13 @@ SET NEW.a = 10;
 SET NEW.a = 99999999999;
 END|
 UPDATE t1 SET b = 20;
-Warnings:
-Warning	1264	Out of range value for column 'a' at row 1
 SHOW WARNINGS;
 Level	Code	Message
-Warning	1264	Out of range value for column 'a' at row 1
 SELECT * FROM t1;
 a	b
 10	20
 DROP TRIGGER t1_bu;
 DROP TABLE t1;
-
-# - Case 2
-
-CREATE TABLE t1(a INT);
-CREATE TABLE t2(b CHAR(1));
-CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
-BEGIN
-INSERT INTO t2 VALUES('ab'); # Produces a warning.
-INSERT INTO t2 VALUES('b');  # Does not produce a warning,
-# previous warning should be cleared.
-END|
-INSERT INTO t1 VALUES(0);
-SHOW WARNINGS;
-Level	Code	Message
-SELECT * FROM t1;
-a
-0
-SELECT * FROM t2;
-b
-a
-b
-DROP TRIGGER t1_bi;
-DROP TABLE t1;
-DROP TABLE t2;
 #
 # Bug#9857: Stored procedures: handler for sqlwarning ignored
 #
@@ -1961,3 +1931,64 @@ Warning	1365	Division by 0
 DROP PROCEDURE p1;
 DROP PROCEDURE p2;
 SET sql_mode = @sql_mode_saved;
+#
+# Bug#55850: Trigger warnings not cleared.
+#
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+DROP PROCEDURE IF EXISTS p1;
+CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
+CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT,
+d SMALLINT, e SMALLINT, f SMALLINT);
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+INSERT INTO t2(a, b, c) VALUES(99999, 99999, 99999);
+CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW
+INSERT INTO t2(d, e, f) VALUES(99999, 99999, 99999);
+CREATE PROCEDURE p1()
+INSERT INTO t1 VALUES(99999, 99999, 99999);
+
+CALL p1();
+Warnings:
+Warning	1264	Out of range value for column 'x' at row 1
+Warning	1264	Out of range value for column 'y' at row 1
+Warning	1264	Out of range value for column 'z' at row 1
+
+SHOW WARNINGS;
+Level	Code	Message
+Warning	1264	Out of range value for column 'x' at row 1
+Warning	1264	Out of range value for column 'y' at row 1
+Warning	1264	Out of range value for column 'z' at row 1
+
+DROP TABLE t1;
+DROP TABLE t2;
+DROP PROCEDURE p1;
+# ----------------------------------------------------------------------
+CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
+CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT NOT NULL);
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+BEGIN
+INSERT INTO t2 VALUES(
+CAST('111111 ' AS SIGNED),
+CAST('222222 ' AS SIGNED),
+NULL);
+END|
+CREATE PROCEDURE p1()
+INSERT INTO t1 VALUES(99999, 99999, 99999);
+
+CALL p1();
+ERROR 23000: Column 'c' cannot be null
+
+SHOW WARNINGS;
+Level	Code	Message
+Warning	1264	Out of range value for column 'x' at row 1
+Warning	1264	Out of range value for column 'y' at row 1
+Warning	1264	Out of range value for column 'z' at row 1
+Warning	1292	Truncated incorrect INTEGER value: '111111 '
+Warning	1264	Out of range value for column 'a' at row 1
+Warning	1292	Truncated incorrect INTEGER value: '222222 '
+Warning	1264	Out of range value for column 'b' at row 1
+Error	1048	Column 'c' cannot be null
+
+DROP TABLE t1;
+DROP TABLE t2;
+DROP PROCEDURE p1;

=== modified file 'mysql-test/r/trigger.result'
--- a/mysql-test/r/trigger.result	2010-08-30 08:38:30 +0000
+++ b/mysql-test/r/trigger.result	2010-10-26 11:50:55 +0000
@@ -1072,8 +1072,6 @@ SELECT @x;
 NULL
 SET @x=2;
 UPDATE t1 SET i1 = @x;
-Warnings:
-Warning	1365	Division by 0
 SELECT @x;
 @x
 NULL
@@ -1085,9 +1083,6 @@ SELECT @x;
 NULL
 SET @x=4;
 UPDATE t1 SET i1 = @x;
-Warnings:
-Warning	1365	Division by 0
-Warning	1365	Division by 0
 SELECT @x;
 @x
 NULL
@@ -1198,8 +1193,6 @@ Warnings:
 Warning	1365	Division by 0
 create trigger t1_bi before insert on t1 for each row set @a:=1/0|
 insert into t1 values(20, 20)|
-Warnings:
-Warning	1365	Division by 0
 drop trigger t1_bi|
 create trigger t1_bi before insert on t1 for each row
 begin
@@ -1218,8 +1211,6 @@ set @a:=1/0;
 end|
 set @check=0, @t4_bi_called=0, @t4_bu_called=0|
 insert into t1 values(30, 30)|
-Warnings:
-Warning	1365	Division by 0
 select @check, @t4_bi_called, @t4_bu_called|
 @check	@t4_bi_called	@t4_bu_called
 2	1	1
@@ -2090,12 +2081,8 @@ SELECT 1 FROM t1 c WHERE
 END//
 SET @bug51650 = 1;
 INSERT IGNORE INTO t2 VALUES();
-Warnings:
-Warning	1329	No data - zero rows fetched, selected, or processed
 INSERT IGNORE INTO t1 SET b = '777';
 INSERT IGNORE INTO t2 SET a = '111';
-Warnings:
-Warning	1329	No data - zero rows fetched, selected, or processed
 SET @bug51650 = 1;
 INSERT IGNORE INTO t2 SET a = '777';
 DROP TRIGGER trg1;
@@ -2177,8 +2164,6 @@ SELECT 'ab' INTO a;
 SELECT 'a' INTO a;
 END|
 INSERT INTO t1 VALUES (1);
-Warnings:
-Warning	1265	Data truncated for column 'a' at row 1
 DROP TRIGGER trg1;
 DROP TABLE t1;
 DROP TRIGGER IF EXISTS trg1;
@@ -2196,20 +2181,12 @@ DECLARE trg2 CHAR;
 SELECT 'ab' INTO trg2;
 END|
 INSERT INTO t1 VALUES (0);
-Warnings:
-Warning	1265	Data truncated for column 'trg1' at row 1
-Warning	1265	Data truncated for column 'trg2' at row 1
 SELECT * FROM t1;
 a
 0
 SHOW WARNINGS;
 Level	Code	Message
 INSERT INTO t1 VALUES (1),(2);
-Warnings:
-Warning	1265	Data truncated for column 'trg1' at row 1
-Warning	1265	Data truncated for column 'trg2' at row 1
-Warning	1265	Data truncated for column 'trg1' at row 1
-Warning	1265	Data truncated for column 'trg2' at row 1
 DROP TRIGGER trg1;
 DROP TRIGGER trg2;
 DROP TABLE t1;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_trig003.result'
--- a/mysql-test/suite/rpl/r/rpl_row_trig003.result	2010-07-30 15:28:36 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_trig003.result	2010-10-26 11:48:08 +0000
@@ -69,15 +69,9 @@ INSERT INTO test.t2 VALUES(NULL,0,'Testi
 UPDATE test.t1 SET b1 = 0 WHERE b1 = 1;
 INSERT INTO test.t2 VALUES(NULL,1,'This is an after update test.', 'If this works, total will not be zero on the master or slave',1.4321,5.221,0,YEAR(NOW()),NOW());
 UPDATE test.t2 SET b1 = 0 WHERE b1 = 1;
-Warnings:
-Error	1329	No data - zero rows fetched, selected, or processed
 INSERT INTO test.t1 VALUES(NULL,1,'add some more test data test.', 'and hope for the best', 3.321,5.221,0,YEAR(NOW()),NOW());
 DELETE FROM test.t1 WHERE id = 1;
-Warnings:
-Error	1329	No data - zero rows fetched, selected, or processed
 DELETE FROM test.t2 WHERE id = 1;
-Warnings:
-Error	1329	No data - zero rows fetched, selected, or processed
 DROP TRIGGER test.t1_bi;
 DROP TRIGGER test.t2_ai;
 DROP TRIGGER test.t1_bu;

=== modified file 'mysql-test/t/sp-error.test'
--- a/mysql-test/t/sp-error.test	2010-07-30 15:28:36 +0000
+++ b/mysql-test/t/sp-error.test	2010-10-26 11:48:08 +0000
@@ -2719,10 +2719,6 @@ DROP PROCEDURE p1;
 --echo # Bug#5889: Exit handler for a warning doesn't hide the warning in trigger
 --echo #
 
---echo
---echo # - Case 1
---echo
-
 CREATE TABLE t1(a INT, b INT);
 INSERT INTO t1 VALUES (1, 2);
 
@@ -2747,36 +2743,6 @@ SELECT * FROM t1;
 DROP TRIGGER t1_bu;
 DROP TABLE t1;
 
---echo
---echo # - Case 2
---echo
-
-CREATE TABLE t1(a INT);
-CREATE TABLE t2(b CHAR(1));
-
-delimiter |;
-
-CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
-BEGIN
-  INSERT INTO t2 VALUES('ab'); # Produces a warning.
-
-  INSERT INTO t2 VALUES('b');  # Does not produce a warning,
-                               # previous warning should be cleared.
-END|
-
-delimiter ;|
-
-INSERT INTO t1 VALUES(0);
-
-SHOW WARNINGS;
-
-SELECT * FROM t1;
-SELECT * FROM t2;
-
-DROP TRIGGER t1_bi;
-DROP TABLE t1;
-DROP TABLE t2;
-
 --echo #
 --echo # Bug#9857: Stored procedures: handler for sqlwarning ignored
 --echo #
@@ -2813,3 +2779,83 @@ SHOW WARNINGS;
 DROP PROCEDURE p1;
 DROP PROCEDURE p2;
 SET sql_mode = @sql_mode_saved;
+
+--echo #
+--echo # Bug#55850: Trigger warnings not cleared.
+--echo #
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+DROP PROCEDURE IF EXISTS p1;
+--enable_warnings
+
+CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
+CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT,
+                d SMALLINT, e SMALLINT, f SMALLINT);
+
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+  INSERT INTO t2(a, b, c) VALUES(99999, 99999, 99999);
+
+CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW
+  INSERT INTO t2(d, e, f) VALUES(99999, 99999, 99999);
+
+CREATE PROCEDURE p1()
+  INSERT INTO t1 VALUES(99999, 99999, 99999);
+
+# What happened before the patch was:
+#  - INSERT INTO t1 added 3 warnings about overflow in 'x', 'y' and 'z' columns;
+#  - t1_bi run and added 3 warnings about overflow in 'a', 'b' and 'c' columns;
+#  - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns;
+# => we had 9 warnings.
+#
+# Now what happens is:
+#  - INSERT INTO t1 adds 3 warnings about overflow in 'x', 'y' and 'z' columns;
+#  - t1_bi adds 3 warnings about overflow in 'a', 'b' and 'c' columns;
+#  - The warnings added by triggers are cleared;
+#  - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns;
+#  - The warnings added by triggers are cleared;
+# => we have 3 warnings.
+
+--echo
+CALL p1();
+
+--echo
+SHOW WARNINGS;
+
+--echo
+DROP TABLE t1;
+DROP TABLE t2;
+DROP PROCEDURE p1;
+
+--echo # ----------------------------------------------------------------------
+
+CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
+CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT NOT NULL);
+
+delimiter |;
+
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+BEGIN
+  INSERT INTO t2 VALUES(
+    CAST('111111 ' AS SIGNED),
+    CAST('222222 ' AS SIGNED),
+    NULL);
+END|
+
+delimiter ;|
+
+CREATE PROCEDURE p1()
+  INSERT INTO t1 VALUES(99999, 99999, 99999);
+
+--echo
+--error ER_BAD_NULL_ERROR
+CALL p1();
+
+--echo
+SHOW WARNINGS;
+
+--echo
+DROP TABLE t1;
+DROP TABLE t2;
+DROP PROCEDURE p1;

=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc	2010-10-22 12:37:58 +0000
+++ b/sql/sp_head.cc	2010-10-26 11:50:55 +0000
@@ -1176,10 +1176,17 @@ find_handler_after_execution(THD *thd, s
 /**
   Execute the routine. The main instruction jump loop is there.
   Assume the parameters already set.
+
+  @param thd                  Thread context.
+  @param merge_da_on_success  Flag specifying if Warning Info should be
+                              propagated to the caller on Completion
+                              Condition or not.
+
   @todo
     - Will write this SP statement into binlog separately
     (TODO: consider changing the condition to "not inside event union")
 
+  @return Error status.
   @retval
     FALSE  on success
   @retval
@@ -1187,7 +1194,7 @@ find_handler_after_execution(THD *thd, s
 */
 
 bool
-sp_head::execute(THD *thd)
+sp_head::execute(THD *thd, bool merge_da_on_success)
 {
   DBUG_ENTER("sp_head::execute");
   char saved_cur_db_name_buf[NAME_LEN+1];
@@ -1481,8 +1488,15 @@ sp_head::execute(THD *thd)
   thd->stmt_arena= old_arena;
   state= EXECUTED;
 
-  /* Restore the caller's original warning information area. */
-  saved_warning_info->merge_with_routine_info(thd, thd->warning_info);
+  /*
+    Restore the caller's original warning information area:
+      - warnings generated during trigger execution should not be
+        propagated to the caller on success;
+      - if there was an exception during execution, warning info should be
+        propagated to the caller in any case.
+  */
+  if (err_status || merge_da_on_success)
+    saved_warning_info->merge_with_routine_info(thd, thd->warning_info);
   thd->warning_info= saved_warning_info;
 
  done:
@@ -1704,7 +1718,7 @@ sp_head::execute_trigger(THD *thd,
 
   thd->spcont= nctx;
 
-  err_status= execute(thd);
+  err_status= execute(thd, FALSE);
 
 err_with_cleanup:
   thd->restore_active_arena(&call_arena, &backup_arena);
@@ -1921,7 +1935,7 @@ sp_head::execute_function(THD *thd, Item
   */
   thd->set_n_backup_active_arena(&call_arena, &backup_arena);
 
-  err_status= execute(thd);
+  err_status= execute(thd, TRUE);
 
   thd->restore_active_arena(&call_arena, &backup_arena);
 
@@ -2154,7 +2168,7 @@ sp_head::execute_procedure(THD *thd, Lis
 #endif
 
   if (!err_status)
-    err_status= execute(thd);
+    err_status= execute(thd, TRUE);
 
   if (save_log_general)
     thd->variables.option_bits &= ~OPTION_LOG_OFF;

=== modified file 'sql/sp_head.h'
--- a/sql/sp_head.h	2010-10-04 15:25:10 +0000
+++ b/sql/sp_head.h	2010-10-26 11:50:55 +0000
@@ -527,7 +527,7 @@ private:
   HASH m_sptabs;
 
   bool
-  execute(THD *thd);
+  execute(THD *thd, bool merge_da_on_success);
 
   /**
     Perform a forward flow analysis in the generated code.

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-trunk-bugfixing branch (alexander.nozdrin:3289 to 3290) Alexander Nozdrin26 Oct