3387 Tor Didriksen 2010-05-19
Backport from next-mr-bugfixing of tor.didriksen@stripped
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.
modified:
mysql-test/r/events_scheduling.result
mysql-test/t/events_scheduling.test
sql/event_data_objects.cc
3386 Sergey Glukhov 2010-05-18
Bug#48729 SELECT ... FROM INFORMATION_SCHEMA.ROUTINES causes memory to grow
Analysis showed that in case of accessing I_S table
ROUTINES we perform unnecessary allocations
with get_field() function for every processed row that
in their turn causes significant memory growth.
the fix is to avoid use of get_field().
@ sql/sql_show.cc
Functions store_schema_proc() are changed
to avoid use of get_field() function.
modified:
sql/sql_show.cc
=== modified file 'mysql-test/r/events_scheduling.result'
--- a/mysql-test/r/events_scheduling.result 2008-12-16 18:09:09 +0000
+++ b/mysql-test/r/events_scheduling.result 2010-05-19 09:18:59 +0000
@@ -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;
=== modified file 'mysql-test/t/events_scheduling.test'
--- a/mysql-test/t/events_scheduling.test 2008-12-16 18:09:09 +0000
+++ b/mysql-test/t/events_scheduling.test 2010-05-19 09:18:59 +0000
@@ -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;
=== modified file 'sql/event_data_objects.cc'
--- a/sql/event_data_objects.cc 2010-01-19 09:03:40 +0000
+++ b/sql/event_data_objects.cc 2010-05-19 09:18:59 +0000
@@ -834,8 +834,9 @@ bool get_next_time(const Time_zone *time
}
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
Attachment: [text/bzr-bundle] bzr/tor.didriksen@sun.com-20100519091859-rwwjn5kjrgmoypic.bundle
| Thread |
|---|
| • bzr push into mysql-5.1-bugteam branch (tor.didriksen:3386 to 3387) | Tor Didriksen | 19 May |