← Back to team overview

maria-developers team mailing list archive

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@xxxxxxxxxxxx-20090818221948-f2mg0szfqrve06f9
parent: psergey@xxxxxxxxxxxx-20090818211810-48v6pb8dt0sqkysi
committer: Sergey Petrunya <psergey@xxxxxxxxxxxx>
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)
   {