~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_select.cc

  • Committer: Brian Aker
  • Date: 2010-07-09 21:43:25 UTC
  • mfrom: (1643.5.1 dr-bug-600624)
  • Revision ID: brian@gaz-20100709214325-4rllc5yyo6bku5sh
Merge Prafulla Tekawade

Show diffs side-by-side

added added

removed removed

Lines of Context:
555
555
                         Select_Lex *select_lex,
556
556
                         vector<optimizer::SargableParam> &sargables)
557
557
{
558
 
  uint  and_level,i,found_eq_constant;
 
558
  uint  and_level,found_eq_constant;
559
559
  optimizer::KeyField *key_fields, *end, *field;
560
560
  uint32_t sz;
561
561
  uint32_t m= max(select_lex->max_equal_elems,(uint32_t)1);
578
578
    substitutions.
579
579
  */
580
580
  sz= sizeof(optimizer::KeyField) *
581
 
      (((session->lex->current_select->cond_count+1) +
 
581
      (((session->lex->current_select->cond_count+1)*2 +
582
582
        session->lex->current_select->between_count)*m+1);
583
583
  if (! (key_fields= (optimizer::KeyField*) session->alloc(sz)))
584
584
    return true;
602
602
      }
603
603
    }
604
604
  }
605
 
  for (i= 0; i < tables; i++)
 
605
  for (uint32_t i= 0; i < tables; i++)
606
606
  {
607
607
    /*
608
608
      Block the creation of keys for inner tables of outer joins.
657
657
    use= save_pos= dynamic_element(keyuse, 0, optimizer::KeyUse*);
658
658
    prev= &key_end;
659
659
    found_eq_constant= 0;
660
 
    for (i= 0; i < keyuse->elements-1; i++, use++)
661
660
    {
662
 
      if (! use->getUsedTables() && use->getOptimizeFlags() != KEY_OPTIMIZE_REF_OR_NULL)
663
 
        use->getTable()->const_key_parts[use->getKey()]|= use->getKeypartMap();
664
 
      if (use->getKey() == prev->getKey() && use->getTable() == prev->getTable())
 
661
      uint32_t i;
 
662
 
 
663
      for (i= 0; i < keyuse->elements-1; i++, use++)
665
664
      {
666
 
        if (prev->getKeypart() + 1 < use->getKeypart() || 
667
 
            ((prev->getKeypart() == use->getKeypart()) && found_eq_constant))
668
 
          continue;                             /* remove */
669
 
      }
670
 
      else if (use->getKeypart() != 0)          // First found must be 0
671
 
        continue;
 
665
        if (! use->getUsedTables() && use->getOptimizeFlags() != KEY_OPTIMIZE_REF_OR_NULL)
 
666
          use->getTable()->const_key_parts[use->getKey()]|= use->getKeypartMap();
 
667
        if (use->getKey() == prev->getKey() && use->getTable() == prev->getTable())
 
668
        {
 
669
          if (prev->getKeypart() + 1 < use->getKeypart() || 
 
670
              ((prev->getKeypart() == use->getKeypart()) && found_eq_constant))
 
671
            continue;                           /* remove */
 
672
        }
 
673
        else if (use->getKeypart() != 0)                // First found must be 0
 
674
          continue;
672
675
 
673
676
#ifdef HAVE_purify
674
 
      /* Valgrind complains about overlapped memcpy when save_pos==use. */
675
 
      if (save_pos != use)
 
677
        /* Valgrind complains about overlapped memcpy when save_pos==use. */
 
678
        if (save_pos != use)
676
679
#endif
677
 
        *save_pos= *use;
678
 
      prev=use;
679
 
      found_eq_constant= ! use->getUsedTables();
680
 
      /* Save ptr to first use */
681
 
      if (! use->getTable()->reginfo.join_tab->keyuse)
682
 
        use->getTable()->reginfo.join_tab->keyuse= save_pos;
683
 
      use->getTable()->reginfo.join_tab->checked_keys.set(use->getKey());
684
 
      save_pos++;
 
680
          *save_pos= *use;
 
681
        prev=use;
 
682
        found_eq_constant= ! use->getUsedTables();
 
683
        /* Save ptr to first use */
 
684
        if (! use->getTable()->reginfo.join_tab->keyuse)
 
685
          use->getTable()->reginfo.join_tab->keyuse= save_pos;
 
686
        use->getTable()->reginfo.join_tab->checked_keys.set(use->getKey());
 
687
        save_pos++;
 
688
      }
 
689
      i= (uint32_t) (save_pos - (optimizer::KeyUse*) keyuse->buffer);
 
690
      set_dynamic(keyuse, (unsigned char*) &key_end, i);
 
691
      keyuse->elements= i;
685
692
    }
686
 
    i= (uint32_t) (save_pos - (optimizer::KeyUse*) keyuse->buffer);
687
 
    set_dynamic(keyuse, (unsigned char*) &key_end, i);
688
 
    keyuse->elements= i;
689
693
  }
690
694
  return false;
691
695
}