summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2003-05-03 15:22:57 +0200
committerunknown <serg@serg.mylan>2003-05-03 15:22:57 +0200
commitba886f1086b4add9c3421988a57758eac9203f4e (patch)
treeaaf2e8adb8c4cc5a11461188ee15c3942dd86611
parente2a839ff470f99f629dba2ddd31c0f2dce314941 (diff)
parent38b188bf9a921d8a253e2692b26de8caac4fc4aa (diff)
downloadmariadb-git-ba886f1086b4add9c3421988a57758eac9203f4e.tar.gz
Merge bk-internal:/home/bk/mysql-4.0/
into serg.mylan:/usr/home/serg/Abk/mysql-4.0
-rw-r--r--mysql-test/r/innodb.result34
-rw-r--r--mysql-test/t/innodb.test4
-rw-r--r--sql/opt_sum.cc14
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_update.cc25
5 files changed, 52 insertions, 30 deletions
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index c98f85f93d2..b3c7c137a6f 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -1139,7 +1139,7 @@ a b
drop table t1;
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;
-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);
update t1,t2 set t1.a=t1.a+100;
select * from t1;
@@ -1153,6 +1153,9 @@ a b
107 7
108 8
109 9
+110 10
+111 11
+112 12
update t1,t2 set t1.a=t1.a+100 where t1.a=101;
select * from t1;
a b
@@ -1165,6 +1168,9 @@ a b
107 7
108 8
109 9
+110 10
+111 11
+112 12
update t1,t2 set t1.b=t1.b+10 where t1.b=2;
select * from t1;
a b
@@ -1176,8 +1182,11 @@ a b
107 7
108 8
109 9
+110 10
+111 11
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;
a b
201 1
@@ -1188,18 +1197,21 @@ a b
107 7
108 8
109 9
+110 10
+111 11
102 12
+112 12
select * from t2;
a b
-1 5
-2 5
-3 5
-4 5
-5 5
-6 5
-7 5
-8 5
-9 5
+1 1
+2 2
+6 6
+7 7
+8 8
+9 9
+3 13
+4 14
+5 15
drop table t1,t2;
CREATE TABLE t2 ( NEXT_T BIGINT NOT NULL PRIMARY KEY) TYPE=MyISAM;
CREATE TABLE t1 ( B_ID INTEGER NOT NULL PRIMARY KEY) TYPE=InnoDB;
diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test
index d65b9b1638e..ae1f7dae922 100644
--- a/mysql-test/t/innodb.test
+++ b/mysql-test/t/innodb.test
@@ -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 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);
# Full join, without key
@@ -792,7 +792,7 @@ update t1,t2 set t1.b=t1.b+10 where t1.b=2;
select * from 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 t2;
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index aeaf8beef07..21296845c21 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -191,13 +191,13 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
ref.key_buff=key_buff;
TABLE *table=((Item_field*) expr)->field->table;
- if ((outer_tables & table->map) ||
- !find_range_key(&ref, ((Item_field*) expr)->field,conds))
+ if ((table->file->table_flags() & HA_NOT_READ_AFTER_KEY))
{
const_result=0;
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;
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)
{
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 0f0c3c97ed2..f0aa8e9c351 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -482,8 +482,9 @@ bool close_thread_table(THD *thd, TABLE **table_ptr)
{
DBUG_ENTER("close_thread_table");
- bool found_old_table=0;
- TABLE *table=*table_ptr;
+ bool found_old_table= 0;
+ TABLE *table= *table_ptr;
+ DBUG_ASSERT(table->key_read == 0);
*table_ptr=table->next;
if (table->version != refresh_version ||
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 462206b25f3..0dc6073278f 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -62,6 +62,7 @@ int mysql_update(THD *thd,
int error=0;
uint used_index, want_privilege;
ulong query_id=thd->query_id, timestamp_query_id;
+ ha_rows updated, found;
key_map old_used_keys;
TABLE *table;
SQL_SELECT *select;
@@ -192,9 +193,8 @@ int mysql_update(THD *thd,
limit, &examined_rows)) ==
HA_POS_ERROR)
{
- delete select;
free_io_cache(table);
- DBUG_RETURN(-1);
+ goto err;
}
/*
Filesort has already found and selected the rows we want to update,
@@ -214,10 +214,7 @@ int mysql_update(THD *thd,
IO_CACHE tempfile;
if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
DISK_BUFFER_SIZE, MYF(MY_WME)))
- {
- delete select; /* purecov: inspected */
- DBUG_RETURN(-1);
- }
+ goto err;
init_read_record(&info,thd,table,select,0,1);
thd->proc_info="Searching rows for update";
@@ -256,10 +253,7 @@ int mysql_update(THD *thd,
error=1; /* purecov: inspected */
select->file=tempfile; // Read row ptrs from this file
if (error >= 0)
- {
- delete select;
- DBUG_RETURN(-1);
- }
+ goto err;
}
if (table->key_read)
{
@@ -272,7 +266,7 @@ int mysql_update(THD *thd,
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
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->cuted_fields=0L;
thd->proc_info="Updating";
@@ -365,6 +359,15 @@ int mysql_update(THD *thd,
thd->count_cuted_fields=0; /* calc cuted fields */
free_io_cache(table);
DBUG_RETURN(0);
+
+err:
+ delete select;
+ if (table->key_read)
+ {
+ table->key_read=0;
+ table->file->extra(HA_EXTRA_NO_KEYREAD);
+ }
+ DBUG_RETURN(-1);
}