~percona-toolkit-dev/percona-toolkit/pt-agent

« back to all changes in this revision

Viewing changes to t/lib/MySQLProtocolParser.t

  • Committer: Daniel Nichter
  • Date: 2011-06-24 17:22:06 UTC
  • Revision ID: daniel@percona.com-20110624172206-c7q4s4ad6r260zz6
Add lib/, t/lib/, and sandbox/.  All modules are updated and passing on MySQL 5.1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl
 
2
 
 
3
BEGIN {
 
4
   die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
 
5
      unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
 
6
   unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
 
7
};
 
8
 
 
9
use strict;
 
10
use warnings FATAL => 'all';
 
11
use English qw(-no_match_vars);
 
12
use Test::More tests => 72;
 
13
 
 
14
use MySQLProtocolParser;
 
15
use TcpdumpParser;
 
16
use MaatkitTest;
 
17
 
 
18
my $sample  = "t/lib/samples/tcpdump/";
 
19
my $tcpdump = new TcpdumpParser();
 
20
my $protocol; # Create a new MySQLProtocolParser for each test.
 
21
 
 
22
# Check that I can parse a really simple session.
 
23
$protocol = new MySQLProtocolParser();
 
24
test_protocol_parser(
 
25
   parser   => $tcpdump,
 
26
   protocol => $protocol,
 
27
   file     => "$sample/tcpdump001.txt",
 
28
   result   => [
 
29
      {  ts            => '090412 09:50:16.805123',
 
30
         db            => undef,
 
31
         user          => undef,
 
32
         Thread_id     => 4294967296,
 
33
         host          => '127.0.0.1',
 
34
         ip            => '127.0.0.1',
 
35
         port          => '42167',
 
36
         arg           => 'select "hello world" as greeting',
 
37
         Query_time    => sprintf('%.6f', .805123 - .804849),
 
38
         pos_in_log    => 0,
 
39
         bytes         => length('select "hello world" as greeting'),
 
40
         cmd           => 'Query',
 
41
         Error_no      => 'none',
 
42
         Rows_affected => 0,
 
43
         Warning_count      => 0,
 
44
         No_good_index_used => 'No',
 
45
         No_index_used      => 'No',
 
46
      },
 
47
   ],
 
48
);
 
49
 
 
50
# A more complex session with a complete login/logout cycle.
 
51
$protocol = new MySQLProtocolParser();
 
52
test_protocol_parser(
 
53
   parser   => $tcpdump,
 
54
   protocol => $protocol,
 
55
   file     => "$sample/tcpdump002.txt",
 
56
   result   => [
 
57
      {  ts         => "090412 11:00:13.118191",
 
58
         db         => 'mysql',
 
59
         user       => 'msandbox',
 
60
         host       => '127.0.0.1',
 
61
         ip         => '127.0.0.1',
 
62
         port       => '57890',
 
63
         arg        => 'administrator command: Connect',
 
64
         Query_time => '0.011152',
 
65
         Thread_id  => 8,
 
66
         pos_in_log => 1470,
 
67
         bytes      => length('administrator command: Connect'),
 
68
         cmd        => 'Admin',
 
69
         Error_no   => 'none',
 
70
         Rows_affected => 0,
 
71
         Warning_count      => 0,
 
72
         No_good_index_used => 'No',
 
73
         No_index_used      => 'No',
 
74
      },
 
75
      {  Query_time => '0.000265',
 
76
         Thread_id  => 8,
 
77
         arg        => 'select @@version_comment limit 1',
 
78
         bytes      => length('select @@version_comment limit 1'),
 
79
         cmd        => 'Query',
 
80
         db         => 'mysql',
 
81
         host       => '127.0.0.1',
 
82
         ip         => '127.0.0.1',
 
83
         port       => '57890',
 
84
         pos_in_log => 2449,
 
85
         ts         => '090412 11:00:13.118643',
 
86
         user       => 'msandbox',
 
87
         Error_no   => 'none',
 
88
         Rows_affected => 0,
 
89
         Warning_count      => 0,
 
90
         No_good_index_used => 'No',
 
91
         No_index_used      => 'No',
 
92
      },
 
93
      {  Query_time => '0.000167',
 
94
         Thread_id  => 8,
 
95
         arg        => 'select "paris in the the spring" as trick',
 
96
         bytes      => length('select "paris in the the spring" as trick'),
 
97
         cmd        => 'Query',
 
98
         db         => 'mysql',
 
99
         host       => '127.0.0.1',
 
100
         ip         => '127.0.0.1',
 
101
         port       => '57890',
 
102
         pos_in_log => 3298,
 
103
         ts         => '090412 11:00:13.119079',
 
104
         user       => 'msandbox',
 
105
         Error_no   => 'none',
 
106
         Rows_affected => 0,
 
107
         Warning_count      => 0,
 
108
         No_good_index_used => 'No',
 
109
         No_index_used      => 'No',
 
110
      },
 
111
      {  Query_time => '0.000000',
 
112
         Thread_id  => 8,
 
113
         arg        => 'administrator command: Quit',
 
114
         bytes      => 27,
 
115
         cmd        => 'Admin',
 
116
         db         => 'mysql',
 
117
         host       => '127.0.0.1',
 
118
         ip         => '127.0.0.1',
 
119
         port       => '57890',
 
120
         pos_in_log => '4186',
 
121
         ts         => '090412 11:00:13.119487',
 
122
         user       => 'msandbox',
 
123
         Error_no   => 'none',
 
124
         Rows_affected => 0,
 
125
         Warning_count      => 0,
 
126
         No_good_index_used => 'No',
 
127
         No_index_used      => 'No',
 
128
      },
 
129
   ],
 
130
);
 
131
 
 
132
# A session that has an error during login.
 
133
$protocol = new MySQLProtocolParser();
 
134
test_protocol_parser(
 
135
   parser   => $tcpdump,
 
136
   protocol => $protocol,
 
137
   file     => "$sample/tcpdump003.txt",
 
138
   result   => [
 
139
      {  ts         => "090412 12:41:46.357853",
 
140
         db         => '',
 
141
         user       => 'msandbox',
 
142
         host       => '127.0.0.1',
 
143
         ip         => '127.0.0.1',
 
144
         port       => '44488',
 
145
         arg        => 'administrator command: Connect',
 
146
         Query_time => '0.010753',
 
147
         Thread_id  => 9,
 
148
         pos_in_log => 1455,
 
149
         bytes      => length('administrator command: Connect'),
 
150
         cmd        => 'Admin',
 
151
         Error_no   => 1045,
 
152
         Error_msg  => 'Access denied for user \'msandbox\'@\'localhost\' (using password: YES)',
 
153
         Rows_affected => 0,
 
154
         Warning_count      => 0,
 
155
         No_good_index_used => 'No',
 
156
         No_index_used      => 'No',
 
157
      },
 
158
   ],
 
159
);
 
160
 
 
161
# A session that has an error executing a query
 
162
$protocol = new MySQLProtocolParser();
 
163
test_protocol_parser(
 
164
   parser   => $tcpdump,
 
165
   protocol => $protocol,
 
166
   file     => "$sample/tcpdump004.txt",
 
167
   result   => [
 
168
      {  ts         => "090412 12:58:02.036002",
 
169
         db         => undef,
 
170
         user       => undef,
 
171
         host       => '127.0.0.1',
 
172
         ip         => '127.0.0.1',
 
173
         port       => '60439',
 
174
         arg        => 'select 5 from foo',
 
175
         Query_time => '0.000251',
 
176
         Thread_id  => 4294967296,
 
177
         pos_in_log => 0,
 
178
         bytes      => length('select 5 from foo'),
 
179
         cmd        => 'Query',
 
180
         Error_no   => "#1046",
 
181
         Error_msg  => 'No database selected',
 
182
         Rows_affected => 0,
 
183
         Warning_count      => 0,
 
184
         No_good_index_used => 'No',
 
185
         No_index_used      => 'No',
 
186
      },
 
187
   ],
 
188
);
 
189
 
 
190
# A session that has a single-row insert and a multi-row insert
 
191
$protocol = new MySQLProtocolParser();
 
