newrelic_rpm 3.14.2.312 → 3.14.3.313

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -5
  3. data/CHANGELOG +22 -0
  4. data/lib/new_relic/agent/agent.rb +0 -4
  5. data/lib/new_relic/agent/configuration/default_source.rb +114 -107
  6. data/lib/new_relic/agent/database.rb +17 -1
  7. data/lib/new_relic/agent/database/obfuscation_helpers.rb +68 -48
  8. data/lib/new_relic/agent/database/obfuscator.rb +4 -23
  9. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
  10. data/lib/new_relic/agent/instrumentation/data_mapper.rb +20 -1
  11. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +1 -1
  12. data/lib/new_relic/agent/rules_engine.rb +39 -2
  13. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +27 -5
  14. data/lib/new_relic/agent/sql_sampler.rb +7 -3
  15. data/lib/new_relic/language_support.rb +8 -0
  16. data/lib/new_relic/version.rb +1 -1
  17. data/lib/tasks/config.html.erb +5 -1
  18. data/lib/tasks/config.rake +10 -2
  19. data/lib/tasks/config.text.erb +6 -5
  20. data/test/environments/rails32/Gemfile +6 -1
  21. data/test/fixtures/cross_agent_tests/aws.json +95 -1
  22. data/test/fixtures/cross_agent_tests/cat/README.md +28 -0
  23. data/test/fixtures/cross_agent_tests/cat/cat_map.json +595 -0
  24. data/test/fixtures/cross_agent_tests/cat/path_hashing.json +51 -0
  25. data/test/fixtures/cross_agent_tests/data_transport/data_transport.json +1441 -0
  26. data/test/fixtures/cross_agent_tests/data_transport/data_transport.md +35 -0
  27. data/test/fixtures/cross_agent_tests/sql_obfuscation/README.md +7 -2
  28. data/test/fixtures/cross_agent_tests/sql_obfuscation/sql_obfuscation.json +261 -35
  29. data/test/fixtures/cross_agent_tests/transaction_segment_terms.json +305 -17
  30. data/test/multiverse/suites/active_record/active_record_test.rb +1 -1
  31. data/test/multiverse/suites/agent_only/rename_rule_test.rb +12 -12
  32. data/test/multiverse/suites/datamapper/datamapper_test.rb +23 -0
  33. data/test/multiverse/suites/rails/Envfile +10 -2
  34. data/test/new_relic/agent/database/sql_obfuscation_test.rb +2 -7
  35. data/test/performance/README.md +3 -10
  36. data/test/performance/lib/performance/table.rb +1 -1
  37. data/test/performance/suites/rules_engine.rb +35 -0
  38. data/test/performance/suites/segment_terms_rule.rb +27 -0
  39. data/test/performance/suites/sql_obfuscation.rb +19 -0
  40. metadata +9 -2
@@ -0,0 +1,35 @@
1
+ What
2
+ ----
3
+
4
+ The Data Transport Tests are meant to validate your agent's data transport layer (the part of the code that sends requests to the collector and interprets the responses). These tests are meant to be consumable both by code (for automated tests) and by humans, such that we can treat these tests as a sort of spec for agent-collector communication.
5
+
6
+ The basic gist is that each of these tests are just collections of steps. A step is one of the following:
7
+
8
+ * An event that you need to induce your agent to do (such as generate a metric or do a harvest).
9
+ * An expectation that your agent should send a request (as a result of previous steps).
10
+ * A composite step, which is just several other steps grouped together to reduce repetition.
11
+
12
+ ### Types of steps (not an exhaustive list) ###
13
+
14
+ * `event_agent_start` -- Represents the startup of the agent. Will contain a `payload` property that defines the startup configuration.
15
+ * `event_metric` -- Represents some event that would cause your agent to generate a metric (such as a page view, a database query, etc).
16
+ * `event_harvest_metrics` -- Represents some event that would cause your agent to harvest metrics (such as a harvest timer elapsing).
17
+ * `event_local_config_update` -- Represents a change to local config while the agent is running.
18
+ * `expect_request` -- Represents an expectation that a particular request should happen as a result of the previous events.
19
+ * Will sometimes contain a `payload` property that defines the expected serialized payload (if omitted, payload can be ignored).
20
+ * Expected payloads will sometimes contain wildcard tokens such as `"__ANY_FLOAT__"`.
21
+ * Will sometimes contain a `response_payload` property that defines the response that the test runner should give to the agent (if omitted, just send back any payload that makes your agent continue on happily).
22
+ * `expect_no_request` -- Represents an expectation that **no** request should happen as a result of the previous events. *Note that this expectation is redundant if your test runner follows that paradigm that every request that occurs must be explicitly called out by the test data.*
23
+
24
+ ### "But our agent doesn't do *xyz*!" ###
25
+
26
+ It is inevitable that there will be conflicts in functionality between the various agents. As much as possible, these tests are written to be idealistically comprehensive -- that is, covering all behavior that a perfectly functioning agent should follow -- but flexible enough for agents to intentionally ignore components that either don't apply or are not yet supported.
27
+
28
+ Examples:
29
+
30
+ * **Discrepancy:** Agent does not send `agent_settings` command.
31
+ * **Solution:** Ignore `expect_request` steps with `"agent_settings"` as the command name.
32
+ * **Discrepancy:** Agent does not yet support custom events.
33
+ * **Solution:** Ignore any test that contains a `event_custom_event` step.
34
+ * **Discrepancy:** Agent request payloads looks significantly different than the expected payload due to special reasons X, Y, and Z.
35
+ * **Solution:** Pre-process all expected payloads to make them match your agent's goofy output.
@@ -7,8 +7,7 @@ test case are in the `sql` property of each object. Each test case also has an
7
7
  `obfuscated` property which is an array containing at least one valid output.
