Skip to content

Commit

Permalink
MDEV-11842 Fail to insert on a table where a field has no default
Browse files Browse the repository at this point in the history
has_no_default_value() should only fail the insert in the strict mode.

Additionally, don't check for "all fields are given values" twice,
it'll produce duplicate warnings.
  • Loading branch information
vuvova committed Mar 10, 2017
1 parent b6a1d65 commit 5fa04aa
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 2 deletions.
18 changes: 18 additions & 0 deletions mysql-test/r/trigger_no_defaults-11698.result
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,21 @@ a b
10 10
0 30
drop table t1;
set sql_mode=default;
create table t1 (
id int(11) not null auto_increment primary key,
data1 varchar(10) not null,
data2 varchar(10) not null
);
insert into t1 (data2) values ('x');
Warnings:
Warning 1364 Field 'data1' doesn't have a default value
create trigger test_trigger before insert on t1 for each row begin end;
insert into t1 (data2) values ('y');
Warnings:
Warning 1364 Field 'data1' doesn't have a default value
select * from t1;
id data1 data2
1 x
2 y
drop table t1;
15 changes: 15 additions & 0 deletions mysql-test/t/trigger_no_defaults-11698.test
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,18 @@ insert t1 (b) values (20);
insert t1 (b) values (30);
select * from t1;
drop table t1;
set sql_mode=default;

#
# MDEV-11842 Fail to insert on a table where a field has no default
#
create table t1 (
id int(11) not null auto_increment primary key,
data1 varchar(10) not null,
data2 varchar(10) not null
);
insert into t1 (data2) values ('x');
create trigger test_trigger before insert on t1 for each row begin end;
insert into t1 (data2) values ('y');
select * from t1;
drop table t1;
9 changes: 7 additions & 2 deletions sql/sql_insert.cc
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ static bool has_no_default_value(THD *thd, Field *field, TABLE_LIST *table_list)
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_NO_DEFAULT_FOR_FIELD,
ER_THD(thd, ER_NO_DEFAULT_FOR_FIELD), field->field_name);
}
return true;
return thd->really_abort_on_warning();
}
return false;
}
Expand Down Expand Up @@ -891,7 +891,12 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,

if (fields.elements || !value_count || table_list->view != 0)
{
if (check_that_all_fields_are_given_values(thd, table, table_list))
if (table->triggers &&
table->triggers->has_triggers(TRG_EVENT_INSERT, TRG_ACTION_BEFORE))
{
/* BEFORE INSERT triggers exist, the check will be done later, per row */
}
else if (check_that_all_fields_are_given_values(thd, table, table_list))
{
error= 1;
goto values_loop_end;
Expand Down

0 comments on commit 5fa04aa

Please sign in to comment.