[Maria-developers] Rev 2736: More code cleanups in file:///home/psergey/dev/maria-5.1-table-elim-r11/
At file:///home/psergey/dev/maria-5.1-table-elim-r11/ ------------------------------------------------------------ revno: 2736 revision-id: psergey@askmonty.org-20090818221948-f2mg0szfqrve06f9 parent: psergey@askmonty.org-20090818211810-48v6pb8dt0sqkysi committer: Sergey Petrunya <psergey@askmonty.org> branch nick: maria-5.1-table-elim-r11 timestamp: Wed 2009-08-19 01:19:48 +0300 message: More code cleanups === modified file 'sql/opt_table_elimination.cc' --- a/sql/opt_table_elimination.cc 2009-08-18 21:18:10 +0000 +++ b/sql/opt_table_elimination.cc 2009-08-18 22:19:48 +0000 @@ -295,14 +295,16 @@ bzero(table_deps, sizeof(table_deps)); } - JOIN *join; + JOIN *join; /* Join we're working on */ + /* Array of equality dependencies */ Equality_module *equality_deps; uint n_equality_deps; /* Number of elements in the array */ /* tablenr -> Table_value* mapping. */ Table_value *table_deps[MAX_KEY]; - + + /* Element for the outer join we're attempting to eliminate */ Outer_join_module *outer_join_dep; /* Bitmap of how expressions depend on bits */ @@ -312,13 +314,13 @@ void eliminate_tables(JOIN *join); static bool -eliminate_tables_for_list(Table_elimination *te, +eliminate_tables_for_list(JOIN *join, List<TABLE_LIST> *join_list, table_map tables_in_list, Item *on_expr, table_map tables_used_elsewhere); static -bool check_func_dependency(Table_elimination *te, +bool check_func_dependency(JOIN *join, table_map dep_tables, List_iterator<TABLE_LIST> *it, TABLE_LIST *oj_tbl, @@ -753,61 +755,6 @@ /* - Create an Outer_join_module object for the given outer join - - DESCRIPTION - Outer_join_module objects for children (or further descendants) are always - created before the parents. -*/ - -#if 0 -static -Outer_join_module *get_outer_join_dep(Table_elimination *te, - // TABLE_LIST *outer_join, - table_map deps_map) -{ - Outer_join_module *oj_dep; - if (!(oj_dep= new Outer_join_module(/*outer_join, */my_count_bits(deps_map)))) - return NULL; - - /* - Collect a bitmap fo tables that we depend on, and also set parent pointer - for descendant outer join elements. - */ - Table_map_iterator it(deps_map); - int idx; - while ((idx= it.next_bit()) != Table_map_iterator::BITMAP_END) - { - Table_value *table_dep; - if (!(table_dep= te->table_deps[idx])) - { - /* - We get here only when ON expression had no references to inner tables - and Table_map objects weren't created for them. This is a rare/ - unimportant case so it's ok to do not too efficient searches. - */ - TABLE *table= NULL; - for (TABLE_LIST *tlist= te->join->select_lex->leaf_tables; tlist; - tlist=tlist->next_leaf) - { - if (tlist->table->tablenr == (uint)idx) - { - table=tlist->table; - break; - } - } - DBUG_ASSERT(table); - if (!(table_dep= get_table_value(te, table))) - return NULL; - } - table_dep->outer_join_dep= oj_dep; - } - return oj_dep; -} -#endif - - -/* This is used to analyze expressions in "tbl.col=expr" dependencies so that we can figure out which fields the expression depends on. */ @@ -852,33 +799,39 @@ /* - Setup equality dependencies + Setup inbound dependency relationships for tbl.col=expr equalities SYNOPSIS - setup_equality_deps() + setup_equality_modules_deps() te Table elimination context bound_deps_list OUT Start of linked list of elements that were found to be bound (caller will use this to see if that allows to declare further elements bound) DESCRIPTION + Setup inbound dependency relationships for tbl.col=expr equalities: + - allocate a bitmap where we store such dependencies + - for each "tbl.col=expr" equality, analyze the expr part and find out + which fields it refers to and set appropriate dependencies. + RETURN - + FALSE OK + TRUE Out of memory */ static -bool setup_equality_deps(Table_elimination *te, Module_dep **bound_deps_list) +bool setup_equality_modules_deps(Table_elimination *te, + Module_dep **bound_deps_list) { - DBUG_ENTER("setup_equality_deps"); + DBUG_ENTER("setup_equality_modules_deps"); - if (!te->n_equality_deps) - DBUG_RETURN(TRUE); /* - Count Field_value objects and assign each of them a unique bitmap_offset. + Count Field_value objects and assign each of them a unique bitmap_offset + value. */ uint offset= 0; for (Table_value **tbl_dep=te->table_deps; tbl_dep < te->table_deps + MAX_TABLES; - tbl_dep++) // psergey-todo: Wipe this out altogether + tbl_dep++) { if (*tbl_dep) { @@ -924,7 +877,6 @@ } *bound_deps_list= bound_dep; - DBUG_EXECUTE("test", dbug_print_deps(te); ); DBUG_RETURN(FALSE); } @@ -1016,15 +968,7 @@ if (all_tables & ~used_tables) { /* There are some tables that we probably could eliminate. Try it. */ - //psergey-todo: move allocs to somewhere else. - Table_elimination te(join); - uint m= max(thd->lex->current_select->max_equal_elems,1); - uint max_elems= ((thd->lex->current_select->cond_count+1)*2 + - thd->lex->current_select->between_count)*m + 1 + 10; - if (!(te.equality_deps= new Equality_module[max_elems])) - DBUG_VOID_RETURN; - - eliminate_tables_for_list(&te, join->join_list, all_tables, NULL, + eliminate_tables_for_list(join, join->join_list, all_tables, NULL, used_tables); } DBUG_VOID_RETURN; @@ -1056,7 +1000,7 @@ */ static bool -eliminate_tables_for_list(Table_elimination *te, List<TABLE_LIST> *join_list, +eliminate_tables_for_list(JOIN *join, List<TABLE_LIST> *join_list, table_map list_tables, Item *on_expr, table_map tables_used_elsewhere) { @@ -1074,13 +1018,13 @@ if (tbl->nested_join) { /* This is "... LEFT JOIN (join_nest) ON cond" */ - if (eliminate_tables_for_list(te, + if (eliminate_tables_for_list(join, &tbl->nested_join->join_list, tbl->nested_join->used_tables, tbl->on_expr, outside_used_tables)) { - mark_as_eliminated(te->join, tbl); + mark_as_eliminated(join, tbl); } else all_eliminated= FALSE; @@ -1089,10 +1033,10 @@ { /* This is "... LEFT JOIN tbl ON cond" */ if (!(tbl->table->map & outside_used_tables) && - check_func_dependency(te, tbl->table->map, NULL, tbl, + check_func_dependency(join, tbl->table->map, NULL, tbl, tbl->on_expr)) { - mark_as_eliminated(te->join, tbl); + mark_as_eliminated(join, tbl); } else all_eliminated= FALSE; @@ -1109,7 +1053,7 @@ if (all_eliminated && on_expr && !(list_tables & tables_used_elsewhere)) { it.rewind(); - return check_func_dependency(te, list_tables & ~te->join->eliminated_tables, + return check_func_dependency(join, list_tables & ~join->eliminated_tables, &it, NULL, on_expr); } return FALSE; /* not eliminated */ @@ -1135,18 +1079,27 @@ */ static -bool check_func_dependency(Table_elimination *te, +bool check_func_dependency(JOIN *join, table_map dep_tables, List_iterator<TABLE_LIST> *it, TABLE_LIST *oj_tbl, Item* cond) { uint and_level=0; + Module_dep *bound_modules; + + //psergey-todo: move allocs to somewhere else. + Table_elimination pte(join); + Table_elimination *te= &pte; + uint m= max(join->thd->lex->current_select->max_equal_elems,1); + uint max_elems= ((join->thd->lex->current_select->cond_count+1)*2 + + join->thd->lex->current_select->between_count)*m + 1 + 10; + if (!(te->equality_deps= new Equality_module[max_elems])) + return FALSE; + Equality_module* eq_dep= te->equality_deps; - Module_dep *bound_modules; - - bzero(te->table_deps, sizeof(te->table_deps)); - + + /* Create Table_value objects for all tables we're trying to eliminate */ if (oj_tbl) { if (!get_table_value(te, oj_tbl->table)) @@ -1165,19 +1118,25 @@ } } - /* Extract equalities from the ON expression */ + /* + Analyze the the ON expression and create Equality_module objects and + Field_value objects for their left parts. + */ if (build_eq_deps_for_cond(te, &eq_dep, &and_level, cond, dep_tables) || eq_dep == te->equality_deps) return FALSE; - + te->n_equality_deps= eq_dep - te->equality_deps; - /* Create objects for running wave algorithm */ + if (!(te->outer_join_dep= new Outer_join_module(my_count_bits(dep_tables))) || - setup_equality_deps(te, &bound_modules)) + setup_equality_modules_deps(te, &bound_modules)) { return FALSE; /* OOM, default to non-dependent */ } + + DBUG_EXECUTE("test", dbug_print_deps(te); ); + /* The running wave algorithm itself: */ Value_dep *bound_values= NULL; while (bound_modules) {
participants (1)
-
Sergey Petrunya