Bug#47150 Assertion in Field_long::val_int() on MERGE + TRIGGER + multi-table UPDATE
The bug is not related to MERGE table or TRIGGER. More correct description would be 'assertion on multi-table UPDATE + NATURAL JOIN + MERGEABLE VIEW'. On PREPARE stage(see test case) we call mark_common_columns() func which creates ON condition for NATURAL JOIN and sets appropriate table read_set bitmaps for fields which are used in ON condition. On EXECUTE stage mark_common_columns() is not called, we set necessary read_set bitmaps in setup_conds(). But 'B.f1' field is already processed and related item alredy fixed before setup_conds() as updated field and setup_conds can not set read_set bitmap because of that. The fix is to set read_set bitmap for appropriate table field even if Item_direct_view_ref item which represents a refernce to this field is fixed. mysql-test/r/join.result: test result mysql-test/t/join.test: test case sql/item.cc: The bug is not related to MERGE table or TRIGGER. More correct description would be 'assertion on multi-table UPDATE + NATURAL JOIN + MERGEABLE VIEW'. On PREPARE stage(see test case) we call mark_common_columns() func which creates ON condition for NATURAL JOIN and sets appropriate table read_set bitmaps for fields which are used in ON condition. On EXECUTE stage mark_common_columns() is not called, we set necessary read_set bitmaps in setup_conds(). But 'B.f1' field is already processed and related item alredy fixed before setup_conds() as updated field and setup_conds can not set read_set bitmap because of that. The fix is to set read_set bitmap for appropriate table field even if Item_direct_view_ref item which represents a refernce to this field is fixed.
This commit is contained in:
parent
54631d6168
commit
5f8bb5c507
@ -1064,3 +1064,13 @@ a b c d
|
||||
128 NULL 128 NULL
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
End of 5.0 tests.
|
||||
CREATE TABLE t1 (f1 int);
|
||||
CREATE TABLE t2 (f1 int);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
CREATE VIEW v1 AS SELECT * FROM t2;
|
||||
PREPARE stmt FROM 'UPDATE t2 AS A NATURAL JOIN v1 B SET B.f1 = 1';
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -729,4 +729,24 @@ SELECT * FROM t1 JOIN t2 ON b=c ORDER BY a;
|
||||
SELECT * FROM t1 JOIN t2 ON a=c ORDER BY a;
|
||||
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
||||
|
||||
#
|
||||
# Bug#47150 Assertion in Field_long::val_int() on MERGE + TRIGGER + multi-table UPDATE
|
||||
#
|
||||
CREATE TABLE t1 (f1 int);
|
||||
|
||||
CREATE TABLE t2 (f1 int);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
CREATE VIEW v1 AS SELECT * FROM t2;
|
||||
|
||||
PREPARE stmt FROM 'UPDATE t2 AS A NATURAL JOIN v1 B SET B.f1 = 1';
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1, t2;
|
||||
|
21
sql/item.cc
21
sql/item.cc
@ -6331,9 +6331,26 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference)
|
||||
/* view fild reference must be defined */
|
||||
DBUG_ASSERT(*ref);
|
||||
/* (*ref)->check_cols() will be made in Item_direct_ref::fix_fields */
|
||||
if (!(*ref)->fixed &&
|
||||
((*ref)->fix_fields(thd, ref)))
|
||||
if ((*ref)->fixed)
|
||||
{
|
||||
Item *ref_item= (*ref)->real_item();
|
||||
if (ref_item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
/*
|
||||
In some cases we need to update table read set(see bug#47150).
|
||||
If ref item is FIELD_ITEM and fixed then field and table
|
||||
have proper values. So we can use them for update.
|
||||
*/
|
||||
Field *fld= ((Item_field*) ref_item)->field;
|
||||
DBUG_ASSERT(fld && fld->table);
|
||||
if (thd->mark_used_columns == MARK_COLUMNS_READ)
|
||||
bitmap_set_bit(fld->table->read_set, fld->field_index);
|
||||
}
|
||||
}
|
||||
else if (!(*ref)->fixed &&
|
||||
((*ref)->fix_fields(thd, ref)))
|
||||
return TRUE;
|
||||
|
||||
return Item_direct_ref::fix_fields(thd, reference);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user