192
test_protocol_parser(
 
193
   parser   => $tcpdump,
 
194
   protocol => $protocol,
 
195
   file     => "$sample/tcpdump005.txt",
 
196
   result   => [
 
197
      {  Error_no   => 'none',
 
198
         Rows_affected => 1,
 
199
         Query_time => '0.000435',
 
200
         Thread_id  => 4294967296,
 
201
         arg        => 'insert into test.t values(1)',
 
202
         bytes      => 28,
 
203
         cmd        => 'Query',
 
204
         db         => undef,
 
205
         host       => '127.0.0.1',
 
206
         ip         => '127.0.0.1',
 
207
         port       => '55300',
 
208
         pos_in_log => '0',
 
209
         ts         => '090412 16:46:02.978340',
 
210
         user       => undef,
 
211
         Warning_count      => 0,
 
212
         No_good_index_used => 'No',
 
213
         No_index_used      => 'No',
 
214
      },
 
215
      {  Error_no   => 'none',
 
216
         Rows_affected => 2,
 
217
         Query_time => '0.000565',
 
218
         Thread_id  => 4294967296,
 
219
         arg        => 'insert into test.t values(1),(2)',
 
220
         bytes      => 32,
 
221
         cmd        => 'Query',
 
222
         db         => undef,
 
223
         host       => '127.0.0.1',
 
224
         ip         => '127.0.0.1',
 
225
         port       => '55300',
 
226
         pos_in_log => '1033',
 
227
         ts         => '090412 16:46:20.245088',
 
228
         user       => undef,
 
229
         Warning_count      => 0,
 
230
         No_good_index_used => 'No',
 
231
         No_index_used      => 'No',
 
232
      },
 
233
   ],
 
234
);
 
235
 
 
236
# A session that causes a slow query because it doesn't use an index.
 
237
$protocol = new MySQLProtocolParser();
 
238
test_protocol_parser(
 
239
   parser   => $tcpdump,
 
240
   protocol => $protocol,
 
241
   file     => "$sample/tcpdump006.txt",
 
242
   result   => [
 
243
      {  ts         => '100412 20:46:10.776899',
 
244
         db         => undef,
 
245
         user       => undef,
 
246
         host       => '127.0.0.1',
 
247
         ip         => '127.0.0.1',
 
248
         port       => '48259',
 
249
         arg        => 'select * from t',
 
250
         Query_time => '0.000205',
 
251
         Thread_id  => 4294967296,
 
252
         pos_in_log => 0,
 
253
         bytes      => length('select * from t'),
 
254
         cmd        => 'Query',
 
255
         Error_no   => 'none',
 
256
         Rows_affected      => 0,
 
257
         Warning_count      => 0,
 
258
         No_good_index_used => 'No',
 
259
         No_index_used      => 'Yes',
 
260
      },
 
261
   ],
 
262
);
 
263
 
 
264
# A session that truncates an insert.
 
265
$protocol = new MySQLProtocolParser();
 
266
test_protocol_parser(
 
267
   parser   => $tcpdump,
 
268
   protocol => $protocol,
 
269
   file     => "$sample/tcpdump007.txt",
 
270
   result   => [
 
271
      {  ts         => '090412 20:57:22.798296',
 
272
         db         => undef,
 
273
         user       => undef,
 
274
         host       => '127.0.0.1',
 
275
         ip         => '127.0.0.1',
 
276
         port       => '38381',
 
277
         arg        => 'insert into t values(current_date)',
 
278
         Query_time => '0.000020',
 
279
         Thread_id  => 4294967296,
 
280
         pos_in_log => 0,
 
281
         bytes      => length('insert into t values(current_date)'),
 
282
         cmd        => 'Query',
 
283
         Error_no   => 'none',
 
284
         Rows_affected      => 1,
 
285
         Warning_count      => 1,
 
286
         No_good_index_used => 'No',
 
287
         No_index_used      => 'No',
 
288
      },
 
289
   ],
 
290
);
 
291
 
 
292
# #############################################################################
 
293
# Check the individual packet parsing subs.
 
294
# #############################################################################
 
295
MySQLProtocolParser->import(qw(
 
296
   parse_error_packet
 
297
   parse_ok_packet
 
298
   parse_server_handshake_packet
 
299
   parse_client_handshake_packet
 
300
   parse_com_packet
 
301
));
 
302
 
 
303
is_deeply(
 
304
   parse_error_packet(load_data("t/lib/samples/mysql_proto_001.txt")),
 
305
   {
 
306
      errno    => '1046',
 
307
      sqlstate => '#3D000',
 
308
      message  => 'No database selected',
 
309
   },
 
310
   'Parse error packet'
 
311
);
 
312
 
 
313
is_deeply(
 
314
   parse_ok_packet('010002000100'),
 
315
   {
 
316
      affected_rows => 1,
 
317
      insert_id     => 0,
 
318
      status        => 2,
 
319
      warnings      => 1,
 
320
      message       => '',
 
321
   },
 
322
   'Parse ok packet'
 
323
);
 
324
 
 
325
is_deeply(
 
326
   parse_server_handshake_packet(load_data("t/lib/samples/mysql_proto_002.txt")),
 
327
   {
 
328
      thread_id      => '9',
 
329
      server_version => '5.0.67-0ubuntu6-log',
 
330
      flags          => {
 
331
         CLIENT_COMPRESS          => 1,
 
332
         CLIENT_CONNECT_WITH_DB   => 1,
 
333
         CLIENT_FOUND_ROWS        => 0,
 
334
         CLIENT_IGNORE_SIGPIPE    => 0,
 
335
         CLIENT_IGNORE_SPACE      => 0,
 
336
         CLIENT_INTERACTIVE       => 0,
 
337
         CLIENT_LOCAL_FILES       => 0,
 
338
         CLIENT_LONG_FLAG         => 1,
 
339
         CLIENT_LONG_PASSWORD     => 0,
 
340
         CLIENT_MULTI_RESULTS     => 0,
 
341
         CLIENT_MULTI_STATEMENTS  => 0,
 
342
         CLIENT_NO_SCHEMA         => 0,
 
343
         CLIENT_ODBC              => 0,
 
344
         CLIENT_PROTOCOL_41       => 1,
 
345
         CLIENT_RESERVED          => 0,
 
346
         CLIENT_SECURE_CONNECTION => 1,
 
347
         CLIENT_SSL               => 0,
 
348
         CLIENT_TRANSACTIONS      => 1,
 
349
      }
 
350
   },
 
351
   'Parse server handshake packet'
 
352
);
 
353
 
 
354
is_deeply(
 
355
   parse_client_handshake_packet(load_data("t/lib/samples/mysql_proto_003.txt")),
 
356
   {
 
357
      db    => 'mysql',
 
358
      user  => 'msandbox',
 
359
      flags => {
 
360
         CLIENT_COMPRESS          => 0,
 
361
         CLIENT_CONNECT_WITH_DB   => 1,
 
362
         CLIENT_FOUND_ROWS        => 0,
 
363
         CLIENT_IGNORE_SIGPIPE    => 0,
 
364
         CLIENT_IGNORE_SPACE      => 0,
 
365
         CLIENT_INTERACTIVE       => 0,
 
366
         CLIENT_LOCAL_FILES       => 1,
 
367
         CLIENT_LONG_FLAG         => 1,
 
368
         CLIENT_LONG_PASSWORD     => 1,
 
369
         CLIENT_MULTI_RESULTS     => 1,
 
370
         CLIENT_MULTI_STATEMENTS  => 1,
 
371
         CLIENT_NO_SCHEMA         => 0,
 
372
         CLIENT_ODBC              => 0,
 
373
         CLIENT_PROTOCOL_41       => 1,
 
374
         CLIENT_RESERVED          => 0,
 
375
         CLIENT_SECURE_CONNECTION => 1,
 
376
         CLIENT_SSL               => 0,
 
377
         CLIENT_TRANSACTIONS      => 1,
 
378
      },
 
379
   },
 
380
   'Parse client handshake packet'
 
381
);
 
382
 
 
383
is_deeply(
 
384
   parse_com_packet('0373686f77207761726e696e67738d2dacbc', 14),
 
385
   {
 
386
      code => '03',
 
387
      com  => 'COM_QUERY',
 
388
      data => 'show warnings',
 
389
   },
 
390
   'Parse COM_QUERY packet'
 
391
);
 
392
 
 
393
# Test that we can parse with a non-standard port etc.
 
394
$protocol = new MySQLProtocolParser(
 
395
   server => '192.168.1.1',
 
396
   port   => '3307',
 
397
);
 
