File: log_components_filter.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (697 lines) | stat: -rw-r--r-- 33,107 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
--echo #
--echo # WL#9651:  Logging services: filter configuration engine
--echo #

--source include/have_debug.inc
--source include/have_log_component.inc
--source include/not_valgrind.inc

let GREP_START=`SELECT DATE_FORMAT(CONVERT_TZ(SYSDATE(6),'SYSTEM','UTC'),'%Y%m%d%H%i%s%f');`;

SET @old_log_error_verbosity = @@global.log_error_verbosity;
SET @@global.log_error_verbosity=3;

let $log_error_= `SELECT @@GLOBAL.log_error`;
if($log_error_ == "stderr")
{
  let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err;
}
FLUSH LOGS;

# Send parse-trace to error log; first one with a current timestamp
# to compare against our GREP_START defined above.
SET @@session.debug="+d,parser_stmt_to_error_log";
# Now normalize timestamp and thread_ID on all following lines,
# for less hassle with --regex_replace in test files.  Once
SET @@session.debug="+d,log_error_normalize";

SELECT @@global.log_error_services;
--echo

--echo ## WL#9651
--error ER_UNKNOWN_SYSTEM_VARIABLE
SET @save_filters= @@global.dragnet.log_error_filter_rules;
--echo # currently nothing is loaded that can handle this, so we'll fail
--error ER_UNKNOWN_SYSTEM_VARIABLE
SET @@global.dragnet.log_error_filter_rules= DEFAULT;
--echo

INSTALL COMPONENT "file://component_log_filter_dragnet";

SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";

disable_warnings;

SET @save_filters= @@global.dragnet.log_error_filter_rules;
SET @@global.dragnet.log_error_filter_rules="IF EXISTS source_line THEN unset source_line.";

SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";

SHOW STATUS LIKE "dragnet.Status";

--echo # when clearing rule-set, notice should also show an empty rule-set
SET @@global.dragnet.log_error_filter_rules="";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF EXISTS source_line THEN unset source_line.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";


# reaction we get when we try to multi-open something not supporting instances:
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.log_error_services="log_sink_internal; log_sink_internal";
# show we get that for trying to use dragnet multiple times:
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.log_error_services="log_filter_dragnet; log_filter_dragnet";

SET @@global.log_error_services="log_filter_dragnet; log_sink_internal";

--echo # error, not starting with IF
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='drop.';
SHOW WARNINGS;
--echo

--echo # error, ELSE without IF
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='ELSE drop.';
SHOW WARNINGS;
--echo

--echo # correct OR
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a OR NOT EXISTS b THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct AND
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a AND NOT EXISTS b THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # multi-chain
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a AND NOT EXISTS b OR c>=5 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # test presence/absence operator
SET @@global.dragnet.log_error_filter_rules="IF EXISTS prio THEN SET a=1. IF NOT EXISTS a THEN SET a='asd'.";
SET @@global.dragnet.log_error_filter_rules="IF EXISTS prio THEN SET a='qwerty'. IF EXISTS a THEN SET a='asd'.";
SET @@global.dragnet.log_error_filter_rules="IF EXISTS prio THEN SET a='qwerty'. IF NOT EXISTS a THEN SET a='asd'.";

--echo # correct conditions:
SET @@global.dragnet.log_error_filter_rules='IF a>0 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a<3 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a>=0 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a<=3 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a=>0 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a=<3 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a!=2 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a<>2 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF NOT EXISTS a THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct actions:
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 5.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 5/30.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b:=2.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b=2.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b= 2.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b:="2".';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b:=2.0.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN unset.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a THEN unset.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF NOT EXISTS a THEN unset.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN unset a.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN unset a.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a==ER_STARTUP THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_STARTUP THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";


SET @@global.dragnet.log_error_filter_rules='IF err_symbol=="ER_STARTUP" THEN drop.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF err_symbol=='ER_STARTUP' THEN drop.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_STARTUP THEN set err_code:=ER_YES.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF err_symbol=="ER_STARTUP" THEN set err_symbol:="ER_YES".';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules='IF a=="\\\\a\\\"\\\'" THEN set err_symbol:="ER_YES".';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";

--echo # error, unrecognized token
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='DRAUGR.';
SHOW WARNINGS;

--echo # error, == is not an assignment operator
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b==2.';
SHOW WARNINGS;

--echo # error, mismatching quotation signs
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF err_symbol=='ER_STARTUP THEN drop.";
SHOW WARNINGS;

--echo # error, mismatching quotation signs
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF err_symbol==ER_STARTUP' THEN drop.";
SHOW WARNINGS;

