From: Tor Didriksen Date: May 18 2011 1:12pm Subject: bzr commit into mysql-trunk branch (tor.didriksen:3373) Bug#12552221 List-Archive: http://lists.mysql.com/commits/137647 X-Bug: 12552221 Message-Id: <20110518131206.CDA7E37B2@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2424717914560576644==" --===============2424717914560576644== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/didrik/repo/next-mr-opt-backporting/ based on revid:tor.didriksen@stripped 3373 Tor Didriksen 2011-05-18 Bug#12552221 - MEMORY LEAK IN UPDATE_REF_AND_KEYS Addendum: Use Mem_root_array<> rather than Array<> for sj_subselects. Remove (the now obsolete) Array class. modified: sql/sql_array.h sql/sql_select.cc sql/sql_select.h === modified file 'sql/sql_array.h' --- a/sql/sql_array.h 2010-11-05 22:14:29 +0000 +++ b/sql/sql_array.h 2011-05-18 13:12:02 +0000 @@ -79,75 +79,4 @@ public: } }; - -/* - Array of pointers to Elem that uses memory from MEM_ROOT - - MEM_ROOT has no realloc() so this is supposed to be used for cases when - reallocations are rare. -*/ - -template class Array -{ - enum {alloc_increment = 16}; - Elem **buffer; - uint n_elements, max_element; -public: - Array(MEM_ROOT *mem_root, uint prealloc=16) - { - buffer= (Elem**)alloc_root(mem_root, prealloc * sizeof(Elem**)); - max_element = buffer? prealloc : 0; - n_elements= 0; - } - - Elem& at(int idx) - { - return *(((Elem*)buffer) + idx); - } - - Elem **front() - { - return buffer; - } - - Elem **back() - { - return buffer + n_elements; - } - - bool append(MEM_ROOT *mem_root, Elem *el) - { - if (n_elements == max_element) - { - Elem **newbuf; - if (!(newbuf= (Elem**)alloc_root(mem_root, (n_elements + alloc_increment)* - sizeof(Elem**)))) - { - return FALSE; - } - memcpy(newbuf, buffer, n_elements*sizeof(Elem*)); - buffer= newbuf; - } - buffer[n_elements++]= el; - return FALSE; - } - - int elements() - { - return n_elements; - } - - void clear() - { - n_elements= 0; - } - - typedef int (*CMP_FUNC)(Elem * const *el1, Elem *const *el2); - - void sort(CMP_FUNC cmp_func) - { - my_qsort(buffer, n_elements, sizeof(Elem*), (qsort_cmp)cmp_func); - } -}; - #endif /* SQL_ARRAY_INCLUDED */ === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-05-18 11:44:39 +0000 +++ b/sql/sql_select.cc 2011-05-18 13:12:02 +0000 @@ -978,7 +978,7 @@ bool resolve_subquery(THD *thd, JOIN *jo /* Register the subquery for further processing in flatten_subqueries() */ select_lex->outer_select()->join-> - sj_subselects.append(thd->mem_root, in_exists_predicate); + sj_subselects.push_back(in_exists_predicate); } else { @@ -4170,11 +4170,11 @@ bool JOIN::flatten_subqueries() Item_exists_subselect **subq_end; DBUG_ENTER("JOIN::flatten_subqueries"); - if (sj_subselects.elements() == 0) + if (sj_subselects.empty()) DBUG_RETURN(FALSE); /* First, convert child join's subqueries. We proceed bottom-up here */ - for (subq= sj_subselects.front(), subq_end= sj_subselects.back(); + for (subq= sj_subselects.begin(), subq_end= sj_subselects.end(); subq != subq_end; subq++) { @@ -4207,7 +4207,7 @@ bool JOIN::flatten_subqueries() { if (tbl->on_expr || tbl->in_outer_join_nest()) { - subq= sj_subselects.front(); + subq= sj_subselects.begin(); arena= thd->activate_stmt_arena_if_needed(&backup); goto skip_conversion; } @@ -4220,11 +4220,14 @@ bool JOIN::flatten_subqueries() - prefer correlated subqueries over uncorrelated; - prefer subqueries that have greater number of outer tables; */ - sj_subselects.sort(subq_sj_candidate_cmp); + my_qsort(sj_subselects.begin(), + sj_subselects.size(), sj_subselects.element_size(), + reinterpret_cast(subq_sj_candidate_cmp)); + // #tables-in-parent-query + #tables-in-subquery < MAX_TABLES /* Replace all subqueries to be flattened with Item_int(1) */ arena= thd->activate_stmt_arena_if_needed(&backup); - for (subq= sj_subselects.front(); + for (subq= sj_subselects.begin(); subq != subq_end && tables + (*subq)->unit->first_select()->join->tables < MAX_TABLES; subq++) @@ -4235,7 +4238,7 @@ bool JOIN::flatten_subqueries() DBUG_RETURN(TRUE); /* purecov: inspected */ } - for (subq= sj_subselects.front(); + for (subq= sj_subselects.begin(); subq != subq_end && tables + (*subq)->unit->first_select()->join->tables < MAX_TABLES; subq++) === modified file 'sql/sql_select.h' --- a/sql/sql_select.h 2011-05-18 11:44:39 +0000 +++ b/sql/sql_select.h 2011-05-18 13:12:02 +0000 @@ -1888,7 +1888,8 @@ public: bool union_part; ///< this subselect is part of union bool optimized; ///< flag to avoid double optimization in EXPLAIN - Array sj_subselects; + // true: No need to run DTORs on pointers. + Mem_root_array sj_subselects; /* Temporary tables used to weed-out semi-join duplicates */ List sj_tmp_tables; @@ -1913,7 +1914,7 @@ public: select_result *result_arg) : keyuse(thd_arg->mem_root), fields_list(fields_arg), - sj_subselects(thd_arg->mem_root, 4) + sj_subselects(thd_arg->mem_root) { init(thd_arg, fields_arg, select_options_arg, result_arg); } --===============2424717914560576644== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped\ # 2syhw2snf8b4bmge # target_branch: file:///export/home/didrik/repo/next-mr-opt-\ # backporting/ # testament_sha1: e1a83526989b8613b511d9043023d7ee353d6fcd # timestamp: 2011-05-18 15:12:06 +0200 # source_branch: file:///export/home/didrik/repo/next-mr-bugfixing/ # base_revision_id: tor.didriksen@stripped\ # nkyqjwh5xh2mg1qm # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWeRCJ4oAAxhfgBCQWHf//3cv 3iC////wYAaXM+adBVVcwdAFCJQxQU8o1NPSbSaD0g0/Uj1B6gAaGhobU9QJSaUwSe00GknpogNA ZAGgDQABzRkxMAExGBGmBBiMEyYBGCRKYiI2BU9Q8KNplBoGgaPUNAAaHNGTEwATEYEaYEGIwTJg EYJJBMgmIaZBDEZTaTyUnpkNPSCbRpGNQuz2GLLgnI1mUwDdX32H9pvxhaX3NCljZ1okFfkliCTQ EYZlsz5iK4rqqltpOvJGSYioFXx/KyqnqXFaExsQx/f5oKfucNDd0iq/hjOWFHKuGEOHTFcTWoRT leGysHXnzUUVd6pcXFnz/N91uGUJWTvOCZgEHdQEk9jwXTVup6cl/kq0iWU72I1a7MICQAGnbbjS D0bNnNg17XP4eVP3fZggz2UXh8JaTAPsAeYj0PssKu80uc03I4sY4rqLUtuZyKVZgAVAEFTFMOPH QFFbOF3PLdRLfVAm0De8LTAZeDmDSTGIZs54PB8ByAnUZECvqf0eRCQVCpRcbCsiURkW5i68RO17 4QdCx72aB7qkdJOCsA+e0stOdABTCWhCSWiYQ0zSR02Ez1FELR8lqFjUahme+Oycrc4K/vsRqYRN eGlx6hqLjMqsdjs6uIGt4uKKyyqVusRjcS2uAJCI5aiTDVNSPTmPPIiUVxrdnK6a2rNBOo1SFIqX ihl7xF4KrPRaWyLamaIQHAombI7iBtvPAfXXNFlD9gxapaXlKvV77qxzVvnpYIwsIhUMBGMkOAuH 390DENxSIuKD+4H4Kn8W65YOGIiTstpFmSJ6FMl8aPFgFY0cQGb5uRsqzMWHGnUGaNGU76UaRUmc zsShKgzn/zePKFWGKGs17HuwA6/cXIQ6Ewi3uK9gxkaZqnJdBC6wZWpqNE2qjSPGHDwCql+A1oxJ xQotZYIkX2DiSYyswlFCClWJy4VJhuGK0UHXyBFWlSo4dVUy+OiNJo8YelVV1TE2WD9DnRtcFlD0 NJohMU5tMXXeyOENIaIbwQbWj0aIqZ0XLoS3wI9DeNkoBq/fSmkmUJIBB/Rqf5r7hZq0fuGaLPyd ochY5kYWwt2F9RoovCe/a9lNZ3x3Z2Y1lpyNLi1A5pJ5jdBgTF90g1i4R2o1HY7Djp6/X4+nyPxA H4K54vzxWm6F/zrQeQsYZDbJPZL8omJpMKivI+IiGT17Fp43/CZ+Z+iMjvEewpsJfTqAVqZ3uPYz /OnQcS7OXUUXrIvkOIxw9uFOQzdWALCxAT8zSJGanOsDljyoeSLdhSjI5lKJwv1umlybtzo/XK2e oA4hnKhBvjxP81clfBVtgdCIBUmtRPo4E9ZU2TGY7Cs3YmrharFEqMtcRatArtxZAEcpMdOZUZ9+ Vkbmd+qpNR5nU1opzWmtvT6uNwI4YZa9P4kPvokgG9/utCfFORXDfZSxy5RpJ5mExWaZpRl3i2Hu NKN5kQ8Dy6WCH3yooPApIBzJHdaGCY+a8l2WRWuBfAXY5nSWtGg0DkGSTUvS3GCarBcBY/ujqjoc IMBvU6XRKDzPURYawVCLdPY3u0e/klD4sAPnueEyaA6FiDdIl3I+ukV8b648MaMheJaLad7iCNsR wlsRuWMlE8jYKPkkG5Ew0BUKtwPQUbSScAMKAI+TYUF5TRx0bbJgDqXMjuVQdxNO9Y5VnmjmIypV fJT02NUGZQ2bzh2XTzY8skNEgCIopykJw6pZ9IihnFInnXIvSUokMmZExyuX7eOhVU9x0OFWAgor F6+JSjQrV9GtAMgBhOVZYPWAX3+uYeSQNdiyZF48J96P+BR0zbpLE56rK49vjoXAUTYdkaUKw+CL kW9eNIeLcb3ADl0HCRbjglX/lKB2r0oD4Ea7uyAsWK9FzzDlrsXU24sGyhyQsT2ywfdYjoGEWdem 0TQtyA07vJATXgE97Dsx9jQ3G2Lka7tQjWX+I4r8NtvBeGIGxs25m8hZGGDL3iJTuEWatuvv5c9Q u6VBdOSkmZUQoe3766C4Xya8o801ll41DkZGIMne68VgUGdCfNoIx0seC29qAR3zPp0+6EI1RVZo ZdJsFoGbDpo0h9aOJYcx1IsNpgQBmL+Z95Nh19DAQyHXEImwVPsYGY/0XckU4UJDkQieKA== --===============2424717914560576644==--