[Commits] bzr commit into MariaDB 5.1, with Maria 1.5:maria branch (igor:2924) WL#24

Igor Babaev igor at askmonty.org
Sat Sep 11 22:19:05 EEST 2010


#At lp:maria based on revid:igor at askmonty.org-20100901041520-j5jjnux409gbf10c

 2924 Igor Babaev	2010-09-11
      WL#24: post review fixes.
      modified:
        sql/opt_range.cc
        sql/sql_list.h

=== modified file 'sql/opt_range.cc'
--- a/sql/opt_range.cc	2010-08-31 22:45:25 +0000
+++ b/sql/opt_range.cc	2010-09-11 19:18:58 +0000
@@ -262,8 +262,8 @@ public:
   uint8 part;					// Which key part
   uint8 maybe_null;
   /* 
-    The ordinal number the least significant component encountered the ranges
-    of the SEL_ARG tree (the first component has number 1) 
+    The ordinal number the least significant component encountered in
+    the ranges of the SEL_ARG tree (the first component has number 1) 
   */
   uint16 max_part_no; 
   /* 
@@ -851,8 +851,7 @@ static bool eq_tree(SEL_ARG* a,SEL_ARG *
 static SEL_ARG null_element(SEL_ARG::IMPOSSIBLE);
 static bool null_part_in_key(KEY_PART *key_part, const uchar *key,
                              uint length);
-static bool sel_trees_have_common_keys(RANGE_OPT_PARAM* param,
-                                       SEL_TREE *tree1, SEL_TREE *tree2, 
+static bool sel_trees_have_common_keys(SEL_TREE *tree1, SEL_TREE *tree2, 
                                        key_map *common_keys);
 static void eliminate_single_tree_imerges(RANGE_OPT_PARAM *param,
                                           SEL_TREE *tree);
@@ -964,7 +963,7 @@ bool SEL_IMERGE::have_common_keys(RANGE_
        or_tree != bound; or_tree++)
   {
     key_map common_keys;
-    if (sel_trees_have_common_keys(param, *or_tree, tree, &common_keys))
+    if (sel_trees_have_common_keys(*or_tree, tree, &common_keys))
       return TRUE;
   }
   return FALSE;
@@ -988,12 +987,15 @@ bool SEL_IMERGE::have_common_keys(RANGE_
     If this imerge m represent the formula
       RT_1 OR ... OR RT_k
     then the resulting imerge of the function represents the formula
-      (RT_1 AND RT) OR ... (RT_k AND RT)
+      (RT_1 AND RT) OR ... OR (RT_k AND RT)
     The function calls the function and_range_trees to construct the
     range tree representing (RT_i AND RT).
     
   NOTE
-    The function may return an empty imerge without any range trees
+    The function may return an empty imerge without any range trees.
+    This happens when each call of and_range_trees returns an 
+    impossible range tree (SEL_TREE::IMPOSSIBLE).
+    Example: (key1 < 2 AND key2 > 10) AND (key1 > 4 OR key2 < 6).
          
   RETURN
      0  if the operation is a success
@@ -1005,13 +1007,12 @@ int SEL_IMERGE::and_sel_tree(RANGE_OPT_P
 {
   for (SEL_TREE** or_tree= trees; or_tree != trees_next; or_tree++) 
   {
-    SEL_TREE *result= 0;
-    key_map  result_keys;
-    if (!(result= new SEL_TREE()))
+    SEL_TREE *res_or_tree= 0;
+    if (!(res_or_tree= new SEL_TREE()))
       return (-1);
-    if (!and_range_trees(param, *or_tree, tree, result))
+    if (!and_range_trees(param, *or_tree, tree, res_or_tree))
     {
-      if (new_imerge->or_sel_tree(param, result))
+      if (new_imerge->or_sel_tree(param, res_or_tree))
         return (-1);
     }        
   }
@@ -1030,7 +1031,7 @@ int SEL_IMERGE::and_sel_tree(RANGE_OPT_P
       is_last_check_pass OUT <=> no more calls of the function for this imerge
 
   DESCRIPTION
-    The functions performs OR operation on this imerge m and the range part
+    The function performs OR operation on this imerge m and the range part
     of the SEL_TREE tree rt. It always replaces this imerge with the result
     of the operation.
  
@@ -1044,7 +1045,7 @@ int SEL_IMERGE::and_sel_tree(RANGE_OPT_P
     1. In the first mode, when is_first_check_pass==TRUE :
       1.1. If rt must be ored(see the function sel_trees_must_be_ored) with
            some rt_j (there may be only one such range tree in the imerge)
-           then the function produces the imerge representing the formula
+           then the function produces an imerge representing the formula
              RT_1 OR ... OR (RT_j OR RT) OR ... OR RT_k,
            where the tree for (RT_j OR RT) is built by oring the pairs
            of SEL_ARG trees for the corresponding indexes
@@ -1090,7 +1091,8 @@ int SEL_IMERGE::or_sel_tree_with_checks(
     {
       bool must_be_ored= sel_trees_must_be_ored(param, *or_tree, tree,
                                                 ored_keys);
-      if (must_be_ored == is_first_check_pass)      {
+      if (must_be_ored == is_first_check_pass) 
+      {
         result_keys.clear_all();
         result= *or_tree;
         for (uint key_no= 0; key_no < param->keys; key_no++)
@@ -6962,7 +6964,6 @@ void eliminate_single_tree_imerges(RANGE
  
   SYNOPSIS
     sel_trees_have_common_keys()
-      param           Context info for the function
       tree1           SEL_TREE for the first tree
       tree2           SEL_TREE for the second tree
       common_keys OUT bitmap of all indexes with ranges in both trees
@@ -6979,8 +6980,7 @@ void eliminate_single_tree_imerges(RANGE
 */
 
 static