--echo # error, mismatching quotation signs
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF err_symbol=='ER_STARTUP\" THEN drop.";
SHOW WARNINGS;

--echo # error, mismatching quotation signs
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF err_symbol==\"ER_STARTUP' THEN drop.";
SHOW WARNINGS;

--echo # error, reserved
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF misc_cstring=='1' THEN drop.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF a=='1' THEN set misc_cstring:='abc'.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS misc_cstring THEN drop.";
SHOW WARNINGS;

--echo # error, trying to assign integer to string field
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS foo THEN set component:=1.";
SHOW WARNINGS;

--echo # error, trying to assign float to string field
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS foo THEN set component:=1..5.";
SHOW WARNINGS;

--echo # error, trying to assign float to an integer field
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS foo THEN set prio:=1.5.";
SHOW WARNINGS;

--echo # error, no action (condition ends in NUL)
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF err_symbol==ER_STARTUP";
SHOW WARNINGS;

--echo # error, NOT requires EXISTS
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF NOT field THEN action.";
SHOW WARNINGS;

# test with tab instead of space
SET @@global.dragnet.log_error_filter_rules="IF\tEXISTS\tfield\tTHEN\tDROP.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";

# test with multi-line rule-set
SET @@global.dragnet.log_error_filter_rules="IF\t \t\tEXISTS   field\rTHEN\nDROP.\nIF EXISTS field2 THEN DROP.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";


--echo

--echo # error, wrong data-type
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF err_symbol==ER_STARTUP THEN drop.';
SHOW WARNINGS;

--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF err_code=="ER_STARTUP" THEN drop.';
SHOW WARNINGS;
--echo

SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN unset.';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 AND b==3 THEN unset.';
SHOW WARNINGS;
--echo

--echo # error, both prefix and infix operators
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a>0 THEN drop.';
SHOW WARNINGS;
--echo

--echo # error, no terminator
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a THEN drop';
SHOW WARNINGS;
--echo

--echo # error, malformed statement
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS field THEN AND.";

--echo # error, malformed statement
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF EXISTS field DROP.";

--echo # error, incomplete action:
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set.';
SHOW WARNINGS;

--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b.';
SHOW WARNINGS;

--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b:=.';
SHOW WARNINGS;

--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set b:=.';
SHOW WARNINGS;

--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN set :=2.';
SHOW WARNINGS;
--echo

# . is terminator, not delimiter
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop';
SHOW WARNINGS;
--echo

--echo # NULL should not be allowed
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop.';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules=NULL;
SHOW WARNINGS;

--echo # empty rule-set should be allowed
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop.';
SET @@global.dragnet.log_error_filter_rules="";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
# rule-set should show as empty now (rather than old rule-set):
SELECT @@global.dragnet.log_error_filter_rules;

--echo # interaction with SET PERSIST
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop.';
SET PERSIST dragnet.log_error_filter_rules= '';
SHOW WARNINGS;
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SELECT @@global.dragnet.log_error_filter_rules;
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT @@session.dragnet.log_error_filter_rules;
RESET PERSIST;
--let $MYSQLD_DATADIR= `select @@datadir`
--remove_file $MYSQLD_DATADIR/mysqld-auto.cnf

--echo # symbolic prio
SET @@global.dragnet.log_error_filter_rules="IF prio>9999 THEN set prio:=WARNING.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=ERROR THEN drop.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=WARNING THEN drop.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=NOTE THEN drop.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=INFORMATION THEN drop.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF thread>=INFORMATION THEN drop.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=INFORMATION THEN set thread:=ERROR.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=NOUGAT THEN drop.";
SHOW WARNINGS;

--echo # == should not require a space
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN drop. IF EXISTS source_line THEN unset source_line. IF msg== \'Parser saw: select 1\' THEN set a:=1. ";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN drop. IF EXISTS source_line THEN unset source_line. IF msg==\'Parser saw: select 1\' THEN set a:=1. ";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";

--echo # throw error for absurdly large values
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 1/1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 .";
SHOW WARNINGS;

--echo # throw error for floats
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN drop. IF EXISTS source_line THEN unset source_line. IF err_code == 001045 THEN throttle 1/1.1.";
SHOW WARNINGS;

--echo # test for correct range in throttle denominator
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 111/3600.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 111/604800.";
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 111/604801.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 111/0.";
SHOW WARNINGS;
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 111/-1.";
SHOW WARNINGS;

# --echo # throw error for negative values
# SET @@global.dragnet.log_error_filter_rules="IF prio>=9999 THEN throttle 1/-1.";

