mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Backport from next-mr-bugfixing of tor.didriksen@sun.com-20100106140051-3j2iuag63eltsr2e
Bug #50087 Interval arithmetic for Event_queue_element is not portable. Subtraction of two unsigned months yielded a (very large) positive value. Conversion of this to a signed value was not necessarily well defined. Solution: do the subtraction on signed values. mysql-test/r/events_scheduling.result: Add test case. mysql-test/t/events_scheduling.test: Add test case. sql/event_data_objects.cc: Convert month to signed before doing the subtraction.
This commit is contained in:
parent
36be33b0ad
commit
5539f5ccf6
3 changed files with 48 additions and 2 deletions
|
@ -82,5 +82,24 @@ DROP TABLE table_1;
|
|||
DROP TABLE table_2;
|
||||
DROP TABLE table_3;
|
||||
DROP TABLE table_4;
|
||||
|
||||
Bug #50087 Interval arithmetic for Event_queue_element is not portable.
|
||||
|
||||
CREATE TABLE t1(a int);
|
||||
CREATE EVENT e1 ON SCHEDULE EVERY 1 MONTH
|
||||
STARTS NOW() - INTERVAL 1 MONTH
|
||||
ENDS NOW() + INTERVAL 2 MONTH
|
||||
ON COMPLETION PRESERVE
|
||||
DO
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE EVENT e2 ON SCHEDULE EVERY 1 MONTH
|
||||
STARTS NOW()
|
||||
ENDS NOW() + INTERVAL 11 MONTH
|
||||
ON COMPLETION PRESERVE
|
||||
DO
|
||||
INSERT INTO t1 VALUES (1);
|
||||
DROP TABLE t1;
|
||||
DROP EVENT e1;
|
||||
DROP EVENT e2;
|
||||
DROP DATABASE events_test;
|
||||
SET GLOBAL event_scheduler=@event_scheduler;
|
||||
|
|
|
@ -108,6 +108,32 @@ DROP TABLE table_1;
|
|||
DROP TABLE table_2;
|
||||
DROP TABLE table_3;
|
||||
DROP TABLE table_4;
|
||||
|
||||
-- echo
|
||||
-- echo Bug #50087 Interval arithmetic for Event_queue_element is not portable.
|
||||
-- echo
|
||||
|
||||
CREATE TABLE t1(a int);
|
||||
|
||||
CREATE EVENT e1 ON SCHEDULE EVERY 1 MONTH
|
||||
STARTS NOW() - INTERVAL 1 MONTH
|
||||
ENDS NOW() + INTERVAL 2 MONTH
|
||||
ON COMPLETION PRESERVE
|
||||
DO
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
CREATE EVENT e2 ON SCHEDULE EVERY 1 MONTH
|
||||
STARTS NOW()
|
||||
ENDS NOW() + INTERVAL 11 MONTH
|
||||
ON COMPLETION PRESERVE
|
||||
DO
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP EVENT e1;
|
||||
DROP EVENT e2;
|
||||
|
||||
|
||||
DROP DATABASE events_test;
|
||||
SET GLOBAL event_scheduler=@event_scheduler;
|
||||
|
||||
|
|
|
@ -834,8 +834,9 @@ bool get_next_time(const Time_zone *time_zone, my_time_t *next,
|
|||
}
|
||||
else
|
||||
{
|
||||
long diff_months= (long) (local_now.year - local_start.year)*12 +
|
||||
(local_now.month - local_start.month);
|
||||
long diff_months= ((long) local_now.year - (long) local_start.year)*12 +
|
||||
((long) local_now.month - (long) local_start.month);
|
||||
|
||||
/*
|
||||
Unlike for seconds above, the formula below returns the interval
|
||||
that, when added to the local_start, will give the time in the
|
||||
|
|
Loading…
Reference in a new issue