diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_join_cache.cc | 25 | ||||
-rw-r--r-- | sql/sql_select.cc | 32 |
2 files changed, 42 insertions, 15 deletions
diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 620c52a3f40..0188cc9ac8f 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -219,8 +219,10 @@ void JOIN_CACHE::calc_record_fields() /* The following loop will get inside SJM nests, because data may be unpacked to sjm-inner tables. + We also cover SJM roots (aka bush roots), as their rowids may need to be + saved and restored. */ - for (; tab != join_tab ; tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) + for (; tab != join_tab ; tab= next_linear_tab(join, tab, WITH_BUSH_ROOTS)) { tab->calc_used_field_length(FALSE); flag_fields+= MY_TEST(tab->used_null_fields || tab->used_uneven_bit_fields); @@ -585,7 +587,7 @@ void JOIN_CACHE::create_remaining_fields() CACHE_FIELD **copy_ptr= blob_ptr+data_field_ptr_count; for (tab= start_tab; tab != join_tab; - tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) + tab= next_linear_tab(join, tab, WITH_BUSH_ROOTS)) { MY_BITMAP *rem_field_set; TABLE *table= tab->table; @@ -599,10 +601,21 @@ void JOIN_CACHE::create_remaining_fields() rem_field_set= &table->tmp_set; } - length+= add_table_data_fields_to_join_cache(tab, rem_field_set, - &data_field_count, ©, - &data_field_ptr_count, - ©_ptr); + /* + Do not add columns for SJM nests: + - for SJ-Materialization-Scan, the columns are unpacked to the + source tables. + - for SJ-Materialization-Lookup, equality substitution should + make sure all references are made to the source of data for + making the lookup. + */ + if (!tab->bush_children) + { + length+= add_table_data_fields_to_join_cache(tab, rem_field_set, + &data_field_count, ©, + &data_field_ptr_count, + ©_ptr); + } /* SemiJoinDuplicateElimination: allocate space for rowid if needed */ if (tab->keep_current_rowid) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3b0061fcf8e..1cb57e17a83 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -10263,6 +10263,27 @@ void JOIN_TAB::calc_used_field_length(bool max_fl) MY_BITMAP *read_set= table->read_set; uneven_bit_fields= null_fields= blobs= fields= rec_length=0; + + /* Take into account that DuplicateElimination may need to store rowid */ + uint rowid_add_size= 0; + + if (keep_current_rowid) + { + rowid_add_size= table->file->ref_length; + rec_length += rowid_add_size; + fields++; + } + + if (bush_children) + { + /* + This JOIN_TAB represents an SJ-Materialization nest. The table is + the materialized temptable. For such tables, we may need their rowid + (taken care of above). We don't need any columns. + */ + goto save_and_exit; + } + for (f_ptr=table->field ; (field= *f_ptr) ; f_ptr++) { if (bitmap_is_set(read_set, field->field_index)) @@ -10284,14 +10305,6 @@ void JOIN_TAB::calc_used_field_length(bool max_fl) if (table->maybe_null) rec_length+=sizeof(my_bool); - /* Take into account that DuplicateElimination may need to store rowid */ - uint rowid_add_size= 0; - if (keep_current_rowid) - { - rowid_add_size= table->file->ref_length; - rec_length += rowid_add_size; - fields++; - } if (max_fl) { @@ -10308,7 +10321,8 @@ void JOIN_TAB::calc_used_field_length(bool max_fl) } else if (table->file->stats.mean_rec_length) set_if_smaller(rec_length, table->file->stats.mean_rec_length + rowid_add_size); - + +save_and_exit: used_fields=fields; used_fieldlength=rec_length; used_blobs=blobs; |