mirror of
https://github.com/MariaDB/server.git
synced 2025-02-14 17:35:35 +01:00
![Sergei Golubchik](/assets/img/avatar_default.png)
it's incorrect to zero out table->triggers->extra_null_bitmap before a statement, because if insert uses an explicit field list and omits a field that has no default value, the field should get NULL implicitly. So extra_null_bitmap should have 1s for all fields that have no defaults * create extra_null_bitmap_init and initialize it as above * copy extra_null_bitmap_init to extra_null_bitmap for inserts * still zero out extra_null_bitmap for updates/deletes where all fields definitely have a value * make not_null_fields_have_null_values() to send ER_NO_DEFAULT_FOR_FIELD for fields with no default and no value, otherwise creation of a trigger with an empty body would change the error message
42 lines
1 KiB
Text
42 lines
1 KiB
Text
set sql_mode='strict_all_tables';
|
|
create table t1 (a int not null, b int);
|
|
insert t1 (b) values (1);
|
|
ERROR HY000: Field 'a' doesn't have a default value
|
|
create trigger trgi before insert on t1 for each row
|
|
case new.b
|
|
when 10 then
|
|
set new.a = new.b;
|
|
when 30 then
|
|
set new.a = new.a;
|
|
else
|
|
do 1;
|
|
end case|
|
|
insert t1 (b) values (10);
|
|
insert t1 (b) values (20);
|
|
ERROR HY000: Field 'a' doesn't have a default value
|
|
insert t1 (b) values (30);
|
|
ERROR 23000: Column 'a' cannot be null
|
|
select * from t1;
|
|
a b
|
|
10 10
|
|
drop table t1;
|
|
set sql_mode=default;
|
|
set sql_mode='';
|
|
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;
|
|
set sql_mode=default;
|