use consistent error messaging for IGNORE
1. the same message text for INSERT and INSERT IGNORE 2. no new warnings in UPDATE IGNORE yet (big change for 5.5) and replace a commonly used expression with a named constant
This commit is contained in:
parent
9e826bfa36
commit
24ac546d0f
@ -11,20 +11,11 @@ INSERT INTO t2 VALUES(0);
|
|||||||
INSERT IGNORE INTO t2 VALUES(1);
|
INSERT IGNORE INTO t2 VALUES(1);
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
Warning 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
|
|
||||||
UPDATE IGNORE t2 SET fld2=20 WHERE fld2=0;
|
UPDATE IGNORE t2 SET fld2=20 WHERE fld2=0;
|
||||||
Warnings:
|
|
||||||
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
|
|
||||||
UPDATE IGNORE t1 SET fld1=20 WHERE fld1=0;
|
UPDATE IGNORE t1 SET fld1=20 WHERE fld1=0;
|
||||||
Warnings:
|
|
||||||
Warning 1451 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
|
|
||||||
# Test for multi update.
|
# Test for multi update.
|
||||||
UPDATE IGNORE t1, t2 SET t2.fld2= t2.fld2 + 3;
|
UPDATE IGNORE t1, t2 SET t2.fld2= t2.fld2 + 3;
|
||||||
Warnings:
|
|
||||||
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
|
|
||||||
UPDATE IGNORE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
UPDATE IGNORE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
||||||
Warnings:
|
|
||||||
Warning 1451 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
|
|
||||||
# Reports an error since IGNORE is not used.
|
# Reports an error since IGNORE is not used.
|
||||||
INSERT INTO t2 VALUES(1);
|
INSERT INTO t2 VALUES(1);
|
||||||
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
|
@ -5463,28 +5463,3 @@ fl_create_iterator(enum handler_iterator_type type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/
|
#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Report a warning for FK constraint violation.
|
|
||||||
|
|
||||||
@param thd Thread handle.
|
|
||||||
@param table table on which the operation is performed.
|
|
||||||
@param error handler error number.
|
|
||||||
*/
|
|
||||||
void warn_fk_constraint_violation(THD *thd,TABLE *table, int error)
|
|
||||||
{
|
|
||||||
String str;
|
|
||||||
switch(error) {
|
|
||||||
case HA_ERR_ROW_IS_REFERENCED:
|
|
||||||
table->file->get_error_message(error, &str);
|
|
||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
|
||||||
ER_ROW_IS_REFERENCED_2, str.c_ptr_safe());
|
|
||||||
break;
|
|
||||||
case HA_ERR_NO_REFERENCED_ROW:
|
|
||||||
table->file->get_error_message(error, &str);
|
|
||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
|
||||||
ER_NO_REFERENCED_ROW_2, str.c_ptr_safe());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -335,6 +335,7 @@
|
|||||||
#define HA_CHECK_DUP_UNIQUE 2
|
#define HA_CHECK_DUP_UNIQUE 2
|
||||||
#define HA_CHECK_FK_ERROR 4
|
#define HA_CHECK_FK_ERROR 4
|
||||||
#define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE)
|
#define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE)
|
||||||
|
#define HA_CHECK_ALL (~0U)
|
||||||
|
|
||||||
enum legacy_db_type
|
enum legacy_db_type
|
||||||
{
|
{
|
||||||
@ -3110,6 +3111,4 @@ inline const char *table_case_name(HA_CREATE_INFO *info, const char *name)
|
|||||||
return ((lower_case_table_names == 2 && info->alias) ? info->alias : name);
|
return ((lower_case_table_names == 2 && info->alias) ? info->alias : name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void warn_fk_constraint_violation(THD *thd, TABLE *table, int error);
|
|
||||||
|
|
||||||
#endif /* HANDLER_INCLUDED */
|
#endif /* HANDLER_INCLUDED */
|
||||||
|
@ -1609,9 +1609,10 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||||||
else
|
else
|
||||||
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
|
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
|
||||||
bool is_duplicate_key_error;
|
bool is_duplicate_key_error;
|
||||||
if (table->file->is_fatal_error(error, HA_CHECK_DUP | HA_CHECK_FK_ERROR))
|
if (table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
goto err;
|
goto err;
|
||||||
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
|
is_duplicate_key_error=
|
||||||
|
table->file->is_fatal_error(error, HA_CHECK_ALL & ~HA_CHECK_DUP);
|
||||||
if (!is_duplicate_key_error)
|
if (!is_duplicate_key_error)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1712,8 +1713,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||||||
error != HA_ERR_RECORD_IS_THE_SAME)
|
error != HA_ERR_RECORD_IS_THE_SAME)
|
||||||
{
|
{
|
||||||
if (info->ignore &&
|
if (info->ignore &&
|
||||||
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
|
!table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
{
|
{
|
||||||
if (!(thd->variables.old_behavior &
|
if (!(thd->variables.old_behavior &
|
||||||
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
|
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
|
||||||
@ -1845,7 +1845,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||||||
{
|
{
|
||||||
DEBUG_SYNC(thd, "write_row_noreplace");
|
DEBUG_SYNC(thd, "write_row_noreplace");
|
||||||
if (!info->ignore ||
|
if (!info->ignore ||
|
||||||
table->file->is_fatal_error(error, HA_CHECK_DUP | HA_CHECK_FK_ERROR))
|
table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
goto err;
|
goto err;
|
||||||
if (!(thd->variables.old_behavior &
|
if (!(thd->variables.old_behavior &
|
||||||
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
|
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
|
||||||
@ -1866,9 +1866,6 @@ ok_or_after_trg_err:
|
|||||||
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
|
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
|
||||||
if (!table->file->has_transactions())
|
if (!table->file->has_transactions())
|
||||||
thd->transaction.stmt.modified_non_trans_table= TRUE;
|
thd->transaction.stmt.modified_non_trans_table= TRUE;
|
||||||
if (info->ignore &&
|
|
||||||
!table->file->is_fatal_error(error, HA_CHECK_FK_ERROR))
|
|
||||||
warn_fk_constraint_violation(thd, table, error);
|
|
||||||
DBUG_RETURN(trg_error);
|
DBUG_RETURN(trg_error);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -774,8 +774,7 @@ int mysql_update(THD *thd,
|
|||||||
error= 0;
|
error= 0;
|
||||||
}
|
}
|
||||||
else if (!ignore ||
|
else if (!ignore ||
|
||||||
table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
|
table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
If (ignore && error is ignorable) we don't have to
|
If (ignore && error is ignorable) we don't have to
|
||||||
@ -783,8 +782,7 @@ int mysql_update(THD *thd,
|
|||||||
*/
|
*/
|
||||||
myf flags= 0;
|
myf flags= 0;
|
||||||
|
|
||||||
if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
|
if (table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
flags|= ME_FATALERROR; /* Other handler errors are fatal */
|
flags|= ME_FATALERROR; /* Other handler errors are fatal */
|
||||||
|
|
||||||
prepare_record_for_error_message(error, table);
|
prepare_record_for_error_message(error, table);
|
||||||
@ -792,9 +790,6 @@ int mysql_update(THD *thd,
|
|||||||
error= 1;
|
error= 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (ignore && !table->file->is_fatal_error(error,
|
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
warn_fk_constraint_violation(thd, table, error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (table->triggers &&
|
if (table->triggers &&
|
||||||
@ -1974,8 +1969,7 @@ int multi_update::send_data(List<Item> ¬_used_values)
|
|||||||
{
|
{
|
||||||
updated--;
|
updated--;
|
||||||
if (!ignore ||
|
if (!ignore ||
|
||||||
table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
|
table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
If (ignore && error == is ignorable) we don't have to
|
If (ignore && error == is ignorable) we don't have to
|
||||||
@ -1983,17 +1977,13 @@ int multi_update::send_data(List<Item> ¬_used_values)
|
|||||||
*/
|
*/
|
||||||
myf flags= 0;
|
myf flags= 0;
|
||||||
|
|
||||||
if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
|
if (table->file->is_fatal_error(error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
flags|= ME_FATALERROR; /* Other handler errors are fatal */
|
flags|= ME_FATALERROR; /* Other handler errors are fatal */
|
||||||
|
|
||||||
prepare_record_for_error_message(error, table);
|
prepare_record_for_error_message(error, table);
|
||||||
table->file->print_error(error,MYF(flags));
|
table->file->print_error(error,MYF(flags));
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
else if (ignore && !table->file->is_fatal_error(error,
|
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
warn_fk_constraint_violation(thd, table, error);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2266,15 +2256,11 @@ int multi_update::do_updates()
|
|||||||
local_error != HA_ERR_RECORD_IS_THE_SAME)
|
local_error != HA_ERR_RECORD_IS_THE_SAME)
|
||||||
{
|
{
|
||||||
if (!ignore ||
|
if (!ignore ||
|
||||||
table->file->is_fatal_error(local_error, HA_CHECK_DUP_KEY |
|
table->file->is_fatal_error(local_error, HA_CHECK_ALL))
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
{
|
{
|
||||||
err_table= table;
|
err_table= table;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else if (ignore && !table->file->is_fatal_error(local_error,
|
|
||||||
HA_CHECK_FK_ERROR))
|
|
||||||
warn_fk_constraint_violation(thd, table, local_error);
|
|
||||||
}
|
}
|
||||||
if (local_error != HA_ERR_RECORD_IS_THE_SAME)
|
if (local_error != HA_ERR_RECORD_IS_THE_SAME)
|
||||||
updated++;
|
updated++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user