Loading mysql-test/r/update.result +14 −0 Original line number Diff line number Diff line Loading @@ -226,3 +226,17 @@ select * from t1; a b 0 2 drop table t1; create table t1 (a int, b varchar(10), key b(b(5))) engine=myisam; create table t2 (a int, b varchar(10)) engine=myisam; insert into t1 values ( 1, 'abcd1e'); insert into t1 values ( 2, 'abcd2e'); insert into t2 values ( 1, 'abcd1e'); insert into t2 values ( 2, 'abcd2e'); analyze table t1,t2; Table Op Msg_type Msg_text test.t1 analyze status OK test.t2 analyze status OK update t1, t2 set t1.a = t2.a where t2.b = t1.b; show warnings; Level Code Message drop table t1, t2; mysql-test/t/update.test +12 −0 Original line number Diff line number Diff line Loading @@ -189,3 +189,15 @@ insert into t1 values (0, '1'); update t1 set b = b + 1 where a = 0; select * from t1; drop table t1; # BUG#9103 "Erroneous data truncation warnings on multi-table updates" create table t1 (a int, b varchar(10), key b(b(5))) engine=myisam; create table t2 (a int, b varchar(10)) engine=myisam; insert into t1 values ( 1, 'abcd1e'); insert into t1 values ( 2, 'abcd2e'); insert into t2 values ( 1, 'abcd1e'); insert into t2 values ( 2, 'abcd2e'); analyze table t1,t2; update t1, t2 set t1.a = t2.a where t2.b = t1.b; show warnings; drop table t1, t2; sql/opt_range.cc +1 −1 Original line number Diff line number Diff line Loading @@ -5532,7 +5532,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, goto err; } if (cp_buffer_from_ref(ref) && thd->is_fatal_error || if (cp_buffer_from_ref(thd,ref) && thd->is_fatal_error || !(range= new QUICK_RANGE())) goto err; // out of memory Loading sql/sql_select.cc +13 −6 Original line number Diff line number Diff line Loading @@ -9583,7 +9583,7 @@ join_read_const(JOIN_TAB *tab) if (table->status & STATUS_GARBAGE) // If first read { table->status= 0; if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) error=HA_ERR_KEY_NOT_FOUND; else { Loading Loading @@ -9647,7 +9647,7 @@ join_read_always_key(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) return -1; if ((error=table->file->index_read(table->record[0], tab->ref.key_buff, Loading @@ -9674,7 +9674,7 @@ join_read_last_key(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) return -1; if ((error=table->file->index_read_last(table->record[0], tab->ref.key_buff, Loading Loading @@ -9848,7 +9848,7 @@ join_ft_read_first(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); #if NOT_USED_YET if (cp_buffer_from_ref(&tab->ref)) // as ft-key doesn't use store_key's if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) // as ft-key doesn't use store_key's return -1; // see also FT_SELECT::init() #endif table->file->ft_init(); Loading Loading @@ -11609,7 +11609,8 @@ cmp_buffer_with_ref(JOIN_TAB *tab) { memcpy(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length); } if ((tab->ref.key_err=cp_buffer_from_ref(&tab->ref)) || diff) if ((tab->ref.key_err= cp_buffer_from_ref(tab->join->thd, &tab->ref)) || diff) return 1; return memcmp(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length) != 0; Loading @@ -11617,11 +11618,17 @@ cmp_buffer_with_ref(JOIN_TAB *tab) bool cp_buffer_from_ref(TABLE_REF *ref) cp_buffer_from_ref(THD *thd, TABLE_REF *ref) { enum enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; thd->count_cuted_fields= CHECK_FIELD_IGNORE; for (store_key **copy=ref->key_copy ; *copy ; copy++) if ((*copy)->copy()) { thd->count_cuted_fields= save_count_cuted_fields; return 1; // Something went wrong } thd->count_cuted_fields= save_count_cuted_fields; return 0; } Loading sql/sql_select.h +1 −1 Original line number Diff line number Diff line Loading @@ -520,7 +520,7 @@ class store_key_const_item :public store_key_item const char *name() const { return "const"; } }; bool cp_buffer_from_ref(TABLE_REF *ref); bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); bool error_if_full_join(JOIN *join); int report_error(TABLE *table, int error); int safe_index_read(JOIN_TAB *tab); Loading
mysql-test/r/update.result +14 −0 Original line number Diff line number Diff line Loading @@ -226,3 +226,17 @@ select * from t1; a b 0 2 drop table t1; create table t1 (a int, b varchar(10), key b(b(5))) engine=myisam; create table t2 (a int, b varchar(10)) engine=myisam; insert into t1 values ( 1, 'abcd1e'); insert into t1 values ( 2, 'abcd2e'); insert into t2 values ( 1, 'abcd1e'); insert into t2 values ( 2, 'abcd2e'); analyze table t1,t2; Table Op Msg_type Msg_text test.t1 analyze status OK test.t2 analyze status OK update t1, t2 set t1.a = t2.a where t2.b = t1.b; show warnings; Level Code Message drop table t1, t2;
mysql-test/t/update.test +12 −0 Original line number Diff line number Diff line Loading @@ -189,3 +189,15 @@ insert into t1 values (0, '1'); update t1 set b = b + 1 where a = 0; select * from t1; drop table t1; # BUG#9103 "Erroneous data truncation warnings on multi-table updates" create table t1 (a int, b varchar(10), key b(b(5))) engine=myisam; create table t2 (a int, b varchar(10)) engine=myisam; insert into t1 values ( 1, 'abcd1e'); insert into t1 values ( 2, 'abcd2e'); insert into t2 values ( 1, 'abcd1e'); insert into t2 values ( 2, 'abcd2e'); analyze table t1,t2; update t1, t2 set t1.a = t2.a where t2.b = t1.b; show warnings; drop table t1, t2;
sql/opt_range.cc +1 −1 Original line number Diff line number Diff line Loading @@ -5532,7 +5532,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, goto err; } if (cp_buffer_from_ref(ref) && thd->is_fatal_error || if (cp_buffer_from_ref(thd,ref) && thd->is_fatal_error || !(range= new QUICK_RANGE())) goto err; // out of memory Loading
sql/sql_select.cc +13 −6 Original line number Diff line number Diff line Loading @@ -9583,7 +9583,7 @@ join_read_const(JOIN_TAB *tab) if (table->status & STATUS_GARBAGE) // If first read { table->status= 0; if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) error=HA_ERR_KEY_NOT_FOUND; else { Loading Loading @@ -9647,7 +9647,7 @@ join_read_always_key(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) return -1; if ((error=table->file->index_read(table->record[0], tab->ref.key_buff, Loading @@ -9674,7 +9674,7 @@ join_read_last_key(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); if (cp_buffer_from_ref(&tab->ref)) if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) return -1; if ((error=table->file->index_read_last(table->record[0], tab->ref.key_buff, Loading Loading @@ -9848,7 +9848,7 @@ join_ft_read_first(JOIN_TAB *tab) if (!table->file->inited) table->file->ha_index_init(tab->ref.key); #if NOT_USED_YET if (cp_buffer_from_ref(&tab->ref)) // as ft-key doesn't use store_key's if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) // as ft-key doesn't use store_key's return -1; // see also FT_SELECT::init() #endif table->file->ft_init(); Loading Loading @@ -11609,7 +11609,8 @@ cmp_buffer_with_ref(JOIN_TAB *tab) { memcpy(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length); } if ((tab->ref.key_err=cp_buffer_from_ref(&tab->ref)) || diff) if ((tab->ref.key_err= cp_buffer_from_ref(tab->join->thd, &tab->ref)) || diff) return 1; return memcmp(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length) != 0; Loading @@ -11617,11 +11618,17 @@ cmp_buffer_with_ref(JOIN_TAB *tab) bool cp_buffer_from_ref(TABLE_REF *ref) cp_buffer_from_ref(THD *thd, TABLE_REF *ref) { enum enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; thd->count_cuted_fields= CHECK_FIELD_IGNORE; for (store_key **copy=ref->key_copy ; *copy ; copy++) if ((*copy)->copy()) { thd->count_cuted_fields= save_count_cuted_fields; return 1; // Something went wrong } thd->count_cuted_fields= save_count_cuted_fields; return 0; } Loading
sql/sql_select.h +1 −1 Original line number Diff line number Diff line Loading @@ -520,7 +520,7 @@ class store_key_const_item :public store_key_item const char *name() const { return "const"; } }; bool cp_buffer_from_ref(TABLE_REF *ref); bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); bool error_if_full_join(JOIN *join); int report_error(TABLE *table, int error); int safe_index_read(JOIN_TAB *tab);