List:Commits« Previous MessageNext Message »
From:kroki Date:October 3 2006 9:38am
Subject:bk commit into 5.0 tree (kroki:1.2294) BUG#21726
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of tomash. When tomash does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-10-03 13:38:16+04:00, kroki@stripped +9 -0
  Fix for the patch for bug#21726: Incorrect result with multiple
  invocations of LAST_INSERT_ID.
  
  Reding of LAST_INSERT_ID inside stored function wasn't noted by caller,
  and no LAST_INSERT_ID_EVENT was issued for binary log.
  
  The solution is to add THD::last_insert_id_used_bin_log, which is much
  like THD::last_insert_id_used, but is reset only for upper-level
  statements.  This new variable is used to issue LAST_INSERT_ID_EVENT.

  mysql-test/r/rpl_insert_id.result@stripped, 2006-10-03 13:38:12+04:00, kroki@stripped +18 -0
    For bug#21726, add result for statement-based replication of function
    calls.

  mysql-test/t/rpl_insert_id.test@stripped, 2006-10-03 13:38:12+04:00, kroki@stripped +17 -0
    For bug#21726, add test case for statement-based replication of function
    calls.

  sql/item_func.cc@stripped, 2006-10-03 13:38:12+04:00, kroki@stripped +1 -0
    Set THD::last_insert_id_used_bin_log for issuing of LAST_INSERT_ID_EVENT.

  sql/log.cc@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +2 -2
    Issue LAST_INSERT_ID_EVENT if THD::last_insert_id_used_bin_log is set.

  sql/set_var.cc@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +1 -0
    Set THD::last_insert_id_used_bin_log for issuing of LAST_INSERT_ID_EVENT.

  sql/sql_class.cc@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +6 -4
    Initialize THD::last_insert_id_used_bin_log.
    Fix typo, add whitespace.

  sql/sql_class.h@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +11 -2
    Add THD::last_insert_id_used_bin_log.

  sql/sql_parse.cc@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +1 -0
    Reset THD::last_insert_id_used_bin_log for upper-level statements.

  sql/sql_select.cc@stripped, 2006-10-03 13:38:13+04:00, kroki@stripped +4 -4
    Set THD::last_insert_id_used_bin_log for issuing of LAST_INSERT_ID_EVENT.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	kroki
# Host:	moonlight.intranet
# Root:	/home/tomash/src/mysql_ab/mysql-5.0-real-bug21726-fix

--- 1.305/sql/item_func.cc	2006-10-03 13:38:23 +04:00
+++ 1.306/sql/item_func.cc	2006-10-03 13:38:23 +04:00
@@ -3362,6 +3362,7 @@ bool Item_func_last_insert_id::fix_field
         id of the previous statement in THD::current_insert_id.
       */
       thd->last_insert_id_used= TRUE;
+      thd->last_insert_id_used_bin_log= TRUE;
       thd->current_insert_id= thd->last_insert_id;
     }
     null_value= FALSE;

