| Bug #35981 | ALTER EVENT causes the server to change the PRESERVE option. | ||
|---|---|---|---|
| Submitted: | 11 Apr 2008 0:00 | Modified: | 17 Oct 2008 17:25 | 
| Reporter: | Santo Leto | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S2 (Serious) | 
| Version: | 5.1.23-rc | OS: | Windows (XPSP2) | 
| Assigned to: | Tatiana Azundris Nuernberg | CPU Architecture: | Any | 
| Tags: | ALTER EVENT, preserve | ||
   [11 Apr 2008 0:28]
   MySQL Verification Team        
  Thank you for the bug report. Verified on Linux and Windows:
c:\dbs>5.1\bin\mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.25-rc-nt-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT CURRENT_USER(), VERSION(), CONNECTION_ID(), @@global.event_scheduler;
+----------------+------------------+-----------------+--------------------------+
| CURRENT_USER() | VERSION()        | CONNECTION_ID() | @@global.event_scheduler |
+----------------+------------------+-----------------+--------------------------+
| root@localhost | 5.1.25-rc-nt-log |               1 | OFF                      |
+----------------+------------------+-----------------+--------------------------+
1 row in set (0.03 sec)
mysql>
mysql> DROP DATABASE IF EXISTS `alter_event_bug`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE DATABASE IF NOT EXISTS `alter_event_bug`;
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> DELIMITER $$
mysql>
mysql> CREATE
    ->  DEFINER = 'root'@'localhost'
    ->  EVENT `alter_event_bug`.`test_bug`
    ->  ON SCHEDULE EVERY 6 MONTH
    ->  STARTS CURRENT_TIMESTAMP
    ->  ON COMPLETION PRESERVE
    ->  DISABLE
    ->  COMMENT ''
    ->  DO
    ->  BEGIN
    ->          # do nothing
    ->  END$$
Query OK, 0 rows affected (0.05 sec)
mysql>
mysql> DELIMITER ;
mysql>
mysql> SELECT
    ->  `EVENT_TYPE`,
    ->  `EXECUTE_AT`,
    ->  `STATUS`,
    ->  `ON_COMPLETION`,
    ->  `INTERVAL_VALUE`,
    ->  `INTERVAL_FIELD`,
    ->  `STARTS`,
    ->  `ENDS`,
    ->  `CREATED`,
    ->  `LAST_ALTERED`,
    ->  `LAST_EXECUTED`,
    ->  `SQL_MODE`,
    ->  `TIME_ZONE`,
    ->  `DEFINER`,
    ->  `ORIGINATOR`,
    ->  `EVENT_COMMENT`,
    ->  `EVENT_DEFINITION`
    -> FROM
    ->  `INFORMATION_SCHEMA`.`EVENTS`
    -> WHERE `EVENT_SCHEMA` = 'alter_event_bug'
    -> AND `EVENT_NAME` = 'test_bug'\G
*************************** 1. row ***************************
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
          STATUS: DISABLED
   ON_COMPLETION: PRESERVE
  INTERVAL_VALUE: 6
  INTERVAL_FIELD: MONTH
          STARTS: 2008-04-10 21:13:00
            ENDS: NULL
         CREATED: 2008-04-10 21:13:00
    LAST_ALTERED: 2008-04-10 21:13:00
   LAST_EXECUTED: NULL
        SQL_MODE:
       TIME_ZONE: SYSTEM
         DEFINER: root@localhost
      ORIGINATOR: 3
   EVENT_COMMENT:
EVENT_DEFINITION: BEGIN
        END
1 row in set (0.05 sec)
mysql>
mysql> ALTER
    ->  EVENT `alter_event_bug`.`test_bug`
    ->  ENABLE;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> SELECT
    ->  `EVENT_TYPE`,
    ->  `EXECUTE_AT`,
    ->  `STATUS`,
    ->  `ON_COMPLETION`,
    ->  `INTERVAL_VALUE`,
    ->  `INTERVAL_FIELD`,
    ->  `STARTS`,
    ->  `ENDS`,
    ->  `CREATED`,
    ->  `LAST_ALTERED`,
    ->  `LAST_EXECUTED`,
    ->  `SQL_MODE`,
    ->  `TIME_ZONE`,
    ->  `DEFINER`,
    ->  `ORIGINATOR`,
    ->  `EVENT_COMMENT`,
    ->  `EVENT_DEFINITION`
    -> FROM
    ->  `INFORMATION_SCHEMA`.`EVENTS`
    -> WHERE `EVENT_SCHEMA` = 'alter_event_bug'
    -> AND `EVENT_NAME` = 'test_bug'\G