--echo # error, drop takes no argument
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop a.';
SHOW WARNINGS;
--echo

--echo # error, throttle requires numeric value (limit)
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle a.';
SHOW WARNINGS;
--echo

--echo # error, throttle requires integer value (limit)
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1.5.';
SHOW WARNINGS;
--echo

--echo # error, throttle requires numeric value (window-size)
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/b.';
SHOW WARNINGS;
--echo

--echo # error, throttle -- / given, but not window-size
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle a/.';
SHOW WARNINGS;
--echo

--echo # error, throttle numerator needs to be positive
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle -1/2.';
SHOW WARNINGS;
--echo

--echo # error, throttle numerator needs to be non-zero
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 0/2.';
SHOW WARNINGS;
--echo


--echo # correct ELSE
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/2 ELSE throttle 1/30.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # incorrect ELSE
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='ELSE.';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 ELSE.';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop ELSE drop ELSE drop.';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop ELSE scream.';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN drop ELSE.';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF .';
SHOW WARNINGS;
--echo
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF EXISTS a THEN.';
SHOW WARNINGS;
--echo

--echo # error, unknown comparator
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF a!!b THEN drop.';
SHOW WARNINGS;
--echo

--echo # error, field name missing after EXISTS
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules='IF EXISTS.';
SHOW WARNINGS;
--echo

--echo # correct ELSEIF
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/2 ELSEIF a==5 THEN throttle 1/30.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct ELSE IF
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/2 ELSE IF a==5 THEN throttle 1/30.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct ELSEIF-ELSE
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/5 ELSEIF a==5 THEN throttle 2/5 ELSE throttle 3/5.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct ELSE IF-ELSE
SET @@global.dragnet.log_error_filter_rules='IF a==2 THEN throttle 1/5 ELSE IF a==5 THEN throttle 2/5 ELSE throttle 3/5.';
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
--echo

--echo # correct multi-rule rule-set.
CREATE TABLE my_rules (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, rule VARCHAR(256));
INSERT INTO my_rules VALUES(NULL, 'IF EXISTS source_line THEN unset source_line.');
INSERT INTO my_rules VALUES(NULL, 'IF EXISTS thread THEN set thread:=0.'),
                           (NULL, 'IF EXISTS user THEN unset user.'),
                           (NULL, 'IF EXISTS host THEN unset host.'),
                           (NULL, 'IF EXISTS query_id THEN set query_id:=0.'),
                           (NULL, 'IF EXISTS time THEN set time:="1970-01-01T00:00:00.012345Z".'),
                           (NULL, 'IF EXISTS _pid THEN unset _pid.'),
                           (NULL, 'IF EXISTS _platform THEN unset platform.'),
                           (NULL, 'IF EXISTS _client_version THEN unset _client_version.'),
                           (NULL, 'IF EXISTS _os THEN unset _os.');

# additional rules that work in tandem with log_sink_test
# 1 - IF/ELSEIF/ELSEIF/ELSE
INSERT INTO my_rules VALUES(NULL, 'IF wl9651_val1 < 1 THEN set wl9651_result1:="IF" ELSE IF wl9651_val1 == 1 THEN set wl9651_result1:="ELSEIF1" ELSE IF wl9651_val1 == 2 THEN set wl9651_result1:="ELSEIF2" ELSE set wl9651_result1:="ELSE".');

# 2 - IF/OR/OR
INSERT INTO my_rules VALUES(NULL, 'IF wl9651_val2==1 OR wl9651_val2==2 OR wl9651_val2==3 THEN set wl9651_result2:="SUCCESS" ELSE set wl9651_result2:="FAILURE".');

# 3 - IF/AND/AND
INSERT INTO my_rules VALUES(NULL, 'IF wl9651_val3a==1 AND wl9651_val3b==2 AND wl9651_val3c==3 THEN set wl9651_result3:="SUCCESS" ELSE set wl9651_result3:="FAILURE".');

# Add more exceptions here for all messages that are not revelant to test and should be ignored.
INSERT INTO my_rules VALUES(NULL, 'IF err_code==011825 THEN drop.');

SELECT group_concat(rule ORDER BY id SEPARATOR ' ') FROM my_rules INTO @rules;
SET @@global.dragnet.log_error_filter_rules= @rules;

INSERT INTO my_rules VALUES(NULL, 'IF NOT EXISTS does_not_exist THEN set s1:="string". IF s1=="string" THEN set cmp01:="EQ/S works" ELSE set cmp01:="EQ/S is broken".');

