Commit baaf300d authored by evgen@moonbone.local's avatar evgen@moonbone.local

Bug#29477: Not all fields of the target table were checked to have a default

value when inserting into a view.

The mysql_prepare_insert function checks all fields of the target table that
directly or indirectly (through a view) are specified in the INSERT
statement to have a default value. This check can be skipped if the INSERT
statement doesn't mention any insert fields. In case of a view this allows
fields that aren't mentioned in the view to bypass the check.

Now fields of the target table are always checked to have a default value
when insert goes into a view.
parent f8ade5e9
...@@ -3602,4 +3602,20 @@ DROP VIEW v1; ...@@ -3602,4 +3602,20 @@ DROP VIEW v1;
DROP VIEW v2; DROP VIEW v2;
DROP VIEW v3; DROP VIEW v3;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#29477: Not all fields of the target table were checked to have
# a default value when inserting into a view.
#
create table t1(f1 int, f2 int not null);
create view v1 as select f1 from t1;
insert into v1 values(1);
Warnings:
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
set @old_mode=@@sql_mode;
set @@sql_mode=traditional;
insert into v1 values(1);
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
set @@sql_mode=@old_mode;
drop view v1;
drop table t1;
End of 5.0 tests. End of 5.0 tests.
...@@ -3456,5 +3456,19 @@ DROP VIEW v2; ...@@ -3456,5 +3456,19 @@ DROP VIEW v2;
DROP VIEW v3; DROP VIEW v3;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Bug#29477: Not all fields of the target table were checked to have
--echo # a default value when inserting into a view.
--echo #
create table t1(f1 int, f2 int not null);
create view v1 as select f1 from t1;
insert into v1 values(1);
set @old_mode=@@sql_mode;
set @@sql_mode=traditional;
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
insert into v1 values(1);
set @@sql_mode=@old_mode;
drop view v1;
drop table t1;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -630,7 +630,8 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -630,7 +630,8 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
if (mysql_prepare_insert(thd, table_list, table, fields, values, if (mysql_prepare_insert(thd, table_list, table, fields, values,
update_fields, update_values, duplic, &unused_conds, update_fields, update_values, duplic, &unused_conds,
FALSE, FALSE,
(fields.elements || !value_count), (fields.elements || !value_count ||
table_list->view != 0),
!ignore && (thd->variables.sql_mode & !ignore && (thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES | (MODE_STRICT_TRANS_TABLES |
MODE_STRICT_ALL_TABLES)))) MODE_STRICT_ALL_TABLES))))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment