~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/optimizer/key_field.cc

Merge Joe, plus I updated the tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2008-2009 Sun Microsystems, Inc.
 
4
 *  Copyright (C) 2008-2009 Sun Microsystems
5
5
 *
6
6
 *  This program is free software; you can redistribute it and/or modify
7
7
 *  it under the terms of the GNU General Public License as published by
36
36
                             optimizer::KeyField *key_field)
37
37
{
38
38
  Field *field= key_field->getField();
39
 
  Table *form= field->getTable();
 
39
  Table *form= field->table;
40
40
 
41
41
  if (key_field->isEqualityCondition() &&
42
42
      ! (key_field->getOptimizeFlags() & KEY_OPTIMIZE_EXISTS))
51
51
      {
52
52
        if (field->eq(form->key_info[key].key_part[part].field))
53
53
        {
54
 
          optimizer::KeyUse keyuse(field->getTable(),
 
54
          optimizer::KeyUse keyuse(field->table,
55
55
                                   key_field->getValue(),
56
56
                                   key_field->getValue()->used_tables(),
57
57
                                   key,
244
244
  {
245
245
    // Don't remove column IS NULL on a LEFT JOIN table
246
246
    if (! eq_func || (*value)->type() != Item::NULL_ITEM ||
247
 
        ! field->getTable()->maybe_null || field->null_ptr)
 
247
        ! field->table->maybe_null || field->null_ptr)
248
248
      return;                                   // Not a key. Skip it
249
249
    exists_optimize= KEY_OPTIMIZE_EXISTS;
250
250
    assert(num_values == 1);
256
256
    for (uint32_t i= 0; i < num_values; i++)
257
257
    {
258
258
      used_tables|= (value[i])->used_tables();
259
 
      if (! ((value[i])->used_tables() & (field->getTable()->map | RAND_TABLE_BIT)))
 
259
      if (! ((value[i])->used_tables() & (field->table->map | RAND_TABLE_BIT)))
260
260
        optimizable= 1;
261
261
    }
262
262
    if (! optimizable)
263
263
      return;
264
 
    if (! (usable_tables & field->getTable()->map))
 
264
    if (! (usable_tables & field->table->map))
265
265
    {
266
266
      if (! eq_func || (*value)->type() != Item::NULL_ITEM ||
267
 
          ! field->getTable()->maybe_null || field->null_ptr)
 
267
          ! field->table->maybe_null || field->null_ptr)
268
268
        return;                                 // Can't use left join optimize
269
269
      exists_optimize= KEY_OPTIMIZE_EXISTS;
270
270
    }
271
271
    else
272
272
    {
273
 
      JoinTable *stat= field->getTable()->reginfo.join_tab;
 
273
      JoinTable *stat= field->table->reginfo.join_tab;
274
274
      key_map possible_keys= field->key_start;
275
 
      possible_keys&= field->getTable()->keys_in_use_for_query;
 
275
      possible_keys&= field->table->keys_in_use_for_query;
276
276
      stat[0].keys|= possible_keys;             // Add possible keys
277
277
 
278
278
      /*