~tsarev/percona-server/5.5-processlist_rows_stats-sporadic_fails-fix

10 by Oleg Tsarev
propogate Oleg's patches
1
# name       : slow_extended.patch
2
# introduced : 11 or before
3
# maintainer : Oleg
4
#
5
#!!! notice !!!
6
# Any small change to this file in the main branch
7
# should be done or reviewed by the maintainer!
8
diff -ruN a/include/mysql/plugin_audit.h.pp b/include/mysql/plugin_audit.h.pp
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
9
--- a/include/mysql/plugin_audit.h.pp	2011-04-09 18:48:05.000000000 +0400
10
+++ b/include/mysql/plugin_audit.h.pp	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
11
@@ -178,6 +178,16 @@
12
 char *thd_security_context(void* thd, char *buffer, unsigned int length,
13
                            unsigned int max_query_len);
14
 void thd_inc_row_count(void* thd);
15
+void increment_thd_innodb_stats(void* thd,
16
+                    unsigned long long trx_id,
17
+                    long io_reads,
18
+                    long long io_read,
19
+                    long io_reads_wait_timer,
20
+                    long lock_que_wait_timer,
21
+                    long que_wait_timer,
22
+                    long page_access);
23
+unsigned long thd_log_slow_verbosity(const void* thd);
24
+int thd_opt_slow_log();
25
 int mysql_tmpfile(const char *prefix);
26
 int thd_killed(const void* thd);
27
 unsigned long thd_get_thread_id(const void* thd);
28
diff -ruN a/include/mysql/plugin_auth.h.pp b/include/mysql/plugin_auth.h.pp
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
29
--- a/include/mysql/plugin_auth.h.pp	2011-04-09 18:48:05.000000000 +0400
30
+++ b/include/mysql/plugin_auth.h.pp	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
31
@@ -178,6 +178,16 @@
32
 char *thd_security_context(void* thd, char *buffer, unsigned int length,
33
                            unsigned int max_query_len);
34
 void thd_inc_row_count(void* thd);
35
+void increment_thd_innodb_stats(void* thd,
36
+                    unsigned long long trx_id,
37
+                    long io_reads,
38
+                    long long io_read,
39
+                    long io_reads_wait_timer,
40
+                    long lock_que_wait_timer,
41
+                    long que_wait_timer,
42
+                    long page_access);
43
+unsigned long thd_log_slow_verbosity(const void* thd);
44
+int thd_opt_slow_log();
45
 int mysql_tmpfile(const char *prefix);
46
 int thd_killed(const void* thd);
47
 unsigned long thd_get_thread_id(const void* thd);
48
diff -ruN a/include/mysql/plugin_ftparser.h.pp b/include/mysql/plugin_ftparser.h.pp
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
49
--- a/include/mysql/plugin_ftparser.h.pp	2011-04-09 18:48:05.000000000 +0400
50
+++ b/include/mysql/plugin_ftparser.h.pp	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
51
@@ -131,6 +131,16 @@
52
 char *thd_security_context(void* thd, char *buffer, unsigned int length,
53
                            unsigned int max_query_len);
54
 void thd_inc_row_count(void* thd);
55
+void increment_thd_innodb_stats(void* thd,
56
+                    unsigned long long trx_id,
57
+                    long io_reads,
58
+                    long long io_read,
59
+                    long io_reads_wait_timer,
60
+                    long lock_que_wait_timer,
61
+                    long que_wait_timer,
62
+                    long page_access);
63
+unsigned long thd_log_slow_verbosity(const void* thd);
64
+int thd_opt_slow_log();
65
 int mysql_tmpfile(const char *prefix);
66
 int thd_killed(const void* thd);
67
 unsigned long thd_get_thread_id(const void* thd);
68
diff -ruN a/include/mysql/plugin.h b/include/mysql/plugin.h
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
69
--- a/include/mysql/plugin.h	2011-04-09 18:48:05.000000000 +0400
70
+++ b/include/mysql/plugin.h	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
71
@@ -536,6 +536,17 @@
72
 /* Increments the row counter, see THD::row_count */
73
 void thd_inc_row_count(MYSQL_THD thd);
74
 
75
+void increment_thd_innodb_stats(MYSQL_THD thd,
76
+                    unsigned long long trx_id,
77
+                    long io_reads,
78
+                    long long io_read,
79
+                    long io_reads_wait_timer,
80
+                    long lock_que_wait_timer,
81
+                    long que_wait_timer,
82
+                    long page_access);
83
+unsigned long thd_log_slow_verbosity(const MYSQL_THD thd);
84
+int thd_opt_slow_log();
85
+#define EXTENDED_SLOWLOG
86
 /**
87
   Create a temporary file.
88
 
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
89
diff -ruN /dev/null b/patch_info/slow_extended.info
90
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
91
+++ b/patch_info/slow_extended.info	2011-04-09 18:48:50.000000000 +0400
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
92
@@ -0,0 +1,25 @@
10 by Oleg Tsarev
propogate Oleg's patches
93
+File=slow_extended.patch
94
+Name=Extended statistics in slow.log (not InnoDB part)
95
+Version=1.3
96
+Author=Percona <info@percona.com>
97
+License=GPL
98
+Comment=
99
+Changelog
100
+2008-11-26
101
+YK: Fix inefficient determination of trx, Make not to call useless gettimeofday when don't use slow log. Make log_slow_queries dynamic (bool).
102
+
103
+2008-11-07
104
+VT: Moved log_slow_rate_limit in SHOW VARIABLE into right place
105
+
106
+2008-11
107
+Arjen Lentz: Fixups (backward compatibility) by Arjen Lentz <arjen@openquery.com.au>
108
+
109
+2010-07
110
+1) Fix overflow of query time and lock time (Bug 600360) (slow_extended_fix_overflow.patch merged)
111
+2) Control global slow feature merged (control_global_slow.patch merged)
112
+3) Microseconds in slow query log merged (microseconds_in_slow_query_log.patch merged)
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
113
+4) Now use_global_long_query_time and use_global_log_slow_control are synonims. Add value "all" for use_global_log_slow_control (contol-global_slow-2.patch merged)
10 by Oleg Tsarev
propogate Oleg's patches
114
+5) Fix innodb_stats on replication (Bug 600684)
115
+6) Change variable types (system/command-line)
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
116
+2011-01
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
117
+Patch profiling_slow.patch was merged
10 by Oleg Tsarev
propogate Oleg's patches
118
diff -ruN a/scripts/mysqldumpslow.sh b/scripts/mysqldumpslow.sh
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
119
--- a/scripts/mysqldumpslow.sh	2011-04-09 18:48:05.000000000 +0400
120
+++ b/scripts/mysqldumpslow.sh	2011-04-09 18:48:50.000000000 +0400
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
121
@@ -101,8 +101,8 @@
10 by Oleg Tsarev
propogate Oleg's patches
122
     s/^#? Time: \d{6}\s+\d+:\d+:\d+.*\n//;
123
     my ($user,$host) = s/^#? User\@Host:\s+(\S+)\s+\@\s+(\S+).*\n// ? ($1,$2) : ('','');
124
 
125
-    s/^# Query_time: ([0-9.]+)\s+Lock_time: ([0-9.]+)\s+Rows_sent: ([0-9.]+).*\n//;
126
-    my ($t, $l, $r) = ($1, $2, $3);
127
+    s/^# Query_time: (\d+(\.\d+)?)  Lock_time: (\d+(\.\d+)?)  Rows_sent: (\d+(\.\d+)?).*\n//;
128
+    my ($t, $l, $r) = ($1, $3, $5);
129
     $t -= $l unless $opt{l};
130
 
131
     # remove fluff that mysqld writes to log when it (re)starts:
132
diff -ruN a/sql/event_scheduler.cc b/sql/event_scheduler.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
133
--- a/sql/event_scheduler.cc	2011-04-09 18:48:05.000000000 +0400
134
+++ b/sql/event_scheduler.cc	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
135
@@ -195,6 +195,7 @@
136
   thd->client_capabilities|= CLIENT_MULTI_RESULTS;
137
   mysql_mutex_lock(&LOCK_thread_count);
138
   thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
139
+  thd->write_to_slow_log = TRUE;
140
   mysql_mutex_unlock(&LOCK_thread_count);
141
 
142
   /*
143
diff -ruN a/sql/filesort.cc b/sql/filesort.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
144
--- a/sql/filesort.cc	2011-04-09 18:48:05.000000000 +0400
145
+++ b/sql/filesort.cc	2011-04-09 18:48:50.000000000 +0400
146
@@ -195,6 +195,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
147
   {
148
     status_var_increment(thd->status_var.filesort_scan_count);
149
   }
150
+  thd->query_plan_flags|= QPLAN_FILESORT;
151
 #ifdef CAN_TRUST_RANGE
152
   if (select && select->quick && select->quick->records > 0L)
153
   {
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
154
@@ -260,6 +261,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
155
   }
156
   else
157
   {
158
+    thd->query_plan_flags|= QPLAN_FILESORT_DISK;
159
     if (table_sort.buffpek && table_sort.buffpek_len < maxbuffer)
160
     {
161
       my_free(table_sort.buffpek);
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
162
@@ -1219,6 +1221,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
163
   DBUG_ENTER("merge_buffers");
164
 
165
   status_var_increment(current_thd->status_var.filesort_merge_passes);
166
+  current_thd->query_plan_fsort_passes++;
167
   if (param->not_killable)
168
   {
169
     killed= &not_killable;
170
diff -ruN a/sql/log.cc b/sql/log.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
171
--- a/sql/log.cc	2011-04-09 18:48:05.000000000 +0400
172
+++ b/sql/log.cc	2011-04-09 18:48:50.000000000 +0400
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
173
@@ -715,11 +715,13 @@
10 by Oleg Tsarev
propogate Oleg's patches
174
 */
