diff options
author | unknown <serg@serg.mylan> | 2003-05-03 15:22:57 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2003-05-03 15:22:57 +0200 |
commit | ba886f1086b4add9c3421988a57758eac9203f4e (patch) | |
tree | aaf2e8adb8c4cc5a11461188ee15c3942dd86611 | |
parent | e2a839ff470f99f629dba2ddd31c0f2dce314941 (diff) | |
parent | 38b188bf9a921d8a253e2692b26de8caac4fc4aa (diff) | |
download | mariadb-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.result | 34 | ||||
-rw-r--r-- | mysql-test/t/innodb.test | 4 | ||||
-rw-r--r-- | sql/opt_sum.cc | 14 | ||||
-rw-r--r-- | sql/sql_base.cc | 5 | ||||
-rw-r--r-- | sql/sql_update.cc | 25 |
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); } |