~jaypipes/drizzle/transaction_log

« back to all changes in this revision

Viewing changes to drizzled/optimizer/key_field.cc

  • Committer: Jay Pipes
  • Date: 2009-12-14 20:25:43 UTC
  • mfrom: (1143.14.75 staging)
  • Revision ID: jpipes@serialcoder-20091214202543-mpslf60zs4d9mo5v
Merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
namespace drizzled
33
33
{
34
34
 
35
 
void optimizer::add_key_part(DYNAMIC_ARRAY *keyuse_array, 
 
35
void optimizer::add_key_part(DYNAMIC_ARRAY *keyuse_array,
36
36
                             optimizer::KeyField *key_field)
37
37
{
38
38
  Field *field= key_field->getField();
39
39
  Table *form= field->table;
40
40
 
41
 
  if (key_field->isEqualityCondition() && 
 
41
  if (key_field->isEqualityCondition() &&
42
42
      ! (key_field->getOptimizeFlags() & KEY_OPTIMIZE_EXISTS))
43
43
  {
44
44
    for (uint32_t key= 0; key < form->sizeKeys(); key++)
102
102
  }
103
103
  if (nested_join_table->on_expr)
104
104
  {
105
 
    add_key_fields(join, 
106
 
                   end, 
107
 
                   and_level, 
108
 
                   nested_join_table->on_expr, 
 
105
    add_key_fields(join,
 
106
                   end,
 
107
                   and_level,
 
108
                   nested_join_table->on_expr,
109
109
                   tables,
110
110
                   sargables);
111
111
  }
113
113
 
114
114
optimizer::KeyField *optimizer::merge_key_fields(optimizer::KeyField *start,
115
115
                                                 optimizer::KeyField *new_fields,
116
 
                                                 optimizer::KeyField *end, 
 
116
                                                 optimizer::KeyField *end,
117
117
                                                 uint32_t and_level)
118
118
{
119
119
  if (start == new_fields)
151
151
          if (old->getValue()->eq(new_fields->getValue(), old->getField()->binary()))
152
152
          {
153
153
            old->setLevel(and_level);
154
 
            old->setOptimizeFlags(((old->getOptimizeFlags() & 
 
154
            old->setOptimizeFlags(((old->getOptimizeFlags() &
155
155
                                    new_fields->getOptimizeFlags() &
156
156
                                    KEY_OPTIMIZE_EXISTS) |
157
157
                                   ((old->getOptimizeFlags() |
161
161
                                     new_fields->rejectNullValues());
162
162
          }
163
163
        }
164
 
        else if (old->isEqualityCondition() && 
 
164
        else if (old->isEqualityCondition() &&
165
165
                 new_fields->isEqualityCondition() &&
166
166
                 old->getValue()->eq_by_collation(new_fields->getValue(),
167
167
                                                  old->getField()->binary(),
169
169
 
170
170
        {
171
171
          old->setLevel(and_level);
172
 
          old->setOptimizeFlags(((old->getOptimizeFlags() & 
 
172
          old->setOptimizeFlags(((old->getOptimizeFlags() &
173
173
                                  new_fields->getOptimizeFlags() &
174
174
                                  KEY_OPTIMIZE_EXISTS) |
175
 
                                 ((old->getOptimizeFlags() | 
 
175
                                 ((old->getOptimizeFlags() |
176
176
                                   new_fields->getOptimizeFlags()) &
177
177
                                 KEY_OPTIMIZE_REF_OR_NULL)));
178
178
          old->setRejectNullValues(old->rejectNullValues() &&
179
179
                                   new_fields->rejectNullValues());
180
180
        }
181
 
        else if (old->isEqualityCondition() && 
 
181
        else if (old->isEqualityCondition() &&
182
182
                 new_fields->isEqualityCondition() &&
183
 
                 ((old->getValue()->const_item() && 
 
183
                 ((old->getValue()->const_item() &&
184
184
                   old->getValue()->is_null()) ||
185
185
                   new_fields->getValue()->is_null()))
186
186
        {
191
191
            Remember the NOT NULL value unless the value does not depend
192
192
            on other tables.
193
193
           */
194
 
          if (! old->getValue()->used_tables() && 
 
194
          if (! old->getValue()->used_tables() &&
195
195
              old->getValue()->is_null())
196
196
          {
197
197
            old->setValue(new_fields->getValue());
413
413
  }
414
414
}
415
415
 
416
 
void optimizer::add_key_fields(JOIN *join, 
 
416
void optimizer::add_key_fields(JOIN *join,
417
417
                               optimizer::KeyField **key_fields,
418
418
                               uint32_t *and_level,
419
419
                               COND *cond,
430
430
      Item *item;
431
431
      while ((item= li++))
432
432
      {
433
 
        add_key_fields(join, 
434
 
                       key_fields, 
435
 
                       and_level, 
436
 
                       item, 
 
433
        add_key_fields(join,
 
434
                       key_fields,
 
435
                       and_level,
 
436
                       item,
437
437
                       usable_tables,
438
438
                       sargables);
439
439
      }
443
443
    else
444
444
    {
445
445
      (*and_level)++;
446
 
      add_key_fields(join, 
447
 
                     key_fields, 
448
 
                     and_level, 
449
 
                     li++, 
 
446
      add_key_fields(join,
 
447
                     key_fields,
 
448
                     and_level,
 
449
                     li++,
450
450
                     usable_tables,
451
451
                     sargables);
452
452
      Item *item;
454
454
      {
455
455
        optimizer::KeyField *start_key_fields= *key_fields;
456
456
        (*and_level)++;
457
 
        add_key_fields(join, 
458
 
                       key_fields, 
459
 
                       and_level, 
460
 
                       item, 
 
457
        add_key_fields(join,
 
458
                       key_fields,
 
459
                       and_level,
 
460
                       item,
461
461
                       usable_tables,
462
462
                       sargables);
463
463
        *key_fields= merge_key_fields(org_key_fields, start_key_fields,
477
477
        ((Item_func*)cond)->functype() == Item_func::TRIG_COND_FUNC)
478
478
    {
479
479
      Item *cond_arg= ((Item_func*)cond)->arguments()[0];
480
 
      if (! join->group_list && 
 
480
      if (! join->group_list &&
481
481
          ! join->order &&
482
482
          join->unit->item &&
483
483
          join->unit->item->substype() == Item_subselect::IN_SUBS &&
484
484
          ! join->unit->is_union())
485
485
      {
486
486
        optimizer::KeyField *save= *key_fields;
487
 
        add_key_fields(join, 
488
 
                       key_fields, 
489
 
                       and_level, 
490
 
                       cond_arg, 
 
487
        add_key_fields(join,
 
488
                       key_fields,
 
489
                       and_level,
 
490
                       cond_arg,
491
491
                       usable_tables,
492
492
                       sargables);
493
493
        /* Indicate that this ref access candidate is for subquery lookup */
502
502
  if (cond->type() != Item::FUNC_ITEM)
503
503
    return;
504
504
  Item_func *cond_func= (Item_func*) cond;
505
 
  switch (cond_func->select_optimize()) 
 
505
  switch (cond_func->select_optimize())
506
506
  {
507
507
  case Item_func::OPTIMIZE_NONE:
508
508
    break;