INSERT INTO my_rules VALUES(NULL, 'IF s1!="stringx" THEN set cmp02:="NE/S works" ELSE set cmp02:="NE/S is broken".');

INSERT INTO my_rules VALUES(NULL, 'IF s1>="string" THEN set cmp03:="GE/S works" ELSE set cmp03:="GE/S is broken".');
INSERT INTO my_rules VALUES(NULL, 'IF s1>="strin" THEN set cmp04:="GE/S works" ELSE set cmp04:="GE/S is broken".');
INSERT INTO my_rules VALUES(NULL, 'IF s1>="strinx" THEN set cmp04:="GE/S is broken" ELSE set cmp04:="GE/S works".');

INSERT INTO my_rules VALUES(NULL, 'IF s1>"strinx" THEN set cmp05:="GT/S is broken" ELSE set cmp05:="GT/S works".');
INSERT INTO my_rules VALUES(NULL, 'IF s1>"string" THEN set cmp06:="GT/S is broken" ELSE set cmp06:="GT/S works".');
INSERT INTO my_rules VALUES(NULL, 'IF s1>"strin" THEN set cmp07:="GT/S works" ELSE set cmp07:="GT/S is broken".');

INSERT INTO my_rules VALUES(NULL, 'IF s1<="string" THEN set cmp08:="LE/S works" ELSE set cmp08:="LE/S is broken".');
INSERT INTO my_rules VALUES(NULL, 'IF s1<="strin" THEN set cmp09:="LE/S is broken" ELSE set cmp09:="LE/S works".');
INSERT INTO my_rules VALUES(NULL, 'IF s1<="strinx" THEN set cmp10:="LE/S works" ELSE set cmp10:="LE/S is broken".');

INSERT INTO my_rules VALUES(NULL, 'IF s1<"string" THEN set cmp11:="LT/S is broken" ELSE set cmp11:="LT/S works".');
INSERT INTO my_rules VALUES(NULL, 'IF s1<"strin" THEN set cmp12:="LT/S is broken" ELSE set cmp12:="LT/S works".');
INSERT INTO my_rules VALUES(NULL, 'IF s1<"strinx" THEN set cmp1:="LT/S works" ELSE set cmp13:="LT/S is broken".');

INSERT INTO my_rules VALUES(NULL, 'IF NOT EXISTS does_not_exist THEN set f1:=1.4. IF f1>=1.4 THEN set cmp14:="GE/# works" ELSE set cmp14:="GE/# is broken".');
INSERT INTO my_rules VALUES(NULL, 'IF f1>=1 THEN set cmp15:="GE/# works" ELSE set cmp15:="GE/# is broken".');
INSERT INTO my_rules VALUES(NULL, 'IF f1>=1.5 THEN set cmp16:="GE/# is broken" ELSE set cmp16:="GE/# works".');


SET SESSION group_concat_max_len=65535;
SELECT group_concat(rule ORDER BY id SEPARATOR ' ') FROM my_rules INTO @rules;

DROP TABLE my_rules;
--echo

--echo # Heads-up: log_sink_test sets up some debug rules in the built-in
--echo # rule-set, including a throttle for some ER_YES messages it also
--echo # generates. We see this succeed (rate-limit) in log_components.test;
--echo # in here, the throttle is not applied as it is in the internal rule-set,
--echo # and we run the rule-set generated by the log_filter_dragnet language
--echo # (which does not contain this throttle). The throttle not being applied
--echo # therefore demonstrates the separation of the rule-sets, and counts as a
--echo # success in this context!
--echo

INSTALL COMPONENT   "file://component_log_sink_test";
INSTALL COMPONENT   "file://component_log_sink_json";
SET @@global.log_error_services="log_filter_dragnet; log_sink_test";

disable_warnings;
SET @@global.dragnet.log_error_filter_rules= @rules;
SET @@global.log_error_services="log_filter_dragnet; log_sink_json";

# rule-set with too many rules -- this will fail with an explanatory message
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules= REPEAT("IF prio>9 THEN drop. ", 1025);
SHOW WARNINGS;
# rule-set that's too long -- this will succeed, but without a decompile
SET @rules= CONCAT("IF ", REPEAT("x", 20000), ">9 THEN drop.");
SET @@global.dragnet.log_error_filter_rules= @rules;
SHOW WARNINGS;
SELECT variable_value AS decompiled_filter_rules FROM performance_schema.global_status WHERE variable_name="dragnet.Status";
# SELECT @@global.dragnet.log_error_filter_rules;

