Commit 3a5c004b authored by Sergey Petrunya's avatar Sergey Petrunya

BUG#625841: Assertion `!table || (!table->read_set || bitmap_is_set

- When find_all_keys() checks which table columns are needed for table scan
  that is done before the sorting, it should also analyze pushed index condition.
  This is achieved by remembering/checking pre-index-pushed condition.
parent 7f41516f
...@@ -437,3 +437,28 @@ NULL NULL 5678 ...@@ -437,3 +437,28 @@ NULL NULL 5678
NULL NULL 5678 NULL NULL 5678
set @@join_cache_level=@save_join_cache_level; set @@join_cache_level=@save_join_cache_level;
drop table t0, t1; drop table t0, t1;
#
# BUG#625841: Assertion `!table || (!table->read_set || bitmap_is_set
# (table->read_set, field_index))' on REPLACE ... SELECT with MRR
#
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
key1 varchar(10),
col1 char(255), col2 char(255),
col3 char(244), col4 char(255),
key(key1)
);
create table t2 like t1;
insert into t1
select
1000+A.a+100*B.a + 10*C.a,
'col1val', 'col2val',
'col3val', 'col4val'
from t0 A, t0 B, t0 C;
REPLACE INTO t2(col2,col3,col4)
SELECT col2,col3,col4
FROM t1
WHERE `key1` LIKE CONCAT( LEFT( '1' , 7 ) , '%' )
ORDER BY col1 LIMIT 7;
drop table t0, t1, t2;
...@@ -140,3 +140,32 @@ select * from t0, t1 where t0.a<=>t1.a; ...@@ -140,3 +140,32 @@ select * from t0, t1 where t0.a<=>t1.a;
set @@join_cache_level=@save_join_cache_level; set @@join_cache_level=@save_join_cache_level;
drop table t0, t1; drop table t0, t1;
--echo #
--echo # BUG#625841: Assertion `!table || (!table->read_set || bitmap_is_set
--echo # (table->read_set, field_index))' on REPLACE ... SELECT with MRR
--echo #
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
key1 varchar(10),
col1 char(255), col2 char(255),
col3 char(244), col4 char(255),
key(key1)
);
create table t2 like t1;
insert into t1
select
1000+A.a+100*B.a + 10*C.a,
'col1val', 'col2val',
'col3val', 'col4val'
from t0 A, t0 B, t0 C;
REPLACE INTO t2(col2,col3,col4)
SELECT col2,col3,col4
FROM t1
WHERE `key1` LIKE CONCAT( LEFT( '1' , 7 ) , '%' )
ORDER BY col1 LIMIT 7;
drop table t0, t1, t2;
...@@ -542,11 +542,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -542,11 +542,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
current_thd->variables.read_buff_size); current_thd->variables.read_buff_size);
} }
if (quick_select)
{
if (select->quick->reset())
DBUG_RETURN(HA_POS_ERROR);
}
/* Remember original bitmaps */ /* Remember original bitmaps */
save_read_set= sort_form->read_set; save_read_set= sort_form->read_set;
...@@ -559,8 +554,18 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -559,8 +554,18 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
if (select && select->cond) if (select && select->cond)
select->cond->walk(&Item::register_field_in_read_map, 1, select->cond->walk(&Item::register_field_in_read_map, 1,
(uchar*) sort_form); (uchar*) sort_form);
if (select && select->pre_idx_push_select_cond)
select->pre_idx_push_select_cond->walk(&Item::register_field_in_read_map,
1, (uchar*) sort_form);
sort_form->column_bitmaps_set(&sort_form->tmp_set, &sort_form->tmp_set); sort_form->column_bitmaps_set(&sort_form->tmp_set, &sort_form->tmp_set);
if (quick_select)
{
if (select->quick->reset())
DBUG_RETURN(HA_POS_ERROR);
}
for (;;) for (;;)
{ {
if (quick_select) if (quick_select)
......
...@@ -378,6 +378,7 @@ void push_index_cond(JOIN_TAB *tab, uint keyno, bool other_tbls_ok) ...@@ -378,6 +378,7 @@ void push_index_cond(JOIN_TAB *tab, uint keyno, bool other_tbls_ok)
QT_ORDINARY);); QT_ORDINARY););
tab->select->cond= tab->select_cond; tab->select->cond= tab->select_cond;
tab->select->pre_idx_push_select_cond= tab->pre_idx_push_select_cond;
} }
} }
} }
......
...@@ -1119,7 +1119,7 @@ SQL_SELECT *make_select(TABLE *head, table_map const_tables, ...@@ -1119,7 +1119,7 @@ SQL_SELECT *make_select(TABLE *head, table_map const_tables,
} }
SQL_SELECT::SQL_SELECT() :quick(0),cond(0),free_cond(0) SQL_SELECT::SQL_SELECT() :quick(0),cond(0),pre_idx_push_select_cond(NULL),free_cond(0)
{ {
quick_keys.clear_all(); needed_reg.clear_all(); quick_keys.clear_all(); needed_reg.clear_all();
my_b_clear(&file); my_b_clear(&file);
......
...@@ -738,6 +738,13 @@ class SQL_SELECT :public Sql_alloc { ...@@ -738,6 +738,13 @@ class SQL_SELECT :public Sql_alloc {
public: public:
QUICK_SELECT_I *quick; // If quick-select used QUICK_SELECT_I *quick; // If quick-select used
COND *cond; // where condition COND *cond; // where condition
/*
When using Index Condition Pushdown: condition that we've had before
extracting and pushing index condition.
In other cases, NULL.
*/
Item *pre_idx_push_select_cond;
TABLE *head; TABLE *head;
IO_CACHE file; // Positions to used records IO_CACHE file; // Positions to used records
ha_rows records; // Records in use if read from file ha_rows records; // Records in use if read from file
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment