@@ -283,6 +283,247 @@ fn full_run_logs_expected_queries_for_tlp_where_oracle() -> Result<(), Box<dyn E
283283 Ok ( ( ) )
284284}
285285
286+ #[ test]
287+ fn full_run_logs_expected_queries_for_tlp_having_oracle ( ) -> Result < ( ) , Box < dyn Error > > {
288+ let log_dir = make_temp_log_dir ( "integration-tlp-having" ) ?;
289+ let config_path =
290+ generate_default_config_with_oracles ( & log_dir, & [ ConfiguredOracle :: TlpHaving ] ) ?;
291+ let run_output = run_fuzzer_once ( & config_path) ?;
292+
293+ insta:: assert_snapshot!( run_output. query_log, @r#"
294+ === round=1 query=1 oracle=TlpHavingOracle query_seed=310304 ===
295+ --- statement=1 context=TLP-HAVING all groups ---
296+ SELECT t0.col_t0_3_date32, t0.col_t0_1_decimal128
297+ FROM t0
298+ GROUP BY t0.col_t0_3_date32, t0.col_t0_1_decimal128
299+
300+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
301+ SELECT t0.col_t0_3_date32, t0.col_t0_1_decimal128
302+ FROM t0
303+ GROUP BY t0.col_t0_3_date32, t0.col_t0_1_decimal128
304+ HAVING ((INTERVAL '-7 MONS 16 DAYS -0.000000001 SECS' = 1193.6000000000000000000000000000000))
305+ UNION ALL
306+ SELECT t0.col_t0_3_date32, t0.col_t0_1_decimal128
307+ FROM t0
308+ GROUP BY t0.col_t0_3_date32, t0.col_t0_1_decimal128
309+ HAVING NOT ((INTERVAL '-7 MONS 16 DAYS -0.000000001 SECS' = 1193.6000000000000000000000000000000))
310+ UNION ALL
311+ SELECT t0.col_t0_3_date32, t0.col_t0_1_decimal128
312+ FROM t0
313+ GROUP BY t0.col_t0_3_date32, t0.col_t0_1_decimal128
314+ HAVING ((INTERVAL '-7 MONS 16 DAYS -0.000000001 SECS' = 1193.6000000000000000000000000000000)) IS NULL
315+
316+ === round=1 query=2 oracle=TlpHavingOracle query_seed=310305 ===
317+ --- statement=1 context=TLP-HAVING all groups ---
318+ SELECT t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
319+ FROM t1
320+ GROUP BY t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
321+
322+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
323+ SELECT t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
324+ FROM t1
325+ GROUP BY t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
326+ HAVING (NULL)
327+ UNION ALL
328+ SELECT t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
329+ FROM t1
330+ GROUP BY t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
331+ HAVING NOT (NULL)
332+ UNION ALL
333+ SELECT t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
334+ FROM t1
335+ GROUP BY t1.col_t1_1_int64, t1.col_t1_3_date32, t1.col_t1_2_int64
336+ HAVING (NULL) IS NULL
337+
338+ === round=1 query=3 oracle=TlpHavingOracle query_seed=310306 ===
339+ --- statement=1 context=TLP-HAVING all groups ---
340+ SELECT t2.col_t2_1_string
341+ FROM t2
342+ WHERE NULL
343+ GROUP BY t2.col_t2_1_string
344+
345+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
346+ SELECT t2.col_t2_1_string
347+ FROM t2
348+ WHERE NULL
349+ GROUP BY t2.col_t2_1_string
350+ HAVING (false)
351+ UNION ALL
352+ SELECT t2.col_t2_1_string
353+ FROM t2
354+ WHERE NULL
355+ GROUP BY t2.col_t2_1_string
356+ HAVING NOT (false)
357+ UNION ALL
358+ SELECT t2.col_t2_1_string
359+ FROM t2
360+ WHERE NULL
361+ GROUP BY t2.col_t2_1_string
362+ HAVING (false) IS NULL
363+
364+ === round=1 query=5 oracle=TlpHavingOracle query_seed=310308 ===
365+ --- statement=1 context=TLP-HAVING all groups ---
366+ SELECT t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
367+ FROM t0
368+ WHERE (to_char(CAST('2052-04-28' AS DATE), '=B 2v') !~* to_char(INTERVAL '1 MONS -11 DAYS -0.658344865 SECS', to_char(CAST('2056-06-17 08:39:22.305135405 -09:00' AS TIMESTAMP), '9L4l6.-bG6dPLWk-7 ~9azH0^V;7q0S#|%@?MyX"')))
369+ GROUP BY t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
370+
371+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
372+ SELECT t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
373+ FROM t0
374+ WHERE (to_char(CAST('2052-04-28' AS DATE), '=B 2v') !~* to_char(INTERVAL '1 MONS -11 DAYS -0.658344865 SECS', to_char(CAST('2056-06-17 08:39:22.305135405 -09:00' AS TIMESTAMP), '9L4l6.-bG6dPLWk-7 ~9azH0^V;7q0S#|%@?MyX"')))
375+ GROUP BY t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
376+ HAVING (false)
377+ UNION ALL
378+ SELECT t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
379+ FROM t0
380+ WHERE (to_char(CAST('2052-04-28' AS DATE), '=B 2v') !~* to_char(INTERVAL '1 MONS -11 DAYS -0.658344865 SECS', to_char(CAST('2056-06-17 08:39:22.305135405 -09:00' AS TIMESTAMP), '9L4l6.-bG6dPLWk-7 ~9azH0^V;7q0S#|%@?MyX"')))
381+ GROUP BY t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
382+ HAVING NOT (false)
383+ UNION ALL
384+ SELECT t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
385+ FROM t0
386+ WHERE (to_char(CAST('2052-04-28' AS DATE), '=B 2v') !~* to_char(INTERVAL '1 MONS -11 DAYS -0.658344865 SECS', to_char(CAST('2056-06-17 08:39:22.305135405 -09:00' AS TIMESTAMP), '9L4l6.-bG6dPLWk-7 ~9azH0^V;7q0S#|%@?MyX"')))
387+ GROUP BY t0.col_t0_2_float32, t0.col_t0_1_decimal128, t0.col_t0_3_date32
388+ HAVING (false) IS NULL
389+
390+ === round=2 query=1 oracle=TlpHavingOracle query_seed=311304 ===
391+ --- statement=1 context=TLP-HAVING all groups ---
392+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
393+ FROM t0
394+ WHERE false
395+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
396+
397+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
398+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
399+ FROM t0
400+ WHERE false
401+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
402+ HAVING (false)
403+ UNION ALL
404+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
405+ FROM t0
406+ WHERE false
407+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
408+ HAVING NOT (false)
409+ UNION ALL
410+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
411+ FROM t0
412+ WHERE false
413+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_1_float64, t0.col_t0_2_time64_nanosecond
414+ HAVING (false) IS NULL
415+
416+ === round=2 query=2 oracle=TlpHavingOracle query_seed=311305 ===
417+ --- statement=1 context=TLP-HAVING all groups ---
418+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
419+ FROM t0
420+ WHERE true
421+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
422+
423+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
424+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
425+ FROM t0
426+ WHERE true
427+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
428+ HAVING (t0.col_t0_3_boolean)
429+ UNION ALL
430+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
431+ FROM t0
432+ WHERE true
433+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
434+ HAVING NOT (t0.col_t0_3_boolean)
435+ UNION ALL
436+ SELECT t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
437+ FROM t0
438+ WHERE true
439+ GROUP BY t0.col_t0_4_interval_month_day_nano, t0.col_t0_3_boolean
440+ HAVING (t0.col_t0_3_boolean) IS NULL
441+
442+ === round=2 query=3 oracle=TlpHavingOracle query_seed=311306 ===
443+ --- statement=1 context=TLP-HAVING all groups ---
444+ SELECT t2.col_t2_1_float32
445+ FROM t2
446+ WHERE false
447+ GROUP BY t2.col_t2_1_float32
448+
449+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
450+ SELECT t2.col_t2_1_float32
451+ FROM t2
452+ WHERE false
453+ GROUP BY t2.col_t2_1_float32
454+ HAVING (false)
455+ UNION ALL
456+ SELECT t2.col_t2_1_float32
457+ FROM t2
458+ WHERE false
459+ GROUP BY t2.col_t2_1_float32
460+ HAVING NOT (false)
461+ UNION ALL
462+ SELECT t2.col_t2_1_float32
463+ FROM t2
464+ WHERE false
465+ GROUP BY t2.col_t2_1_float32
466+ HAVING (false) IS NULL
467+
468+ === round=2 query=4 oracle=TlpHavingOracle query_seed=311307 ===
469+ --- statement=1 context=TLP-HAVING all groups ---
470+ SELECT t1.col_t1_3_decimal128
471+ FROM t1
472+ GROUP BY t1.col_t1_3_decimal128
473+
474+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
475+ SELECT t1.col_t1_3_decimal128
476+ FROM t1
477+ GROUP BY t1.col_t1_3_decimal128
478+ HAVING (true)
479+ UNION ALL
480+ SELECT t1.col_t1_3_decimal128
481+ FROM t1
482+ GROUP BY t1.col_t1_3_decimal128
483+ HAVING NOT (true)
484+ UNION ALL
485+ SELECT t1.col_t1_3_decimal128
486+ FROM t1
487+ GROUP BY t1.col_t1_3_decimal128
488+ HAVING (true) IS NULL
489+
490+ === round=2 query=5 oracle=TlpHavingOracle query_seed=311308 ===
491+ --- statement=1 context=TLP-HAVING all groups ---
492+ SELECT t2.col_t2_1_float32
493+ FROM t2
494+ GROUP BY t2.col_t2_1_float32
495+
496+ --- statement=2 context=TLP-HAVING p UNION ALL NOT p UNION ALL p IS NULL ---
497+ SELECT t2.col_t2_1_float32
498+ FROM t2
499+ GROUP BY t2.col_t2_1_float32
500+ HAVING (('ro' ~ to_char((INTERVAL '4 MONS -11 DAYS -0.961066195 SECS' + INTERVAL '10 MONS -17 DAYS -0.349920790 SECS'), to_char(NULL, '0,YK#Mw'))))
501+ UNION ALL
502+ SELECT t2.col_t2_1_float32
503+ FROM t2
504+ GROUP BY t2.col_t2_1_float32
505+ HAVING NOT (('ro' ~ to_char((INTERVAL '4 MONS -11 DAYS -0.961066195 SECS' + INTERVAL '10 MONS -17 DAYS -0.349920790 SECS'), to_char(NULL, '0,YK#Mw'))))
506+ UNION ALL
507+ SELECT t2.col_t2_1_float32
508+ FROM t2
509+ GROUP BY t2.col_t2_1_float32
510+ HAVING (('ro' ~ to_char((INTERVAL '4 MONS -11 DAYS -0.961066195 SECS' + INTERVAL '10 MONS -17 DAYS -0.349920790 SECS'), to_char(NULL, '0,YK#Mw')))) IS NULL
511+ "# ) ;
512+ insta:: assert_snapshot!( run_output. stats_summary, @r#"
513+ ============================================================
514+ 🎯 DataFusion Fuzzer - Final Statistics
515+ ============================================================
516+ 📊 Execution Summary:
517+ • Rounds Completed: 2
518+ • Queries Executed: 18
519+ • Query Success Rate: 77.78%
520+ "# ) ;
521+
522+ fs:: remove_dir_all ( & log_dir) ?;
523+
524+ Ok ( ( ) )
525+ }
526+
286527struct RunOutput {
287528 query_log : String ,
288529 stats_summary : String ,
0 commit comments