555
555
Select_Lex *select_lex,
556
556
vector<optimizer::SargableParam> &sargables)
558
uint and_level,i,found_eq_constant;
558
uint and_level,found_eq_constant;
559
559
optimizer::KeyField *key_fields, *end, *field;
561
561
uint32_t m= max(select_lex->max_equal_elems,(uint32_t)1);
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)))
657
657
use= save_pos= dynamic_element(keyuse, 0, optimizer::KeyUse*);
659
659
found_eq_constant= 0;
660
for (i= 0; i < keyuse->elements-1; i++, use++)
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())
663
for (i= 0; i < keyuse->elements-1; i++, use++)
666
if (prev->getKeypart() + 1 < use->getKeypart() ||
667
((prev->getKeypart() == use->getKeypart()) && found_eq_constant))
668
continue; /* remove */
670
else if (use->getKeypart() != 0) // First found must be 0
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())
669
if (prev->getKeypart() + 1 < use->getKeypart() ||
670
((prev->getKeypart() == use->getKeypart()) && found_eq_constant))
671
continue; /* remove */
673
else if (use->getKeypart() != 0) // First found must be 0
673
676
#ifdef HAVE_purify
674
/* Valgrind complains about overlapped memcpy when save_pos==use. */
677
/* Valgrind complains about overlapped memcpy when save_pos==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());
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());
689
i= (uint32_t) (save_pos - (optimizer::KeyUse*) keyuse->buffer);
690
set_dynamic(keyuse, (unsigned char*) &key_end, i);
686
i= (uint32_t) (save_pos - (optimizer::KeyUse*) keyuse->buffer);
687
set_dynamic(keyuse, (unsigned char*) &key_end, i);