Fuzzer: compares SPARQL evaluation with and without the optimizer

pull/322/head
Tpt 2 years ago committed by Thomas Tanon
parent 24371412b4
commit a8f666fb5d
  1. 46
      fuzz/fuzz_targets/sparql_eval.rs

@ -1,8 +1,9 @@
#![no_main] #![no_main]
use lazy_static::lazy_static; use lazy_static::lazy_static;
use libfuzzer_sys::fuzz_target; use libfuzzer_sys::fuzz_target;
use oxigraph::io::DatasetFormat; use oxigraph::io::DatasetFormat;
use oxigraph::sparql::Query; use oxigraph::sparql::{Query, QueryOptions, QueryResults, QuerySolutionIter};
use oxigraph::store::Store; use oxigraph::store::Store;
lazy_static! { lazy_static! {
@ -20,7 +21,46 @@ lazy_static! {
} }
fuzz_target!(|data: sparql_smith::Query| { fuzz_target!(|data: sparql_smith::Query| {
if let Ok(q) = Query::parse(&data.to_string(), None) { let query_str = data.to_string();
STORE.query(q).unwrap(); if let Ok(query) = Query::parse(&query_str, None) {
let options = QueryOptions::default();
let with_opt = STORE.query_opt(query.clone(), options.clone()).unwrap();
let without_opt = STORE
.query_opt(query, options.without_optimizations())
.unwrap();
match (with_opt, without_opt) {
(QueryResults::Solutions(with_opt), QueryResults::Solutions(without_opt)) => {
assert_eq!(
query_solutions_key(with_opt, query_str.contains(" REDUCED ")),
query_solutions_key(without_opt, query_str.contains(" REDUCED "))
)
}
(QueryResults::Graph(_), QueryResults::Graph(_)) => unimplemented!(),
(QueryResults::Boolean(with_opt), QueryResults::Boolean(without_opt)) => {
assert_eq!(with_opt, without_opt)
}
_ => panic!("Different query result types"),
}
} }
}); });
fn query_solutions_key(iter: QuerySolutionIter, is_reduced: bool) -> String {
// TODO: ordering
let mut b = iter
.into_iter()
.map(|t| {
let mut b = t
.unwrap()
.iter()
.map(|(var, val)| format!("{}: {}", var, val))
.collect::<Vec<_>>();
b.sort_unstable();
b.join(" ")
})
.collect::<Vec<_>>();
b.sort_unstable();
if is_reduced {
b.dedup();
}
b.join("\n")
}

Loading…
Cancel
Save