175
 
176
 bool Log_to_csv_event_handler::
177
-  log_slow(THD *thd, time_t current_time, time_t query_start_arg,
178
+  log_slow(THD *thd, ulonglong current_utime, time_t query_start_arg,
179
            const char *user_host, uint user_host_len,
180
            ulonglong query_utime, ulonglong lock_utime, bool is_command,
181
            const char *sql_text, uint sql_text_len)
182
 {
183
+  time_t current_time= my_time_possible_from_micro(current_utime);
184
+
185
   TABLE_LIST table_list;
186
   TABLE *table;
187
   bool result= TRUE;
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
188
@@ -935,14 +937,14 @@
10 by Oleg Tsarev
propogate Oleg's patches
189
 /** Wrapper around MYSQL_LOG::write() for slow log. */
190
 
191
 bool Log_to_file_event_handler::
192
-  log_slow(THD *thd, time_t current_time, time_t query_start_arg,
193
+  log_slow(THD *thd, ulonglong current_utime, time_t query_start_arg,
194
            const char *user_host, uint user_host_len,
195
            ulonglong query_utime, ulonglong lock_utime, bool is_command,
196
            const char *sql_text, uint sql_text_len)
197
 {
198
   Silence_log_table_errors error_handler;
199
   thd->push_internal_handler(&error_handler);
200
-  bool retval= mysql_slow_log.write(thd, current_time, query_start_arg,
201
+  bool retval= mysql_slow_log.write(thd, current_utime, query_start_arg,
202
                                     user_host, user_host_len,
203
                                     query_utime, lock_utime, is_command,
204
                                     sql_text, sql_text_len);
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
205
@@ -1216,7 +1218,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
206
     /* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
207
     user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
208
                              sctx->priv_user ? sctx->priv_user : "", "[",
209
-                             sctx->user ? sctx->user : "", "] @ ",
210
+                             sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), "] @ ",
211
                              sctx->host ? sctx->host : "", " [",
212
                              sctx->ip ? sctx->ip : "", "]", NullS) -
213
                     user_host_buff);
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
214
@@ -1224,8 +1226,22 @@
10 by Oleg Tsarev
propogate Oleg's patches
215
     current_time= my_time_possible_from_micro(current_utime);
216
     if (thd->start_utime)
217
     {
218
-      query_utime= (current_utime - thd->start_utime);
219
-      lock_utime=  (thd->utime_after_lock - thd->start_utime);
220
+      if(current_utime < thd->start_utime)
221
+      {
222
+        query_utime= 0;
223
+      }
224
+      else
225
+      {
226
+        query_utime= (current_utime - thd->start_utime);
227
+      }
228
+      if(thd->utime_after_lock < thd->start_utime)
229
+      {
230
+        lock_utime= 0;
231
+      }
232
+      else
233
+      {
234
+        lock_utime= (thd->utime_after_lock - thd->start_utime);
235
+      }
236
     }
237
     else
238
     {
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
239
@@ -1239,8 +1255,20 @@
10 by Oleg Tsarev
propogate Oleg's patches
240
       query_length= command_name[thd->command].length;
241
     }
242
 
243
+    if (!query_length)
244
+    {
245
+      thd->sent_row_count= thd->examined_row_count= 0;
246
+      thd->sent_row_count= 0;
247
+      thd->bytes_sent_old= thd->status_var.bytes_sent;
248
+      thd->tmp_tables_used= thd->tmp_tables_disk_used= 0;
249
+      thd->tmp_tables_size= 0;
250
+      thd->innodb_was_used= FALSE;
251
+      thd->query_plan_flags= QPLAN_NONE;
252
+      thd->query_plan_fsort_passes= 0;
253
+    }
254
+
255
     for (current_handler= slow_log_handler_list; *current_handler ;)
256
-      error= (*current_handler++)->log_slow(thd, current_time, thd->start_time,
257
+      error= (*current_handler++)->log_slow(thd, current_utime, thd->start_time,
258
                                             user_host_buff, user_host_len,
259
                                             query_utime, lock_utime, is_command,
260
                                             query, query_length) || error;
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
261
@@ -2656,12 +2684,13 @@
10 by Oleg Tsarev
propogate Oleg's patches
262
     TRUE - error occured
263
 */
264
 
265
-bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time,
266
+bool MYSQL_QUERY_LOG::write(THD *thd, ulonglong current_utime,
267
                             time_t query_start_arg, const char *user_host,
268
                             uint user_host_len, ulonglong query_utime,
269
                             ulonglong lock_utime, bool is_command,
270
                             const char *sql_text, uint sql_text_len)
271
 {
272
+  time_t current_time= my_time_possible_from_micro(current_utime);
273
   bool error= 0;
274
   DBUG_ENTER("MYSQL_QUERY_LOG::write");
275
 
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
276
@@ -2683,17 +2712,28 @@
10 by Oleg Tsarev
propogate Oleg's patches
277
 
278
     if (!(specialflag & SPECIAL_SHORT_LOG_FORMAT))
279
     {
280
-      if (current_time != last_time)
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
281
+      if (opt_slow_query_log_timestamp_always || current_time != last_time)
10 by Oleg Tsarev
propogate Oleg's patches
282
       {
283
         last_time= current_time;
284
         struct tm start;
285
         localtime_r(&current_time, &start);
286
-
287
-        buff_len= my_snprintf(buff, sizeof buff,
288
-                              "# Time: %02d%02d%02d %2d:%02d:%02d\n",
289
-                              start.tm_year % 100, start.tm_mon + 1,
290
-                              start.tm_mday, start.tm_hour,
291
-                              start.tm_min, start.tm_sec);
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
292
+	if(opt_slow_query_log_timestamp_precision & SLOG_MICROSECOND)
10 by Oleg Tsarev
propogate Oleg's patches
293
+	{
294
+	  ulonglong microsecond = current_utime % (1000 * 1000);
295
+	  buff_len= snprintf(buff, sizeof buff,
296
+	    "# Time: %02d%02d%02d %2d:%02d:%02d.%010lld\n",
297
+            start.tm_year % 100, start.tm_mon + 1,
298
+	    start.tm_mday, start.tm_hour,
299
+	    start.tm_min, start.tm_sec,microsecond);
300
+	}
301
+	else
302
+	{
303
+	  buff_len= my_snprintf(buff, sizeof buff,
304
+	    "# Time: %02d%02d%02d %2d:%02d:%02d\n",
305
+            start.tm_year % 100, start.tm_mon + 1,
306
+	    start.tm_mday, start.tm_hour,
307
+	    start.tm_min, start.tm_sec);
308
+	}
309
 
310
         /* Note that my_b_write() assumes it knows the length for this */
311
         if (my_b_write(&log_file, (uchar*) buff, buff_len))
91 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.10
312
@@ -2711,12 +2751,69 @@
10 by Oleg Tsarev
propogate Oleg's patches
313
     sprintf(query_time_buff, "%.6f", ulonglong2double(query_utime)/1000000.0);
314
     sprintf(lock_time_buff,  "%.6f", ulonglong2double(lock_utime)/1000000.0);
315
     if (my_b_printf(&log_file,
316
-                    "# Query_time: %s  Lock_time: %s"
317
-                    " Rows_sent: %lu  Rows_examined: %lu\n",
318
+                    "# Thread_id: %lu  Schema: %s  Last_errno: %u  Killed: %u\n" \
319
+                    "# Query_time: %s  Lock_time: %s  Rows_sent: %lu  Rows_examined: %lu  Rows_affected: %lu  Rows_read: %lu\n"
320
+                    "# Bytes_sent: %lu  Tmp_tables: %lu  Tmp_disk_tables: %lu  Tmp_table_sizes: %lu\n",
321
+                    (ulong) thd->thread_id, (thd->db ? thd->db : ""),
322
+                    thd->last_errno, (uint) thd->killed,
323
                     query_time_buff, lock_time_buff,
324
                     (ulong) thd->sent_row_count,
325
-                    (ulong) thd->examined_row_count) == (uint) -1)
326
+                    (ulong) thd->examined_row_count,
327
+                    ((long) thd->get_row_count_func() > 0 ) ? (ulong) thd->get_row_count_func() : 0,
328
+                    (ulong) thd->sent_row_count,
329
+                    (ulong) (thd->status_var.bytes_sent - thd->bytes_sent_old),
330
+                    (ulong) thd->tmp_tables_used,
331
+                    (ulong) thd->tmp_tables_disk_used,
332
+                    (ulong) thd->tmp_tables_size) == (uint) -1)
333
       tmp_errno= errno;
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
334
+
41 by Oleg Tsarev
Remove unnecessary test percona_suppress_log_warning_1592 (this test should be renamed to log_warnings_silence)
335
+#if defined(ENABLED_PROFILING)
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
336
+    thd->profiling.print_current(&log_file);
337
+#endif
10 by Oleg Tsarev
propogate Oleg's patches
338
+    if (thd->innodb_was_used)
339
+    {
340
+      char buf[20];
341
+      snprintf(buf, 20, "%llX", thd->innodb_trx_id);
342
+      if (my_b_printf(&log_file,
343
+                    "# InnoDB_trx_id: %s\n", buf) == (uint) -1)
344
+        tmp_errno=errno;
345
+    }
346
+    if ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_QUERY_PLAN)) &&
347
+         my_b_printf(&log_file,
348
+                    "# QC_Hit: %s  Full_scan: %s  Full_join: %s  Tmp_table: %s  Tmp_table_on_disk: %s\n" \
349
+                    "# Filesort: %s  Filesort_on_disk: %s  Merge_passes: %lu\n",
350
+                    ((thd->query_plan_flags & QPLAN_QC) ? "Yes" : "No"),
351
+                    ((thd->query_plan_flags & QPLAN_FULL_SCAN) ? "Yes" : "No"),
352
+                    ((thd->query_plan_flags & QPLAN_FULL_JOIN) ? "Yes" : "No"),
353
+                    ((thd->query_plan_flags & QPLAN_TMP_TABLE) ? "Yes" : "No"),
354
+                    ((thd->query_plan_flags & QPLAN_TMP_DISK) ? "Yes" : "No"),
355
+                    ((thd->query_plan_flags & QPLAN_FILESORT) ? "Yes" : "No"),
356
+                    ((thd->query_plan_flags & QPLAN_FILESORT_DISK) ? "Yes" : "No"),
357
+                    thd->query_plan_fsort_passes) == (uint) -1)
358
+      tmp_errno=errno;
359
+    if ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_INNODB)) && thd->innodb_was_used)
360
+    {
361
+      char buf[3][20];
362
+      snprintf(buf[0], 20, "%.6f", thd->innodb_io_reads_wait_timer / 1000000.0);
363
+      snprintf(buf[1], 20, "%.6f", thd->innodb_lock_que_wait_timer / 1000000.0);
364
+      snprintf(buf[2], 20, "%.6f", thd->innodb_innodb_que_wait_timer / 1000000.0);
365
+      if (my_b_printf(&log_file,
366
+                      "#   InnoDB_IO_r_ops: %lu  InnoDB_IO_r_bytes: %lu  InnoDB_IO_r_wait: %s\n" \
367
+                      "#   InnoDB_rec_lock_wait: %s  InnoDB_queue_wait: %s\n" \
368
+                      "#   InnoDB_pages_distinct: %lu\n",
369
+                      (ulong) thd->innodb_io_reads,
370
+                      (ulong) thd->innodb_io_read,
371
+                      buf[0], buf[1], buf[2],
372
+                      (ulong) thd->innodb_page_access) == (uint) -1)
373
+        tmp_errno=errno;
374
+    } 
375
+    else
376
+    {
377
+      if ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_INNODB)) &&
378
+          my_b_printf(&log_file,"# No InnoDB statistics available for this query\n") == (uint) -1)
379
+        tmp_errno=errno;
380
+    }
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
381
+
10 by Oleg Tsarev
propogate Oleg's patches
382
     if (thd->db && strcmp(thd->db, db))
