diff options
author | unknown <Sinisa@sinisa.nasamreza.org> | 2003-03-11 19:40:49 +0200 |
---|---|---|
committer | unknown <Sinisa@sinisa.nasamreza.org> | 2003-03-11 19:40:49 +0200 |
commit | fd59fb1031bfcf0d0154f192fe8d8895a2f69b5a (patch) | |
tree | e3735cb804d191d6ea34c1e12ac74b093cd45277 | |
parent | b65aee401ca3a42b279fa824ba9a8f16522592ab (diff) | |
download | mariadb-git-fd59fb1031bfcf0d0154f192fe8d8895a2f69b5a.tar.gz |
A bug fix for multi-table updates with InnoDB storage engine
-rw-r--r-- | mysql-test/r/innodb.result | 17 | ||||
-rw-r--r-- | mysql-test/t/innodb.test | 11 | ||||
-rw-r--r-- | sql/sql_class.h | 2 | ||||
-rw-r--r-- | sql/sql_update.cc | 13 |
4 files changed, 37 insertions, 6 deletions
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index d65e90a6cc0..e577ddb9ecd 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -1074,3 +1074,20 @@ id select * from t2; id t1_id drop table t1,t2; +DROP TABLE IF EXISTS t1,t2; +CREATE TABLE t1(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; +CREATE TABLE t2(id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id) ) TYPE=INNODB; +INSERT INTO t1 VALUES(1); +INSERT INTO t2 VALUES(1, 1); +SELECT * from t1; +id +1 +UPDATE t1,t2 SET t1.id=t1.id+1, t2.t1_id=t1.id+1; +SELECT * from t1; +id +2 +UPDATE t1,t2 SET t1.id=t1.id+1; +SELECT * from t1; +id +3 +DROP TABLE IF EXISTS t1,t2; diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index 7d13258ede1..bd44038b446 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -715,3 +715,14 @@ delete t1,t2 from t1,t2 where t1.id=t2.t1_id; select * from t1; select * from t2; drop table t1,t2; +DROP TABLE IF EXISTS t1,t2; +CREATE TABLE t1(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; +CREATE TABLE t2(id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id) ) TYPE=INNODB; +INSERT INTO t1 VALUES(1); +INSERT INTO t2 VALUES(1, 1); +SELECT * from t1; +UPDATE t1,t2 SET t1.id=t1.id+1, t2.t1_id=t1.id+1; +SELECT * from t1; +UPDATE t1,t2 SET t1.id=t1.id+1; +SELECT * from t1; +DROP TABLE IF EXISTS t1,t2; diff --git a/sql/sql_class.h b/sql/sql_class.h index f7d9d93a606..f372db079ff 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -831,7 +831,7 @@ class multi_update : public select_result uint table_count; Copy_field *copy_field; enum enum_duplicates handle_duplicates; - bool do_update, trans_safe, transactional_tables, log_delayed; + bool do_update, trans_safe, transactional_tables, log_delayed, on_the_fly; public: multi_update(THD *thd_arg, TABLE_LIST *ut, List<Item> *fields, diff --git a/sql/sql_update.cc b/sql/sql_update.cc index d1a2d4d5524..8258d6df6a5 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -413,7 +413,7 @@ multi_update::multi_update(THD *thd_arg, TABLE_LIST *table_list, :all_tables(table_list), update_tables(0), thd(thd_arg), tmp_tables(0), updated(0), found(0), fields(field_list), values(value_list), table_count(0), copy_field(0), handle_duplicates(handle_duplicates_arg), - do_update(1), trans_safe(0) + do_update(1), trans_safe(0), on_the_fly(1) {} @@ -538,12 +538,15 @@ multi_update::initialize_tables(JOIN *join) main_table=join->join_tab->table; trans_safe= transactional_tables= main_table->file->has_transactions(); log_delayed= trans_safe || main_table->tmp_table != NO_TMP_TABLE; - +#ifdef HAVE_INNOBASE_DB + if (main_table->db_type == DB_TYPE_INNODB) + on_the_fly=0; +#endif /* Create a temporary table for all tables after except main table */ for (table_ref= update_tables; table_ref; table_ref=table_ref->next) { TABLE *table=table_ref->table; - if (table != main_table) + if (!on_the_fly || table != main_table) { uint cnt= table_ref->shared; ORDER group; @@ -623,7 +626,7 @@ bool multi_update::send_data(List<Item> ¬_used_values) uint offset= cur_table->shared; table->file->position(table->record[0]); - if (table == main_table) + if (on_the_fly && table == main_table) { table->status|= STATUS_UPDATED; store_record(table,1); @@ -716,7 +719,7 @@ int multi_update::do_updates(bool from_send_error) for (cur_table= update_tables; cur_table ; cur_table= cur_table->next) { table = cur_table->table; - if (table == main_table) + if (on_the_fly && table == main_table) continue; // Already updated org_updated= updated; |