diff --git a/mysql-test/r/connect.result b/mysql-test/r/connect.result
index fef813371c81cf68bc4e21d391096f2fb387ca33..2508d751b460f378aaad10f244de360fa4d1fd2e 100644
--- a/mysql-test/r/connect.result
+++ b/mysql-test/r/connect.result
@@ -1,3 +1,4 @@
+drop table if exists t1,t2;
 show tables;
 Tables_in_mysql
 columns_priv
@@ -71,3 +72,8 @@ show tables;
 Tables_in_test
 delete from mysql.user where user=_binary"test";
 flush privileges;
+create table t1 (id integer not null auto_increment primary key);
+create temporary table t2(id integer not null auto_increment primary key);
+set @id := 1;
+delete from t1 where id like @id;
+drop table t1;
diff --git a/mysql-test/r/olap.result b/mysql-test/r/olap.result
index 69871b2110bd8c0bf4b8d0f9701c02b85f576ca5..b5b43cba3c78e3e2f71e52030649dc0421478a3a 100644
--- a/mysql-test/r/olap.result
+++ b/mysql-test/r/olap.result
@@ -555,6 +555,31 @@ IFNULL(a, 'TEST')	COALESCE(b, 'TEST')
 4	TEST
 TEST	TEST
 DROP TABLE t1,t2;