383
     {						// Database changed
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
384
       if (my_b_printf(&log_file,"use %s;\n",thd->db) == (uint) -1)
10 by Oleg Tsarev
propogate Oleg's patches
385
diff -ruN a/sql/log.h b/sql/log.h
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
386
--- a/sql/log.h	2011-04-09 18:48:05.000000000 +0400
387
+++ b/sql/log.h	2011-04-09 18:48:50.000000000 +0400
21 by Oleg Tsarev
port Oleg's patches to 5.5.8
388
@@ -242,7 +242,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
389
              uint user_host_len, int thread_id,
390
              const char *command_type, uint command_type_len,
391
              const char *sql_text, uint sql_text_len);
392
-  bool write(THD *thd, time_t current_time, time_t query_start_arg,
393
+  bool write(THD *thd, ulonglong current_time, time_t query_start_arg,
394
              const char *user_host, uint user_host_len,
395
              ulonglong query_utime, ulonglong lock_utime, bool is_command,
396
              const char *sql_text, uint sql_text_len);
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
397
@@ -515,7 +515,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
398
   virtual bool init()= 0;
399
   virtual void cleanup()= 0;
400
 
401
-  virtual bool log_slow(THD *thd, time_t current_time,
402
+  virtual bool log_slow(THD *thd, ulonglong current_time,
403
                         time_t query_start_arg, const char *user_host,
404
                         uint user_host_len, ulonglong query_utime,
405
                         ulonglong lock_utime, bool is_command,
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
406
@@ -544,7 +544,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
407
   virtual bool init();
408
   virtual void cleanup();
409
 
410
-  virtual bool log_slow(THD *thd, time_t current_time,
411
+  virtual bool log_slow(THD *thd, ulonglong current_utime,
412
                         time_t query_start_arg, const char *user_host,
413
                         uint user_host_len, ulonglong query_utime,
414
                         ulonglong lock_utime, bool is_command,
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
415
@@ -576,7 +576,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
416
   virtual bool init();
417
   virtual void cleanup();
418
 
419
-  virtual bool log_slow(THD *thd, time_t current_time,
420
+  virtual bool log_slow(THD *thd, ulonglong current_utime,
421
                         time_t query_start_arg, const char *user_host,
422
                         uint user_host_len, ulonglong query_utime,
423
                         ulonglong lock_utime, bool is_command,
424
diff -ruN a/sql/mysqld.cc b/sql/mysqld.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
425
--- a/sql/mysqld.cc	2011-04-09 18:48:20.000000000 +0400
426
+++ b/sql/mysqld.cc	2011-04-09 18:48:50.000000000 +0400
120 by Oleg Tsarev
port to 5.5.13
427
@@ -416,6 +416,10 @@
10 by Oleg Tsarev
propogate Oleg's patches
428
 char* opt_secure_file_priv;
429
 my_bool opt_log_slow_admin_statements= 0;
430
 my_bool opt_log_slow_slave_statements= 0;
431
+my_bool opt_log_slow_sp_statements= 0;
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
432
+my_bool opt_slow_query_log_timestamp_always= 0;
77.1.1 by Oleg Tsarev
backup
433
+ulonglong opt_slow_query_log_use_global_control= 0;
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
434
+ulonglong opt_slow_query_log_timestamp_precision= 0;
10 by Oleg Tsarev
propogate Oleg's patches
435
 my_bool lower_case_file_system= 0;
436
 my_bool opt_large_pages= 0;
437
 my_bool opt_super_large_pages= 0;
120 by Oleg Tsarev
port to 5.5.13
438
@@ -5835,10 +5839,10 @@
10 by Oleg Tsarev
propogate Oleg's patches
439
    "Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to "
440
    "the slow log if it is open.", &opt_log_slow_admin_statements,
441
    &opt_log_slow_admin_statements, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
442
- {"log-slow-slave-statements", 0,
443
+ /*{"log-slow-slave-statements", 0,
444
   "Log slow statements executed by slave thread to the slow log if it is open.",
445
   &opt_log_slow_slave_statements, &opt_log_slow_slave_statements,
446
-  0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
447
+  0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},*/
448
   {"log-slow-queries", OPT_SLOW_QUERY_LOG,
449
    "Log slow queries to a table or log file. Defaults logging to table "
450
    "mysql.slow_log or hostname-slow.log if --log-output=file is used. "
120 by Oleg Tsarev
port to 5.5.13
451
@@ -7227,6 +7231,10 @@
21.1.1 by Oleg Tsarev
fix bug #692415
452
 
453
 C_MODE_END
454
 
455
+/* defined in sys_vars.cc */
456
+extern void init_log_slow_verbosity();
77.1.1 by Oleg Tsarev
backup
457
+extern void init_slow_query_log_use_global_control();
21.1.1 by Oleg Tsarev
fix bug #692415
458
+
459
 /**
460
   Get server options from the command line,
461
   and perform related server initializations.
120 by Oleg Tsarev
port to 5.5.13
462
@@ -7376,6 +7384,8 @@
21.1.1 by Oleg Tsarev
fix bug #692415
463
   global_system_variables.long_query_time= (ulonglong)
464
     (global_system_variables.long_query_time_double * 1e6);
465
 
466
+  init_log_slow_verbosity();
77.1.1 by Oleg Tsarev
backup
467
+  init_slow_query_log_use_global_control();
21.1.1 by Oleg Tsarev
fix bug #692415
468
   if (opt_short_log_format)
469
     opt_specialflag|= SPECIAL_SHORT_LOG_FORMAT;
470
 
10 by Oleg Tsarev
propogate Oleg's patches
471
diff -ruN a/sql/mysqld.h b/sql/mysqld.h
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
472
--- a/sql/mysqld.h	2011-04-09 18:48:17.000000000 +0400
473
+++ b/sql/mysqld.h	2011-04-09 18:48:50.000000000 +0400
21.1.1 by Oleg Tsarev
fix bug #692415
474
@@ -116,6 +116,10 @@
10 by Oleg Tsarev
propogate Oleg's patches
475
 extern char* opt_secure_backup_file_priv;
476
 extern size_t opt_secure_backup_file_priv_len;
477
 extern my_bool opt_log_slow_admin_statements, opt_log_slow_slave_statements;
478
+extern my_bool opt_log_slow_sp_statements;
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
479
+extern my_bool opt_slow_query_log_timestamp_always;
77.1.1 by Oleg Tsarev
backup
480
+extern ulonglong opt_slow_query_log_use_global_control;
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
481
+extern ulonglong opt_slow_query_log_timestamp_precision;
10 by Oleg Tsarev
propogate Oleg's patches
482
 extern my_bool sp_automatic_privileges, opt_noacl;
483
 extern my_bool opt_old_style_user_limits, trust_function_creators;
484
 extern uint opt_crash_binlog_innodb;
485
diff -ruN a/sql/slave.cc b/sql/slave.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
486
--- a/sql/slave.cc	2011-04-09 18:48:05.000000000 +0400
487
+++ b/sql/slave.cc	2011-04-09 18:48:50.000000000 +0400
69.1.1 by Oleg Tsarev
Port Oleg and Alexey patches to 5.5.9
488
@@ -2038,6 +2038,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
489
     + MAX_LOG_EVENT_HEADER;  /* note, incr over the global not session var */
490
   thd->slave_thread = 1;
491
   thd->enable_slow_log= opt_log_slow_slave_statements;
492
+  thd->write_to_slow_log= opt_log_slow_slave_statements;
493
   set_slave_thread_options(thd);
494
   thd->client_capabilities = CLIENT_LOCAL_FILES;
495
   mysql_mutex_lock(&LOCK_thread_count);
496
diff -ruN a/sql/sp_head.cc b/sql/sp_head.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
497
--- a/sql/sp_head.cc	2011-04-09 18:48:05.000000000 +0400
498
+++ b/sql/sp_head.cc	2011-04-09 18:48:50.000000000 +0400
120 by Oleg Tsarev
port to 5.5.13
499
@@ -2151,7 +2151,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
500
     DBUG_PRINT("info",(" %.*s: eval args done", (int) m_name.length, 
501
                        m_name.str));
502
   }
503
-  if (!(m_flags & LOG_SLOW_STATEMENTS) && thd->enable_slow_log)
504
+  if (!(m_flags & LOG_SLOW_STATEMENTS || opt_log_slow_sp_statements) && thd->enable_slow_log)
505
   {
506
     DBUG_PRINT("info", ("Disabling slow log for the execution"));
507
     save_enable_slow_log= true;
508
diff -ruN a/sql/sql_cache.cc b/sql/sql_cache.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
509
--- a/sql/sql_cache.cc	2011-04-09 18:48:05.000000000 +0400
510
+++ b/sql/sql_cache.cc	2011-04-09 18:48:50.000000000 +0400
10 by Oleg Tsarev
propogate Oleg's patches
511
@@ -1756,6 +1756,7 @@
512
     response, we can't handle it anyway.
513
   */
514
   (void) trans_commit_stmt(thd);
515
+  thd->query_plan_flags|= QPLAN_QC;
516
   if (!thd->stmt_da->is_set())
517
     thd->stmt_da->disable_status();
518
 
519
@@ -1766,6 +1767,7 @@
520
 err_unlock:
521
   unlock();
522
 err:
523
+  thd->query_plan_flags|= QPLAN_QC_NO;
524
   MYSQL_QUERY_CACHE_MISS(thd->query());
525
   DBUG_RETURN(0);				// Query was not cached
526
 }
527
diff -ruN a/sql/sql_class.cc b/sql/sql_class.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
528
--- a/sql/sql_class.cc	2011-04-09 18:48:05.000000000 +0400
529
+++ b/sql/sql_class.cc	2011-04-09 18:48:50.000000000 +0400
120 by Oleg Tsarev
port to 5.5.13
530
@@ -367,6 +367,37 @@
10 by Oleg Tsarev
propogate Oleg's patches
531
   thd->warning_info->inc_current_row_for_warning();
532
 }
533
 
534
+extern "C"
535
+void increment_thd_innodb_stats(THD* thd,
536
+                    unsigned long long trx_id,
537
+                    long io_reads,
538
+                    long long  io_read,
539
+                    long      io_reads_wait_timer,
540
+                    long      lock_que_wait_timer,
541
+                    long      que_wait_timer,
542
+                    long      page_access)
543
+{
544
+  thd->innodb_was_used = TRUE;
545
+  thd->innodb_trx_id = trx_id;
546
+  thd->innodb_io_reads += io_reads;
547
+  thd->innodb_io_read += io_read;
548
+  thd->innodb_io_reads_wait_timer += io_reads_wait_timer;
549
+  thd->innodb_lock_que_wait_timer += lock_que_wait_timer;
550
+  thd->innodb_innodb_que_wait_timer += que_wait_timer;
551
+  thd->innodb_page_access += page_access;
552
+}
553
+
554
+extern "C"
555
+unsigned long thd_log_slow_verbosity(const THD *thd)
556
+{
557
+  return (unsigned long) thd->variables.log_slow_verbosity;
558
+}
559
+
560
+extern "C"
561
+int thd_opt_slow_log()
562
+{
563
+  return (int) opt_slow_log;
564
+}
565
 
566
 /**
567
   Dumps a text description of a thread, its security context
120 by Oleg Tsarev
port to 5.5.13
568
@@ -661,6 +692,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
569
     *cond_hdl= NULL;
570
     return FALSE;
571
   }
572
+  last_errno= sql_errno;
573
 
574
   for (Internal_error_handler *error_handler= m_internal_handler;
575
        error_handler;
120 by Oleg Tsarev
port to 5.5.13
576
@@ -3385,6 +3417,12 @@
10 by Oleg Tsarev
propogate Oleg's patches
577
     first_successful_insert_id_in_prev_stmt;
578
   backup->first_successful_insert_id_in_cur_stmt= 
579
     first_successful_insert_id_in_cur_stmt;
580
+  backup->innodb_io_reads= innodb_io_reads;
581
+  backup->innodb_io_read= innodb_io_read;
582
+  backup->innodb_io_reads_wait_timer= innodb_io_reads_wait_timer;
583
+  backup->innodb_lock_que_wait_timer= innodb_lock_que_wait_timer;
584
+  backup->innodb_innodb_que_wait_timer= innodb_innodb_que_wait_timer;
585
+  backup->innodb_page_access= innodb_page_access;
586
 
587
   if ((!lex->requires_prelocking() || is_update_query(lex->sql_command)) &&
588
       !is_current_stmt_binlog_format_row())
120 by Oleg Tsarev
port to 5.5.13
589
@@ -3405,6 +3443,14 @@
10 by Oleg Tsarev
propogate Oleg's patches
590
   cuted_fields= 0;
591
   transaction.savepoints= 0;
592
   first_successful_insert_id_in_cur_stmt= 0;
593
+  last_errno= 0;
594
+  innodb_trx_id= 0;
595
+  innodb_io_reads= 0;
596
+  innodb_io_read= 0;
597
+  innodb_io_reads_wait_timer= 0;
598
+  innodb_lock_que_wait_timer= 0;
599
+  innodb_innodb_que_wait_timer= 0;
600
+  innodb_page_access= 0;
601
 }
602
 
603
 
120 by Oleg Tsarev
port to 5.5.13
604
@@ -3467,6 +3513,12 @@
10 by Oleg Tsarev
propogate Oleg's patches
605
   */
606
   examined_row_count+= backup->examined_row_count;
607
   cuted_fields+=       backup->cuted_fields;
608
+  innodb_io_reads+= backup->innodb_io_reads;
609
+  innodb_io_read+= backup->innodb_io_read;
610
+  innodb_io_reads_wait_timer+= backup->innodb_io_reads_wait_timer;
611
+  innodb_lock_que_wait_timer+= backup->innodb_lock_que_wait_timer;
612
+  innodb_innodb_que_wait_timer+= backup->innodb_innodb_que_wait_timer;
613
+  innodb_page_access+= backup->innodb_page_access;
614
   DBUG_VOID_RETURN;
615
 }
616
 
617
diff -ruN a/sql/sql_class.h b/sql/sql_class.h
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
618
--- a/sql/sql_class.h	2011-04-09 18:48:19.000000000 +0400
619
+++ b/sql/sql_class.h	2011-04-09 18:48:50.000000000 +0400
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
620
@@ -60,6 +60,33 @@
10 by Oleg Tsarev
propogate Oleg's patches
621
 enum enum_duplicates { DUP_ERROR, DUP_REPLACE, DUP_UPDATE };
622
 enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
623
 			    DELAY_KEY_WRITE_ALL };
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
624
+enum enum_slow_query_log_use_global_control {
625
+  SLOG_UG_LOG_SLOW_FILTER, SLOG_UG_LOG_SLOW_RATE_LIMIT
626
+  , SLOG_UG_LOG_SLOW_VERBOSITY, SLOG_UG_LONG_QUERY_TIME
627
+  , SLOG_UG_MIN_EXAMINED_ROW_LIMIT, SLOG_UG_ALL
628
+};
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
629
+enum enum_log_slow_verbosity { 
630
+  SLOG_V_MICROTIME, SLOG_V_QUERY_PLAN, SLOG_V_INNODB, 
631
+  SLOG_V_PROFILING, SLOG_V_PROFILING_USE_GETRUSAGE,
632
+  SLOG_V_MINIMAL, SLOG_V_STANDARD, SLOG_V_FULL
633
+};
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
634
+enum enum_slow_query_log_timestamp_precision {
635
+  SLOG_SECOND, SLOG_MICROSECOND
636
+};
10 by Oleg Tsarev
propogate Oleg's patches
637
+#define QPLAN_NONE            0
638
+#define QPLAN_QC              1 << 0
639
+#define QPLAN_QC_NO           1 << 1
640
+#define QPLAN_FULL_SCAN       1 << 2
641
+#define QPLAN_FULL_JOIN       1 << 3
642
+#define QPLAN_TMP_TABLE       1 << 4
643
+#define QPLAN_TMP_DISK        1 << 5
644
+#define QPLAN_FILESORT        1 << 6
645
+#define QPLAN_FILESORT_DISK   1 << 7
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
646
+enum enum_log_slow_filter {
647
+  SLOG_F_QC_NO, SLOG_F_FULL_SCAN, SLOG_F_FULL_JOIN,
648
+  SLOG_F_TMP_TABLE, SLOG_F_TMP_DISK, SLOG_F_FILESORT,
649
+  SLOG_F_FILESORT_DISK
650
+};
10 by Oleg Tsarev
propogate Oleg's patches
651
 enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT,
652
                             SLAVE_EXEC_MODE_IDEMPOTENT,
653
                             SLAVE_EXEC_MODE_LAST_BIT};
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
654
@@ -508,6 +535,17 @@
10 by Oleg Tsarev
propogate Oleg's patches
655
 
656
   my_bool sysdate_is_now;
657
 
658
+  ulong log_slow_rate_limit;
659
+  ulonglong log_slow_filter;
660
+  ulonglong log_slow_verbosity;
661
+
662
+  ulong      innodb_io_reads;
663
+  ulonglong  innodb_io_read;
664
+  ulong      innodb_io_reads_wait_timer;
665
+  ulong      innodb_lock_que_wait_timer;
666
+  ulong      innodb_innodb_que_wait_timer;
667
+  ulong      innodb_page_access;
668
+
669
   double long_query_time_double;
670
 
671
 } SV;
120 by Oleg Tsarev
port to 5.5.13
672
@@ -1135,6 +1173,14 @@
10 by Oleg Tsarev
propogate Oleg's patches
673
   uint in_sub_stmt;
674
   bool enable_slow_log;
675
   bool last_insert_id_used;
676
+
677
+  ulong      innodb_io_reads;
678
+  ulonglong  innodb_io_read;
679
+  ulong      innodb_io_reads_wait_timer;
680
+  ulong      innodb_lock_que_wait_timer;
681
+  ulong      innodb_innodb_que_wait_timer;
682
+  ulong      innodb_page_access;
683
+
684
   SAVEPOINT *savepoints;
685
   enum enum_check_fields count_cuted_fields;
686
 };
120 by Oleg Tsarev
port to 5.5.13
687
@@ -1583,6 +1629,26 @@
10 by Oleg Tsarev
propogate Oleg's patches
688
   thr_lock_type update_lock_default;
689
   Delayed_insert *di;
690
 
691
+  bool       write_to_slow_log;
692
+
693
+  ulonglong  bytes_sent_old;
694
+  ulong      tmp_tables_used;
695
+  ulong      tmp_tables_disk_used;
696
+  ulonglong  tmp_tables_size;
697
+  bool       innodb_was_used;
698
+  ulonglong  innodb_trx_id;
699
+  ulong      innodb_io_reads;
700
+  ulonglong  innodb_io_read;
701
+  ulong      innodb_io_reads_wait_timer;
702
+  ulong      innodb_lock_que_wait_timer;
703
+  ulong      innodb_innodb_que_wait_timer;
704
+  ulong      innodb_page_access;
705
+
706
+  ulong      query_plan_flags;
707
+  ulong      query_plan_fsort_passes;
708
+
709
+  uint       last_errno;
710
+
711
   /* <> 0 if we are inside of trigger or stored function. */
712
   uint in_sub_stmt;
713
 
714
diff -ruN a/sql/sql_connect.cc b/sql/sql_connect.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
715
--- a/sql/sql_connect.cc	2011-04-09 18:48:05.000000000 +0400
716
+++ b/sql/sql_connect.cc	2011-04-09 18:48:50.000000000 +0400
110.4.1 by Oleg Tsarev
Bugs: #786645 and #794350.
717
@@ -764,4 +764,13 @@
10 by Oleg Tsarev
propogate Oleg's patches
718
 
719
+    /* 
720
+      If rate limiting of slow log writes is enabled, decide whether to log this 
721
+      new thread's queries or not. Uses extremely simple algorithm. :) 
722
+    */ 
723
+    thd->write_to_slow_log= FALSE; 
724
+    if (thd->variables.log_slow_rate_limit <= 1 ||  
725
+        (thd->thread_id % thd->variables.log_slow_rate_limit) == 0) 
726
+         thd->write_to_slow_log= TRUE; 
727
+
110.4.1 by Oleg Tsarev
Bugs: #786645 and #794350.
728
     prepare_new_connection_state(thd);
729
 
10 by Oleg Tsarev
propogate Oleg's patches
730
     while (!net->error && net->vio != 0 &&
731
diff -ruN a/sql/sql_parse.cc b/sql/sql_parse.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
732
--- a/sql/sql_parse.cc	2011-04-09 18:48:20.000000000 +0400
733
+++ b/sql/sql_parse.cc	2011-04-09 18:48:50.000000000 +0400
734
@@ -1430,7 +1430,6 @@
10 by Oleg Tsarev
propogate Oleg's patches
735
   DBUG_RETURN(error);
736
 }
737
 
738
-
739
 void log_slow_statement(THD *thd)
740
 {
741
   DBUG_ENTER("log_slow_statement");
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
742
@@ -1443,6 +1442,42 @@
10 by Oleg Tsarev
propogate Oleg's patches
743
   if (unlikely(thd->in_sub_stmt))
744
     DBUG_VOID_RETURN;                           // Don't set time for sub stmt
745
 
746
+  /* Follow the slow log filter configuration. */
747
+  if (thd->variables.log_slow_filter != 0 &&
748
+      (!(thd->variables.log_slow_filter & thd->query_plan_flags) ||
749
+       ((thd->variables.log_slow_filter & SLOG_F_QC_NO) &&
750
+        (thd->query_plan_flags & QPLAN_QC))))
751
+    DBUG_VOID_RETURN;
752
+
753
+  /*
754
+    Low long_query_time value most likely means user is debugging stuff and even
755
+    though some thread's queries are not supposed to be logged b/c of the rate
756
+    limit, if one of them takes long enough (>= 1 second) it will be sensible
757
+    to make an exception and write to slow log anyway.
758
+  */
759
+
760
+  ulonglong end_utime_of_query= thd->current_utime();
16.1.1 by Oleg Tsarev
fix slow_extened.patch
761
+#define USE_GLOBAL_UPDATE(variable_name,enum_value_name)                \
77.1.1 by Oleg Tsarev
backup
762
+  if (opt_slow_query_log_use_global_control & (ULL(1) << enum_value_name))    \
16.1.1 by Oleg Tsarev
fix slow_extened.patch
763
+  {                                                                     \
764
+    thd->variables. variable_name=                                      \
765
+      global_system_variables. variable_name;                           \
766
+  }
767
+  USE_GLOBAL_UPDATE(log_slow_filter,SLOG_UG_LOG_SLOW_FILTER);
768
+  USE_GLOBAL_UPDATE(log_slow_rate_limit,SLOG_UG_LOG_SLOW_RATE_LIMIT);
769
+  USE_GLOBAL_UPDATE(log_slow_verbosity,SLOG_UG_LOG_SLOW_VERBOSITY);
770
+  USE_GLOBAL_UPDATE(long_query_time,SLOG_UG_LONG_QUERY_TIME);
20 by Oleg Tsarev
propogate fixes for slow_extended
771
+  USE_GLOBAL_UPDATE(long_query_time_double,SLOG_UG_LONG_QUERY_TIME);
16.1.1 by Oleg Tsarev
fix slow_extened.patch
772
+  USE_GLOBAL_UPDATE(min_examined_row_limit,SLOG_UG_MIN_EXAMINED_ROW_LIMIT);
773
+#undef USE_GLOBAL_UPDATE
10 by Oleg Tsarev
propogate Oleg's patches
774
+
775
+  /* Do not log this thread's queries due to rate limiting. */
776
+  if (thd->write_to_slow_log != TRUE
777
+      && (thd->variables.long_query_time >= 1000000
778
+          || (ulong) (end_utime_of_query - thd->utime_after_lock) < 1000000))
779
+    DBUG_VOID_RETURN;
780
+
781
+
782
   /*
783
     Do not log administrative statements unless the appropriate option is
784
     set.
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
785
@@ -1818,6 +1853,9 @@
10 by Oleg Tsarev
propogate Oleg's patches
786
     context.resolve_in_table_list_only(select_lex->
787
                                        table_list.first);
788
 
789
+  /* Reset the counter at all cases for the extended slow query log */
790
+  thd->sent_row_count= 0;
791
+
792
   /*
793
     Reset warning count for each query that uses tables
794
     A better approach would be to reset this for any commands
109.1.1 by Oleg Tsarev
port to 5.5.12 second part
795
@@ -5252,6 +5290,21 @@
10 by Oleg Tsarev
propogate Oleg's patches
796
   thd->rand_used= 0;
797
   thd->sent_row_count= thd->examined_row_count= 0;
798
 
799
+  thd->bytes_sent_old= thd->status_var.bytes_sent;
800
+  thd->tmp_tables_used= thd->tmp_tables_disk_used= 0;
801
+  thd->tmp_tables_size= 0;
802
+  thd->innodb_was_used= FALSE;
803
+  thd->innodb_trx_id= 0;
804
+  thd->innodb_io_reads= 0;
805
+  thd->innodb_io_read= 0;
806
+  thd->innodb_io_reads_wait_timer= 0;
807
+  thd->innodb_lock_que_wait_timer= 0;
808
+  thd->innodb_innodb_que_wait_timer= 0;
809
+  thd->innodb_page_access= 0;
810
+  thd->query_plan_flags= QPLAN_NONE;
811
+  thd->query_plan_fsort_passes= 0;
812
+  thd->last_errno= 0;
813
+
814
   thd->reset_current_stmt_binlog_format_row();
815
   thd->binlog_unsafe_warning_flags= 0;
816
 
817
diff -ruN a/sql/sql_select.cc b/sql/sql_select.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
818
--- a/sql/sql_select.cc	2011-04-09 18:48:17.000000000 +0400
819
+++ b/sql/sql_select.cc	2011-04-09 18:48:50.000000000 +0400
120 by Oleg Tsarev
port to 5.5.13
820
@@ -6902,7 +6902,10 @@
10 by Oleg Tsarev
propogate Oleg's patches
821
 	  {
822
 	    join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
823
 	    if (statistics)
824
+            {
825
 	      status_var_increment(join->thd->status_var.select_scan_count);
826
+              join->thd->query_plan_flags|= QPLAN_FULL_SCAN;
827
+            }
828
 	  }
829
 	}
830
 	else
120 by Oleg Tsarev
port to 5.5.13
831
@@ -6916,7 +6919,10 @@
10 by Oleg Tsarev
propogate Oleg's patches
832
 	  {
833
 	    join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
834
 	    if (statistics)
835
+            {
836
 	      status_var_increment(join->thd->status_var.select_full_join_count);
837
+              join->thd->query_plan_flags|= QPLAN_FULL_JOIN;
838
+            }
839
 	  }
840
 	}
841
 	if (!table->no_keyread)
120 by Oleg Tsarev
port to 5.5.13
842
@@ -10247,6 +10253,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
843
               (ulong) rows_limit,test(group)));
844
 
845
   status_var_increment(thd->status_var.created_tmp_tables);
846
+  thd->query_plan_flags|= QPLAN_TMP_TABLE;
847
 
848
   if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
849
     temp_pool_slot = bitmap_lock_set_next(&temp_pool);
120 by Oleg Tsarev
port to 5.5.13
850
@@ -11145,6 +11152,7 @@
10 by Oleg Tsarev
propogate Oleg's patches
851
     goto err;
852
   }
853
   status_var_increment(table->in_use->status_var.created_tmp_disk_tables);
854
+  table->in_use->query_plan_flags|= QPLAN_TMP_DISK;
855
   share->db_record_offset= 1;
856
   DBUG_RETURN(0);
857
  err:
120 by Oleg Tsarev
port to 5.5.13
858
@@ -11163,6 +11171,14 @@
10 by Oleg Tsarev
propogate Oleg's patches
859
   save_proc_info=thd->proc_info;
860
   thd_proc_info(thd, "removing tmp table");
861
 
862
+  thd->tmp_tables_used++;
863
+  if (entry->file)
864
+  {
865
+    thd->tmp_tables_size += entry->file->stats.data_file_length;
866
+    if (entry->file->ht->db_type != DB_TYPE_HEAP)
867
+      thd->tmp_tables_disk_used++;
868
+  }
869
+
870
   // Release latches since this can take a long time
871
   ha_release_temporary_latches(thd);
872
 
873
diff -ruN a/sql/sql_show.cc b/sql/sql_show.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
874
--- a/sql/sql_show.cc	2011-04-09 18:48:20.000000000 +0400
875
+++ b/sql/sql_show.cc	2011-04-09 18:48:50.000000000 +0400
109.1.1 by Oleg Tsarev
port to 5.5.12 second part
876
@@ -1950,8 +1950,17 @@
10 by Oleg Tsarev
propogate Oleg's patches
877
         table->field[4]->store(command_name[tmp->command].str,
878
                                command_name[tmp->command].length, cs);
879
       /* MYSQL_TIME */
880
-      table->field[5]->store((longlong)(tmp->start_time ?
881
-                                      now - tmp->start_time : 0), FALSE);
882
+      longlong value_in_time_column= 0;
883
+      if(tmp->start_time)
884
+      {
885
+        value_in_time_column = (now - tmp->start_time);
886
+        if(value_in_time_column > now)
887
+        {
888
+          value_in_time_column= 0;
889
+        }
890
+      }
891
+      table->field[5]->store(value_in_time_column, FALSE);
892
+
893
       /* STATE */
894
       if ((val= thread_state_info(tmp)))
895
       {
896
diff -ruN a/sql/sys_vars.cc b/sql/sys_vars.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
897
--- a/sql/sys_vars.cc	2011-04-09 18:48:19.000000000 +0400
898
+++ b/sql/sys_vars.cc	2011-04-09 18:48:50.000000000 +0400
109.1.1 by Oleg Tsarev
port to 5.5.12 second part
899
@@ -2898,6 +2898,117 @@
10 by Oleg Tsarev
propogate Oleg's patches
900
        DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
901
        ON_UPDATE(fix_log_state));
902
 
903
+const char *log_slow_filter_name[]= { "qc_miss", "full_scan", "full_join",
904
+                                      "tmp_table", "tmp_table_on_disk", "filesort", "filesort_on_disk", 0};
905
+static Sys_var_set Sys_log_slow_filter(
906
+       "log_slow_filter",
907
+       "Log only the queries that followed certain execution plan. "
908
+       "Multiple flags allowed in a comma-separated string. "
909
+       "[qc_miss, full_scan, full_join, tmp_table, tmp_table_on_disk, "
910
+       "filesort, filesort_on_disk]",
911
+       SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG),
16.1.1 by Oleg Tsarev
fix slow_extened.patch
912
+       log_slow_filter_name, DEFAULT(0));
10 by Oleg Tsarev
propogate Oleg's patches
913
+static Sys_var_ulong sys_log_slow_rate_limit(
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
914
+       "log_slow_rate_limit","Rate limit statement writes to slow log to only those from every (1/log_slow_rate_limit) session.",
10 by Oleg Tsarev
propogate Oleg's patches
915
+       SESSION_VAR(log_slow_rate_limit), CMD_LINE(REQUIRED_ARG),
16.1.1 by Oleg Tsarev
fix slow_extened.patch
916
+       VALID_RANGE(1, ULONG_MAX), DEFAULT(1), BLOCK_SIZE(1));
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
917
+const char* log_slow_verbosity_name[] = { 
918
+  "microtime", "query_plan", "innodb", 
54 by Oleg Tsarev
slow_extended.patch: rename profiling_getr_usage to correct profiling_use_getrusage
919
+  "profiling", "profling_use_getrusage", 
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
920
+  "minimal", "standard", "full", 0
921
+};
10 by Oleg Tsarev
propogate Oleg's patches
922
+static ulonglong update_log_slow_verbosity_replace(ulonglong value, ulonglong what, ulonglong by)
923
+{
924
+  if((value & what) == what)
925
+  {
926
+    value = value & (~what);
927
+    value = value | by;
928
+  }
929
+  return value;
930
+}
21.1.1 by Oleg Tsarev
fix bug #692415
931
+void update_log_slow_verbosity(ulonglong* value_ptr)
10 by Oleg Tsarev
propogate Oleg's patches
932
+{
933
+  ulonglong &value    = *value_ptr;
934
+  ulonglong microtime= ULL(1) << SLOG_V_MICROTIME;
935
+  ulonglong query_plan= ULL(1) << SLOG_V_QUERY_PLAN;
936
+  ulonglong innodb= ULL(1) << SLOG_V_INNODB;
937
+  ulonglong minimal= ULL(1) << SLOG_V_MINIMAL;
938
+  ulonglong standard= ULL(1) << SLOG_V_STANDARD;
939
+  ulonglong full= ULL(1) << SLOG_V_FULL;
940
+  value= update_log_slow_verbosity_replace(value,minimal,microtime);
941
+  value= update_log_slow_verbosity_replace(value,standard,microtime | query_plan);
942
+  value= update_log_slow_verbosity_replace(value,full,microtime | query_plan | innodb);
21.1.1 by Oleg Tsarev
fix bug #692415
943
+}
944
+static bool update_log_slow_verbosity_helper(sys_var */*self*/, THD *thd,
945
+                                          enum_var_type type)
946
+{
947
+  if(type == OPT_SESSION)
948
+  {
949
+    update_log_slow_verbosity(&(thd->variables.log_slow_verbosity));
950
+  }
951
+  else
952
+  {
953
+    update_log_slow_verbosity(&(global_system_variables.log_slow_verbosity));
954
+  }
10 by Oleg Tsarev
propogate Oleg's patches
955
+  return false;
956
+}
77.1.1 by Oleg Tsarev
backup
957
+void init_slow_query_log_use_global_control()
21.1.1 by Oleg Tsarev
fix bug #692415
958
+{
959
+  update_log_slow_verbosity(&(global_system_variables.log_slow_verbosity));
960
+}
10 by Oleg Tsarev
propogate Oleg's patches
961
+static Sys_var_set Sys_log_slow_verbosity(
962
+        "log_slow_verbosity",
963
+        "Choose how verbose the messages to your slow log will be. "
54 by Oleg Tsarev
slow_extended.patch: rename profiling_getr_usage to correct profiling_use_getrusage
964
+        "Multiple flags allowed in a comma-separated string. [microtime, query_plan, innodb, profiling, profiling_use_getrusage]",
10 by Oleg Tsarev
propogate Oleg's patches
965
+        SESSION_VAR(log_slow_verbosity), CMD_LINE(REQUIRED_ARG),
966
+        log_slow_verbosity_name, DEFAULT(SLOG_V_MICROTIME),
967
+        NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
21.1.1 by Oleg Tsarev
fix bug #692415
968
+        ON_UPDATE(update_log_slow_verbosity_helper));
10 by Oleg Tsarev
propogate Oleg's patches
969
+static Sys_var_mybool Sys_log_slow_slave_statements(
970
+       "log_slow_slave_statements",
971
+       "Log queries replayed be the slave SQL thread",
972
+       GLOBAL_VAR(opt_log_slow_slave_statements), CMD_LINE(OPT_ARG),
973
+       DEFAULT(FALSE));
974
+static Sys_var_mybool Sys_log_slow_sp_statements(
975
+       "log_slow_sp_statements",
976
+       "Log slow statements executed by stored procedure to the slow log if it is open.",
977
+       GLOBAL_VAR(opt_log_slow_sp_statements), CMD_LINE(OPT_ARG),
978
+       DEFAULT(TRUE));
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
979
+static Sys_var_mybool Sys_slow_query_log_timestamp_always(
980
+       "slow_query_log_timestamp_always",
10 by Oleg Tsarev
propogate Oleg's patches
981
+       "Timestamp is printed for all records of the slow log even if they are same time.",
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
982
+       GLOBAL_VAR(opt_slow_query_log_timestamp_always), CMD_LINE(OPT_ARG),
10 by Oleg Tsarev
propogate Oleg's patches
983
+       DEFAULT(FALSE));
77.1.1 by Oleg Tsarev
backup
984
+const char *slow_query_log_use_global_control_name[]= { "log_slow_filter", "log_slow_rate_limit", "log_slow_verbosity", "long_query_time", "min_examined_row_limit", "all", 0};
985
+static bool update_slow_query_log_use_global_control(sys_var */*self*/, THD */*thd*/,
21.1.1 by Oleg Tsarev
fix bug #692415
986
+                                               enum_var_type /*type*/)
10 by Oleg Tsarev
propogate Oleg's patches
987
+{
77.1.1 by Oleg Tsarev
backup
988
+  if(opt_slow_query_log_use_global_control & (ULL(1) << SLOG_UG_ALL))
10 by Oleg Tsarev
propogate Oleg's patches
989
+  {
77.1.1 by Oleg Tsarev
backup
990
+    opt_slow_query_log_use_global_control=
10 by Oleg Tsarev
propogate Oleg's patches
991
+      SLOG_UG_LOG_SLOW_FILTER | SLOG_UG_LOG_SLOW_RATE_LIMIT | SLOG_UG_LOG_SLOW_VERBOSITY |
992
+      SLOG_UG_LONG_QUERY_TIME | SLOG_UG_MIN_EXAMINED_ROW_LIMIT;
993
+  }
994
+  return false;
995
+}
21.1.1 by Oleg Tsarev
fix bug #692415
996
+void init_log_slow_verbosity()
997
+{
77.1.1 by Oleg Tsarev
backup
998
+  update_slow_query_log_use_global_control(0,0,OPT_GLOBAL);
21.1.1 by Oleg Tsarev
fix bug #692415
999
+}
77.1.1 by Oleg Tsarev
backup
1000
+static Sys_var_set Sys_slow_query_log_use_global_control(
1001
+       "slow_query_log_use_global_control",
10 by Oleg Tsarev
propogate Oleg's patches
1002
+       "Choose flags, wich always use the global variables. Multiple flags allowed in a comma-separated string. [none, log_slow_filter, log_slow_rate_limit, log_slow_verbosity, long_query_time, min_examined_row_limit, all]",
77.1.1 by Oleg Tsarev
backup
1003
+       GLOBAL_VAR(opt_slow_query_log_use_global_control), CMD_LINE(REQUIRED_ARG),
1004
+       slow_query_log_use_global_control_name, DEFAULT(0),
10 by Oleg Tsarev
propogate Oleg's patches
1005
+        NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
77.1.1 by Oleg Tsarev
backup
1006
+       ON_UPDATE(update_slow_query_log_use_global_control));
79 by Oleg Tsarev
* Rename variables in slow_extended.patch:
1007
+const char *slow_query_log_timestamp_precision_name[]= { "second", "microsecond", 0 };
1008
+static Sys_var_enum Sys_slow_query_log_timestamp_precision(
1009
+       "slow_query_log_timestamp_precision",
1010
+       "Log slow statements executed by stored procedure to the slow log if it is open. [second, microsecond]",
1011
+       GLOBAL_VAR(opt_slow_query_log_timestamp_precision), CMD_LINE(REQUIRED_ARG),
1012
+       slow_query_log_timestamp_precision_name, DEFAULT(SLOG_SECOND));
10 by Oleg Tsarev
propogate Oleg's patches
1013
+ 
1014
 /* Synonym of "slow_query_log" for consistency with SHOW VARIABLES output */
1015
 static Sys_var_mybool Sys_log_slow(
1016
        "log_slow_queries",
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
1017
diff -ruN a/sql/sql_profile.cc b/sql/sql_profile.cc
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
1018
--- a/sql/sql_profile.cc	2011-04-09 18:48:05.000000000 +0400
1019
+++ b/sql/sql_profile.cc	2011-04-09 18:48:50.000000000 +0400
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
1020
@@ -243,7 +243,8 @@
1021
 {
1022
   time_usecs= (double) my_getsystime() / 10.0;  /* 1 sec was 1e7, now is 1e6 */
1023
 #ifdef HAVE_GETRUSAGE
1024
-  getrusage(RUSAGE_SELF, &rusage);
1025
+  if ((profile->get_profiling())->enabled_getrusage())
1026
+    getrusage(RUSAGE_SELF, &rusage);
1027
 #elif defined(_WIN32)
1028
   FILETIME ftDummy;
1029
   // NOTE: Get{Process|Thread}Times has a granularity of the clock interval,
1030
@@ -251,6 +252,19 @@
1031
   // measurable by this function.
1032
   GetProcessTimes(GetCurrentProcess(), &ftDummy, &ftDummy, &ftKernel, &ftUser);
1033
 #endif
1034
+
1035
+#ifdef HAVE_CLOCK_GETTIME
1036
+  struct timespec tp;
1037
+
1038
+  if (!(clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)))
1039
+  {
1040
+    cpu_time_usecs= tp.tv_sec*1000000000.0 + tp.tv_nsec;
1041
+  }
1042
+  else
1043
+#endif
1044
+  {
1045
+    cpu_time_usecs= 0;
1046
+  }
1047
 }
1048
 
1049
 
1050
@@ -366,7 +380,8 @@
1051
     finish_current_query();
1052
   }
1053
 
1054
-  enabled= ((thd->variables.option_bits & OPTION_PROFILING) != 0);
1055
+  enabled= ((thd->variables.option_bits & OPTION_PROFILING) != 0) ||
1056
+            ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_PROFILING)) != 0);
1057
 
