• Sergey Glukhov's avatar
    Bug#50402 Optimizer producing wrong results when using Index Merge on InnoDB · 31a38c0f
    Sergey Glukhov authored
    Subselect executes twice, at JOIN::optimize stage
    and at JOIN::execute stage. At optimize stage
    Innodb prebuilt struct which is used for the
    retrieval of column values is initialized in.
    ha_innobase::index_read(), prebuilt->sql_stat_start is true.
    After QUICK_ROR_INTERSECT_SELECT finished his job it
    restores read_set/write_set bitmaps with initial values
    and deactivates one of the handlers used by
    QUICK_ROR_INTERSECT_SELECT in JOIN::cleanup
    (it's the case when we reuse original handler as one of
     handlers required by QUICK_ROR_INTERSECT_SELECT object).
    On second subselect execution inactive handler is activated
    in  QUICK_RANGE_SELECT::reset, file->ha_index_init().
    In ha_index_init Innodb prebuilt struct is reinitialized
    with inappropriate read_set/write_set bitmaps. Further
    reinitialization in ha_innobase::index_read() does not
    happen as prebuilt->sql_stat_start is false.
    It leads to partial retrieval of required field values
    and we get a mix of field values from different records
    in the record buffer.
    The fix is to reset
    read_set/write_set bitmaps as these values
    are required for proper intialization of
    internal InnoDB struct which is used for
    the retrieval of column values
    (see build_template(), ha_innodb.cc)
    
    
    mysql-test/include/index_merge_ror_cpk.inc:
      test case
    mysql-test/r/index_merge_innodb.result:
      test case
    mysql-test/r/index_merge_myisam.result:
      test case
    sql/opt_range.cc:
      if ROR merge scan is used we need to reset
      read_set/write_set bitmaps as these values
      are required for proper intialization of
      internal InnoDB struct which is used for
      the retrieval of column values
      (see build_template(), ha_innodb.cc)
    31a38c0f
index_merge_innodb.result 20.6 KB