~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/optimizer/sel_imerge.cc

  • Committer: Mark Atwood
  • Date: 2011-06-24 02:13:02 UTC
  • mfrom: (2318.6.56 rf)
  • Revision ID: me@mark.atwood.name-20110624021302-y9oiksid220xan9s
mergeĀ lp:~olafvdspek/drizzle/refactor14

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
{}
40
40
 
41
41
 
42
 
int optimizer::SEL_IMERGE::or_sel_tree(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree)
 
42
void optimizer::SEL_IMERGE::or_sel_tree(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree)
43
43
{
44
44
  if (trees_next == trees_end)
45
45
  {
47
47
    uint32_t old_elements= (trees_end - trees);
48
48
    uint32_t old_size= sizeof(optimizer::SEL_TREE**) * old_elements;
49
49
    uint32_t new_size= old_size * realloc_ratio;
50
 
    optimizer::SEL_TREE **new_trees= NULL;
51
 
    if (! (new_trees= (optimizer::SEL_TREE**) param->mem_root->alloc_root(new_size)))
52
 
      return -1;
 
50
    optimizer::SEL_TREE** new_trees= (optimizer::SEL_TREE**) param->mem_root->alloc(new_size);
53
51
    memcpy(new_trees, trees, old_size);
54
52
    trees= new_trees;
55
53
    trees_next= trees + old_elements;
56
54
    trees_end= trees + old_elements * realloc_ratio;
57
55
  }
58
56
  *(trees_next++)= tree;
59
 
  return 0;
60
57
}
61
58
 
62
59
 
63
 
int optimizer::SEL_IMERGE::or_sel_tree_with_checks(optimizer::RangeParameter *param, optimizer::SEL_TREE *new_tree)
 
60
int optimizer::SEL_IMERGE::or_sel_tree_with_checks(optimizer::RangeParameter& param, optimizer::SEL_TREE& new_tree)
64
61
{
65
 
  for (optimizer::SEL_TREE** tree = trees;
66
 
       tree != trees_next;
67
 
       tree++)
 
62
  for (optimizer::SEL_TREE** tree = trees; tree != trees_next; tree++)
68
63
  {
69
 
    if (sel_trees_can_be_ored(*tree, new_tree, param))
 
64
    if (sel_trees_can_be_ored(**tree, new_tree, param))
70
65
    {
71
 
      *tree = tree_or(param, *tree, new_tree);
 
66
      *tree = tree_or(&param, *tree, &new_tree);
72
67
      if (!*tree)
73
68
        return 1;
74
 
      if (((*tree)->type == optimizer::SEL_TREE::MAYBE) ||
75
 
          ((*tree)->type == optimizer::SEL_TREE::ALWAYS))
 
69
      if (((*tree)->type == SEL_TREE::MAYBE) ||
 
70
          ((*tree)->type == SEL_TREE::ALWAYS))
76
71
        return 1;
77
72
      /* optimizer::SEL_TREE::IMPOSSIBLE is impossible here */
78
73
      return 0;
80
75
  }
81
76
 
82
77
  /* New tree cannot be combined with any of existing trees. */
83
 
  return or_sel_tree(param, new_tree);
 
78
  or_sel_tree(&param, &new_tree);
 
79
  return 0;
84
80
}
85
81
 
86
82
 
87
 
int optimizer::SEL_IMERGE::or_sel_imerge_with_checks(optimizer::RangeParameter *param, optimizer::SEL_IMERGE* imerge)
 
83
int optimizer::SEL_IMERGE::or_sel_imerge_with_checks(RangeParameter& param, SEL_IMERGE& imerge)
88
84
{
89
 
  for (optimizer::SEL_TREE** tree= imerge->trees;
90
 
       tree != imerge->trees_next;
91
 
       tree++)
 
85
  for (SEL_TREE** tree= imerge.trees; tree != imerge.trees_next; tree++)
92
86
  {
93
 
    if (or_sel_tree_with_checks(param, *tree))
 
87
    if (or_sel_tree_with_checks(param, **tree))
94
88
      return 1;
95
89
  }
96
90
  return 0;