398
test_protocol_parser(
 
399
   parser   => $tcpdump,
 
400
   protocol => $protocol,
 
401
   file     => "$sample/tcpdump012.txt",
 
402
   result   => [
 
403
      {  ts            => '090412 09:50:16.805123',
 
404
         db            => undef,
 
405
         user          => undef,
 
406
         Thread_id     => 4294967296,
 
407
         host          => '127.0.0.1',
 
408
         ip            => '127.0.0.1',
 
409
         port          => '42167',
 
410
         arg           => 'select "hello world" as greeting',
 
411
         Query_time    => sprintf('%.6f', .805123 - .804849),
 
412
         pos_in_log    => 0,
 
413
         bytes         => length('select "hello world" as greeting'),
 
414
         cmd           => 'Query',
 
415
         Error_no      => 'none',
 
416
         Rows_affected => 0,
 
417
         Warning_count      => 0,
 
418
         No_good_index_used => 'No',
 
419
         No_index_used      => 'No',
 
420
      },
 
421
   ],
 
422
);
 
423
 
 
424
# #############################################################################
 
425
# Issue 447: MySQLProtocolParser does not handle old password algo or
 
426
# compressed packets  
 
427
# #############################################################################
 
428
$protocol = new MySQLProtocolParser(
 
429
   server => '10.55.200.15',
 
430
);
 
431
test_protocol_parser(
 
432
   parser   => $tcpdump,
 
433
   protocol => $protocol,
 
434
   file     => "$sample/tcpdump013.txt",
 
435
   desc     => 'old password and compression',
 
436
   result   => [
 
437
      {  Error_no => 'none',
 
438
         No_good_index_used => 'No',
 
439
         No_index_used => 'No',
 
440
         Query_time => '0.034355',
 
441
         Rows_affected => 0,
 
442
         Thread_id => 36947020,
 
443
         Warning_count => 0,
 
444
         arg => 'administrator command: Connect',
 
445
         bytes => 30,
 
446
         cmd => 'Admin',
 
447
         db => '',
 
448
         host => '10.54.212.171',
 
449
         ip => '10.54.212.171',
 
450
         port => '49663',
 
451
         pos_in_log => 1834,
 
452
         ts => '090603 10:52:24.578817',
 
453
         user => 'luck'
 
454
      },
 
455
   ],
 
456
);
 
457
 
 
458
# Check in-stream compression detection.
 
459
$protocol = new MySQLProtocolParser(
 
460
   server => '10.55.200.15',
 
461
);
 
462
test_protocol_parser(
 
463
   parser   => $tcpdump,
 
464
   protocol => $protocol,
 
465
   file     => "$sample/tcpdump014.txt",
 
466
   desc     => 'in-stream compression detection',
 
467
   result   => [
 
468
      {
 
469
         Error_no           => 'none',
 
470
         No_good_index_used => 'No',
 
471
         No_index_used      => 'No',
 
472
         Query_time         => '0.001375',
 
473
         Rows_affected      => 0,
 
474
         Thread_id          => 4294967296,
 
475
         Warning_count      => 0,
 
476
         arg                => 'show databases',
 
477
         bytes              => 14,
 
478
         cmd                => 'Query',
 
479
         db                 => undef,
 
480
         host               => '10.54.212.171',
 
481
         ip                 => '10.54.212.171',
 
482
         port               => '49663',
 
483
         pos_in_log         => 0,
 
484
         ts                 => '090603 10:52:24.587685',
 
485
         user               => undef,
 
486
      },
 
487
   ],
 
488
);
 
489
 
 
490
# Check data decompression.
 
491
$protocol = new MySQLProtocolParser(
 
492
   server => '127.0.0.1',
 
493
   port   => '12345',
 
494
);
 
495
test_protocol_parser(
 
496
   parser   => $tcpdump,
 
497
   protocol => $protocol,
 
498
   file     => "$sample/tcpdump015.txt",
 
499
   desc     => 'compressed data',
 
500
   result   => [
 
501
      {
 
502
         Error_no => 'none',
 
503
         No_good_index_used => 'No',
 
504
         No_index_used => 'No',
 
505
         Query_time => '0.006415',
 
506
         Rows_affected => 0,
 
507
         Thread_id => 20,
 
508
         Warning_count => 0,
 
509
         arg => 'administrator command: Connect',
 
510
         bytes => 30,
 
511
         cmd => 'Admin',
 
512
         db => 'mysql',
 
513
         host => '127.0.0.1',
 
514
         ip => '127.0.0.1',
 
515
         port => '44489',
 
516
         pos_in_log => 664,
 
517
         ts => '090612 08:39:05.316805',
 
518
         user => 'msandbox',
 
519
      },
 
520
      {
 
521
         Error_no => 'none',
 
522
         No_good_index_used => 'No',
 
523
         No_index_used => 'Yes',
 
524
         Query_time => '0.002884',
 
525
         Rows_affected => 0,
 
526
         Thread_id => 20,
 
527
         Warning_count => 0,
 
528
         arg => 'select * from help_relation',
 
529
         bytes => 27,
 
530
         cmd => 'Query',
 
531
         db => 'mysql',
 
532
         host => '127.0.0.1',
 
533
         ip => '127.0.0.1',
 
534
         port => '44489',
 
535
         pos_in_log => 1637,
 
536
         ts => '090612 08:39:08.428913',
 
537
         user => 'msandbox',
 
538
      },
 
539
      {
 
540
         Error_no => 'none',
 
541
         No_good_index_used => 'No',
 
542
         No_index_used => 'No',
 
543
         Query_time => '0.000000',
 
544
         Rows_affected => 0,
 
545
         Thread_id => 20,
 
546
         Warning_count => 0,
 
547
         arg => 'administrator command: Quit',
 
548
         bytes => 27,
 
549
         cmd => 'Admin',
 
550
         db => 'mysql',
 
551
         host => '127.0.0.1',
 
552
         ip => '127.0.0.1',
 
553
         port => '44489',
 
554
         pos_in_log => 15782,
 
555
         ts => '090612 08:39:09.145334',
 
556
         user => 'msandbox',
 
557
      },
 
558
   ],
 
559
);
 
560
 
 
561
# TCP retransmission.
 
562
# Check data decompression.
 
563
$protocol = new MySQLProtocolParser(
 
564
   server => '10.55.200.15',
 
565
);
 
566
test_protocol_parser(
 
567
   parser   => $tcpdump,
 
568
   protocol => $protocol,
 
569
   file     => "$sample/tcpdump016.txt",
 
570
   desc     => 'TCP retransmission',
 
571
   result   => [
 
572
      {
 
573
         Error_no => 'none',
 
574
         No_good_index_used => 'No',
 
575
         No_index_used => 'No',
 
576
         Query_time => '0.001000',
 
577
         Rows_affected => 0,
 
578
         Thread_id => 38559282,
 
579
         Warning_count => 0,
 
580
         arg => 'administrator command: Connect',
 
581
         bytes => 30,
 
582
         cmd => 'Admin',
 
583
         db => '',
 
584
         host => '10.55.200.31',
 
585
         ip => '10.55.200.31',
 
586
         port => '64987',
 
587
         pos_in_log => 468,
 
588
         ts => '090609 16:53:17.112346',
 
589
         user => 'ppppadri',
 
590
      },
 
591
   ],
 
592
);
 
593
 
 
594
# #############################################################################
 
595
# Issue 537: MySQLProtocolParser and MemcachedProtocolParser do not handle
 
596
# multiple servers.
 
597
# #############################################################################
 
598
$protocol = new MySQLProtocolParser();
 
599
test_protocol_parser(
 
600
   parser   => $tcpdump,
 
601
   protocol => $protocol,
 
602
   file     => "$sample/tcpdump018.txt",
 
603
   desc     => 'Multiple servers',
 
604
   result   => [
 
605
      {
 
606
         Error_no => 'none',
 
607
         No_good_index_used => 'No',
 
608
         No_index_used => 'No',
 
609
         Query_time => '0.000206',
 
610
         Rows_affected => 0,
 
611
         Thread_id => '4294967296',
 
612
         Warning_count => 0,
 
613
         arg => 'select * from foo',
 
614
         bytes => 17,
 
615
         cmd => 'Query',
 
616
         db => undef,
 
617
         host => '127.0.0.1',
 
618
         ip => '127.0.0.1',
 
619
         port => '42275',
 
620
         pos_in_log => 0,
 
621
         ts => '090727 08:28:41.723651',
 
622
         user => undef,
 
623
      },
 
624
      {
 
625
         Error_no => 'none',
 
626
         No_good_index_used => 'No',
 
627
         No_index_used => 'No',
 
628
         Query_time => '0.000203',
 
629
         Rows_affected => 0,
 
630
         Thread_id => '4294967297',
 
631
         Warning_count => 0,
 
632
         arg => 'select * from bar',
 
633
         bytes => 17,
 
634
         cmd => 'Query',
 
635
         db => undef,
 
636
         host => '127.0.0.1',
 
637
         ip => '127.0.0.1',
 
638
         port => '34233',
 
639
         pos_in_log => 987,
 
640
         ts => '090727 08:29:34.232748',
 
641
         user => undef,
 
642
      },
 
643
   ],
 
644
);
 
