456
456
if (table->on_expr)
457
457
table->on_expr->fix_after_pullout(new_parent, &table->on_expr);
458
if (table->nested_join)
459
fix_list_after_tbl_changes(new_parent, &table->nested_join->join_list);
458
if (table->getNestedJoin())
459
fix_list_after_tbl_changes(new_parent, &table->getNestedJoin()->join_list);
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);
2267
2271
if (table->on_expr)
2269
List<TableList> *nested_join_list= table->nested_join ?
2270
&table->nested_join->join_list : NULL;
2273
List<TableList> *nested_join_list= table->getNestedJoin() ?
2274
&table->getNestedJoin()->join_list : NULL;
2272
2276
We can modify table->on_expr because its old value will
2273
2277
be restored before re-execution of PS/SP.
2859
2863
bool check_interleaving_with_nj(JoinTable *last_tab, JoinTable *next_tab)
2861
TableList *next_emb= next_tab->table->pos_in_table_list->embedding;
2865
TableList *next_emb= next_tab->table->pos_in_table_list->getEmbedding();
2862
2866
Join *join= last_tab->join;
2864
2868
if ((join->cur_embedding_map & ~next_tab->embedding_map).any())
2874
2878
Do update counters for "pairs of brackets" that we've left (marked as
2875
2879
X,Y,Z in the above picture)
2877
for (;next_emb; next_emb= next_emb->embedding)
2881
for (;next_emb; next_emb= next_emb->getEmbedding())
2879
next_emb->nested_join->counter_++;
2880
if (next_emb->nested_join->counter_ == 1)
2883
next_emb->getNestedJoin()->counter_++;
2884
if (next_emb->getNestedJoin()->counter_ == 1)
2883
2887
next_emb is the first table inside a nested join we've "entered". In
2884
2888
the picture above, we're looking at the 'X' bracket. Don't exit yet as
2885
2889
X bracket might have Y pair bracket.
2887
join->cur_embedding_map |= next_emb->nested_join->nj_map;
2891
join->cur_embedding_map |= next_emb->getNestedJoin()->nj_map;
2890
if (next_emb->nested_join->join_list.elements !=
2891
next_emb->nested_join->counter_)
2894
if (next_emb->getNestedJoin()->join_list.elements !=
2895
next_emb->getNestedJoin()->counter_)
2895
2899
We're currently at Y or Z-bracket as depicted in the above picture.
2896
2900
Mark that we've left it and continue walking up the brackets hierarchy.
2898
join->cur_embedding_map &= ~next_emb->nested_join->nj_map;
2902
join->cur_embedding_map &= ~next_emb->getNestedJoin()->nj_map;
3664
3668
embedded= embedding;
3665
3669
if (embedded->on_expr)
3666
3670
update_const_equal_items(embedded->on_expr, tab);
3667
embedding= embedded->embedding;
3671
embedding= embedded->getEmbedding();
3669
3673
while (embedding &&
3670
embedding->nested_join->join_list.head() == embedded);
3674
embedding->getNestedJoin()->join_list.head() == embedded);