Commit ae117f23 authored by dlenev@mockturtle.local's avatar dlenev@mockturtle.local

Merge mockturtle.local:/home/dlenev/src/mysql-5.0-bg20670-2

into  mockturtle.local:/home/dlenev/src/mysql-5.1-bg20670
parents 5f149dde 091ed9fb
...@@ -1173,4 +1173,16 @@ TRIGGER t2_bi BEFORE INSERT ON t2 FOR EACH ROW SET @a = 2; ...@@ -1173,4 +1173,16 @@ TRIGGER t2_bi BEFORE INSERT ON t2 FOR EACH ROW SET @a = 2;
ERROR HY000: String '1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY' is too long for host name (should be no longer than 60) ERROR HY000: String '1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY' is too long for host name (should be no longer than 60)
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
drop table if exists t1;
create table t1 (i int, j int key);
insert into t1 values (1,1), (2,2), (3,3);
create trigger t1_bu before update on t1 for each row
set new.j = new.j + 10;
update t1 set i= i+ 10 where j > 2;
select * from t1;
i j
1 1
2 2
13 13
drop table t1;
End of 5.0 tests End of 5.0 tests
...@@ -1421,4 +1421,23 @@ DROP TABLE t1; ...@@ -1421,4 +1421,23 @@ DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
#
# Bug#20670 "UPDATE using key and invoking trigger that modifies
# this key does not stop"
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (i int, j int key);
insert into t1 values (1,1), (2,2), (3,3);
create trigger t1_bu before update on t1 for each row
set new.j = new.j + 10;
# This should not work indefinitely and should cause
# expected result
update t1 set i= i+ 10 where j > 2;
select * from t1;
drop table t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -1582,6 +1582,38 @@ void Table_triggers_list::mark_fields_used(trg_event_type event) ...@@ -1582,6 +1582,38 @@ void Table_triggers_list::mark_fields_used(trg_event_type event)
} }
/*
Check if field of subject table can be changed in before update trigger.
SYNOPSIS
is_updated_in_before_update_triggers()
field Field object for field to be checked
NOTE
Field passed to this function should be bound to the same
TABLE object as Table_triggers_list.
RETURN VALUE
TRUE Field is changed
FALSE Otherwise
*/
bool Table_triggers_list::is_updated_in_before_update_triggers(Field *fld)
{
Item_trigger_field *trg_fld;
for (trg_fld= trigger_fields[TRG_EVENT_UPDATE][TRG_ACTION_BEFORE];
trg_fld != 0;
trg_fld= trg_fld->next_trg_field)
{
if (trg_fld->get_settable_routine_parameter() &&
trg_fld->field_idx != (uint)-1 &&
table->field[trg_fld->field_idx]->eq(fld))
return TRUE;
}
return FALSE;
}
/* /*
Trigger BUG#14090 compatibility hook Trigger BUG#14090 compatibility hook
......
...@@ -116,11 +116,6 @@ public: ...@@ -116,11 +116,6 @@ public:
bodies[TRG_EVENT_DELETE][TRG_ACTION_AFTER]); bodies[TRG_EVENT_DELETE][TRG_ACTION_AFTER]);
} }
bool has_before_update_triggers()
{
return test(bodies[TRG_EVENT_UPDATE][TRG_ACTION_BEFORE]);
}
void set_table(TABLE *new_table); void set_table(TABLE *new_table);
void mark_fields_used(trg_event_type event); void mark_fields_used(trg_event_type event);
......
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