645
 
 
646
# Test that --watch-server causes just the given server to be watched.
 
647
$protocol = new MySQLProtocolParser(server=>'10.0.0.1',port=>'3306');
 
648
test_protocol_parser(
 
649
   parser   => $tcpdump,
 
650
   protocol => $protocol,
 
651
   file     => "$sample/tcpdump018.txt",
 
652
   desc     => 'Multiple servers but watch only one',
 
653
   result   => [
 
654
      {
 
655
         Error_no => 'none',
 
656
         No_good_index_used => 'No',
 
657
         No_index_used => 'No',
 
658
         Query_time => '0.000206',
 
659
         Rows_affected => 0,
 
660
         Thread_id => '4294967296',
 
661
         Warning_count => 0,
 
662
         arg => 'select * from foo',
 
663
         bytes => 17,
 
664
         cmd => 'Query',
 
665
         db => undef,
 
666
         host => '127.0.0.1',
 
667
         ip => '127.0.0.1',
 
668
         port => '42275',
 
669
         pos_in_log => 0,
 
670
         ts => '090727 08:28:41.723651',
 
671
         user => undef,
 
672
      },
 
673
   ]
 
674
);
 
675
 
 
676
 
 
677
# #############################################################################
 
678
# Issue 558: Make mk-query-digest handle big/fragmented packets
 
679
# #############################################################################
 
680
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
681
my $e = test_protocol_parser(
 
682
   parser   => $tcpdump,
 
683
   protocol => $protocol,
 
684
   file     => "$sample/tcpdump019.txt",
 
685
);
 
686
 
 
687
like(
 
688
   $e->[0]->{arg},
 
689
   qr/--THE END--'\)$/,
 
690
   'Handles big, fragmented MySQL packets (issue 558)'
 
691
);
 
692
 
 
693
my $arg = load_file("$sample/tcpdump019-arg.txt");
 
694
chomp $arg;
 
695
is(
 
696
   $e->[0]->{arg},
 
697
   $arg,
 
698
   'Re-assembled data is correct (issue 558)'
 
699
);
 
700
 
 
701
# #############################################################################
 
702
# Issue 740: Handle prepared statements
 
703
# #############################################################################
 
704
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
705
test_protocol_parser(
 
706
   parser   => $tcpdump,
 
707
   protocol => $protocol,
 
708
   file     => "$sample/tcpdump021.txt",
 
709
   desc     => 'prepared statements, simple, no NULL',
 
710
   result   => [
 
711
      {
 
712
         Error_no => 'none',
 
713
         No_good_index_used => 'No',
 
714
         No_index_used => 'No',
 
715
         Query_time => '0.000286',
 
716
         Rows_affected => 0,
 
717
         Thread_id => '4294967296',
 
718
         Warning_count => 0,
 
719
         arg => 'PREPARE SELECT i FROM d.t WHERE i=?',
 
720
         bytes => 35,
 
721
         cmd => 'Query',
 
722
         db => undef,
 
723
         host => '127.0.0.1',
 
724
         ip => '127.0.0.1',
 
725
         port => '58619',
 
726
         pos_in_log => 0,
 
727
         ts => '091208 09:23:49.637394',
 
728
         user => undef,
 
729
         Statement_id => 2,
 
730
      },
 
731
      {
 
732
         Error_no => 'none',
 
733
         No_good_index_used => 'No',
 
734
         No_index_used => 'Yes',
 
735
         Query_time => '0.000281',
 
736
         Rows_affected => 0,
 
737
         Thread_id => '4294967296',
 
738
         Warning_count => 0,
 
739
         arg => 'EXECUTE SELECT i FROM d.t WHERE i="3"',
 
740
         bytes => 37,
 
741
         cmd => 'Query',
 
742
         db => undef,
 
743
         host => '127.0.0.1',
 
744
         ip => '127.0.0.1',
 
745
         port => '58619',
 
746
         pos_in_log => 1106,
 
747
         ts => '091208 09:23:49.637892',
 
748
         user => undef,
 
749
         Statement_id => 2,
 
750
      },
 
751
      {
 
752
         Error_no => 'none',
 
753
          No_good_index_used => 'No',
 
754
          No_index_used => 'No',
 
755
          Query_time => '0.000000',
 
756
          Rows_affected => 0,
 
757
          Thread_id => '4294967296',
 
758
          Warning_count => 0,
 
759
          arg => 'administrator command: Quit',
 
760
          bytes => 27,
 
761
          cmd => 'Admin',
 
762
          db => undef,
 
763
          host => '127.0.0.1',
 
764
          ip => '127.0.0.1',
 
765
          port => '58619',
 
766
          pos_in_log => 1850,
 
767
          ts => '091208 09:23:49.638381',
 
768
          user => undef
 
769
      },
 
770
   ],
 
771
);
 
772
 
 
773
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
774
test_protocol_parser(
 
775
   parser   => $tcpdump,
 
776
   protocol => $protocol,
 
777
   file     => "$sample/tcpdump022.txt",
 
778
   desc     => 'prepared statements, NULL value',
 
779
   result   => [
 
780
      {
 
781
         Error_no => 'none',
 
782
         No_good_index_used => 'No',
 
783
         No_index_used => 'No',
 
784
         Query_time => '0.000303',
 
785
         Rows_affected => 0,
 
786
         Thread_id => '4294967296',
 
787
         Warning_count => 0,
 
788
         arg => 'PREPARE SELECT i,j FROM d.t2 WHERE i=? AND j=?',
 
789
         bytes => 46,
 
790
         cmd => 'Query',
 
791
         db => undef,
 
792
         host => '127.0.0.1',
 
793
         ip => '127.0.0.1',
 
794
         port => '44545',
 
795
         pos_in_log => 0,
 
796
         ts => '091208 13:41:12.811188',
 
797
         user => undef,
 
798
         Statement_id => 2,
 
799
      },
 
800
      {
 
801
         Error_no => 'none',
 
802
         No_good_index_used => 'No',
 
803
         No_index_used => 'No',
 
804
         Query_time => '0.000186',
 
805
         Rows_affected => 0,
 
806
         Thread_id => '4294967296',
 
807
         Warning_count => 0,
 
808
         arg => 'EXECUTE SELECT i,j FROM d.t2 WHERE i=NULL AND j="5"',
 
809
         bytes => 51,
 
810
         cmd => 'Query',
 
811
         db => undef,
 
812
         host => '127.0.0.1',
 
813
         ip => '127.0.0.1',
 
814
         port => '44545',
 
815
         pos_in_log => 1330,
 
816
         ts => '091208 13:41:12.811591',
 
817
         user => undef,
 
818
         Statement_id => 2,
 
819
      }
 
820
   ],
 
821
);
 
822
 
 
823
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
824
test_protocol_parser(
 
825
   parser   => $tcpdump,
 
826
   protocol => $protocol,
 
827
   file     => "$sample/tcpdump023.txt",
 
828
   desc     => 'prepared statements, string, char and float',
 
829
   result   => [
 
830
      {
 
831
         Error_no => 'none',
 
832
         No_good_index_used => 'No',
 
833
         No_index_used => 'No',
 
834
         Query_time => '0.000315',
 
835
         Rows_affected => 0,
 
836
         Thread_id => '4294967296',
 
837
         Warning_count => 0,
 
838
         arg => 'PREPARE SELECT * FROM d.t3 WHERE v=? OR c=? OR f=?',
 
839
         bytes => 50,
 
840
         cmd => 'Query',
 
841
         db => undef,
 
842
         host => '127.0.0.1',
 
843
         ip => '127.0.0.1',
 
844
         port => '49806',
 
845
         pos_in_log => 0,
 
846
         ts => '091208 14:14:55.951863',
 
847
         user => undef,
 
848
         Statement_id => 2,
 
849
      },
 
850
      {
 
851
         Error_no => 'none',
 
852
         No_good_index_used => 'No',
 
853
         No_index_used => 'No',
 
854
         Query_time => '0.000249',
 
855
         Rows_affected => 0,
 
856
         Thread_id => '4294967296',
 
857
         Warning_count => 0,
 
858
         arg => 'EXECUTE SELECT * FROM d.t3 WHERE v="hello world" OR c="a" OR f="1.23"',
 
859
         bytes => 69,
 
860
         cmd => 'Query',
 
861
         db => undef,
 
862
         host => '127.0.0.1',
 
863
         ip => '127.0.0.1',
 
864
         port => '49806',
 
865
         pos_in_log => 1540,
 
866
         ts => '091208 14:14:55.952344',
 
867
         user => undef,
 
868
         Statement_id => 2,
 
869
      }
 
870
   ],
 
871
);
 