1058
   if (! enabled) DBUG_VOID_RETURN;
1059
 
1060
@@ -404,7 +419,8 @@
1061
     status_change("ending", NULL, NULL, 0);
1062
 
1063
     if ((enabled) &&                                    /* ON at start? */
1064
-        ((thd->variables.option_bits & OPTION_PROFILING) != 0) &&   /* and ON at end? */
1065
+        (((thd->variables.option_bits & OPTION_PROFILING) != 0) ||
1066
+          ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_PROFILING)) != 0)) &&   /* and ON at end? */
1067
         (current->query_source != NULL) &&
1068
         (! current->entries.is_empty()))
1069
     {
1070
@@ -505,6 +521,118 @@
1071
   DBUG_VOID_RETURN;
1072
 }
1073
 
1074
+bool PROFILING::enabled_getrusage()
1075
+{
1076
+  return ((thd->variables.log_slow_verbosity & (ULL(1) << SLOG_V_PROFILING_USE_GETRUSAGE)) != 0);
1077
+}
1078
+
1079
+/**
1080
+   For a given profile entry specified by a name and 2 time measurements,
1081
+   print its normalized name (i.e. with all spaces replaced with underscores)
1082
+   along with its wall clock and CPU time.
1083
+*/
1084
+
1085
+static void my_b_print_status(IO_CACHE *log_file, const char *status,
1086
+                              PROF_MEASUREMENT *start, PROF_MEASUREMENT *stop)
1087
+{
1088
+  DBUG_ENTER("my_b_print_status");
1089
+  DBUG_ASSERT(log_file != NULL && status != NULL);
1090
+  char query_time_buff[22+7];
1091
+  const char *tmp;
1092
+
1093
+  my_b_printf(log_file, "Profile_");
1094
+  for (tmp= status; *tmp; tmp++)
1095
+    my_b_write_byte(log_file, *tmp == ' ' ? '_' : *tmp);
1096
+
1097
+  snprintf(query_time_buff, sizeof(query_time_buff), "%.6f",
1098
+           (stop->time_usecs - start->time_usecs) / (1000.0 * 1000));
1099
+  my_b_printf(log_file, ": %s ", query_time_buff);
1100
+
1101
+  my_b_printf(log_file, "Profile_");
1102
+  for (tmp= status; *tmp; tmp++)
1103
+    my_b_write_byte(log_file, *tmp == ' ' ? '_' : *tmp);
1104
+  my_b_printf(log_file, "_cpu: ");
1105
+
1106
+  snprintf(query_time_buff, sizeof(query_time_buff), "%.6f",
1107
+           (stop->cpu_time_usecs - start->cpu_time_usecs) /
1108
+           (1000.0 * 1000 * 1000));
1109
+  my_b_printf(log_file, "%s ", query_time_buff);
1110
+
1111
+  DBUG_VOID_RETURN;
1112
+}
1113
+
1114
+/**
1115
+  Print output for current query to file 
1116
+*/
1117
+
1118
+int PROFILING::print_current(IO_CACHE *log_file)
1119
+{
1120
+  DBUG_ENTER("PROFILING::print_current");
1121
+  ulonglong row_number= 0;
1122
+
1123
+  QUERY_PROFILE *query;
1124
+  /* Get current query */
1125
+  if (current == NULL)
1126
+  {
1127
+    DBUG_RETURN(0);
1128
+  }
1129
+
1130
+  query= current;
1131
+
1132
+  my_b_printf(log_file, "# ");
1133
+
1134
+    void *entry_iterator;
1135
+    PROF_MEASUREMENT *entry= NULL, *previous= NULL, *first= NULL;
1136
+    /* ...and for each query, go through all its state-change steps. */
1137
+    for (entry_iterator= query->entries.new_iterator();
1138
+         entry_iterator != NULL;
1139
+         entry_iterator= query->entries.iterator_next(entry_iterator),
1140
+         previous=entry, row_number++)
1141
+    {
1142
+      entry= query->entries.iterator_value(entry_iterator);
1143
+
1144
+      /* Skip the first.  We count spans of fence, not fence-posts. */
1145
+      if (previous == NULL) {first= entry; continue;}
1146
+
1147
+      if (thd->lex->sql_command == SQLCOM_SHOW_PROFILE)
1148
+      {
1149
+        /*
1150
+          We got here via a SHOW command.  That means that we stored
1151
+          information about the query we wish to show and that isn't
1152
+          in a WHERE clause at a higher level to filter out rows we
1153
+          wish to exclude.
1154
+
1155
+          Because that functionality isn't available in the server yet,
1156
+          we must filter here, at the wrong level.  Once one can con-
1157
+          struct where and having conditions at the SQL layer, then this
1158
+          condition should be ripped out.
1159
+        */
1160
+        if (thd->lex->profile_query_id == 0) /* 0 == show final query */
1161
+        {
1162
+          if (query != last)
1163
+            continue;
1164
+        }
1165
+        else
1166
+        {
1167
+          if (thd->lex->profile_query_id != query->profiling_query_id)
1168
+            continue;
1169
+        }
1170
+      }
1171
+
1172
+      my_b_print_status(log_file, previous->status, previous, entry);
1173
+    }
1174
+
1175
+    my_b_write_byte(log_file, '\n');
1176
+    if ((entry != NULL) && (first != NULL))
1177
+    {
1178
+      my_b_printf(log_file, "# ");
1179
+      my_b_print_status(log_file, "total", first, entry);
1180
+      my_b_write_byte(log_file, '\n');
1181
+    }
1182
+
1183
+  DBUG_RETURN(0);
1184
+}
1185
+
1186
 /**
1187
   Fill the information schema table, "query_profile", as defined in show.cc .
1188
   There are two ways to get to this function:  Selecting from the information
110.4.2 by Oleg Tsarev
The reason of bug #786645 and #794348: patch slow_extended.patch adds option "log_slow_verbosity" with value "profiling_use_getrusage".
1189
@@ -600,6 +728,8 @@
1190
 
1191
 #ifdef HAVE_GETRUSAGE
1192
 
1193
+      if (enabled_getrusage())
1194
+      {
1195
       my_decimal cpu_utime_decimal, cpu_stime_decimal;
1196
 
1197
       double2my_decimal(E_DEC_FATAL_ERROR,
1198
@@ -687,6 +817,7 @@
1199
       table->field[14]->store((uint32)(entry->rusage.ru_nswap -
1200
                              previous->rusage.ru_nswap), true);
1201
       table->field[14]->set_notnull();
1202
+      }
1203
 #else
1204
       /* TODO: Add swap info for non-BSD systems */
