1
0
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:
sergefp@mysql.com
2005-04-18 05:21:44 +04:00
parent 39f412d329
commit a76ecc5bc7
5 changed files with 41 additions and 8 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);