872
 
 
873
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
874
test_protocol_parser(
 
875
   parser   => $tcpdump,
 
876
   protocol => $protocol,
 
877
   file     => "$sample/tcpdump024.txt",
 
878
   desc     => 'prepared statements, all NULL',
 
879
   result   => [
 
880
      {
 
881
         Error_no => 'none',
 
882
         No_good_index_used => 'No',
 
883
         No_index_used => 'No',
 
884
         Query_time => '0.000278',
 
885
         Rows_affected => 0,
 
886
         Thread_id => '4294967296',
 
887
         Warning_count => 0,
 
888
         arg => 'PREPARE SELECT * FROM d.t3 WHERE v=? OR c=? OR f=?',
 
889
         bytes => 50,
 
890
         cmd => 'Query',
 
891
         db => undef,
 
892
         host => '127.0.0.1',
 
893
         ip => '127.0.0.1',
 
894
         port => '32810',
 
895
         pos_in_log => 0,
 
896
         ts => '091208 14:33:13.711351',
 
897
         user => undef,
 
898
         Statement_id => 2,
 
899
      },
 
900
      {
 
901
         Error_no => 'none',
 
902
         No_good_index_used => 'No',
 
903
         No_index_used => 'No',
 
904
         Query_time => '0.000159',
 
905
         Rows_affected => 0,
 
906
         Thread_id => '4294967296',
 
907
         Warning_count => 0,
 
908
         arg => 'EXECUTE SELECT * FROM d.t3 WHERE v=NULL OR c=NULL OR f=NULL',
 
909
         bytes => 59,
 
910
         cmd => 'Query',
 
911
         db => undef,
 
912
         host => '127.0.0.1',
 
913
         ip => '127.0.0.1',
 
914
         port => '32810',
 
915
         pos_in_log => 1540,
 
916
         ts => '091208 14:33:13.711642',
 
917
         user => undef,
 
918
         Statement_id => 2,
 
919
      },
 
920
   ],
 
921
);
 
922
 
 
923
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
924
test_protocol_parser(
 
925
   parser   => $tcpdump,
 
926
   protocol => $protocol,
 
927
   file     => "$sample/tcpdump025.txt",
 
928
   desc     => 'prepared statements, no params',
 
929
   result   => [
 
930
      {
 
931
         Error_no => 'none',
 
932
         No_good_index_used => 'No',
 
933
         No_index_used => 'No',
 
934
         Query_time => '0.000268',
 
935
         Rows_affected => 0,
 
936
         Thread_id => '4294967296',
 
937
         Warning_count => 0,
 
938
         arg => 'PREPARE SELECT * FROM d.t WHERE 1 LIMIT 1;',
 
939
         bytes => 42,
 
940
         cmd => 'Query',
 
941
         db => undef,
 
942
         host => '127.0.0.1',
 
943
         ip => '127.0.0.1',
 
944
         port => '48585',
 
945
         pos_in_log => 0,
 
946
         ts => '091208 14:44:52.709181',
 
947
         user => undef,
 
948
         Statement_id => 2,
 
949
      },
 
950
      {
 
951
         Error_no => 'none',
 
952
         No_good_index_used => 'No',
 
953
         No_index_used => 'Yes',
 
954
         Query_time => '0.000234',
 
955
         Rows_affected => 0,
 
956
         Thread_id => '4294967296',
 
957
         Warning_count => 0,
 
958
         arg => 'EXECUTE SELECT * FROM d.t WHERE 1 LIMIT 1;',
 
959
         bytes => 42,
 
960
         cmd => 'Query',
 
961
         db => undef,
 
962
         host => '127.0.0.1',
 
963
         ip => '127.0.0.1',
 
964
         port => '48585',
 
965
         pos_in_log => 1014,
 
966
         ts => '091208 14:44:52.709597',
 
967
         user => undef,
 
968
         Statement_id => 2,
 
969
      }
 
970
   ],
 
971
);
 
972
 
 
973
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
974
test_protocol_parser(
 
975
   parser   => $tcpdump,
 
976
   protocol => $protocol,
 
977
   file     => "$sample/tcpdump026.txt",
 
978
   desc     => 'prepared statements, close statement',
 
979
   result   => [
 
980
      {
 
981
         Error_no => 'none',
 
982
         No_good_index_used => 'No',
 
983
         No_index_used => 'No',
 
984
         Query_time => '0.000000',
 
985
         Rows_affected => 0,
 
986
         Thread_id => '4294967296',
 
987
         Warning_count => 0,
 
988
         arg => 'DEALLOCATE PREPARE 50',
 
989
         bytes => 21,
 
990
         cmd => 'Query',
 
991
         db => undef,
 
992
         host => '1.2.3.4',
 
993
         ip => '1.2.3.4',
 
994
         port => '34162',
 
995
         pos_in_log => 0,
 
996
         ts => '091208 17:42:12.696547',
 
997
         user => undef
 
998
      }
 
999
   ],
 
1000
);
 
1001
 
 
1002
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
1003
test_protocol_parser(
 
1004
   parser   => $tcpdump,
 
1005
   protocol => $protocol,
 
1006
   file     => "$sample/tcpdump027.txt",
 
1007
   desc     => 'prepared statements, reset statement',
 
1008
   result   => [
 
1009
      {
 
1010
         Error_no => 'none',
 
1011
         No_good_index_used => 'No',
 
1012
         No_index_used => 'No',
 
1013
         Query_time => '0.000023',
 
1014
         Rows_affected => 0,
 
1015
         Statement_id => 51,
 
1016
         Thread_id => '4294967296',
 
1017
         Warning_count => 0,
 
1018
         arg => 'RESET 51',
 
1019
         bytes => 8,
 
1020
         cmd => 'Query',
 
1021
         db => undef,
 
1022
         host => '1.2.3.4',
 
1023
         ip => '1.2.3.4',
 
1024
         port => '34162',
 
1025
         pos_in_log => 0,
 
1026
         ts => '091208 17:42:12.698093',
 
1027
         user => undef
 
1028
      }
 
1029
   ],
 
1030
);
 
1031
 
 
1032
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
1033
test_protocol_parser(
 
1034
   parser   => $tcpdump,
 
1035
   protocol => $protocol,
 
1036
   file     => "$sample/tcpdump028.txt",
 
1037
   desc     => 'prepared statements, multiple exec, new param',
 
1038
   result => [
 
1039
      {
 
1040
         Error_no => 'none',
 
1041
         No_good_index_used => 'No',
 
1042
         No_index_used => 'No',
 
1043
         Query_time => '0.000292',
 
1044
         Rows_affected => 0,
 
1045
         Statement_id => 2,
 
1046
         Thread_id => '4294967296',
 
1047
         Warning_count => 0,
 
1048
         arg => 'PREPARE SELECT * FROM d.t WHERE i=?',
 
1049
         bytes => 35,
 
1050
         cmd => 'Query',
 
1051
         db => undef,
 
1052
         host => '127.0.0.1',
 
1053
         ip => '127.0.0.1',
 
1054
         port => '38682',
 
1055
         pos_in_log => 0,
 
1056
         ts => '091208 17:35:37.433248',
 
1057
         user => undef
 
1058
      },
 
1059
      {
 
1060
         Error_no => 'none',
 
1061
         No_good_index_used => 'No',
 
1062
         No_index_used => 'Yes',
 
1063
         Query_time => '0.000254',
 
1064
         Rows_affected => 0,
 
1065
         Statement_id => 2,
 
1066
         Thread_id => '4294967296',
 
1067
         Warning_count => 0,
 
1068
         arg => 'EXECUTE SELECT * FROM d.t WHERE i="1"',
 
1069
         bytes => 37,
 
1070
         cmd => 'Query',
 
1071
         db => undef,
 
1072
         host => '127.0.0.1',
 
1073
         ip => '127.0.0.1',
 
1074
         port => '38682',
 
1075
         pos_in_log => 1106,
 
1076
         ts => '091208 17:35:37.433700',
 
1077
         user => undef
 
1078
      },
 
1079
      {
 
1080
         Error_no => 'none',
 
1081
         No_good_index_used => 'No',
 
1082
         No_index_used => 'Yes',
 
1083
         Query_time => '0.000190',
 
1084
         Rows_affected => 0,
 
1085
         Statement_id => 2,
 
1086
         Thread_id => '4294967296',
 
1087
         Warning_count => 0,
 
1088
         arg => 'EXECUTE SELECT * FROM d.t WHERE i="3"',
 
1089
         bytes => 37,
 
1090
         cmd => 'Query',
 
1091
         db => undef,
 
1092
         host => '127.0.0.1',
 
1093
         ip => '127.0.0.1',
 
1094
         port => '38682',
 
1095
         pos_in_log => 1850,
 
1096
         ts => '091208 17:35:37.434303',
 
1097
         user => undef
 
1098
      },
 
1099
      {
 
1100
         Error_no => 'none',
 
1101
         No_good_index_used => 'No',
 
1102
         No_index_used => 'Yes',
 
1103
         Query_time => '0.000166',
 
1104
         Rows_affected => 0,
 
1105
         Statement_id => 2,
 
1106
         Thread_id => '4294967296',
 
1107
         Warning_count => 0,
 
1108
         arg => 'EXECUTE SELECT * FROM d.t WHERE i=NULL',
 
1109
         bytes => 38,
 
1110
         cmd => 'Query',
 
1111
         db => undef,
 
1112
         host => '127.0.0.1',
 
1113
         ip => '127.0.0.1',
 
1114
         port => '38682',
 
1115
         pos_in_log => 2589,
 
1116
         ts => '091208 17:35:37.434708',
 
1117
         user => undef
 
1118
      }
 
1119
   ],
 
1120
);
 