--- 1.194/sql/log.cc	2006-10-03 13:38:23 +04:00
+++ 1.195/sql/log.cc	2006-10-03 13:38:23 +04:00
@@ -1702,7 +1702,7 @@ bool MYSQL_LOG::write(Log_event *event_i
 
     if (thd)
     {
-      if (thd->last_insert_id_used)
+      if (thd->last_insert_id_used_bin_log)
       {
 	Intvar_log_event e(thd,(uchar) LAST_INSERT_ID_EVENT,
 			   thd->current_insert_id);
@@ -1994,7 +1994,7 @@ bool MYSQL_LOG::write(THD *thd,const cha
         tmp_errno=errno;
       strmov(db,thd->db);
     }
-    if (thd->last_insert_id_used)
+    if (thd->last_insert_id_used_bin_log)
     {
       end=strmov(end,",last_insert_id=");
       end=longlong10_to_str((longlong) thd->current_insert_id,end,-10);

--- 1.248/sql/sql_class.cc	2006-10-03 13:38:23 +04:00
+++ 1.249/sql/sql_class.cc	2006-10-03 13:38:23 +04:00
@@ -179,9 +179,9 @@ THD::THD()
    lock_id(&main_lock_id),
    user_time(0), in_sub_stmt(0), global_read_lock(0), is_fatal_error(0),
    rand_used(0), time_zone_used(0),
-   last_insert_id_used(0), insert_id_used(0), clear_next_insert_id(0),
-   in_lock_tables(0), bootstrap(0), derived_tables_processing(FALSE),
-   spcont(NULL)
+   last_insert_id_used(0), last_insert_id_used_bin_log(0), insert_id_used(0),
+   clear_next_insert_id(0), in_lock_tables(0), bootstrap(0),
+   derived_tables_processing(FALSE), spcont(NULL)
 {
   stmt_arena= this;
   thread_stack= 0;
@@ -560,7 +560,7 @@ bool THD::store_globals()
     THD::cleanup_after_query()
 
   DESCRIPTION
-    This function is used to reset thread data to it's default state.
+    This function is used to reset thread data to its default state.
 
   NOTE
     This function is not suitable for setting thread data to some
@@ -568,6 +568,7 @@ bool THD::store_globals()
     different master threads may overwrite data of each other on
     slave.
 */
+
 void THD::cleanup_after_query()
 {
   last_insert_id_used= FALSE;
@@ -581,6 +582,7 @@ void THD::cleanup_after_query()
   /* Reset where. */
   where= THD::DEFAULT_WHERE;
 }
+
 
 /*
   Convert a string to another character set

--- 1.301/sql/sql_class.h	2006-10-03 13:38:23 +04:00
+++ 1.302/sql/sql_class.h	2006-10-03 13:38:23 +04:00
@@ -1340,10 +1340,19 @@ public:
 
   /*
     last_insert_id_used is set when current statement calls
-    LAST_INSERT_ID() or reads @@LAST_INSERT_ID, so that binary log
-    LAST_INSERT_ID_EVENT be generated.
+    LAST_INSERT_ID() or reads @@LAST_INSERT_ID.
   */
   bool	     last_insert_id_used;
+
+  /*
+    last_insert_id_used is set when current statement or any stored
+    function called from this statement calls LAST_INSERT_ID() or
+    reads @@LAST_INSERT_ID, so that binary log LAST_INSERT_ID_EVENT be
+    generated.  Required for statement-based binary log for issuing
+    "SET LAST_INSERT_ID= #" before "SELECT func()", if func() reads
+    LAST_INSERT_ID.
+  */
+  bool	     last_insert_id_used_bin_log;
 
   /*
     insert_id_used is set when current statement updates

--- 1.581/sql/sql_parse.cc	2006-10-03 13:38:23 +04:00
+++ 1.582/sql/sql_parse.cc	2006-10-03 13:38:23 +04:00
@@ -5651,6 +5651,7 @@ void mysql_reset_thd_for_next_command(TH
   thd->free_list= 0;
   thd->select_number= 1;
   thd->query_start_used= thd->insert_id_used=0;
+  thd->last_insert_id_used_bin_log= FALSE;
   thd->is_fatal_error= thd->time_zone_used= 0;
   thd->server_status&= ~ (SERVER_MORE_RESULTS_EXISTS | 
                           SERVER_QUERY_NO_INDEX_USED |

--- 1.459/sql/sql_select.cc	2006-10-03 13:38:23 +04:00
+++ 1.460/sql/sql_select.cc	2006-10-03 13:38:23 +04:00
@@ -8154,11 +8154,11 @@ remove_eq_conds(THD *thd, COND *cond, It
 						     21))))
 	{
           /*
-            Set THD::last_insert_id_used manually, as this statement
-            uses LAST_INSERT_ID() in a sense, and should issue
-            LAST_INSERT_ID_EVENT.
+            Set THD::last_insert_id_used_bin_log manually, as this
+            statement uses LAST_INSERT_ID() in a sense, and should
+            issue LAST_INSERT_ID_EVENT.
           */
-          thd->last_insert_id_used= TRUE;
+          thd->last_insert_id_used_bin_log= TRUE;
 
 	  cond=new_cond;
           /*

--- 1.19/mysql-test/r/rpl_insert_id.result	2006-10-03 13:38:23 +04:00
+++ 1.20/mysql-test/r/rpl_insert_id.result	2006-10-03 13:38:23 +04:00
@@ -272,6 +272,7 @@ DROP TABLE t1, t2;
 DROP PROCEDURE IF EXISTS p1;
 DROP FUNCTION IF EXISTS f1;
 DROP FUNCTION IF EXISTS f2;
+DROP FUNCTION IF EXISTS f3;
 DROP TABLE IF EXISTS t1, t2;
 CREATE TABLE t1 (
 i INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
@@ -295,6 +296,11 @@ RETURN 0;
 END |
 CREATE FUNCTION f2() RETURNS INT NOT DETERMINISTIC
 RETURN LAST_INSERT_ID() |
+CREATE FUNCTION f3() RETURNS INT MODIFIES SQL DATA
+BEGIN
+INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
+RETURN 0;
+END |
 INSERT INTO t1 VALUES (NULL, -1);
 CALL p1();
 SELECT f1();
@@ -307,6 +313,11 @@ INSERT INTO t1 VALUES (NULL, LAST_INSERT
 (NULL, @@LAST_INSERT_ID);
 INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
 UPDATE t1 SET j= -1 WHERE i IS NULL;
+INSERT INTO t1 (i) VALUES (NULL);
+INSERT INTO t1 (i) VALUES (NULL);
+SELECT f3();
+f3()
+0
 SELECT * FROM t1;
 i	j
 1	-1
@@ -327,12 +338,15 @@ i	j
 16	13
 17	-1
 18	14
+19	0
+20	0
 SELECT * FROM t2;
 i
 2
 3
 5
 6
+19
 SELECT * FROM t1;
 i	j
 1	-1
@@ -353,15 +367,19 @@ i	j
 16	13
 17	-1
 18	14
+19	0
+20	0
 SELECT * FROM t2;
 i
 2
 3
 5
 6
+19
 DROP PROCEDURE p1;
 DROP FUNCTION f1;
 DROP FUNCTION f2;
+DROP FUNCTION f3;
 DROP TABLE t1, t2;
 
 # End of 5.0 tests

--- 1.20/mysql-test/t/rpl_insert_id.test	2006-10-03 13:38:23 +04:00
+++ 1.21/mysql-test/t/rpl_insert_id.test	2006-10-03 13:38:23 +04:00
@@ -299,6 +299,7 @@ DROP TABLE t1, t2;
 DROP PROCEDURE IF EXISTS p1;
 DROP FUNCTION IF EXISTS f1;
 DROP FUNCTION IF EXISTS f2;
+DROP FUNCTION IF EXISTS f3;
 DROP TABLE IF EXISTS t1, t2;
 --enable_warnings
 
@@ -328,6 +329,12 @@ END |
 
 CREATE FUNCTION f2() RETURNS INT NOT DETERMINISTIC
   RETURN LAST_INSERT_ID() |
+
+CREATE FUNCTION f3() RETURNS INT MODIFIES SQL DATA
+BEGIN
+  INSERT INTO t2 (i) VALUES (LAST_INSERT_ID());
+  RETURN 0;
+END |
 delimiter ;|
 
 INSERT INTO t1 VALUES (NULL, -1);
@@ -342,6 +349,15 @@ INSERT INTO t1 VALUES (NULL, LAST_INSERT
 INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
 UPDATE t1 SET j= -1 WHERE i IS NULL;
 
+# Test statement-based replication of function calls.
+INSERT INTO t1 (i) VALUES (NULL);
+
+connection master1;
+INSERT INTO t1 (i) VALUES (NULL);
+
+connection master;
+SELECT f3();
+
 SELECT * FROM t1;
 SELECT * FROM t2;
 
@@ -353,6 +369,7 @@ connection master;
 DROP PROCEDURE p1;
 DROP FUNCTION f1;
 DROP FUNCTION f2;
+DROP FUNCTION f3;
 DROP TABLE t1, t2;
 
 

--- 1.164/sql/set_var.cc	2006-10-03 13:38:23 +04:00
+++ 1.165/sql/set_var.cc	2006-10-03 13:38:23 +04:00
@@ -2579,6 +2579,7 @@ byte *sys_var_last_insert_id::value_ptr(
       of the previous statement in THD::current_insert_id.
     */
     thd->last_insert_id_used= TRUE;
+    thd->last_insert_id_used_bin_log= TRUE;
     thd->current_insert_id= thd->last_insert_id;
   }
   return (byte*) &thd->current_insert_id;
Thread
bk commit into 5.0 tree (kroki:1.2294) BUG#21726kroki3 Oct