1205
 #endif
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
1206
diff -ruN a/sql/sql_profile.h b/sql/sql_profile.h
96 by Alexey Kopytov
Ported non-XtraDB patches to 5.5.11
1207
--- a/sql/sql_profile.h	2011-04-09 18:48:05.000000000 +0400
1208
+++ b/sql/sql_profile.h	2011-04-09 18:48:50.000000000 +0400
33.1.5 by Oleg Tsarev
merge profiling_slow.patch to slow_extended.patch
1209
@@ -164,11 +164,15 @@
1210
 */
1211
 class PROF_MEASUREMENT
1212
 {
1213
-private:
1214
-  friend class QUERY_PROFILE;
1215
-  friend class PROFILING;
1216
-
1217
   QUERY_PROFILE *profile;
1218
+
1219
+  char *allocated_status_memory;
1220
+
1221
+  void set_label(const char *status_arg, const char *function_arg, 
1222
+                  const char *file_arg, unsigned int line_arg);
1223
+  void clean_up();
1224
+
1225
+public:
1226
   char *status;
1227
 #ifdef HAVE_GETRUSAGE
1228
   struct rusage rusage;
1229
@@ -181,12 +185,7 @@
1230
   unsigned int line;
1231
 
1232
   double time_usecs;
1233
-  char *allocated_status_memory;
1234
-
1235
-  void set_label(const char *status_arg, const char *function_arg, 
1236
-                  const char *file_arg, unsigned int line_arg);
1237
-  void clean_up();
1238
-  
1239
+  double cpu_time_usecs;
1240
   PROF_MEASUREMENT();
1241
   PROF_MEASUREMENT(QUERY_PROFILE *profile_arg, const char *status_arg);
1242
   PROF_MEASUREMENT(QUERY_PROFILE *profile_arg, const char *status_arg,
1243
@@ -231,6 +230,11 @@
1244
 
1245
   /* Show this profile.  This is called by PROFILING. */
1246
   bool show(uint options);
1247
+
1248
+public:
1249
+
1250
+  inline PROFILING * get_profiling() { return profiling; };
1251
+
1252
 };
1253
 
1254
 
1255
@@ -276,9 +280,11 @@
1256
 
1257
   /* SHOW PROFILES */
1258
   bool show_profiles();
1259
+  bool enabled_getrusage();
1260
 
1261
   /* ... from INFORMATION_SCHEMA.PROFILING ... */
1262
   int fill_statistics_info(THD *thd, TABLE_LIST *tables, Item *cond);
1263
+  int print_current(IO_CACHE *log_file);
1264
 };
1265
 
1266
 #  endif /* HAVE_PROFILING */