1121
 
 
1122
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'12345');
 
1123
test_protocol_parser(
 
1124
   parser   => $tcpdump,
 
1125
   protocol => $protocol,
 
1126
   file     => "$sample/tcpdump029.txt",
 
1127
   desc     => 'prepared statements, real param types',
 
1128
   result => [
 
1129
      {
 
1130
         Error_no => 'none',
 
1131
         No_good_index_used => 'No',
 
1132
         No_index_used => 'No',
 
1133
         Query_time => '0.000221',
 
1134
         Rows_affected => 0,
 
1135
         Statement_id => 1,
 
1136
         Thread_id => '4294967296',
 
1137
         Warning_count => 0,
 
1138
         arg => 'PREPARE SELECT * FROM d.t WHERE i=? OR u=? OR v=? OR d=? OR f=? OR t > ? OR dt > ?',
 
1139
         bytes => 82,
 
1140
         cmd => 'Query',
 
1141
         db => undef,
 
1142
         host => '127.0.0.1',
 
1143
         ip => '127.0.0.1',
 
1144
         port => '36496',
 
1145
         pos_in_log => 0,
 
1146
         ts => '091209 09:20:59.293775',
 
1147
         user => undef
 
1148
      },
 
1149
      {
 
1150
         Error_no => 'none',
 
1151
         No_good_index_used => 'No',
 
1152
         No_index_used => 'No',
 
1153
         Query_time => '0.000203',
 
1154
         Rows_affected => 0,
 
1155
         Statement_id => 1,
 
1156
         Thread_id => '4294967296',
 
1157
         Warning_count => 0,
 
1158
         arg => 'EXECUTE SELECT * FROM d.t WHERE i=42 OR u=2009 OR v="hello world" OR d=1.23 OR f=4.56 OR t > "2009-12-01" OR dt > "2009-12-01"',
 
1159
         bytes => 126,
 
1160
         cmd => 'Query',
 
1161
         db => undef,
 
1162
         host => '127.0.0.1',
 
1163
         ip => '127.0.0.1',
 
1164
         port => '36496',
 
1165
         pos_in_log => 2109,
 
1166
         ts => '091209 09:20:59.294409',
 
1167
         user => undef
 
1168
      },
 
1169
      {
 
1170
         Error_no => 'none',
 
1171
         No_good_index_used => 'No',
 
1172
         No_index_used => 'No',
 
1173
         Query_time => '0.000000',
 
1174
         Rows_affected => 0,
 
1175
         Thread_id => '4294967296',
 
1176
         Warning_count => 0,
 
1177
         arg => 'DEALLOCATE PREPARE 1',
 
1178
         bytes => 20,
 
1179
         cmd => 'Query',
 
1180
         db => undef,
 
1181
         host => '127.0.0.1',
 
1182
         ip => '127.0.0.1',
 
1183
         port => '36496',
 
1184
         pos_in_log => 3787,
 
1185
         ts => '091209 09:20:59.294926',
 
1186
         user => undef
 
1187
      },
 
1188
      {
 
1189
         Error_no => 'none',
 
1190
         No_good_index_used => 'No',
 
1191
         No_index_used => 'No',
 
1192
         Query_time => '0.000000',
 
1193
         Rows_affected => 0,
 
1194
         Thread_id => '4294967296',
 
1195
         Warning_count => 0,
 
1196
         arg => 'administrator command: Quit',
 
1197
         bytes => 27,
 
1198
         cmd => 'Admin',
 
1199
         db => undef,
 
1200
         host => '127.0.0.1',
 
1201
         ip => '127.0.0.1',
 
1202
         port => '36496',
 
1203
         pos_in_log => 4051,
 
1204
         ts => '091209 09:20:59.295064',
 
1205
         user => undef
 
1206
      },
 
1207
   ]
 
1208
);
 
1209
 
 
1210
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
1211
test_protocol_parser(
 
1212
   parser   => $tcpdump,
 
1213
   protocol => $protocol,
 
1214
   file     => "$sample/tcpdump030.txt",
 
1215
   desc     => 'prepared statements, ok response to execute',
 
1216
   result => [
 
1217
      {
 
1218
         Error_no => 'none',
 
1219
         No_good_index_used => 'No',
 
1220
         No_index_used => 'No',
 
1221
         Query_time => '0.000046',
 
1222
         Rows_affected => 0,
 
1223
         Statement_id => 1,
 
1224
         Thread_id => '4294967296',
 
1225
         Warning_count => 0,
 
1226
         arg => 'PREPARE SET SESSION sql_mode="STRICT_ALL_TABLES"',
 
1227
         bytes => 48,
 
1228
         cmd => 'Query',
 
1229
         db => undef,
 
1230
         host => '1.2.3.24',
 
1231
         ip => '1.2.3.24',
 
1232
         port => '60696',
 
1233
         pos_in_log => 0,
 
1234
         ts => '091210 14:21:16.956302',
 
1235
         user => undef
 
1236
      },
 
1237
      {
 
1238
         Error_no => 'none',
 
1239
         No_good_index_used => 'No',
 
1240
         No_index_used => 'No',
 
1241
         Query_time => '0.000024',
 
1242
         Rows_affected => 0,
 
1243
         Statement_id => 1,
 
1244
         Thread_id => '4294967296',
 
1245
         Warning_count => 0,
 
1246
         arg => 'EXECUTE SET SESSION sql_mode="STRICT_ALL_TABLES"',
 
1247
         bytes => 48,
 
1248
         cmd => 'Query',
 
1249
         db => undef,
 
1250
         host => '1.2.3.24',
 
1251
         ip => '1.2.3.24',
 
1252
         port => '60696',
 
1253
         pos_in_log => 700,
 
1254
         ts => '091210 14:21:16.956446',
 
1255
         user => undef
 
1256
      }
 
1257
   ],
 
1258
);
 
1259
 
 
1260
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
1261
test_protocol_parser(
 
1262
   parser   => $tcpdump,
 
1263
   protocol => $protocol,
 
1264
   file     => "$sample/tcpdump034.txt",
 
1265
   desc     => 'prepared statements, NULL bitmap',
 
1266
   result => [
 
1267
      {
 
1268
         Error_no => 'none',
 
1269
         No_good_index_used => 'No',
 
1270
         No_index_used => 'No',
 
1271
         Query_time => '0.000288',
 
1272
         Rows_affected => 0,
 
1273
         Statement_id => 1,
 
1274
         Thread_id => '4294967296',
 
1275
         Warning_count => 0,
 
1276
         arg => 'PREPARE SELECT * FROM d.t WHERE i=? OR u=? OR v=? OR d=? OR f=? OR t > ? OR dt > ? OR i2=? OR i3=? OR i4=?',
 
1277
         bytes => 106,
 
1278
         cmd => 'Query',
 
1279
         db => undef,
 
1280
         host => '127.0.0.1',
 
1281
         ip => '127.0.0.1',
 
1282
         port => '43607',
 
1283
         pos_in_log => 0,
 
1284
         ts => '091224 16:47:24.204501',
 
1285
         user => undef
 
1286
      },
 
1287
      {
 
1288
         Error_no => 'none',
 
1289
         No_good_index_used => 'No',
 
1290
         No_index_used => 'No',
 
1291
         Query_time => '0.000322',
 
1292
         Rows_affected => 0,
 
1293
         Statement_id => 1,
 
1294
         Thread_id => '4294967296',
 
1295
         Warning_count => 0,
 
1296
         arg => 'EXECUTE SELECT * FROM d.t WHERE i=42 OR u=2009 OR v="hello world" OR d=1.23 OR f=4.56 OR t > "2009-12-01" OR dt > "2009-12-01" OR i2=NULL OR i3=NULL OR i4=NULL',
 
1297
         bytes => 159,
 
1298
         cmd => 'Query',
 
1299
         db => undef,
 
1300
         host => '127.0.0.1',
 
1301
         ip => '127.0.0.1',
 
1302
         port => '43607',
 
1303
         pos_in_log => 2748,
 
1304
         ts => '091224 16:47:24.204965',
 
1305
         user => undef
 
1306
      }
 
1307
   ],
 
1308
);
 
