mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Fix for BUG#9103:
Don't produce data truncation warnings from within cp_buffer_from_ref(). This function is only used to make index search tuples and data truncation that occurs here has no relation with truncated values being saved into tables.
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -2574,7 +2574,7 @@ QUICK_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
||||
|
||||
if (!quick)
|
||||
return 0; /* no ranges found */
|
||||
if (cp_buffer_from_ref(ref))
|
||||
if (cp_buffer_from_ref(thd, ref))
|
||||
{
|
||||
if (thd->is_fatal_error)
|
||||
goto err; // out of memory
|
||||
|
@@ -6185,7 +6185,7 @@ join_read_const(JOIN_TAB *tab)
|
||||
TABLE *table= tab->table;
|
||||
if (table->status & STATUS_GARBAGE) // If first read
|
||||
{
|
||||
if (cp_buffer_from_ref(&tab->ref))
|
||||
if (cp_buffer_from_ref(tab->join->thd, &tab->ref))
|
||||
error=HA_ERR_KEY_NOT_FOUND;
|
||||
else
|
||||
{
|
||||
@@ -6248,7 +6248,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,
|
||||
@@ -6275,7 +6275,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,
|
||||
@@ -6449,7 +6449,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();
|
||||
@@ -8168,7 +8168,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;
|
||||
@@ -8176,11 +8177,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;
|
||||
}
|
||||
|
||||
|
@@ -445,7 +445,7 @@ public:
|
||||
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);
|
||||
|
Reference in New Issue
Block a user