8
8
 
9
9
  Test cases also have a `dialects` property, which is an array of strings which
10
- specify which sql dialects the test should apply to. Currently the options are
11
- `mysql`, `postgres`, or `all` This is relevant because PostgreSQL uses
10
+ specify which sql dialects the test should apply to. See "SQL Syntax Documentation" list below. This is relevant because for example, PostgreSQL uses
12
11
  different identifier and string quoting rules than MySQL (most notably,
13
12
  double-quoted string literals are not allowed in PostgreSQL, where
14
13
  double-quotes are instead used around identifiers).
@@ -28,3 +27,9 @@ The following database documentation may be helpful in understanding these test
28
27
  cases:
29
28
  * [MySQL String Literals](http://dev.mysql.com/doc/refman/5.5/en/string-literals.html)
30
29
  * [PostgreSQL String Constants](http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS)
30
+
31
+ SQL Syntax Documentation:
32
+ * [MySQL](http://dev.mysql.com/doc/refman/5.5/en/language-structure.html)
33
+ * [PostgreSQL](http://www.postgresql.org/docs/8.4/static/sql-syntax.html)
34
+ * [Cassandra](http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cql_lexicon_c.html)
35
+ * [Oracle](http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/langelems.htm)
@@ -26,7 +26,9 @@
26
26
  ],
27
27
  "dialects": [
28
28
  "mysql",
29
- "postgres"
29
+ "postgres",
30
+ "oracle",
31
+ "cassandra"
30
32
  ],
31
33
  "sql": "SELECT * FROM t WHERE foo='bar/*' AND baz='whatever */qux'"
32
34
  },
@@ -36,7 +38,8 @@
36
38
  "SELECT \"t001\".\"c2\" FROM \"t001\" WHERE \"t001\".\"c2\" = ? AND c3=? LIMIT ?"
37
39
  ],
38
40
  "dialects": [
39
- "postgres"
41
+ "postgres",
42
+ "oracle"
40
43
  ],
41
44
  "sql": "SELECT \"t001\".\"c2\" FROM \"t001\" WHERE \"t001\".\"c2\" = 'value' AND c3=1234 LIMIT 1"
42
45
  },
@@ -57,7 +60,9 @@
57
60
  ],
58
61
  "dialects": [
59
62
  "mysql",
60
- "postgres"
63
+ "postgres",
64
+ "oracle",
65
+ "cassandra"
61
66
  ],
62
67
  "sql": "SELECT * FROM t WHERE foo='bar--' AND\n baz='qux--'"
63
68
  },
@@ -68,7 +73,9 @@
68
73
  ],
69
74
  "dialects": [
70
75
  "mysql",
71
- "postgres"
76
+ "postgres",
77
+ "oracle",
78
+ "cassandra"
72
79
  ],
73
80
  "sql": "SELECT * FROM foo WHERE bar='baz' /* Hide Me */"
74
81
  },
@@ -79,7 +86,9 @@
79
86
  ],