1309
 
 
1310
# #############################################################################
 
1311
# Issue 761: mk-query-digest --tcpdump does not handle incomplete packets
 
1312
# #############################################################################
 
1313
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
1314
test_protocol_parser(
 
1315
   parser   => $tcpdump,
 
1316
   protocol => $protocol,
 
1317
   file     => "$sample/tcpdump032.txt",
 
1318
   desc     => 'issue 761',
 
1319
   result => [
 
1320
      {
 
1321
         Error_no => 'none',
 
1322
         No_good_index_used => 'No',
 
1323
         No_index_used => 'No',
 
1324
         Query_time => '0.000431',
 
1325
         Rows_affected => 1,
 
1326
         Thread_id => '4294967296',
 
1327
         Warning_count => 21032,
 
1328
         arg => 'UPDATEDDDDNNNN',
 
1329
         bytes => 14,
 
1330
         cmd => 'Query',
 
1331
         db => undef,
 
1332
         host => '1.2.3.4',
 
1333
         ip => '1.2.3.4',
 
1334
         port => '35957',
 
1335
         pos_in_log => 1768,
 
1336
         ts => '091208 20:54:54.795250',
 
1337
         user => undef
 
1338
      }
 
1339
   ],
 
1340
);
 
1341
 
 
1342
# #############################################################################
 
1343
# Issue 760: mk-query-digest --tcpdump might not get the whole query
 
1344
# #############################################################################
 
1345
$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
 
1346
test_protocol_parser(
 
1347
   parser   => $tcpdump,
 
1348
   protocol => $protocol,
 
1349
   file     => "$sample/tcpdump031.txt",
 
1350
   desc     => 'issue 760',
 
1351
   result   => [
 
1352
      {
 
1353
         Error_no => 'none',
 
1354
         No_good_index_used => 'No',
 
1355
         No_index_used => 'No',
 
1356
         Query_time => '0.000430',
 
1357
         Rows_affected => 1,
 
1358
         Thread_id => '4294967296',
 
1359
         Warning_count => 21032,
 
1360
         arg => 'UPDATEDDDDNNNN',
 
1361
         bytes => 14,
 
1362
         cmd => 'Query',
 
1363
         db => undef,
 
1364
         host => '1.2.3.4',
 
1365
         ip => '1.2.3.4',
 
1366
         port => '35957',
 
1367
         pos_in_log => 534,
 
1368
         ts => '091207 20:54:54.795250',
 
1369
         user => undef
 
1370
      }
 
1371
   ],
 
1372
);
 
1373
 
 
1374
# #############################################################################
 
1375
# Issue 794: MySQLProtocolParser does not handle client port reuse
 
1376
# #############################################################################
 
1377
$protocol = new MySQLProtocolParser();
 
1378
test_protocol_parser(
 
1379
   parser   => $tcpdump,
 
1380
   protocol => $protocol,
 
1381
   file     => "$sample/tcpdump035.txt",
 
1382
   desc     => 'client port reuse (issue 794)',
 
1383
   result   => [
 
1384
      {  ts         => "090412 11:00:13.118191",
 
1385
         db         => 'mysql',
 
1386
         user       => 'msandbox',
 
1387
         host       => '127.0.0.1',
 
1388
         ip         => '127.0.0.1',
 
1389
         port       => '57890',
 
1390
         arg        => 'administrator command: Connect',
 
1391
         Query_time => '0.011152',
 
1392
         Thread_id  => 8,
 
1393
         pos_in_log => 1470,
 
1394
         bytes      => length('administrator command: Connect'),
 
1395
         cmd        => 'Admin',
 
1396
         Error_no   => 'none',
 
1397
         Rows_affected => 0,
 
1398
         Warning_count      => 0,
 
1399
         No_good_index_used => 'No',
 
1400
         No_index_used      => 'No',
 
1401
      },
 
1402
      {  Query_time => '0.000167',
 
1403
         Thread_id  => 8,
 
1404
         arg        => 'select "paris in the the spring" as trick',
 
1405
         bytes      => length('select "paris in the the spring" as trick'),
 
1406
         cmd        => 'Query',
 
1407
         db         => 'mysql',
 
1408
         host       => '127.0.0.1',
 
1409
         ip         => '127.0.0.1',
 
1410
         port       => '57890',
 
1411
         pos_in_log => 2449,
 
1412
         ts         => '090412 11:00:13.119079',
 
1413
         user       => 'msandbox',
 
1414
         Error_no   => 'none',
 
1415
         Rows_affected => 0,
 
1416
         Warning_count      => 0,
 
1417
         No_good_index_used => 'No',
 
1418
         No_index_used      => 'No',
 
1419
      },
 
1420
      {  Query_time => '0.000000',
 
1421
         Thread_id  => 8,
 
1422
         arg        => 'administrator command: Quit',
 
1423
         bytes      => 27,
 
1424
         cmd        => 'Admin',
 
1425
         db         => 'mysql',
 
1426
         host       => '127.0.0.1',
 
1427
         ip         => '127.0.0.1',
 
1428
         port       => '57890',
 
1429
         pos_in_log => 3337,
 
1430
         ts         => '090412 11:00:13.119487',
 
1431
         user       => 'msandbox',
 
1432
         Error_no   => 'none',
 
1433
         Rows_affected => 0,
 
1434
         Warning_count      => 0,
 
1435
         No_good_index_used => 'No',
 
1436
         No_index_used      => 'No',
 
1437
      },
 
1438
      # port reused...      
 
1439
      {  ts => '090412 12:00:00.800000',
 
1440
         Error_no => 'none',
 
1441
         No_good_index_used => 'No',
 
1442
         No_index_used => 'No',
 
1443
         Query_time => '0.700000',
 
1444
         Rows_affected => 0,
 
1445
         Thread_id => 8,
 
1446
         Warning_count => 0,
 
1447
         arg => 'administrator command: Connect',
 
1448
         bytes => 30,
 
1449
         cmd => 'Admin',
 
1450
         db => 'mysql',
 
1451
         host => '127.0.0.1',
 
1452
         ip => '127.0.0.1',
 
1453
         port => '57890',
 
1454
         pos_in_log => 5791,
 
1455
         user => 'msandbox',
 
1456
      },
 
1457
      {  ts => '090412 12:00:01.000000',
 
1458
         Error_no => 'none',
 
1459
         No_good_index_used => 'No',
 
1460
         No_index_used => 'No',
 
1461
         Query_time => '0.100000',
 
1462
         Rows_affected => 0,
 
1463
         Thread_id => 8,
 
1464
         Warning_count => 0,
 
1465
         arg => 'select "paris in the the spring" as trick',
 
1466
         bytes => 41,
 
1467
         cmd => 'Query',
 
1468
         db => 'mysql',
 
1469
         host => '127.0.0.1',
 
1470
         ip => '127.0.0.1',
 
1471
         port => '57890',
 
1472
         pos_in_log => 6770, 
 
1473
         user => 'msandbox',
 
1474
      },
 
1475
      {  ts => '090412 12:00:01.100000',
 
1476
         Error_no => 'none',
 
1477
         No_good_index_used => 'No',
 
1478
         No_index_used => 'No',
 
1479
         Query_time => '0.000000',
 
1480
         Rows_affected => 0,
 
1481
         Thread_id => 8,
 
1482
         Warning_count => 0,
 
1483
         arg => 'administrator command: Quit',
 
1484
         bytes => 27,
 
1485
         cmd => 'Admin',
 
1486
         db => 'mysql',
 
1487
         host => '127.0.0.1',
 
1488
         ip => '127.0.0.1',
 
1489
         port => '57890',
 
1490
         pos_in_log => 7658,
 
1491
         user => 'msandbox',
 
1492
      }
 
1493
   ],
 
1494
);
 
