← Back to team overview

maria-developers team mailing list archive

Please review: Rev 3275: BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050

 

Hello Sanja, Igor,

Could you please review the below? The new code, Item_cache::walk() passes the
main testsuite and fixed the bug, however I'm concerned it may have
implications that I am not aware of.

----- Forwarded message from Sergey Petrunya <psergey@xxxxxxxxxxxx> -----

From: Sergey Petrunya <psergey@xxxxxxxxxxxx>
To: commits@xxxxxxxxxxx
X-Mailer: mail (GNU Mailutils 1.2)
Date: Tue, 21 Feb 2012 01:50:51 +0400 (GST)
Subject: [Commits] Rev 3275: BUG#920132: Assert trx->n_active_thrs == 1
	failed at que0que.c line 1050 in
	file:///home/psergey/dev2/5.5-look5/

At file:///home/psergey/dev2/5.5-look5/

------------------------------------------------------------
revno: 3275
revision-id: psergey@xxxxxxxxxxxx-20120220215050-ovuvi8qigyidenum
parent: psergey@xxxxxxxxxxxx-20120220210822-6yumujmervtemmwy
committer: Sergey Petrunya <psergey@xxxxxxxxxxxx>
branch nick: 5.5-look5
timestamp: Tue 2012-02-21 01:50:50 +0400
message:
  BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050
  - MySQL 5.5 introduced caching of constant items by means of 
    wrapping them in Item_cache_XXX objects. If a subquery was wrapped
    in this cache, it could end up being pushed down by ICP.
  - The fix is to add Item_cache::walk() which lets ICP to see that 
    the cache item has a subquery inside it, and disable pushdown for this case.
=== modified file 'mysql-test/r/innodb_icp.result'
--- a/mysql-test/r/innodb_icp.result	2012-01-13 14:50:02 +0000
+++ b/mysql-test/r/innodb_icp.result	2012-02-20 21:50:50 +0000
@@ -808,5 +808,34 @@
 1478
 SET optimizer_switch=@save_optimizer_switch;
 DROP TABLE t1,t2;
+#
+# BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050 
+#
+CREATE TABLE t1 ( a INT )
+ENGINE=InnoDB;
+INSERT INTO t1 VALUES (7),(7);
+CREATE TABLE t2 ( b VARCHAR(1) );
+INSERT INTO t2 VALUES ('j'),('v');
+CREATE TABLE t3 (
+c INT, d VARCHAR(1), e VARCHAR(1),
+KEY (d,c)
+) ENGINE=InnoDB;
+INSERT INTO t3
+VALUES (6,'w','w'),
+(1,'v','v'),(7,'s','s'),(4,'l','l'),
+(7,'y','y'),(0,'c','c'),(2,'i','i'),
+(9,'h','h'),(4,'q','q'),(0,'a','a'),
+(9,'v','v'),(1,'u','u'),(3,'s','s'),
+(8,'z','z'),(1,'h','h'),(8,'p','p'),
+(6,'e','e'),(3,'i','i'),(6,'y','y');
+SELECT *
+FROM t1 INNER JOIN t2 INNER JOIN t3
+ON d = b
+WHERE
+NOT EXISTS ( SELECT * FROM t3 )
+OR a = c
+ORDER BY e;
+a	b	c	d	e
+DROP TABLE t1,t2,t3;
 set optimizer_switch=@innodb_icp_tmp;
 set storage_engine= @save_storage_engine;

=== modified file 'mysql-test/t/innodb_icp.test'
--- a/mysql-test/t/innodb_icp.test	2011-07-08 14:46:47 +0000
+++ b/mysql-test/t/innodb_icp.test	2012-02-20 21:50:50 +0000
@@ -12,6 +12,39 @@
 
 --source include/icp_tests.inc
 
+--echo #
+--echo # BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050 
+--echo #
+CREATE TABLE t1 ( a INT )
+  ENGINE=InnoDB;
+INSERT INTO t1 VALUES (7),(7);
+
+CREATE TABLE t2 ( b VARCHAR(1) );
+INSERT INTO t2 VALUES ('j'),('v');
+
+CREATE TABLE t3 (
+  c INT, d VARCHAR(1), e VARCHAR(1),
+  KEY (d,c)
+) ENGINE=InnoDB;
+INSERT INTO t3
+  VALUES (6,'w','w'),
+    (1,'v','v'),(7,'s','s'),(4,'l','l'),
+    (7,'y','y'),(0,'c','c'),(2,'i','i'),
+    (9,'h','h'),(4,'q','q'),(0,'a','a'),
+    (9,'v','v'),(1,'u','u'),(3,'s','s'),
+    (8,'z','z'),(1,'h','h'),(8,'p','p'),
+    (6,'e','e'),(3,'i','i'),(6,'y','y');
+
+SELECT *
+FROM t1 INNER JOIN t2 INNER JOIN t3
+  ON d = b
+WHERE
+  NOT EXISTS ( SELECT * FROM t3 )
+  OR a = c
+ORDER BY e;
+
+DROP TABLE t1,t2,t3;
+
 set optimizer_switch=@innodb_icp_tmp;
 set storage_engine= @save_storage_engine;
 

=== modified file 'sql/item.h'
--- a/sql/item.h	2012-02-15 17:08:08 +0000
+++ b/sql/item.h	2012-02-20 21:50:50 +0000
@@ -3901,6 +3901,12 @@
     return example->is_expensive_processor(arg);
   }
   virtual void set_null();
+  bool walk(Item_processor processor, bool walk_subquery, uchar *arg)
+  {
+    if (example && example->walk(processor, walk_subquery, arg))
+      return TRUE;
+    return (this->*processor)(arg);
+  }
 };
 
 

_______________________________________________
commits mailing list
commits@xxxxxxxxxxx
https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits

----- End forwarded message -----

-- 
BR
 Sergei
-- 
Sergei Petrunia, Software Developer
Monty Program AB, http://askmonty.org
Blog: http://s.petrunia.net/blog