80
87
  "dialects": [
81
88
  "mysql",
82
- "postgres"
89
+ "postgres",
90
+ "oracle",
91
+ "cassandra"
83
92
  ],
84
93
  "sql": "SELECT * FROM foobar WHERE password='hunter2'\n-- No peeking!"
85
94
  },
@@ -90,19 +99,22 @@
90
99
  ],
91
100
  "dialects": [
92
101
  "mysql",
93
- "postgres"
102
+ "postgres",
103
+ "oracle",
104
+ "cassandra"
94
105
  ],
95
106
  "sql": "SELECT foo, bar FROM baz WHERE password='hunter2' # Secret"
96
107
  },
97
108
  {
98
109
  "name": "escape_string_constants.postgres",
110
+ "sql": "SELECT \"col1\", \"col2\" from \"table\" WHERE \"col3\"=E'foo\\'bar\\\\baz' AND country=e'foo\\'bar\\\\baz'",
99
111
  "obfuscated": [
112
+ "SELECT \"col1\", \"col2\" from \"table\" WHERE \"col3\"=E?",
100
113
  "SELECT \"col1\", \"col2\" from \"table\" WHERE \"col3\"=E? AND country=e?"
101
114
  ],
102
115
  "dialects": [
103
116
  "postgres"
104
117
  ],
105
- "sql": "SELECT \"col1\", \"col2\" from \"table\" WHERE \"col3\"=E'foo\\'bar\\\\baz' AND country=e'foo\\'bar\\\\baz'",
106
118
  "comments": [
107
119
  "PostgreSQL supports an alternate string quoting mode where backslash escape",
108
120
  "sequences are interpreted.",
@@ -126,20 +138,25 @@
126
138
  ],
127
139
  "dialects": [
128
140
  "mysql",
129
- "postgres"
141
+ "postgres",
142
+ "oracle",
143
+ "cassandra"
130
144
  ],
131
145
  "sql": "SELECT c11.col1, c22.col2 FROM table c11, table c22 WHERE value='nothing'"
132
146
  },
133
147
  {
134
148
  "name": "numeric_literals",
149
+ "sql": "INSERT INTO X VALUES(1, 23456, 123.456, 99+100)",
135
150
  "obfuscated": [
151
+ "INSERT INTO X VALUES(?, ?, ?, ?+?)",
136
152
  "INSERT INTO X VALUES(?, ?, ?.?, ?+?)"
137
153
  ],
138
154
  "dialects": [
139
155
  "mysql",
140
- "postgres"
141
- ],
142
- "sql": "INSERT INTO X VALUES(1, 23456, 123.456, 99+100)"
156
+ "postgres",
157
+ "oracle",
158
+ "cassandra"
159
+ ]
143
160
  },
144
161
  {
145
162
  "name": "string_double_quoted.mysql",
@@ -158,7 +175,9 @@
158
175
  ],
159
176
  "dialects": [
160
177
  "mysql",
161
- "postgres"
178
+ "postgres",
179
+ "oracle",
180
+ "cassandra"
162
181
  ],
163
182
  "sql": "SELECT * FROM table WHERE name='foo' AND value = 'bar'"
164
183
  },
@@ -169,7 +188,9 @@
169
188
  ],
170
189
  "dialects": [
171
190
  "mysql",
172
- "postgres"
191
+ "postgres",
192
+ "oracle",
193
+ "cassandra"
173
194
  ],
174
195
  "sql": "SELECT * FROM table WHERE col='foo\\''bar'",
175
196
  "comments": [
@@ -185,7 +206,9 @@
185
206
  ],
186
207
  "dialects": [
187
208
  "mysql",
188
- "postgres"
209
+ "postgres",
210
+ "oracle",
211
+ "cassandra"
189
212
  ],
190
213
  "sql": "SELECT * FROM table WHERE col1='foo\"bar' AND col2='what\"ever'"
191
214
  },
@@ -196,7 +219,9 @@
196
219
  ],
197
220
  "dialects": [
198
221
  "mysql",
199
- "postgres"
222
+ "postgres",
223
+ "oracle",
224
+ "cassandra"
200
225
  ],
201
226
  "sql": "select * from accounts where accounts.name != 'dude \n newline' order by accounts.name"
202
227
  },
@@ -212,24 +237,28 @@
212
237
  },
