mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix problem where key_read was not cleaned up properly, which caused assert in innodb test.
This commit is contained in:
@ -1139,7 +1139,7 @@ a b
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) type=innodb;
|
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) type=innodb;
|
||||||
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) type=innodb;
|
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) type=innodb;
|
||||||
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(11,11),(12,12);
|
||||||
INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
||||||
update t1,t2 set t1.a=t1.a+100;
|
update t1,t2 set t1.a=t1.a+100;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -1153,6 +1153,9 @@ a b
|
|||||||
107 7
|
107 7
|
||||||
108 8
|
108 8
|
||||||
109 9
|
109 9
|
||||||
|
110 10
|
||||||
|
111 11
|
||||||
|
112 12
|
||||||
update t1,t2 set t1.a=t1.a+100 where t1.a=101;
|
update t1,t2 set t1.a=t1.a+100 where t1.a=101;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
a b
|
a b
|
||||||
@ -1165,6 +1168,9 @@ a b
|
|||||||
107 7
|
107 7
|
||||||
108 8
|
108 8
|
||||||
109 9
|
109 9
|
||||||
|
110 10
|
||||||
|
111 11
|
||||||
|
112 12
|
||||||
update t1,t2 set t1.b=t1.b+10 where t1.b=2;
|
update t1,t2 set t1.b=t1.b+10 where t1.b=2;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
a b
|
a b
|
||||||
@ -1176,8 +1182,11 @@ a b
|
|||||||
107 7
|
107 7
|
||||||
108 8
|
108 8
|
||||||
109 9
|
109 9
|
||||||
|
110 10
|
||||||
|
111 11
|
||||||
102 12
|
102 12
|
||||||
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b where t1.b between 3 and 5;
|
112 12
|
||||||
|
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
a b
|
a b
|
||||||
201 1
|
201 1
|
||||||
@ -1188,18 +1197,21 @@ a b
|
|||||||
107 7
|
107 7
|
||||||
108 8
|
108 8
|
||||||
109 9
|
109 9
|
||||||
|
110 10
|
||||||
|
111 11
|
||||||
102 12
|
102 12
|
||||||
|
112 12
|
||||||
select * from t2;
|
select * from t2;
|
||||||
a b
|
a b
|
||||||
1 5
|
1 1
|
||||||
2 5
|
2 2
|
||||||
3 5
|
6 6
|
||||||
4 5
|
7 7
|
||||||
5 5
|
8 8
|
||||||
6 5
|
9 9
|
||||||
7 5
|
3 13
|
||||||
8 5
|
4 14
|
||||||
9 5
|
5 15
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t1 (a int not null auto_increment primary key, b int, c int, key(c)) type=innodb;
|
create table t1 (a int not null auto_increment primary key, b int, c int, key(c)) type=innodb;
|
||||||
create table t2 (a int not null auto_increment primary key, b int);
|
create table t2 (a int not null auto_increment primary key, b int);
|
||||||
|
@ -776,7 +776,7 @@ drop table t1;
|
|||||||
|
|
||||||
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) type=innodb;
|
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) type=innodb;
|
||||||
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) type=innodb;
|
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) type=innodb;
|
||||||
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(11,11),(12,12);
|
||||||
INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
||||||
|
|
||||||
# Full join, without key
|
# Full join, without key
|
||||||
@ -792,7 +792,7 @@ update t1,t2 set t1.b=t1.b+10 where t1.b=2;
|
|||||||
select * from t1;
|
select * from t1;
|
||||||
|
|
||||||
# Range key (in t1)
|
# Range key (in t1)
|
||||||
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b where t1.b between 3 and 5;
|
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
select * from t2;
|
select * from t2;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
@ -191,13 +191,13 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
|||||||
ref.key_buff=key_buff;
|
ref.key_buff=key_buff;
|
||||||
TABLE *table=((Item_field*) expr)->field->table;
|
TABLE *table=((Item_field*) expr)->field->table;
|
||||||
|
|
||||||
if ((outer_tables & table->map) ||
|
if ((table->file->table_flags() & HA_NOT_READ_AFTER_KEY))
|
||||||
!find_range_key(&ref, ((Item_field*) expr)->field,conds))
|
|
||||||
{
|
{
|
||||||
const_result=0;
|
const_result=0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((table->file->table_flags() & HA_NOT_READ_AFTER_KEY))
|
if ((outer_tables & table->map) ||
|
||||||
|
!find_range_key(&ref, ((Item_field*) expr)->field,conds))
|
||||||
{
|
{
|
||||||
const_result=0;
|
const_result=0;
|
||||||
break;
|
break;
|
||||||
@ -348,7 +348,13 @@ bool part_of_cond(COND *cond,Field *field)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Check if we can get value for field by using a key */
|
/*
|
||||||
|
Check if we can get value for field by using a key
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
This function may set table->key_read to 1, which must be reset after
|
||||||
|
index is used! (This can only happen when function returns 1)
|
||||||
|
*/
|
||||||
|
|
||||||
static bool find_range_key(TABLE_REF *ref, Field* field, COND *cond)
|
static bool find_range_key(TABLE_REF *ref, Field* field, COND *cond)
|
||||||
{
|
{
|
||||||
|
@ -482,8 +482,9 @@ bool close_thread_table(THD *thd, TABLE **table_ptr)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("close_thread_table");
|
DBUG_ENTER("close_thread_table");
|
||||||
|
|
||||||
bool found_old_table=0;
|
bool found_old_table= 0;
|
||||||
TABLE *table=*table_ptr;
|
TABLE *table= *table_ptr;
|
||||||
|
DBUG_ASSERT(table->key_read == 0);
|
||||||
|
|
||||||
*table_ptr=table->next;
|
*table_ptr=table->next;
|
||||||
if (table->version != refresh_version ||
|
if (table->version != refresh_version ||
|
||||||
|
@ -62,6 +62,7 @@ int mysql_update(THD *thd,
|
|||||||
int error=0;
|
int error=0;
|
||||||
uint used_index, want_privilege;
|
uint used_index, want_privilege;
|
||||||
ulong query_id=thd->query_id, timestamp_query_id;
|
ulong query_id=thd->query_id, timestamp_query_id;
|
||||||
|
ha_rows updated, found;
|
||||||
key_map old_used_keys;
|
key_map old_used_keys;
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
SQL_SELECT *select;
|
SQL_SELECT *select;
|
||||||
@ -192,9 +193,8 @@ int mysql_update(THD *thd,
|
|||||||
limit, &examined_rows)) ==
|
limit, &examined_rows)) ==
|
||||||
HA_POS_ERROR)
|
HA_POS_ERROR)
|
||||||
{
|
{
|
||||||
delete select;
|
|
||||||
free_io_cache(table);
|
free_io_cache(table);
|
||||||
DBUG_RETURN(-1);
|
goto err;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Filesort has already found and selected the rows we want to update,
|
Filesort has already found and selected the rows we want to update,
|
||||||
@ -214,10 +214,7 @@ int mysql_update(THD *thd,
|
|||||||
IO_CACHE tempfile;
|
IO_CACHE tempfile;
|
||||||
if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
|
if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
|
||||||
DISK_BUFFER_SIZE, MYF(MY_WME)))
|
DISK_BUFFER_SIZE, MYF(MY_WME)))
|
||||||
{
|
goto err;
|
||||||
delete select; /* purecov: inspected */
|
|
||||||
DBUG_RETURN(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
init_read_record(&info,thd,table,select,0,1);
|
init_read_record(&info,thd,table,select,0,1);
|
||||||
thd->proc_info="Searching rows for update";
|
thd->proc_info="Searching rows for update";
|
||||||
@ -256,10 +253,7 @@ int mysql_update(THD *thd,
|
|||||||
error=1; /* purecov: inspected */
|
error=1; /* purecov: inspected */
|
||||||
select->file=tempfile; // Read row ptrs from this file
|
select->file=tempfile; // Read row ptrs from this file
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
{
|
goto err;
|
||||||
delete select;
|
|
||||||
DBUG_RETURN(-1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (table->key_read)
|
if (table->key_read)
|
||||||
{
|
{
|
||||||
@ -272,7 +266,7 @@ int mysql_update(THD *thd,
|
|||||||
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
|
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
|
||||||
init_read_record(&info,thd,table,select,0,1);
|
init_read_record(&info,thd,table,select,0,1);
|
||||||
|
|
||||||
ha_rows updated=0L,found=0L;
|
updated= found= 0;
|
||||||
thd->count_cuted_fields=1; /* calc cuted fields */
|
thd->count_cuted_fields=1; /* calc cuted fields */
|
||||||
thd->cuted_fields=0L;
|
thd->cuted_fields=0L;
|
||||||
thd->proc_info="Updating";
|
thd->proc_info="Updating";
|
||||||
@ -365,6 +359,15 @@ int mysql_update(THD *thd,
|
|||||||
thd->count_cuted_fields=0; /* calc cuted fields */
|
thd->count_cuted_fields=0; /* calc cuted fields */
|
||||||
free_io_cache(table);
|
free_io_cache(table);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
err:
|
||||||
|
delete select;
|
||||||
|
if (table->key_read)
|
||||||
|
{
|
||||||
|
table->key_read=0;
|
||||||
|
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||||
|
}
|
||||||
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user