From 0b8144a4728e357965b2e3027535148870f0d0fd Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Fri, 23 Oct 2015 23:23:36 +1100 Subject: [PATCH] MDEV-8981: Analyze stmt - cycles can overflow A 64bit counter can overflow within the time of a query so lets take it that the measurement is the small value rather than an order 1e12 millisecond query. tested with: int main() { ulonglong start = ULONGLONG_MAX - 30; ulonglong end = 600; ulonglong cycles = 10000; cycles += end - start; if (unlikely(end < start)) cycles += ULONGLONG_MAX; printf("cycles %llu\n", cycles); } --- sql/sql_analyze_stmt.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sql/sql_analyze_stmt.h b/sql/sql_analyze_stmt.h index bf800fd1df6..d7634bdfb85 100644 --- a/sql/sql_analyze_stmt.h +++ b/sql/sql_analyze_stmt.h @@ -47,6 +47,14 @@ protected: ulonglong count; ulonglong cycles; ulonglong last_start; + + void cycles_stop_tracking() + { + ulonglong end= my_timer_cycles(); + cycles += end - last_start; + if (unlikely(end < last_start)) + cycles += ULONGLONG_MAX; + } public: Exec_time_tracker() : count(0), cycles(0) {} @@ -59,7 +67,7 @@ public: void stop_tracking() { count++; - cycles += my_timer_cycles()- last_start; + cycles_stop_tracking(); } // interface for getting the time @@ -93,7 +101,7 @@ public: */ void stop_tracking() { - cycles += my_timer_cycles()- last_start; + cycles_stop_tracking(); } };