213
238
  {
214
239
  "name": "string_with_escaped_quotes.mysql",
240
+ "sql": "INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son', \"\"\"jim''s\"\" hat\", \"\\\"jim''s secret\\\"\")",
215
241
  "obfuscated": [
242
+ "INSERT INTO X values(?, ?,?, ? , ?, ?, ?",
216
243
  "INSERT INTO X values(?, ?,?, ? , ?, ?, ?)"
217
244
  ],
218
245
  "dialects": [
219
246
  "mysql"
220
- ],
221
- "sql": "INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son', \"\"\"jim''s\"\" hat\", \"\\\"jim''s secret\\\"\")"
247
+ ]
222
248
  },
223
249
  {
224
250
  "name": "string_with_trailing_backslash",
251
+ "sql": "SELECT * FROM table WHERE name='foo\\' AND color='blue'",
225
252
  "obfuscated": [
253
+ "SELECT * FROM table WHERE name=?",
226
254
  "SELECT * FROM table WHERE name=? AND color=?"
227
255
  ],
228
256
  "dialects": [
229
257
  "mysql",
230
- "postgres"
258
+ "postgres",
259
+ "oracle",
260
+ "cassandra"
231
261
  ],
232
- "sql": "SELECT * FROM table WHERE name='foo\\' AND color='blue'",
233
262
  "comments": [
234
263
  "If backslashes are being ignored in single-quoted strings",
235
264
  "(standard_conforming_strings=on in PostgreSQL, or NO_BACKSLASH_ESCAPES is on",
@@ -253,20 +282,25 @@
253
282
  ],
254
283
  "dialects": [
255
284
  "mysql",
256
- "postgres"
285
+ "postgres",
286
+ "oracle",
287
+ "cassandra"
257
288
  ],
258
289
  "sql": "SELECT * FROM table WHERE foo='this string ends with a backslash\\\\'"
259
290
  },
260
291
  {
261
292
  "name": "string_with_trailing_escaped_quote",
293
+ "sql": "SELECT * FROM table WHERE name='foo\\'' AND color='blue'",
262
294
  "obfuscated": [
295
+ "SELECT * FROM table WHERE name=?",
263
296
  "SELECT * FROM table WHERE name=? AND color=?"
264
297
  ],
265
298
  "dialects": [
266
299
  "mysql",
267
- "postgres"
268
- ],
269
- "sql": "SELECT * FROM table WHERE name='foo\\'' AND color='blue'"
300
+ "postgres",
301
+ "oracle",
302
+ "cassandra"
303
+ ]
270
304
  },
271
305
  {
272
306
  "name": "string_with_twin_single_quotes",
@@ -275,68 +309,85 @@
275
309
  ],
276
310
  "dialects": [
277
311
  "mysql",
278
- "postgres"
312
+ "postgres",
313
+ "oracle",
314
+ "cassandra"
279
315
  ],
280
316
  "sql": "INSERT INTO X values('', 'a''b c',0, 1 , 'd''e f''s h')"
281
317
  },
282
318
  {
283
319
  "name": "pathological/end_of_line_comments_with_quotes",
320
+ "sql": "SELECT * FROM t WHERE -- '\n bar='baz' -- '",
284
321
  "obfuscated": [
322
+ "SELECT * FROM t WHERE ?\n bar=? ?",
285
323
  "SELECT * FROM t WHERE ?"
286
324
  ],
287
325
  "dialects": [
288
326
  "mysql",
289
- "postgres"
327
+ "postgres",
328
+ "oracle",
329
+ "cassandra"
290
330
  ],
291
- "sql": "SELECT * FROM t WHERE -- '\n bar='baz' -- '",
292
331
  "pathological": true
293
332
  },
294
333
  {
295
334
  "name": "pathological/mixed_comments_and_quotes",
335
+ "sql": "SELECT * FROM t WHERE /* ' */ \n bar='baz' -- '",
296
336
  "obfuscated": [
337
+ "SELECT * FROM t WHERE ? \n bar=? ?",
297
338
  "SELECT * FROM t WHERE ?"
298
339
  ],
299
340
  "dialects": [
300
341
  "mysql",
301
- "postgres"
342
+ "postgres",
343
+ "oracle",
344
+ "cassandra"
302
345
  ],
303
- "sql": "SELECT * FROM t WHERE /* ' */ \n bar='baz' -- '",
304
346
  "pathological": true
305
347
  },
