[Commits] Rev 3622: MDEV-4123 fix. in file:///home/bell/maria/bzr/work-maria-5.3-MDEV-4123/

sanja at askmonty.org sanja at askmonty.org
Mon Feb 11 10:56:02 EET 2013


At file:///home/bell/maria/bzr/work-maria-5.3-MDEV-4123/

------------------------------------------------------------
revno: 3622
revision-id: sanja at askmonty.org-20130211085558-cpr7a2jbd5i59e2t
parent: sergii at pisem.net-20130128081223-mp9rsd3t9soz8lly
committer: sanja at askmonty.org
branch nick: work-maria-5.3-MDEV-4123
timestamp: Mon 2013-02-11 10:55:58 +0200
message:
  MDEV-4123 fix.
  
  Missed update_used_tables() call for multi-update values.
-------------- next part --------------
=== modified file 'mysql-test/r/multi_update.result'
--- a/mysql-test/r/multi_update.result	2011-12-11 17:28:05 +0000
+++ b/mysql-test/r/multi_update.result	2013-02-11 08:55:58 +0000
@@ -675,4 +675,55 @@ Warning	1292	Incorrect datetime value: '
 DROP VIEW v1;
 DROP FUNCTION f1;
 DROP TABLE t1;
+#
+# MDEV-4123: Incorrect results after multi-table update or
+# assertion `!table || (!table->read_set ||
+# bitmap_is_set(table->read_set, field_index))' failure 
+#
+DROP TABLE IF EXISTS t1;
+Warnings:
+Note	1051	Unknown table 't1'
+CREATE TABLE t1 (
+id int(10) unsigned NOT NULL,
+level tinyint(3) unsigned NOT NULL,
+PRIMARY KEY (id)
+);
+INSERT INTO t1 VALUES (2519583,1);
+DROP TABLE IF EXISTS t2;
+Warnings:
+Note	1051	Unknown table 't2'
+CREATE TABLE t2 (
+club_id int(11) NOT NULL DEFAULT '0',
+profile_id int(11) NOT NULL DEFAULT '0',
+member_level_id int(11) NOT NULL DEFAULT '0',
+PRIMARY KEY (profile_id,club_id)
+);
+INSERT INTO t2 VALUES (2,2519583,12);
+DROP TABLE IF EXISTS t3;
+Warnings:
+Note	1051	Unknown table 't3'
+CREATE TABLE t3 (
+member_level_id int(11) unsigned NOT NULL DEFAULT '0',
+map_level int(11) unsigned NOT NULL DEFAULT '0',
+map_status int(11) unsigned NOT NULL DEFAULT '0',
+PRIMARY KEY (member_level_id)
+);
+INSERT INTO t3 VALUES (12,12,1);
+CREATE 
+VIEW v1 AS 
+select club_id,profile_id,
+map_level AS member_level_id,map_status AS member_status
+from (t2 tc join t3 map 
+on(((tc.member_level_id = map.member_level_id) and
+(club_id = 2))));
+select level, count(*) as cnt from t1 group by level;
+level	cnt
+1	1
+UPDATE t1 c LEFT JOIN v1 t ON (c.id = t.profile_id AND t.club_id = 2)
+SET c.level = IF (t.member_status IS NULL, 1, IF (t.member_status = 1, 2,3));
+select level, count(*) as cnt from t1 group by level;
+level	cnt
+2	1
+drop view v1;
+drop table t1,t2,t3;
 end of tests

=== modified file 'mysql-test/t/multi_update.test'
--- a/mysql-test/t/multi_update.test	2011-05-27 07:03:55 +0000
+++ b/mysql-test/t/multi_update.test	2013-02-11 08:55:58 +0000
@@ -691,4 +691,51 @@ DROP VIEW v1;
 DROP FUNCTION f1;
 DROP TABLE t1;
 
+--echo #
+--echo # MDEV-4123: Incorrect results after multi-table update or
+--echo # assertion `!table || (!table->read_set ||
+--echo # bitmap_is_set(table->read_set, field_index))' failure 
+--echo #
+
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (
+  id int(10) unsigned NOT NULL,
+  level tinyint(3) unsigned NOT NULL,
+  PRIMARY KEY (id)
+);
+INSERT INTO t1 VALUES (2519583,1);
+
+DROP TABLE IF EXISTS t2;
+CREATE TABLE t2 (
+  club_id int(11) NOT NULL DEFAULT '0',
+  profile_id int(11) NOT NULL DEFAULT '0',
+  member_level_id int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (profile_id,club_id)
+);
+INSERT INTO t2 VALUES (2,2519583,12);
+
+DROP TABLE IF EXISTS t3;
+CREATE TABLE t3 (
+  member_level_id int(11) unsigned NOT NULL DEFAULT '0',
+  map_level int(11) unsigned NOT NULL DEFAULT '0',
+  map_status int(11) unsigned NOT NULL DEFAULT '0',
+  PRIMARY KEY (member_level_id)
+);
+INSERT INTO t3 VALUES (12,12,1);
+
+CREATE 
+    VIEW v1 AS 
+    select club_id,profile_id,
+      map_level AS member_level_id,map_status AS member_status
+    from (t2 tc join t3 map 
+          on(((tc.member_level_id = map.member_level_id) and
+             (club_id = 2))));
+
+select level, count(*) as cnt from t1 group by level;
+UPDATE t1 c LEFT JOIN v1 t ON (c.id = t.profile_id AND t.club_id = 2)
+  SET c.level = IF (t.member_status IS NULL, 1, IF (t.member_status = 1, 2,3));
+select level, count(*) as cnt from t1 group by level;
+drop view v1;
+drop table t1,t2,t3;
+
 --echo end of tests

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2013-01-25 09:20:45 +0000
+++ b/sql/sql_class.h	2013-02-11 08:55:58 +0000
@@ -2833,6 +2833,7 @@ public:
 #else
   void begin_dataset() {}
 #endif
+  virtual void update_used_tables() {}
 };
 
 
@@ -3578,6 +3579,7 @@ public:
   int  do_updates();
   bool send_eof();
   virtual void abort();
+  void update_used_tables();
 };
 
 class my_var : public Sql_alloc  {

=== modified file 'sql/sql_lex.cc'
--- a/sql/sql_lex.cc	2013-01-10 14:40:21 +0000
+++ b/sql/sql_lex.cc	2013-02-11 08:55:58 +0000
@@ -3540,7 +3540,8 @@ void SELECT_LEX::update_used_tables()
   {
     for (ORDER *order= order_list.first; order; order= order->next)
       (*order->item)->update_used_tables();
-  }      
+  }
+  join->result->update_used_tables();
 }
 
 

=== modified file 'sql/sql_update.cc'
--- a/sql/sql_update.cc	2012-11-20 12:57:49 +0000
+++ b/sql/sql_update.cc	2013-02-11 08:55:58 +0000
@@ -1473,6 +1473,15 @@ int multi_update::prepare(List<Item> &no
   DBUG_RETURN(thd->is_fatal_error != 0);
 }
 
+void multi_update::update_used_tables()
+{
+  Item *item;
+  List_iterator_fast<Item> it(*values);
+  while ((item= it++))
+  {
+    item->update_used_tables();
+  }
+}
 
 /*
   Check if table is safe to update on fly



More information about the commits mailing list