From: kgeorge Date: September 18 2006 1:46pm Subject: bk commit into 5.0 tree (gkodinov:1.2270) List-Archive: http://lists.mysql.com/commits/12129 Message-Id: <200609181346.k8IDkC4C013611@localhost.localdomain> 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 &fields, List &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 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;