306
348
  {
307
349
  "name": "pathological/mixed_quotes_comments_and_newlines",
350
+ "sql": "SELECT * FROM t WHERE -- '\n /* ' */ c2='xxx' /* ' */\n c='x\n xx' -- '",
308
351
  "obfuscated": [
352
+ "SELECT * FROM t WHERE ?\n ? c2=? ?\n c=? ?",
309
353
  "SELECT * FROM t WHERE ?"
310
354
  ],
311
355
  "dialects": [
312
356
  "mysql",
313
- "postgres"
357
+ "postgres",
358
+ "oracle",
359
+ "cassandra"
314
360
  ],
315
- "sql": "SELECT * FROM t WHERE -- '\n /* ' */ c2='xxx' /* ' */\n c='x\n xx' -- '",
316
361
  "pathological": true
317
362
  },
318
363
  {
319
364
  "name": "pathological/mixed_quotes_end_of_line_comments",
365
+ "sql": "SELECT * FROM t WHERE -- '\n c='x\n xx' -- '",
320
366
  "obfuscated": [
367
+ "SELECT * FROM t WHERE ?\n c=? ?",
321
368
  "SELECT * FROM t WHERE ?"
322
369
  ],
323
370
  "dialects": [
324
371
  "mysql",
325
- "postgres"
372
+ "postgres",
373
+ "oracle",
374
+ "cassandra"
326
375
  ],
327
- "sql": "SELECT * FROM t WHERE -- '\n c='x\n xx' -- '",
328
376
  "pathological": true
329
377
  },
330
378
  {
331
379
  "name": "pathological/quote_delimiters_in_comments",
380
+ "sql": "SELECT * FROM foo WHERE col='value1' AND /* don't */ col2='value1' /* won't */",
332
381
  "obfuscated": [
382
+ "SELECT * FROM foo WHERE col=? AND ? col2=? ?",
333
383
  "SELECT * FROM foo WHERE col=? AND ?"
334
384
  ],
335
385
  "dialects": [
336
386
  "mysql",
337
- "postgres"
387
+ "postgres",
388
+ "oracle",
389
+ "cassandra"
338
390
  ],
339
- "sql": "SELECT * FROM foo WHERE col='value1' AND /* don't */ col2='value1' /* won't */",
340
391
  "pathological": true
341
392
  },
