Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
MDEV-23600 Division by 0 in row_search_with_covering_prefix
The InnoDB index fields store bytes, not characters. Remove some unnecessary conversions from characters to bytes. This also fixes MDEV-20422 and the wrong-result bug MDEV-12486.
- Loading branch information
Showing
10 changed files
with
439 additions
and
683 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| [covering] | ||
| innodb_prefix_index_cluster_optimization=on | ||
|
|
||
| [unoptimized] | ||
| innodb_prefix_index_cluster_optimization=off |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| --source include/have_innodb.inc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,295 @@ | ||
| @@ -4,7 +4,7 @@ | ||
| explain | ||
| select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 const,const 1 Using index | ||
| +1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 const 5 Using where | ||
| flush status; | ||
| select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; | ||
| count(*) | ||
| @@ -14,7 +14,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 1 | ||
| +Handler_read_next 5 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -45,7 +45,7 @@ | ||
| select count(*) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 NULL 1 Using where; Using index | ||
| +1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index | ||
| flush status; | ||
| select count(*) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000; | ||
| @@ -56,7 +56,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 1 | ||
| +Handler_read_next 6 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -66,7 +66,7 @@ | ||
| select l_orderkey, l_linenumber from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 NULL 3 Using where; Using index | ||
| +1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index | ||
| flush status; | ||
| select l_orderkey, l_linenumber from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; | ||
| @@ -79,7 +79,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 3 | ||
| +Handler_read_next 6 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -88,7 +88,7 @@ | ||
| explain | ||
| select min(l_orderkey) from lineitem where l_shipdate='1992-07-01'; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away | ||
| +1 SIMPLE lineitem ref i_l_shipdate i_l_shipdate 4 const 6 Using index | ||
| flush status; | ||
| select min(l_orderkey) from lineitem where l_shipdate='1992-07-01'; | ||
| min(l_orderkey) | ||
| @@ -98,7 +98,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 0 | ||
| +Handler_read_next 6 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -108,7 +108,7 @@ | ||
| select min(l_orderkey) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away | ||
| +1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index | ||
| flush status; | ||
| select min(l_orderkey) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; | ||
| @@ -119,7 +119,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 0 | ||
| +Handler_read_next 6 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -129,7 +129,7 @@ | ||
| select max(l_linenumber) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey=130; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away | ||
| +1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 const 5 Using where | ||
| flush status; | ||
| select max(l_linenumber) from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey=130; | ||
| @@ -140,7 +140,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 1 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 0 | ||
| +Handler_read_next 5 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -152,7 +152,7 @@ | ||
| where l_shipdate='1992-07-01' and l_orderkey=130 | ||
| or l_receiptdate='1992-07-01' and l_orderkey=5603; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 8,8 NULL 2 Using union(i_l_shipdate,i_l_receiptdate); Using where | ||
| +1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 4,4 NULL 9 Using union(i_l_shipdate,i_l_receiptdate); Using where | ||
| flush status; | ||
| select l_orderkey, l_linenumber | ||
| from lineitem use index (i_l_shipdate, i_l_receiptdate) | ||
| @@ -166,10 +166,10 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 2 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 2 | ||
| +Handler_read_next 9 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| -Handler_read_rnd 2 | ||
| +Handler_read_rnd 9 | ||
| Handler_read_rnd_deleted 0 | ||
| Handler_read_rnd_next 0 | ||
| explain | ||
| @@ -178,7 +178,7 @@ | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 | ||
| or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 8,8 NULL 3 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where | ||
| +1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 4,4 NULL 9 Using union(i_l_shipdate,i_l_receiptdate); Using where | ||
| flush status; | ||
| select l_orderkey, l_linenumber | ||
| from lineitem use index (i_l_shipdate, i_l_receiptdate) | ||
| @@ -193,10 +193,10 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 2 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 3 | ||
| +Handler_read_next 9 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| -Handler_read_rnd 3 | ||
| +Handler_read_rnd 9 | ||
| Handler_read_rnd_deleted 0 | ||
| Handler_read_rnd_next 0 | ||
| explain | ||
| @@ -204,7 +204,7 @@ | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 | ||
| or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem index_merge PRIMARY,i_l_shipdate,i_l_receiptdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate,i_l_receiptdate 8,8 NULL 3 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where | ||
| +1 SIMPLE lineitem index_merge PRIMARY,i_l_shipdate,i_l_receiptdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate,PRIMARY,i_l_receiptdate,PRIMARY 4,4,4,4 NULL 2 Using union(intersect(i_l_shipdate,PRIMARY),intersect(i_l_receiptdate,PRIMARY)); Using where | ||
| flush status; | ||
| select l_orderkey, l_linenumber from lineitem | ||
| where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 | ||
| @@ -218,7 +218,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 2 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 3 | ||
| +Handler_read_next 9 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 3 | ||
| @@ -228,7 +228,7 @@ | ||
| select max(l_orderkey) from lineitem | ||
| where l_partkey between 1 and 10 group by l_partkey; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem range i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 NULL # Using where; Using index for group-by | ||
| +1 SIMPLE lineitem range i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 NULL # Using where; Using index | ||
| flush status; | ||
| select max(l_orderkey) from lineitem | ||
| where l_partkey between 1 and 10 group by l_partkey; | ||
| @@ -246,9 +246,9 @@ | ||
| show status like 'handler_read%'; | ||
| Variable_name Value | ||
| Handler_read_first 0 | ||
| -Handler_read_key 21 | ||
| -Handler_read_last 1 | ||
| -Handler_read_next 0 | ||
| +Handler_read_key 1 | ||
| +Handler_read_last 0 | ||
| +Handler_read_next 294 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -258,7 +258,7 @@ | ||
| select max(l_orderkey) from lineitem | ||
| where l_suppkey in (1,4) group by l_suppkey; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE lineitem range i_l_suppkey i_l_suppkey 5 NULL # Using where; Using index for group-by | ||
| +1 SIMPLE lineitem range i_l_suppkey i_l_suppkey 5 NULL # Using where; Using index | ||
| flush status; | ||
| select max(l_orderkey) from lineitem | ||
| where l_suppkey in (1,4) group by l_suppkey; | ||
| @@ -268,9 +268,9 @@ | ||
| show status like 'handler_read%'; | ||
| Variable_name Value | ||
| Handler_read_first 0 | ||
| -Handler_read_key 6 | ||
| -Handler_read_last 1 | ||
| -Handler_read_next 0 | ||
| +Handler_read_key 2 | ||
| +Handler_read_last 0 | ||
| +Handler_read_next 1230 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -286,7 +286,7 @@ | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| 1 SIMPLE part range i_p_retailprice i_p_retailprice 9 NULL # Using where; Using index | ||
| 1 SIMPLE orders ref PRIMARY,i_o_orderdate i_o_orderdate 4 const # Using index | ||
| -1 SIMPLE lineitem ref i_l_partkey i_l_partkey 9 dbt3_s001.part.p_partkey,dbt3_s001.orders.o_orderkey # Using index | ||
| +1 SIMPLE lineitem ref i_l_partkey i_l_partkey 5 dbt3_s001.part.p_partkey # Using where; Using index | ||
| flush status; | ||
| select o_orderkey, p_partkey | ||
| from part use index (i_p_retailprice), | ||
| @@ -300,7 +300,7 @@ | ||
| Handler_read_first 0 | ||
| Handler_read_key 3 | ||
| Handler_read_last 0 | ||
| -Handler_read_next 3 | ||
| +Handler_read_next 26 | ||
| Handler_read_prev 0 | ||
| Handler_read_retry 0 | ||
| Handler_read_rnd 0 | ||
| @@ -317,8 +317,8 @@ | ||
| select * from t0, part ignore index (primary) | ||
| where p_partkey=t0.a and p_size=1; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE t0 ALL NULL NULL NULL NULL 5 Using where | ||
| -1 SIMPLE part eq_ref i_p_size i_p_size 9 const,dbt3_s001.t0.a 1 | ||
| +1 SIMPLE t0 ALL NULL NULL NULL NULL 5 | ||
| +1 SIMPLE part ref i_p_size i_p_size 5 const 5 Using index condition | ||
| select * from t0, part ignore index (primary) | ||
| where p_partkey=t0.a and p_size=1; | ||
| a p_partkey p_name p_mfgr p_brand p_type p_size p_container p_retailprice p_comment | ||
| @@ -495,7 +495,7 @@ | ||
| select * from t1, t3 where t3.col1=t1.a and t3.col2=t1.a and t3.pk1=t1.a; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| 1 SIMPLE t1 ALL NULL NULL NULL NULL # Using where | ||
| -1 SIMPLE t3 ref PRIMARY,col1 col1 12 test.t1.a,test.t1.a,test.t1.a # Using index | ||
| +1 SIMPLE t3 ref PRIMARY,col1 col1 8 test.t1.a,test.t1.a # Using where; Using index | ||
| drop table t1,t2,t3; | ||
| # | ||
| # Bug mdev-4340: performance regression with extended_keys=on | ||
| @@ -705,13 +705,13 @@ | ||
| select * from t1 force index(index_date_updated) | ||
| where index_date_updated= 10 and index_id < 800; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE t1 range index_date_updated index_date_updated 13 NULL # Using index condition | ||
| +1 SIMPLE t1 ref index_date_updated index_date_updated 5 const # Using index condition | ||
| # This used to work from the start: | ||
| explain | ||
| select * from t2 force index(index_date_updated) | ||
| where index_date_updated= 10 and index_id < 800; | ||
| id select_type table type possible_keys key key_len ref rows Extra | ||
| -1 SIMPLE t2 range index_date_updated index_date_updated 13 NULL # Using index condition | ||
| +1 SIMPLE t2 ref index_date_updated index_date_updated 5 const # Using index condition | ||
| drop table t0,t1,t2; | ||
| # | ||
| # MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff' | ||
| @@ -746,11 +746,12 @@ | ||
| "select_id": 1, | ||
| "table": { | ||
| "table_name": "t1", | ||
| - "access_type": "range", | ||
| + "access_type": "ref", | ||
| "possible_keys": ["f2"], | ||
| "key": "f2", | ||
| - "key_length": "3070", | ||
| - "used_key_parts": ["f2", "pk1"], | ||
| + "key_length": "3066", | ||
| + "used_key_parts": ["f2"], | ||
| + "ref": ["const"], | ||
| "rows": 1, | ||
| "filtered": 100, | ||
| "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'", | ||
| @@ -779,8 +780,8 @@ | ||
| "access_type": "range", | ||
| "possible_keys": ["k1"], | ||
| "key": "k1", | ||
| - "key_length": "3011", | ||
| - "used_key_parts": ["pk1", "f2", "pk2"], | ||
| + "key_length": "3007", | ||
| + "used_key_parts": ["pk1", "f2"], | ||
| "rows": 1, | ||
| "filtered": 100, | ||
| "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'", |
Oops, something went wrong.