SET @@global.log_error_services="log_filter_dragnet; log_sink_internal";
UNINSTALL COMPONENT "file://component_log_sink_test";
UNINSTALL COMPONENT "file://component_log_sink_json";

#
# WL#11150: Add <component> to error log messages by default
#

# Filter log messages using their subsystem
SET @@global.dragnet.log_error_filter_rules="IF subsystem=='Server' THEN SET msg := 'This is a message from the Server subsystem'.";

# Test dropping, comparing and overriding the subsystem field
SET @@global.dragnet.log_error_filter_rules="IF subsystem == 'Server' THEN SET msg := 'Dropping subsystem if it is \"Server\" and setting it to Repl'. IF subsystem == 'Server' THEN UNSET subsystem. IF NOT EXISTS subsystem THEN SET subsystem := 'Repl'.";

SET @@global.dragnet.log_error_filter_rules="IF subsystem == 'Server' THEN SET subsystem := 'InnoDB'. IF subsystem == 'InnoDB' THEN SET msg := 'The subsystem for this message has been overriden to InnoDB'.";

SET @@global.dragnet.log_error_filter_rules="IF subsystem != 'SERVER' THEN SET msg := 'This message is seen as the the subsystem is specified in upper case'.";

SET @@global.dragnet.log_error_filter_rules=@save_filters;

#
# WL#11393: Implement an interface to suppress error logs of type warning or note
#
call mtr.add_suppression("\\[ERROR\\] \\[MY\\-010000\\] \\[Server\\] Errors should not be suppressed");

# Log error messages with varying severities having the same error code and
# check if they are printed when the error code is present in the suppression
# list.

SET @save_suppression_list=@@global.log_error_suppression_list;

enable_warnings;
SET @@global.log_error_services='log_filter_dragnet; log_filter_internal; log_sink_internal';
disable_warnings;
SET @@global.log_error_suppression_list='10000';
# Log message with [System] label - not suppressed
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_PARSER_TRACE THEN SET prio=0. IF err_code==ER_PARSER_TRACE THEN SET msg="System messages should not be suppressed".';
# Log message as an [ERROR] - not suppressed
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_PARSER_TRACE THEN SET prio=1. IF err_code==ER_PARSER_TRACE THEN SET msg="Errors should not be suppressed".';
# Log message as a [Warning] - suppressed
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_PARSER_TRACE THEN SET prio=2. IF err_code==ER_PARSER_TRACE THEN SET msg="Warnings should be suppressed".';
# Log message as a [Note] - suppressed
SET @@global.dragnet.log_error_filter_rules='IF err_code==ER_PARSER_TRACE THEN SET prio=3. IF err_code==ER_PARSER_TRACE THEN SET msg="Notes should be suppressed".';

FLUSH ERROR LOGS;

SET @@global.log_error_services=DEFAULT;

SET @@global.dragnet.log_error_filter_rules=@save_filters;

SET @@global.log_error_suppression_list=@save_suppression_list;

--echo # Now we can uninstall.
--error 0,ER_WRONG_VALUE_FOR_VAR
SET @@global.dragnet.log_error_filter_rules=@save_filters;
UNINSTALL COMPONENT "file://component_log_filter_dragnet";
--echo


--echo # cleanup
SET @@session.debug="-d,parser_stmt_to_error_log";
SET @@session.debug="-d,log_error_normalize";

FLUSH ERROR LOGS;

SET @@global.log_error_verbosity=DEFAULT;


--echo
--echo ###
--echo ### error log file
--echo ###
--echo

let GREP_FILE=$log_error_;

perl;
   use strict;
   use File::stat;
   my $file= $ENV{'GREP_FILE'} or die("grep file not set");
   my $pattern="^20";
   my $stime= $ENV{'GREP_START'};

   open(FILE, "$file") or die("Unable to open $file: $!");
   while (<FILE>) {
     my $line = $_;
     my $ts = 0;

     if ($stime == 0) {
       print "$line";
     }
     elsif (($line =~ /$pattern/) and not ($line =~ /redo log/)) {
       $line =~ /([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])T([0-9][0-9]):([0-9][0-9]):([0-9][0-9])\.([0-9][0-9][0-9][0-9][0-9][0-9])[-+Z][0-9:]* *[0-9]* *?(\[.*)/;
       $ts=$1.$2.$3.$4.$5.$6.$7;
       if ($ts >= $stime) {
         $stime= 0;
       }
     }
   }
   close(FILE);
EOF

SET @@global.log_error_verbosity=@old_log_error_verbosity;
--enable_warnings

--echo
--echo ###
--echo ### done
--echo ###