1495
 
 
1496
$protocol = new MySQLProtocolParser();
 
1497
test_protocol_parser(
 
1498
   parser   => $tcpdump,
 
1499
   protocol => $protocol,
 
1500
   file     => "$sample/tcpdump036.txt",
 
1501
   desc     => 'Houdini data (issue 794)',
 
1502
   result   => [
 
1503
      {  ts         => "090412 11:00:13.118191",
 
1504
         db         => 'mysql',
 
1505
         user       => 'msandbox',
 
1506
         host       => '127.0.0.1',
 
1507
         ip         => '127.0.0.1',
 
1508
         port       => '57890',
 
1509
         arg        => 'administrator command: Connect',
 
1510
         Query_time => '0.011152',
 
1511
         Thread_id  => 8,
 
1512
         pos_in_log => 1470,
 
1513
         bytes      => length('administrator command: Connect'),
 
1514
         cmd        => 'Admin',
 
1515
         Error_no   => 'none',
 
1516
         Rows_affected => 0,
 
1517
         Warning_count      => 0,
 
1518
         No_good_index_used => 'No',
 
1519
         No_index_used      => 'No',
 
1520
      },
 
1521
      # port reused...      
 
1522
      {  ts => '090412 12:00:00.800000',
 
1523
         Error_no => 'none',
 
1524
         No_good_index_used => 'No',
 
1525
         No_index_used => 'No',
 
1526
         Query_time => '0.700000',
 
1527
         Rows_affected => 0,
 
1528
         Thread_id => 8,
 
1529
         Warning_count => 0,
 
1530
         arg => 'administrator command: Connect',
 
1531
         bytes => 30,
 
1532
         cmd => 'Admin',
 
1533
         db => 'mysql',
 
1534
         host => '127.0.0.1',
 
1535
         ip => '127.0.0.1',
 
1536
         port => '57890',
 
1537
         pos_in_log => 4161,
 
1538
         user => 'msandbox',
 
1539
      },
 
1540
      {  ts => '090412 12:00:01.000000',
 
1541
         Error_no => 'none',
 
1542
         No_good_index_used => 'No',
 
1543
         No_index_used => 'No',
 
1544
         Query_time => '0.100000',
 
1545
         Rows_affected => 0,
 
1546
         Thread_id => 8,
 
1547
         Warning_count => 0,
 
1548
         arg => 'select "paris in the the spring" as trick',
 
1549
         bytes => 41,
 
1550
         cmd => 'Query',
 
1551
         db => 'mysql',
 
1552
         host => '127.0.0.1',
 
1553
         ip => '127.0.0.1',
 
1554
         port => '57890',
 
1555
         pos_in_log => 5140,
 
1556
         user => 'msandbox',
 
1557
      },
 
1558
      {  ts => '090412 12:00:01.100000',
 
1559
         Error_no => 'none',
 
1560
         No_good_index_used => 'No',
 
1561
         No_index_used => 'No',
 
1562
         Query_time => '0.000000',
 
1563
         Rows_affected => 0,
 
1564
         Thread_id => 8,
 
1565
         Warning_count => 0,
 
1566
         arg => 'administrator command: Quit',
 
1567
         bytes => 27,
 
1568
         cmd => 'Admin',
 
1569
         db => 'mysql',
 
1570
         host => '127.0.0.1',
 
1571
         ip => '127.0.0.1',
 
1572
         port => '57890',
 
1573
         pos_in_log => 6028,
 
1574
         user => 'msandbox',
 
1575
      }
 
1576
   ],
 
1577
);
 
1578
 
 
1579
$protocol = new MySQLProtocolParser();
 
1580
test_protocol_parser(
 
1581
   parser   => $tcpdump,
 
1582
   protocol => $protocol,
 
1583
   file     => "$sample/tcpdump037.txt",
 
1584
   desc     => 'no server ok (issue 794)',
 
1585
   result   => [
 
1586
      {  ts => '090412 12:00:01.000000',
 
1587
         Error_no => 'none',
 
1588
         No_good_index_used => 'No',
 
1589
         No_index_used => 'No',
 
1590
         Query_time => '0.000000',
 
1591
         Rows_affected => 0,
 
1592
         Thread_id => '4294967296',
 
1593
         Warning_count => 0,
 
1594
         arg => 'administrator command: Quit',
 
1595
         bytes => 27,
 
1596
         cmd => 'Admin',
 
1597
         db => undef,
 
1598
         host => '127.0.0.1',
 
1599
         ip => '127.0.0.1',
 
1600
         port => '57890',
 
1601
         pos_in_log => 390,
 
1602
         user => undef
 
1603
      },
 
1604
      {  ts => '090412 12:00:03.000000',
 
1605
         Error_no => 'none',
 
1606
         No_good_index_used => 'No',
 
1607
         No_index_used => 'No',
 
1608
         Query_time => '1.000000',
 
1609
         Rows_affected => 0,
 
1610
         Thread_id => 4294967297,
 
1611
         Warning_count => 0,
 
1612
         arg => 'select "paris in the the spring" as trick',
 
1613
         bytes => 41,
 
1614
         cmd => 'Query',
 
1615
         db => undef,
 
1616
         host => '127.0.0.1',
 
1617
         ip => '127.0.0.1',
 
1618
         port => '57890',
 
1619
         pos_in_log => 646,
 
1620
         user => undef,
 
1621
      },
 
1622
   ],
 
1623
);
 
1624
 
 
1625
# #############################################################################
 
1626
# Issue 832: mk-query-digest tcpdump crashes on successive, fragmented
 
1627
# client query
 
1628
# #############################################################################
 
1629
$protocol = new MySQLProtocolParser(server => '127.0.0.1',port=>'12345');
 
1630
$e = test_protocol_parser(
 
1631
   parser   => $tcpdump,
 
1632
   protocol => $protocol,
 
1633
   file     => "$sample/tcpdump038.txt",
 
1634
);
 
1635
 
 
1636
like(
 
1637
   $e->[0]->{arg},
 
1638
   qr/--THE END--'\)$/,
 
1639
   '2nd, fragmented client query (issue 832)',
 
1640
);
 
1641
 
 
1642
# #############################################################################
 
1643
# Issue 670: Make mk-query-digest capture the error message from tcpdump
 
1644
# #############################################################################
 
1645
$protocol = new MySQLProtocolParser(
 
1646
   server => '127.0.0.1',
 
1647
   port   => '3306',
 
1648
);
 
1649
test_protocol_parser(
 
1650
   parser   => $tcpdump,
 
1651
   protocol => $protocol,
 
1652
   file     => "$sample/tcpdump040.txt",
 
1653
   desc     => 'Error (issue 670)',
 
1654
   result =>
 
1655
   [
 
1656
      {
 
1657
         Error_msg          => "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1",
 
1658
         Error_no           => '#1064',
 
1659
         No_good_index_used => 'No',
 
1660
         No_index_used      => 'No',
 
1661
         Query_time         => '0.000316',
 
1662
         Rows_affected      => 0,
 
1663
         Thread_id          => '4294967296',
 
1664
         Warning_count      => 0,
 
1665
         arg                => 'select',
 
1666
         bytes              => 6,
 
1667
         cmd                => 'Query',
 
1668
         db                 => undef,
 
1669
         host               => '127.0.0.1',
 
1670
         ip                 => '127.0.0.1',
 
1671
         port               => '39640',
 
1672
         pos_in_log         => 0,
 
1673
         ts                 => '091101 14:54:44.293453',
 
1674
         user               => undef,
 
1675
      },
 
1676
      {
 
1677
         Error_msg          => 'Unknown system variable \'nono\'',
 
1678
         Error_no           => '#1193',
 
1679
         No_good_index_used => 'No',
 
1680
         No_index_used      => 'No',
 
1681
         Query_time         => '0.000329',
 
1682
         Rows_affected      => 0,
 
1683
         Thread_id          => '4294967296',
 
1684
         Warning_count      => 0,
 
1685
         arg                => 'set global nono = 2',
 
1686
         bytes              => 19,
 
1687
         cmd                => 'Query',
 
1688
         db                 => undef,
 
1689
         host               => '127.0.0.1',
 
1690
         ip                 => '127.0.0.1',
 
1691
         port               => '39640',
 
1692
         pos_in_log         => 1250,
 
1693
         ts                 => '091101 14:54:52.813941',
 
1694
         user               => undef,
 
1695
      },
 
1696
   ],
 
1697
);
 
1698
 
 
1699
# #############################################################################
 
1700
# Done.
 
1701
# #############################################################################
 
1702
exit;