+CREATE TABLE t1 (a INT(10) NOT NULL, b INT(10) NOT NULL);
+INSERT INTO t1 VALUES (1, 1);
+INSERT INTO t1 VALUES (1, 2);
+SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
+a	b	c	count
+1	1	1	1
+1	1	NULL	1
+1	2	1	1
+1	2	NULL	1
+1	NULL	NULL	2
+NULL	NULL	NULL	2
+DROP TABLE t1;
+CREATE TABLE t1 (a int(11) NOT NULL);
+INSERT INTO t1 VALUES (1),(2);
+SELECT * FROM (SELECT a, a + 1, COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
+a	a + 1	COUNT(*)
+1	2	1
+2	3	1
+NULL	NULL	2
+SELECT * FROM (SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
+a	LENGTH(a)	COUNT(*)
+1	1	1
+2	1	1
+NULL	NULL	2
+DROP TABLE t1;
 CREATE TABLE t1(id int, type char(1));
 INSERT INTO t1 VALUES
 (1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
@@ -577,15 +602,3 @@ id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	10	Using filesort
 DROP VIEW v1;
 DROP TABLE t1;
-CREATE TABLE t1 (a INT(10) NOT NULL, b INT(10) NOT NULL);
-INSERT INTO t1 VALUES (1, 1);
-INSERT INTO t1 VALUES (1, 2);
-SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
-a	b	c	count
-1	1	1	1
-1	1	NULL	1
-1	2	1	1
-1	2	NULL	1
-1	NULL	NULL	2
-NULL	NULL	NULL	2
-DROP TABLE t1;
diff --git a/mysql-test/t/connect.test b/mysql-test/t/connect.test
index 64b170970ca26231211b3ee8c5d59df7507dcc54..60ac7b88bbe740a3cd585706567885159ebad8e3 100644
--- a/mysql-test/t/connect.test
+++ b/mysql-test/t/connect.test
@@ -6,6 +6,10 @@
 # This test makes no sense with the embedded server
 --source include/not_embedded.inc
 
+--disable_warnings
+drop table if exists t1,t2;
+--enable_warnings
+
 #connect (con1,localhost,root,,"");
 #show tables;
 connect (con1,localhost,root,,mysql);
@@ -77,4 +81,18 @@ show tables;
 delete from mysql.user where user=_binary"test";
 flush privileges;
 
+#
+# Bug#12517: Clear user variables and replication events before 
+#            closing temp tables in thread cleanup.
+connect (con2,localhost,root,,test);
+connection con2;
+create table t1 (id integer not null auto_increment primary key);
+create temporary table t2(id integer not null auto_increment primary key);
+set @id := 1;
+delete from t1 where id like @id;
+disconnect con2;
+--sleep 5
+connection default;
+drop table t1;
+
 # End of 4.1 tests
diff --git a/mysql-test/t/olap.test b/mysql-test/t/olap.test
index 2e09bc5b3a31a3dd260087bc3308f0e0359f0e87..76c62d14621164fb7fc267386e7a97b93d7d172a 100644
--- a/mysql-test/t/olap.test
+++ b/mysql-test/t/olap.test
@@ -2,10 +2,6 @@
 drop table if exists t1,t2;
 --enable_warnings
 
-set @sav_dpi= @@div_precision_increment;
-set div_precision_increment= 5;
-show variables like 'div_precision_increment';
-
 create table t1 (product varchar(32), country_id int not null, year int, profit int);
 insert into t1  values ( 'Computer', 2,2000, 1200),
 ( 'TV', 1, 1999, 150),
@@ -157,13 +153,6 @@ SELECT DISTINCT SUM(b), COUNT(DISTINCT b), COUNT(*) FROM t1
 SELECT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
 SELECT DISTINCT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
 
-SELECT b, a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
-SELECT DISTINCT b,a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
-
-ALTER TABLE t1 ADD COLUMN c INT;
-SELECT a,b,sum(c) FROM t1 GROUP BY a,b,c WITH ROLLUP;
-SELECT distinct a,b,sum(c) FROM t1 GROUP BY a,b,c WITH ROLLUP;
-
 DROP TABLE t1;
 
 #
@@ -195,7 +184,6 @@ SELECT a, SUM(a) m FROM  t1 GROUP BY a WITH ROLLUP;
 SELECT * FROM ( SELECT a, SUM(a) m FROM  t1 GROUP BY a WITH ROLLUP ) t2;
 
 DROP TABLE t1;
-set div_precision_increment= @sav_dpi;
 
 #
 # Tests for bug #7914: ROLLUP over expressions on temporary table
@@ -251,21 +239,6 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM t2
 DROP TABLE t1,t2;
 
 #
-# Tests for bug #11639: ROLLUP over view executed through filesort
-#
-
-CREATE TABLE t1(id int, type char(1));
-INSERT INTO t1 VALUES
-  (1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
-  (6,"B"),(7,"A"),(8,"C"),(9,"A"),(10,"C");
-CREATE VIEW v1 AS SELECT * FROM t1;
-
-SELECT type FROM t1 GROUP BY type WITH ROLLUP;
-SELECT type FROM v1 GROUP BY type WITH ROLLUP;
-EXPLAIN SELECT type FROM v1 GROUP BY type WITH ROLLUP;
-
-DROP VIEW v1;
-DROP TABLE t1;
 # Test for bug #11543: ROLLUP query with a repeated column in GROUP BY 
 #
 
@@ -277,4 +250,17 @@ SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
 
 DROP TABLE t1;
 
+#
+# Bug #11885:  derived table specified by a subquery with
+#              ROLLUP over expressions on not nullable group by attributes 
+#
+
+CREATE TABLE t1 (a int(11) NOT NULL);
+INSERT INTO t1 VALUES (1),(2);
+
+SELECT * FROM (SELECT a, a + 1, COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
+SELECT * FROM (SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
+
+DROP TABLE t1;
+
 # End of 4.1 tests
diff --git a/ndb/src/ndbapi/SignalSender.cpp b/ndb/src/ndbapi/SignalSender.cpp
index 0a23529dc736d45ebe1a88eef53152c5459f5ff6..a1c80f220413be8691d5c1b35cee1ab2713288ea 100644
--- a/ndb/src/ndbapi/SignalSender.cpp
+++ b/ndb/src/ndbapi/SignalSender.cpp
@@ -266,5 +266,5 @@ SignalSender::execNodeStatus(void* signalSender,
 
 template SimpleSignal* SignalSender::waitFor<WaitForNode>(unsigned, WaitForNode&);
 template SimpleSignal* SignalSender::waitFor<WaitForAny>(unsigned, WaitForAny&);
-template Vector<SimpleSignal*>;
+template class Vector<SimpleSignal*>;
   
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 2ff0413e05eda368f907bfcfe6dce43184294821..2d941e3603c9585558514da7bcee77a8c6bc5693 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -377,6 +377,8 @@ void THD::cleanup(void)
   mysql_ha_flush(this, (TABLE_LIST*) 0,
                  MYSQL_HA_CLOSE_FINAL | MYSQL_HA_FLUSH_ALL);
   hash_free(&handler_tables_hash);
+  delete_dynamic(&user_var_events);
+  hash_free(&user_vars);
   close_temporary_tables(this);
   my_free((char*) variables.time_format, MYF(MY_ALLOW_ZERO_PTR));
   my_free((char*) variables.date_format, MYF(MY_ALLOW_ZERO_PTR));
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index bf06599b25eb5864cfbfdc11c378dcdf137db74d..28afec2f68814182bc5a7512f9e59f0099ef3ca6 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -13043,6 +13043,8 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select)
     The function replaces occurrences of group by fields in expr
     by ref objects for these fields unless they are under aggregate
     functions.
+    The function also corrects value of the the maybe_null attribute
+    for the items of all subexpressions containing group by fields.
 
   IMPLEMENTATION
     The function recursively traverses the tree of the expr expression,
@@ -13053,6 +13055,9 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select)
     This substitution is needed GROUP BY queries with ROLLUP if
     SELECT list contains expressions over group by attributes.
 
+  TODO: Some functions are not null-preserving. For those functions
+    updating of the maybe_null attribute is an overkill. 
+
   EXAMPLES
     SELECT a+1 FROM t1 GROUP BY a WITH ROLLUP
     SELECT SUM(a)+a FROM t1 GROUP BY a WITH ROLLUP 
@@ -13074,6 +13079,7 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
          arg != arg_end; arg++)
     {
       Item *item= *arg;
+      bool arg_changed= FALSE;
       if (item->type() == Item::FIELD_ITEM || item->type() == Item::REF_ITEM)
       {
         ORDER *group_tmp;
@@ -13086,15 +13092,20 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
                                         item->name)))
               return 1;                                 // fatal_error is set
             thd->change_item_tree(arg, new_item);
-            *changed= TRUE;
+            arg_changed= TRUE;
           }
         }
       }
       else if (item->type() == Item::FUNC_ITEM)
       {
-        if (change_group_ref(thd, (Item_func *) item, group_list, changed))
+        if (change_group_ref(thd, (Item_func *) item, group_list, &arg_changed))
           return 1;
       }
+      if (arg_changed)
+      {
+        expr->maybe_null= 1;
+        *changed= TRUE;
+      }
     }
   }
   return 0;
@@ -13157,7 +13168,7 @@ bool JOIN::rollup_init()
     }
     if (item->type() == Item::FUNC_ITEM)
     {
-      bool changed= 0;
+      bool changed= FALSE;
       if (change_group_ref(thd, (Item_func *) item, group_list, &changed))
         return 1;
       /*