From: Dmitry Shulga Date: April 15 2011 6:12am Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3527) Bug#11749345 List-Archive: http://lists.mysql.com/commits/135477 X-Bug: 11749345 Message-Id: <201104150612.p3F6CZp3009886@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7569635193922095700==" --===============7569635193922095700== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/5.1-bugteam-bug38813/ based on revid:luis.soares@stripped 3527 Dmitry Shulga 2011-04-15 Fixed bug#11749345 (formerly #38813) - increasing memory consumption when selecting from I_S and views exist, in SP The problem was that when view is being opened its LEX is incorporated into SQL-statement's LEX. The solution is to create temporal LEX when make opening of tables. @ mysql-test/r/information_schema.result Previous result set for explain plan statement was invalid. @ sql/sql_show.cc Added last argument to fill_schema_show_cols_or_idxs() that contains pointer to TABLE_LIST to SHOW. get_all_tables() was modified: created temporal LEX object before processing tables. This LEX objects destroyed before return from get_all_tables() function and clean up data associated with itself. As well temporal arena object was created and assigned as default arena for successive processing. Memory allocated into this arena cleaned up before return from get_all_tables(). modified: mysql-test/r/information_schema.result sql/sql_show.cc === modified file 'mysql-test/r/information_schema.result' --- a/mysql-test/r/information_schema.result 2010-11-30 17:51:25 +0000 +++ b/mysql-test/r/information_schema.result 2011-04-15 06:12:12 +0000 @@ -1342,7 +1342,7 @@ id select_type table type possible_keys 1 SIMPLE tables ALL NULL NULL NULL NULL NULL Open_frm_only; Scanned all databases; Using filesort explain select * from (select table_name from information_schema.tables) as a; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY system NULL NULL NULL NULL 0 const row not found +1 PRIMARY ALL NULL NULL NULL NULL 54 2 DERIVED tables ALL NULL NULL NULL NULL NULL Skip_open_table; Scanned all databases drop view v1; create table t1 (f1 int(11)); === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2010-12-14 09:33:03 +0000 +++ b/sql/sql_show.cc 2011-04-15 06:12:12 +0000 @@ -3021,18 +3021,17 @@ make_table_name_list(THD *thd, Listlex; bool res; LEX_STRING tmp_lex_string, tmp_lex_string1, *db_name, *table_name; enum_sql_command save_sql_command= lex->sql_command; - TABLE_LIST *show_table_list= tables->schema_select_lex->table_list.first; TABLE *table= tables->table; int error= 1; DBUG_ENTER("fill_schema_show"); - lex->all_selects_list= tables->schema_select_lex; /* Restore thd->temporary_tables to be able to process temporary tables(only for 'show index' & 'show columns'). @@ -3300,7 +3299,6 @@ int get_all_tables(THD *thd, TABLE_LIST { LEX *lex= thd->lex; TABLE *table= tables->table; - SELECT_LEX *old_all_select_lex= lex->all_selects_list; enum_sql_command save_sql_command= lex->sql_command; SELECT_LEX *lsel= tables->schema_select_lex; ST_SCHEMA_TABLE *schema_table= tables->schema_table; @@ -3312,21 +3310,42 @@ int get_all_tables(THD *thd, TABLE_LIST List db_names; List_iterator_fast it(db_names); COND *partial_cond= 0; - uint derived_tables= lex->derived_tables; int error= 1; Open_tables_state open_tables_state_backup; - uint8 save_context_analysis_only= lex->context_analysis_only; Query_tables_list query_tables_list_backup; #ifndef NO_EMBEDDED_ACCESS_CHECKS Security_context *sctx= thd->security_ctx; #endif + uint table_open_method; + Query_arena i_s_arena(thd->mem_root, + Query_arena::CONVENTIONAL_EXECUTION), + backup_arena, *old_arena; + LEX *old_lex= thd->lex, temp_lex; DBUG_ENTER("get_all_tables"); - lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; + old_arena= thd->stmt_arena; + // use temporal arena for statement execution + thd->stmt_arena= &i_s_arena; + // and use temporal LEX + thd->lex= &temp_lex; + lex_start(thd); + // copy some attributes from original LEX + lex= thd->lex; + lex->sql_command= old_lex->sql_command; + lex->wild= old_lex->wild; + lex->select_lex.db= old_lex->select_lex.db; + + lex->context_analysis_only= CONTEXT_ANALYSIS_ONLY_VIEW; lex->reset_n_backup_query_tables_list(&query_tables_list_backup); /* + assign temporal arena to THD object and save original arena'a + value for successive restoring + */ + thd->set_n_backup_active_arena(&i_s_arena, &backup_arena); + + /* We should not introduce deadlocks even if we already have some tables open and locked, since we won't lock tables which we will open and will ignore possible name-locks for these tables. @@ -3340,8 +3359,27 @@ int get_all_tables(THD *thd, TABLE_LIST */ if (lsel && lsel->table_list.first) { + LEX_STRING db_name, table_name; + db_name.str= lsel->table_list.first->db; + db_name.length= strlen(db_name.str); + + table_name.str= lsel->table_list.first->table_name; + table_name.length= strlen(table_name.str); + + sel.parent_lex= lex; + + // get table's object to SHOW and pass it to + // fill_schema_show_cols_or_idxs() for processing + if (make_table_list(thd, &sel, &db_name, &table_name)) + goto err; + + TABLE_LIST *show_table_list= sel.table_list.first; + lex->all_selects_list= &sel; + lex->derived_tables= 0; + error= fill_schema_show_cols_or_idxs(thd, tables, schema_table, - &open_tables_state_backup); + &open_tables_state_backup, + show_table_list); goto err; } @@ -3537,11 +3575,19 @@ int get_all_tables(THD *thd, TABLE_LIST error= 0; err: thd->restore_backup_open_tables_state(&open_tables_state_backup); - lex->restore_backup_query_tables_list(&query_tables_list_backup); - lex->derived_tables= derived_tables; - lex->all_selects_list= old_all_select_lex; - lex->context_analysis_only= save_context_analysis_only; - lex->sql_command= save_sql_command; + + /* + Restore original LEX value, statement's arena and THD arena values + */ + lex_end(thd->lex); + thd->lex= old_lex; + + if (i_s_arena.free_list) + i_s_arena.free_items(); + + thd->stmt_arena= old_arena; + thd->restore_active_arena(&i_s_arena, &backup_arena); + DBUG_RETURN(error); } --===============7569635193922095700== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.shulga@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped\ # xgtazi5lc1r82s61 # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug38813/ # testament_sha1: 79776e5f0d1c233cda1d212ceb9cd4a286216964 # timestamp: 2011-04-15 13:12:28 +0700 # base_revision_id: luis.soares@stripped\ # z1ibm50v9qdg1ayz # # Begin bundle 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 --===============7569635193922095700==--