doStartIndexScan return code ignored in optimizer::sum_query() for MIN() optimization
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Drizzle |
Fix Released
|
Medium
|
Stewart Smith | ||
7.0 |
Fix Released
|
Medium
|
Stewart Smith |
Bug Description
The optimizer has the ability to replace certain MIN() queries with a constant.
e.g.
CREATE TABLE t1 (a int, index(a));
.... insert data ...
SELECT MIN(a) FROM t1;
Will execute a lookup on the first record of the index and replace that part of the query tree with a constant.
In the code in sum.cc which executes this optimization, although the return code from startIndexScan was being saved, the variable was immediately overwritten by a subsequent call to (e.g.) index_first. This meant that if a StorageEngine did not save the error code and return it on subsequent index calls, we could (at best) crash.
At some point in the past, the InnoDB devs figured this out, and on error in getting the index, set things appropriately so that anywhere we subsequently get a row_search_
MyISAM and ARCHIVE just sets a local variable and does nothing in doStartIndexScan that could possibly fail.
It looks as though this could cause a crash in PBXT and HailDB.
A way to test this is with storage_
Related branches
- Drizzle Developers: Pending requested
-
Diff: 343 lines (+232/-1)6 files modifieddrizzled/optimizer/sum.cc (+10/-0)
plugin/storage_engine_api_tester/cursor_states.cc (+27/-0)
plugin/storage_engine_api_tester/engine_states.cc (+1/-0)
plugin/storage_engine_api_tester/storage_engine_api_tester.cc (+146/-1)
plugin/storage_engine_api_tester/tests/r/min_index_scan_error.result (+35/-0)
plugin/storage_engine_api_tester/tests/t/min_index_scan_error.test (+13/-0)
description: | updated |