-bool sel_trees_have_common_keys(RANGE_OPT_PARAM* param,
-                                SEL_TREE *tree1, SEL_TREE *tree2, 
+bool sel_trees_have_common_keys(SEL_TREE *tree1, SEL_TREE *tree2, 
                                 key_map *common_keys)
 {
   *common_keys= tree1->keys_map;
@@ -7027,7 +7027,7 @@ bool sel_trees_can_be_ored(RANGE_OPT_PAR
                            key_map *common_keys)
 {
   DBUG_ENTER("sel_trees_can_be_ored");
-  if (!sel_trees_have_common_keys(param, tree1, tree2, common_keys))
+  if (!sel_trees_have_common_keys(tree1, tree2, common_keys))
     DBUG_RETURN(FALSE);
   int key_no;
   key_map::Iterator it(*common_keys);
@@ -7151,7 +7151,7 @@ bool sel_trees_must_be_ored(RANGE_OPT_PA
       key1part1=1 AND key2part1=3 OR key2part1=3 AND key2part2=2 
     for which an index merge can be built. 
 
-    Any final SEL_TREE may contains SEL_ARG trees for which no quick select
+    Any final SEL_TREE may contain SEL_ARG trees for which no quick select
     can be built. Such SEL_ARG trees should be removed from the range part
     before different range scans are evaluated. Such SEL_ARG trees also should
     be removed from all range trees of each index merge before different
@@ -7335,7 +7335,7 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE 
         result->merges.push_back(imerge_from_ranges) ||
         imerge_from_ranges->or_sel_tree(param, rt1) ||
         imerge_from_ranges->or_sel_tree(param, rt2))
-        result= NULL;
+      result= NULL;
   }
   if (!result)
     DBUG_RETURN(result);

=== modified file 'sql/sql_list.h'
--- a/sql/sql_list.h	2010-08-31 22:45:25 +0000
+++ b/sql/sql_list.h	2010-09-11 19:18:58 +0000
@@ -235,14 +235,11 @@ public:
   {
     if (!list->is_empty())
     {
-#if 0
-#else
       if (is_empty())
       {
         *this= *list;
         return;
       }
-#endif
       *last= list->first;
       last= list->last;
       elements+= list->elements;



More information about the commits mailing list