Commit 33e63d3b authored by unknown's avatar unknown
Browse files

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

into  mockturtle.local:/home/dlenev/src/mysql-5.1-bg20670


mysql-test/r/trigger.result:
  Auto merged
mysql-test/t/trigger.test:
  Auto merged
sql/sql_trigger.cc:
  Auto merged
sql/key.cc:
  Using 5.1 version of the code.
sql/mysql_priv.h:
  Using 5.1 version of the code.
sql/opt_range.cc:
  Using 5.1 version of the code.
sql/opt_range.h:
  Using 5.1 version of the code.
sql/sql_update.cc:
  Using 5.1 version of the code.
sql/sql_trigger.h:
  Manual merge.
parents e0d2f525 0e4dd85d
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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)
DROP TABLE t1;
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
+19 −0
Original line number Diff line number Diff line
@@ -1421,4 +1421,23 @@ DROP TABLE t1;
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
+32 −0
Original line number Diff line number Diff line
@@ -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

+0 −5
Original line number Diff line number Diff line
@@ -116,11 +116,6 @@ class Table_triggers_list: public Sql_alloc
            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 mark_fields_used(trg_event_type event);