342
393
  {
@@ -355,11 +406,186 @@
355
406
  "sql": "SELECT * FROM table WHERE foo='bar' AND baz='nothing to see here",
356
407
  "dialects": [
357
408
  "mysql",
358
- "postgres"
409
+ "postgres",
410
+ "oracle",
411
+ "cassandra"
359
412
  ],
360
413
  "obfuscated": [
361
414
  "?"
362
415
  ],
363
416
  "malformed": true
417
+ },
418
+ {
419
+ "name": "dollar_quotes",
420
+ "sql": "SELECT * FROM \"foo\" WHERE \"foo\" = $a$dollar quotes can be $b$nested$b$$a$ and bar = 'baz'",
421
+ "obfuscated": [
422
+ "SELECT * FROM \"foo\" WHERE \"foo\" = ? and bar = ?"
423
+ ],
424
+ "dialects": [
425
+ "postgres"
426
+ ]
427
+ },
428
+ {
429
+ "name": "variable_substitution_not_mistaken_for_dollar_quotes",
430
+ "sql": "INSERT INTO \"foo\" (\"bar\", \"baz\", \"qux\") VALUES ($1, $2, $3) RETURNING \"id\"",
431
+ "obfuscated": [
432
+ "INSERT INTO \"foo\" (\"bar\", \"baz\", \"qux\") VALUES ($?, $?, $?) RETURNING \"id\""
433
+ ],
434
+ "dialects": [
435
+ "postgres"
436
+ ]
437
+ },
438
+ {
439
+ "name": "non_quote_escape",
440
+ "sql": "select * from foo where bar = 'some\\tthing' and baz = 10",
441
+ "obfuscated": [
442
+ "select * from foo where bar = ? and baz = ?"
443
+ ],
444
+ "dialects": [
445
+ "mysql",
446
+ "postgres",
447
+ "oracle",
448
+ "cassandra"
449
+ ]
450
+ },
451
+ {
452
+ "name": "end_of_string_backslash_and_line_comment_with_quite",
453
+ "sql": "select * from users where user = 'user1\\' password = 'hunter 2' -- ->don't count this quote",
454
+ "obfuscated": [
455
+ "select * from users where user = ?"
456
+ ],
457
+ "dialects": [
458
+ "mysql",
459
+ "postgres",
460
+ "oracle",
461
+ "cassandra"
462
+ ],
463
+ "pathological": true
464
+ },
465
+ {
466
+ "name": "oracle_bracket_quote",
467
+ "sql": "select * from foo where bar=q'[baz's]' and x=5",
468
+ "obfuscated": [
469
+ "select * from foo where bar=? and x=?"
470
+ ],
471
+ "dialects": [
472
+ "oracle"
473
+ ]
474
+ },
475
+ {
476
+ "name": "oracle_brace_quote",
477
+ "sql": "select * from foo where bar=q'{baz's}' and x=5",
478
+ "obfuscated": [
479
+ "select * from foo where bar=? and x=?"
480
+ ],
481
+ "dialects": [
482
+ "oracle"
483
+ ]
484
+ },
485
+ {
486
+ "name": "oracle_angle_quote",
487
+ "sql": "select * from foo where bar=q'<baz's>' and x=5",
488
+ "obfuscated": [
489
+ "select * from foo where bar=? and x=?"
490
+ ],
491
+ "dialects": [
492
+ "oracle"
493
+ ]
494
+ },
495
+ {
496
+ "name": "oracle_paren_quote",
497
+ "sql": "select * from foo where bar=q'(baz's)' and x=5",
498
+ "obfuscated": [
499
+ "select * from foo where bar=? and x=?"
500
+ ],
501
+ "dialects": [
502
+ "oracle"
503
+ ]
504
+ },
505
+ {
506
+ "name": "cassandra_blobs",
507
+ "sql": "select * from foo where bar=0xabcdef123 and x=5",
508
+ "obfuscated": [
509
+ "select * from foo where bar=? and x=?"
510
+ ],
511
+ "dialects": [
512
+ "cassandra"
513
+ ]
514
+ },
515
+ {
516
+ "name": "hex_literals",
517
+ "sql": "select * from foo where bar=0x2F and x=5",
518
+ "obfuscated": [
519
+ "select * from foo where bar=? and x=?"
520
+ ],
521
+ "dialects": [
522
+ "mysql"
523
+ ]
524
+ },
525
+ {
526
+ "name": "exponential_literals",
527
+ "sql": "select * from foo where bar=1.234e-5 and x=5",
528
+ "obfuscated": [
529
+ "select * from foo where bar=? and x=?"
530
+ ],
531
+ "dialects": [
532
+ "mysql",
533
+ "postgres",
534
+ "oracle",
535
+ "cassandra"
536
+ ]
537
+ },
538
+ {
539
+ "name": "uuid",
540
+ "sql": "select * from foo where bar=01234567-89ab-cdef-0123-456789abcdef and x=5",
541
+ "obfuscated": [
542
+ "select * from foo where bar=? and x=?"
543
+ ],
544
+ "dialects": [
545
+ "postgres",
546
+ "cassandra"
547
+ ]
548
+ },
549
+ {
550
+ "name": "uuid_with_braces",
551
+ "sql": "select * from foo where bar={01234567-89ab-cdef-0123-456789abcdef} and x=5",
552
+ "obfuscated": [
553
+ "select * from foo where bar=? and x=?"
554
+ ],
555
+ "dialects": [
556
+ "postgres"
557
+ ]
558
+ },
559
+ {
560
+ "name": "uuid_no_dashes",
561
+ "sql": "select * from foo where bar=0123456789abcdef0123456789abcdef and x=5",
562
+ "obfuscated": [
563
+ "select * from foo where bar=? and x=?"
564
+ ],
565
+ "dialects": [
566
+ "postgres"
567
+ ]
568
+ },
569
+ {
570
+ "name": "uuid_random_dashes",
571
+ "sql": "select * from foo where bar={012-345678-9abc-def012345678-9abcdef} and x=5",
572
+ "obfuscated": [
573
+ "select * from foo where bar=? and x=?"
574
+ ],
575
+ "dialects": [
576
+ "postgres"
577
+ ]
578
+ },
579
+ {
580
+ "name": "booleans",
581
+ "sql": "select * from foo where bar=true and x=FALSE",
582
+ "obfuscated": [
583
+ "select * from foo where bar=? and x=?"
584
+ ],
585
+ "dialects": [
586
+ "mysql",
587
+ "postgres",
588
+ "cassandra"
589
+ ]
364
590
  }
365
591
  ]