mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #16110: insert permitted into view col w/o default value
When compiling INSERT statements the check whether columns are provided values depends on the flag whether a field is used in that query (Field::query_id). However the check for updatability of VIEW columns (check_view_insertability()) was calling fix_fields() and thus setting the Field::query_id even for the view fields that are not referenced in the current INSERT statement. So the correct check for columns without default values ( check_that_all_fields_are_given_values() ) is assuming that all the VIEW columns were mentioned in the INSERT field list and was issuing no warnings or errors. Fixed check_view_insertability() to turn off the flag whether or not to set Field::query_id (THREAD::set_query_id) before calling fix fields and restore it when it's done. mysql-test/r/view.result: Bug #16110: insert permitted into view col w/o default value * test case mysql-test/t/view.test: Bug #16110: insert permitted into view col w/o default value * test case sql/sql_insert.cc: Bug #16110: insert permitted into view col w/o default value * avoid setting the "field used" flag for fields when checking view columns for updatability. * a missing DBUG_RETURN added.
This commit is contained in:
@ -2735,4 +2735,18 @@ m e
|
|||||||
4 a
|
4 a
|
||||||
1 b
|
1 b
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE IF EXISTS t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
CREATE TABLE t1 (a INT NOT NULL, b INT NULL DEFAULT NULL);
|
||||||
|
CREATE VIEW v1 AS SELECT a, b FROM t1;
|
||||||
|
INSERT INTO v1 (b) VALUES (2);
|
||||||
|
Warnings:
|
||||||
|
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||||||
|
SET SQL_MODE = STRICT_ALL_TABLES;
|
||||||
|
INSERT INTO v1 (b) VALUES (4);
|
||||||
|
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||||||
|
SET SQL_MODE = '';
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
0 2
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -2595,4 +2595,22 @@ CREATE TABLE t2 SELECT * FROM v1;
|
|||||||
SELECT * FROM t2;
|
SELECT * FROM t2;
|
||||||
|
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE IF EXISTS t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#16110: insert permitted into view col w/o default value
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT NOT NULL, b INT NULL DEFAULT NULL);
|
||||||
|
CREATE VIEW v1 AS SELECT a, b FROM t1;
|
||||||
|
|
||||||
|
INSERT INTO v1 (b) VALUES (2);
|
||||||
|
|
||||||
|
SET SQL_MODE = STRICT_ALL_TABLES;
|
||||||
|
--error 1423
|
||||||
|
INSERT INTO v1 (b) VALUES (4);
|
||||||
|
SET SQL_MODE = '';
|
||||||
|
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -675,6 +675,7 @@ static bool check_view_insertability(THD * thd, TABLE_LIST *view)
|
|||||||
uint used_fields_buff_size= (table->s->fields + 7) / 8;
|
uint used_fields_buff_size= (table->s->fields + 7) / 8;
|
||||||
uchar *used_fields_buff= (uchar*)thd->alloc(used_fields_buff_size);
|
uchar *used_fields_buff= (uchar*)thd->alloc(used_fields_buff_size);
|
||||||
MY_BITMAP used_fields;
|
MY_BITMAP used_fields;
|
||||||
|
bool save_set_query_id= thd->set_query_id;
|
||||||
DBUG_ENTER("check_key_in_view");
|
DBUG_ENTER("check_key_in_view");
|
||||||
|
|
||||||
if (!used_fields_buff)
|
if (!used_fields_buff)
|
||||||
@ -687,15 +688,26 @@ static bool check_view_insertability(THD * thd, TABLE_LIST *view)
|
|||||||
bitmap_clear_all(&used_fields);
|
bitmap_clear_all(&used_fields);
|
||||||
|
|
||||||
view->contain_auto_increment= 0;
|
view->contain_auto_increment= 0;
|
||||||
|
/*
|
||||||
|
we must not set query_id for fields as they're not
|
||||||
|
really used in this context
|
||||||
|
*/
|
||||||
|
thd->set_query_id= 0;
|
||||||
/* check simplicity and prepare unique test of view */
|
/* check simplicity and prepare unique test of view */
|
||||||
for (trans= trans_start; trans != trans_end; trans++)
|
for (trans= trans_start; trans != trans_end; trans++)
|
||||||
{
|
{
|
||||||
if (!trans->item->fixed && trans->item->fix_fields(thd, &trans->item))
|
if (!trans->item->fixed && trans->item->fix_fields(thd, &trans->item))
|
||||||
return TRUE;
|
{
|
||||||
|
thd->set_query_id= save_set_query_id;
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
Item_field *field;
|
Item_field *field;
|
||||||
/* simple SELECT list entry (field without expression) */
|
/* simple SELECT list entry (field without expression) */
|
||||||
if (!(field= trans->item->filed_for_view_update()))
|
if (!(field= trans->item->filed_for_view_update()))
|
||||||
|
{
|
||||||
|
thd->set_query_id= save_set_query_id;
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
if (field->field->unireg_check == Field::NEXT_NUMBER)
|
if (field->field->unireg_check == Field::NEXT_NUMBER)
|
||||||
view->contain_auto_increment= 1;
|
view->contain_auto_increment= 1;
|
||||||
/* prepare unique test */
|
/* prepare unique test */
|
||||||
@ -705,6 +717,7 @@ static bool check_view_insertability(THD * thd, TABLE_LIST *view)
|
|||||||
*/
|
*/
|
||||||
trans->item= field;
|
trans->item= field;
|
||||||
}
|
}
|
||||||
|
thd->set_query_id= save_set_query_id;
|
||||||
/* unique test */
|
/* unique test */
|
||||||
for (trans= trans_start; trans != trans_end; trans++)
|
for (trans= trans_start; trans != trans_end; trans++)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user