# MDEV-3817: Wrong result with index_merge+index_merge_intersection, InnoDB table, join, AND and OR conditions

Reconcile the fixes from:
#
# guilhem.bichot@oracle.com-20110805143029-ywrzuz15uzgontr0
# Fix for BUG#12698916 - "JOIN QUERY GIVES WRONG RESULT AT 2ND EXEC. OR
# AFTER FLUSH TABLES [-INT VS NULL]"
#
# guilhem.bichot@oracle.com-20111209150650-tzx3ldzxe1yfwji6
# Fix for BUG#12912171 - ASSERTION FAILED: QUICK->HEAD->READ_SET == SAVE_READ_SET
# and
#
and related fixes from: BUG#1006164, MDEV-376:

Now, ROR-merged QUICK_RANGE_SELECT objects make no assumptions about the values
of table->read_set and table->write_set.
Each QUICK_ROR_SELECT has (and had before) its own column bitmap, but now, all 
QUICK_ROR_SELECT's functions that care: reset(), init_ror_merged_scan(), and 
get_next()  will set table->read_set when invoked and restore it back to what 
it was before the call before they return.

This allows to avoid the mess when somebody else modifies table->read_set for 
some reason.
This commit is contained in:
Sergey Petrunya 2012-11-03 12:24:36 +04:00
commit be0be7af47
12 changed files with 358 additions and 15 deletions

View file

@ -480,12 +480,15 @@ int mysql_update(THD *thd,
We can't update table directly; We must first search after all
matching rows before updating the table!
*/
// Verify that table->restore_column_maps_after_mark_index() will work
DBUG_ASSERT(table->read_set == &table->def_read_set);
DBUG_ASSERT(table->write_set == &table->def_write_set);
if (used_index < MAX_KEY && old_covering_keys.is_set(used_index))
table->add_read_columns_used_by_index(used_index);
else
{
table->use_all_columns();
}
/* note: We avoid sorting if we sort on the used index */
if (order && (need_sort || used_key_is_modified))
@ -619,8 +622,11 @@ int mysql_update(THD *thd,
if (error >= 0)
goto err;
}
if (table->key_read)
table->restore_column_maps_after_mark_index();
/*
This restore bitmaps, works for add_read_columns_used_by_index() and
use_all_columns():
*/
table->restore_column_maps_after_mark_index();
}
if (ignore)