*************************** 1. row ***************************
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
          STATUS: ENABLED
   ON_COMPLETION: NOT PRESERVE
  INTERVAL_VALUE: 6
  INTERVAL_FIELD: MONTH
          STARTS: 2008-04-10 21:13:00
            ENDS: NULL
         CREATED: 2008-04-10 21:13:00
    LAST_ALTERED: 2008-04-10 21:13:01
   LAST_EXECUTED: NULL
        SQL_MODE:
       TIME_ZONE: SYSTEM
         DEFINER: root@localhost
      ORIGINATOR: 3
   EVENT_COMMENT:
EVENT_DEFINITION: BEGIN
        END
1 row in set (0.01 sec)
mysql>
 
   [14 Apr 2008 19:00]
   Omer Barnir        
  workaround: include all event parameters in the alter statement (even those that are not changing
   [28 May 2008 6:10]
   Tatiana Azundris Nuernberg        
  notes event-object is always created with a default of "DROP" (NOT PRESERVE), hence we can't tell on ALTER EVENT whether the user really meant DROP, or just got the default as a result of not stating anything specifically. fix like so: - add new state ON_COMPLETION_DEFAULT - default to this state on create event-object - change yy so CREATE EVENT sets this to DROP (default as per the docs) if not given by user - ALTER EVENT will have _DEFAULT set unless anything is stated specifically mysql_event_fill_row() will not update "completion" if ALTER EVENT hands in _DEFAULT. (assert() against getting this flag on CREATE EVENT, just to be sure)
   [28 May 2008 6:27]
   Tatiana Azundris Nuernberg        
  note ALTER EVENT w/o explicit [NOT] PRESERVE will call Event_parse_data::check_if_in_the_past() while we don't have PRESERVE/DROP info yet, so if the date is in the past, we're stuck not knowing whether to react according to PRESERVE or to DROP. (added extra tests for that.)
   [18 Aug 2008 11:09]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/51829 2654 Tatiana A. Nurnberg 2008-08-18 Bug#35981: ALTER EVENT causes the server to change the PRESERVE option. If [NOT] PRESERVE was not given, parser always defaulted to NOT PRESERVE, making it impossible for the "not given = no change" rule to work in ALTER EVENT. Leaving out the PRESERVE-clause defaults to NOT PRESERVE on CREATE now, and to "no change" in ALTER.
   [11 Sep 2008 7:55]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/53785 2684 Tatiana A. Nurnberg 2008-09-11 [merge] Bug#35981: ALTER EVENT causes the server to change the PRESERVE option. If [NOT] PRESERVE was not given, parser always defaulted to NOT PRESERVE, making it impossible for the "not given = no change" rule to work in ALTER EVENT. Leaving out the PRESERVE-clause defaults to NOT PRESERVE on CREATE now, and to "no change" in ALTER.
   [15 Sep 2008 13:57]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/54105 2699 Tatiana A. Nurnberg 2008-09-15 [merge] Bug#35981: ALTER EVENT causes the server to change the PRESERVE option. If [NOT] PRESERVE was not given, parser always defaulted to NOT PRESERVE, making it impossible for the "not given = no change" rule to work in ALTER EVENT. Leaving out the PRESERVE-clause defaults to NOT PRESERVE on CREATE now, and to "no change" in ALTER.
   [18 Sep 2008 15:21]
   Tatiana Azundris Nuernberg        
  q'd for 5.1.30, 6.0.8
   [1 Oct 2008 10:15]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/54904 2753 Georgi Kodinov 2008-10-01 fixed a win32 warning caused by the fix for bug #35981
   [1 Oct 2008 10:15]
   Bugs System        
  A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/54905 2753 Georgi Kodinov 2008-10-01 fixed a win32 warning caused by the fix for bug #35981
   [7 Oct 2008 19:44]
   Paul DuBois        
  Noted in 5.1.29 changelog. ALTER EVENT changed the PRESERVE attribute of an event even when PRESERVE was not specified in the statement. Leaving report status unchanged; this is early documentation of an upcoming push into 5.1.29.
   [9 Oct 2008 17:57]
   Bugs System        
  Pushed into 5.1.30 (revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (version source revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (pib:4)
   [9 Oct 2008 18:41]
   Paul DuBois        
  Setting report to NDI pending push into 6.0.x.
   [17 Oct 2008 16:45]
   Bugs System        
  Pushed into 6.0.8-alpha (revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (version source revid:kgeorge@mysql.com-20081001101819-4v95jij3w9sdlpxo) (pib:5)
   [17 Oct 2008 17:25]
   Paul DuBois        
  Noted in 6.0.8 changelog.
   [28 Oct 2008 21:04]
   Bugs System        
  Pushed into 5.1.29-ndb-6.2.17 (revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (version source revid:tomas.ulin@sun.com-20081028140209-u4emkk1xphi5tkfb) (pib:5)
   [28 Oct 2008 22:23]
   Bugs System        
  Pushed into 5.1.29-ndb-6.3.19 (revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (version source revid:tomas.ulin@sun.com-20081028194045-0353yg8cvd2c7dd1) (pib:5)
   [1 Nov 2008 9:49]
   Bugs System        
  Pushed into 5.1.29-ndb-6.4.0 (revid:kgeorge@mysql.com-20081001101208-iz5u26r71khu4el7) (version source revid:jonas@mysql.com-20081101082305-qx5a1bj0z7i8ueys) (pib:5)


Description: ALTER EVENT causes the server to change the PRESERVE option - even if not specified. Doc. Ref.: "Alter Event Syntax" "It is necessary to include only those options in an ALTER EVENT statement which correspond to characteristics that you actually wish to change; options which are omitted retain their existing values. This includes any default values for CREATE EVENT such as ENABLE." How to repeat: Test Script: SELECT CURRENT_USER(), VERSION(), CONNECTION_ID(), @@global.event_scheduler; DROP DATABASE IF EXISTS `alter_event_bug`; CREATE DATABASE IF NOT EXISTS `alter_event_bug`; DELIMITER $$ CREATE DEFINER = 'root'@'localhost' EVENT `alter_event_bug`.`test_bug` ON SCHEDULE EVERY 6 MONTH STARTS CURRENT_TIMESTAMP ON COMPLETION PRESERVE DISABLE COMMENT '' DO BEGIN # do nothing END$$ DELIMITER ; SELECT `EVENT_TYPE`, `EXECUTE_AT`, `STATUS`, `ON_COMPLETION`, `INTERVAL_VALUE`, `INTERVAL_FIELD`, `STARTS`, `ENDS`, `CREATED`, `LAST_ALTERED`, `LAST_EXECUTED`, `SQL_MODE`, `TIME_ZONE`, `DEFINER`, `ORIGINATOR`, `EVENT_COMMENT`, `EVENT_DEFINITION` FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE `EVENT_SCHEMA` = 'alter_event_bug' AND `EVENT_NAME` = 'test_bug'\G ALTER EVENT `alter_event_bug`.`test_bug` ENABLE; SELECT `EVENT_TYPE`, `EXECUTE_AT`, `STATUS`, `ON_COMPLETION`, `INTERVAL_VALUE`, `INTERVAL_FIELD`, `STARTS`, `ENDS`, `CREATED`, `LAST_ALTERED`, `LAST_EXECUTED`, `SQL_MODE`, `TIME_ZONE`, `DEFINER`, `ORIGINATOR`, `EVENT_COMMENT`, `EVENT_DEFINITION` FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE `EVENT_SCHEMA` = 'alter_event_bug' AND `EVENT_NAME` = 'test_bug'\G Script Output: mysql> SELECT CURRENT_USER(), VERSION(), CONNECTION_ID(), @@global.event_schedul er; +----------------+-------------------------+-----------------+------------------ --------+ | CURRENT_USER() | VERSION() | CONNECTION_ID() | @@global.event_sc heduler | +----------------+-------------------------+-----------------+------------------ --------+ | root@localhost | 5.1.23-rc-community-log | 554 | ON | +----------------+-------------------------+-----------------+------------------ --------+ 1 row in set (0.00 sec) mysql> mysql> DROP DATABASE IF EXISTS `alter_event_bug`; Query OK, 0 rows affected (0.01 sec) mysql> CREATE DATABASE IF NOT EXISTS `alter_event_bug`; Query OK, 1 row affected (0.00 sec) mysql> mysql> DELIMITER $$ mysql> mysql> CREATE -> DEFINER = 'root'@'localhost' -> EVENT `alter_event_bug`.`test_bug` -> ON SCHEDULE EVERY 6 MONTH -> STARTS CURRENT_TIMESTAMP -> ON COMPLETION PRESERVE -> DISABLE -> COMMENT '' -> DO -> BEGIN -> # do nothing -> END$$ Query OK, 0 rows affected (0.00 sec) mysql> mysql> DELIMITER ; mysql> mysql> SELECT -> `EVENT_TYPE`, -> `EXECUTE_AT`, -> `STATUS`, -> `ON_COMPLETION`, -> `INTERVAL_VALUE`, -> `INTERVAL_FIELD`, -> `STARTS`, -> `ENDS`, -> `CREATED`, -> `LAST_ALTERED`, -> `LAST_EXECUTED`, -> `SQL_MODE`, -> `TIME_ZONE`, -> `DEFINER`, -> `ORIGINATOR`, -> `EVENT_COMMENT`, -> `EVENT_DEFINITION` -> FROM -> `INFORMATION_SCHEMA`.`EVENTS` -> WHERE `EVENT_SCHEMA` = 'alter_event_bug' -> AND `EVENT_NAME` = 'test_bug'\G *************************** 1. row *************************** EVENT_TYPE: RECURRING EXECUTE_AT: NULL STATUS: DISABLED ON_COMPLETION: PRESERVE INTERVAL_VALUE: 6 INTERVAL_FIELD: MONTH STARTS: 2008-04-11 01:55:18 ENDS: NULL CREATED: 2008-04-11 01:55:18 LAST_ALTERED: 2008-04-11 01:55:18 LAST_EXECUTED: NULL SQL_MODE: TIME_ZONE: SYSTEM DEFINER: root@localhost ORIGINATOR: 2 EVENT_COMMENT: EVENT_DEFINITION: BEGIN END 1 row in set (0.02 sec) mysql> mysql> ALTER -> EVENT `alter_event_bug`.`test_bug` -> ENABLE; Query OK, 0 rows affected (0.00 sec) mysql> mysql> SELECT -> `EVENT_TYPE`, -> `EXECUTE_AT`, -> `STATUS`, -> `ON_COMPLETION`, -> `INTERVAL_VALUE`, -> `INTERVAL_FIELD`, -> `STARTS`, -> `ENDS`, -> `CREATED`, -> `LAST_ALTERED`, -> `LAST_EXECUTED`, -> `SQL_MODE`, -> `TIME_ZONE`, -> `DEFINER`, -> `ORIGINATOR`, -> `EVENT_COMMENT`, -> `EVENT_DEFINITION` -> FROM -> `INFORMATION_SCHEMA`.`EVENTS` -> WHERE `EVENT_SCHEMA` = 'alter_event_bug' -> AND `EVENT_NAME` = 'test_bug'\G *************************** 1. row *************************** EVENT_TYPE: RECURRING EXECUTE_AT: NULL STATUS: ENABLED ON_COMPLETION: NOT PRESERVE INTERVAL_VALUE: 6 INTERVAL_FIELD: MONTH STARTS: 2008-04-11 01:55:18 ENDS: NULL CREATED: 2008-04-11 01:55:18 LAST_ALTERED: 2008-04-11 01:55:19 LAST_EXECUTED: NULL SQL_MODE: TIME_ZONE: SYSTEM DEFINER: root@localhost ORIGINATOR: 2 EVENT_COMMENT: EVENT_DEFINITION: BEGIN END 1 row in set (0.02 sec) Please, note the change of the 'ON_COMPLETION' option: from PRESERVE to NOT PRESERVE.