[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
Fri Feb 8 14:58:45 EET 2013


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

------------------------------------------------------------
revno: 3622
revision-id: sanja at askmonty.org-20130208125842-idah9vejhvgcvs69
parent: sergii at pisem.net-20130128081223-mp9rsd3t9soz8lly
committer: sanja at askmonty.org
branch nick: work-maria-5.3-MDEV-4123
timestamp: Fri 2013-02-08 14:58:42 +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-08 12:58:42 +0000
@@ -675,4 +675,51 @@ 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 `tc`.`club_id` AS `club_id`,`tc`.`profile_id` AS `profile_id`,`map`.`map_level` AS `member_level_id`,`map`.`map_status` AS `member_status`
+    from (`t2` `tc` join `t3` `map` on(((`tc`.`member_level_id` = `map`.`member_level_id`) and (`tc`.`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-08 12:58:42 +0000
@@ -691,4 +691,48 @@ 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 `tc`.`club_id` AS `club_id`,`tc`.`profile_id` AS `profile_id`,`map`.`map_level` AS `member_level_id`,`map`.`map_status` AS `member_status`
+    from (`t2` `tc` join `t3` `map` on(((`tc`.`member_level_id` = `map`.`member_level_id`) and (`tc`.`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-08 12:58:42 +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();
+  virtual 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-08 12:58:42 +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-08 12:58:42 +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