1
0
mirror of https://github.com/MariaDB/server.git synced 2025-10-24 07:13:33 +03:00
Files
mariadb/mysql-test/r
Sergey Glukhov 31a38c0fc5 Bug#50402 Optimizer producing wrong results when using Index Merge on InnoDB
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)
2010-09-16 16:13:53 +04:00
..
2009-02-10 16:27:35 +03:00
2009-08-20 14:30:59 +02:00
2010-02-25 23:13:11 +04:00
2010-03-09 16:09:32 +01:00
2009-08-10 15:46:20 -03:00
2009-06-01 16:00:38 +04:00
2009-02-03 14:45:17 +01:00
2009-05-06 15:00:14 +05:30
2009-09-02 18:58:17 +02:00
2010-06-01 11:54:06 +04:00
2010-04-27 00:46:52 +04:00
2009-03-16 20:54:50 +01:00
2009-12-17 12:06:36 -08:00
2009-02-19 18:22:28 +01:00
2009-11-06 17:54:19 +03:00
2010-01-29 16:54:27 +02:00
2009-02-03 14:45:17 +01:00
2010-09-10 11:52:35 +02:00
2009-10-27 14:09:36 +04:00
2010-04-30 15:27:17 +04:00
2009-11-27 18:10:28 +02:00
2009-06-10 11:58:36 +03:00
2009-02-09 22:00:15 +01:00
2009-02-19 18:24:25 -05:00
2009-02-14 20:14:10 +03:00
2009-12-22 14:38:33 +04:00
2010-06-04 17:10:22 +03:00