List:Commits« Previous MessageNext Message »
From:kgeorge Date:September 18 2006 1:46pm
Subject:bk commit into 5.0 tree (gkodinov:1.2270)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of kgeorge. When kgeorge 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-09-18 16:46:06+03:00, gkodinov@rakia.(none) +7 -0
  Merge gkodinov@stripped:/home/bk/mysql-5.0-opt
  into  rakia.(none):/home/kgeorge/mysql/autopush/B21798-5.0-opt
  MERGE: 1.2244.30.1

  mysql-test/r/subselect.result@stripped, 2006-09-18 16:46:00+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.156.1.1

  mysql-test/t/subselect.test@stripped, 2006-09-18 16:46:00+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.126.1.1

  sql/mysql_priv.h@stripped, 2006-09-18 16:46:01+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.406.2.2

  sql/sql_delete.cc@stripped, 2006-09-18 16:46:01+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.178.1.1

  sql/sql_select.cc@stripped, 2006-09-18 16:46:01+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.447.4.1

  sql/sql_table.cc@stripped, 2006-09-18 16:46:01+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.320.1.1

  sql/sql_update.cc@stripped, 2006-09-18 16:46:01+03:00, gkodinov@rakia.(none) +0 -0
    Auto merged
    MERGE: 1.196.1.1

# 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:	gkodinov
# Host:	rakia.(none)
# Root:	/home/kgeorge/mysql/autopush/B21798-5.0-opt/RESYNC

--- 1.410/sql/mysql_priv.h	2006-09-18 16:46:13 +03:00
+++ 1.411/sql/mysql_priv.h	2006-09-18 16:46:13 +03:00
@@ -710,7 +710,8 @@ bool mysql_xa_recover(THD *thd);
 
 bool check_simple_select();
 
-SORT_FIELD * make_unireg_sortorder(ORDER *order, uint *length);
+SORT_FIELD * make_unireg_sortorder(ORDER *order, uint *length,
+                                  SORT_FIELD *cache);
 int setup_order(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
 		List<Item> &fields, List <Item> &all_fields, ORDER *order);
 int setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,

--- 1.179/sql/sql_delete.cc	2006-09-18 16:46:13 +03:00
+++ 1.180/sql/sql_delete.cc	2006-09-18 16:46:13 +03:00
@@ -167,7 +167,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *
                                                    MYF(MY_FAE | MY_ZEROFILL));
     
       if (!(sortorder= make_unireg_sortorder((ORDER*) order->first,
-                                             &length)) ||
+                                             &length, NULL)) ||
 	  (table->sort.found_records = filesort(thd, table, sortorder, length,
                                                 select, HA_POS_ERROR,
                                                 &examined_rows))

--- 1.454/sql/sql_select.cc	2006-09-18 16:46:13 +03:00
+++ 1.455/sql/sql_select.cc	2006-09-18 16:46:13 +03:00
@@ -1273,7 +1273,10 @@ JOIN::reinit()
     memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables);
 
   if (tmp_join)
+  {
+    subq_cache= tmp_join->subq_cache;
     restore_tmp();
+  }
 
   /* Reset of sum functions */
   if (sum_funcs)
@@ -1435,6 +1438,7 @@ JOIN::exec()
         (curr_join may have been modified during last exection and we need
         to reset it)
       */
+      tmp_join->subq_cache= curr_join->subq_cache;
       curr_join= tmp_join;
     }
     curr_tmp_table= exec_tmp_table1;
@@ -4949,9 +4953,17 @@ make_simple_join(JOIN *join,TABLE *tmp_t
   JOIN_TAB *join_tab;
   DBUG_ENTER("make_simple_join");
 
-  if (!(tableptr=(TABLE**) join->thd->alloc(sizeof(TABLE*))) ||
-      !(join_tab=(JOIN_TAB*) join->thd->alloc(sizeof(JOIN_TAB))))
+  if (join->subq_cache.simplejoin_table_ptr_cache)
+    tableptr= join->subq_cache.simplejoin_table_ptr_cache;
+  else if (!(join->subq_cache.simplejoin_table_ptr_cache= 
+             tableptr=(TABLE**) join->thd->alloc(sizeof(TABLE*))))
     DBUG_RETURN(TRUE);
+  if (join->subq_cache.simplejoin_tab_cache)
+    join_tab= join->subq_cache.simplejoin_tab_cache;
+  else if (!(join->subq_cache.simplejoin_tab_cache= 
+             join_tab=(JOIN_TAB*) join->thd->alloc(sizeof(JOIN_TAB))))
+    DBUG_RETURN(TRUE);
+
   join->join_tab=join_tab;
   join->table=tableptr; tableptr[0]=tmp_table;
   join->tables=1;
@@ -11999,7 +12011,9 @@ create_sort_index(THD *thd, JOIN *join, 
 
   if (test_if_skip_sort_order(tab,order,select_limit,0))
     DBUG_RETURN(0);
-  if (!(sortorder=make_unireg_sortorder(order,&length)))
+  if (!(join->subq_cache.sortorder_cache= 
+        sortorder= make_unireg_sortorder(order,&length,
+                                         join->subq_cache.sortorder_cache)))
     goto err;				/* purecov: inspected */
   /* It's not fatal if the following alloc fails */
   table->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
@@ -12393,7 +12407,8 @@ err:
 }
 
 
-SORT_FIELD *make_unireg_sortorder(ORDER *order, uint *length)
+SORT_FIELD *make_unireg_sortorder(ORDER *order, uint *length,
+                                  SORT_FIELD *cache)
 {
   uint count;
   SORT_FIELD *sort,*pos;
@@ -12402,7 +12417,9 @@ SORT_FIELD *make_unireg_sortorder(ORDER 
   count=0;
   for (ORDER *tmp = order; tmp; tmp=tmp->next)
     count++;
-  pos=sort=(SORT_FIELD*) sql_alloc(sizeof(SORT_FIELD)*(count+1));
+  if (!cache)
+    cache= (SORT_FIELD*) sql_alloc(sizeof(SORT_FIELD)*(count+1));
+  pos= sort= cache;
   if (!pos)
     return 0;
 

--- 1.321/sql/sql_table.cc	2006-09-18 16:46:13 +03:00
+++ 1.322/sql/sql_table.cc	2006-09-18 16:46:13 +03:00
@@ -4049,7 +4049,7 @@ copy_data_between_tables(TABLE *from,TAB
     if (thd->lex->select_lex.setup_ref_array(thd, order_num) ||
 	setup_order(thd, thd->lex->select_lex.ref_pointer_array,
 		    &tables, fields, all_fields, order) ||
-	!(sortorder=make_unireg_sortorder(order, &length)) ||
+	!(sortorder=make_unireg_sortorder(order, &length, NULL)) ||
 	(from->sort.found_records = filesort(thd, from, sortorder, length,
 					     (SQL_SELECT *) 0, HA_POS_ERROR,
 					     &examined_rows)) ==

--- 1.197/sql/sql_update.cc	2006-09-18 16:46:13 +03:00
+++ 1.198/sql/sql_update.cc	2006-09-18 16:46:13 +03:00
@@ -311,7 +311,7 @@ int mysql_update(THD *thd,
 
       table->sort.io_cache = (IO_CACHE *) my_malloc(sizeof(IO_CACHE),
 						    MYF(MY_FAE | MY_ZEROFILL));
-      if (!(sortorder=make_unireg_sortorder(order, &length)) ||
+      if (!(sortorder=make_unireg_sortorder(order, &length, NULL)) ||
           (table->sort.found_records = filesort(thd, table, sortorder, length,
 						select, limit,
 						&examined_rows))

--- 1.159/mysql-test/r/subselect.result	2006-09-18 16:46:13 +03:00
+++ 1.160/mysql-test/r/subselect.result	2006-09-18 16:46:13 +03:00
@@ -3422,3 +3422,29 @@ id	select_type	table	type	possible_keys	
 4	UNION	t12	system	NULL	NULL	NULL	NULL	0	const row not found
 NULL	UNION RESULT	<union2,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 DROP TABLE t1;
+CREATE TABLE t1 (a VARCHAR(250), b INT auto_increment, PRIMARY KEY (b));
+insert into t1 (a) values (FLOOR(rand() * 100));
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+SELECT a, 
+(SELECT REPEAT(' ',250) FROM t1 i1 
+WHERE i1.b=t1.a ORDER BY RAND() LIMIT 1) AS a 
+FROM t1 ORDER BY a LIMIT 5;
+a	a
+0	NULL
+0	NULL
+0	NULL
+0	NULL
+0	NULL
+DROP TABLE t1;

--- 1.127/mysql-test/t/subselect.test	2006-09-18 16:46:13 +03:00
+++ 1.128/mysql-test/t/subselect.test	2006-09-18 16:46:13 +03:00
@@ -2332,3 +2332,29 @@ explain select * from t1 where not exist
   ((select t11.i from t1 t11) union (select t12.i from t1 t12));
 
 DROP TABLE t1;
+
+#
+# Bug#21798: memory leak during query execution with subquery in column 
+#             list using a function
+#
+CREATE TABLE t1 (a VARCHAR(250), b INT auto_increment, PRIMARY KEY (b));
+insert into t1 (a) values (FLOOR(rand() * 100));
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+insert into t1 (a) select FLOOR(rand() * 100) from t1;
+
+SELECT a, 
+       (SELECT REPEAT(' ',250) FROM t1 i1 
+        WHERE i1.b=t1.a ORDER BY RAND() LIMIT 1) AS a 
+FROM t1 ORDER BY a LIMIT 5;
+DROP TABLE t1;
Thread
bk commit into 5.0 tree (gkodinov:1.2270)kgeorge18 Sep