use criterion::{black_box, criterion_group, criterion_main, Criterion};
use sqlformat::*;
fn simple_query(c: &mut Criterion) {
let input = "SELECT * FROM my_table WHERE id = 1";
c.bench_function("simple query", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::None),
black_box(&FormatOptions::default()),
)
})
});
}
fn complex_query(c: &mut Criterion) {
let input = "SELECT t1.id, t1.name, t1.title, t1.description, t2.mothers_maiden_name, t2.first_girlfriend\nFROM my_table t1 LEFT JOIN other_table t2 ON t1.id = t2.other_id WHERE t2.order BETWEEN 17 AND 30";
c.bench_function("complex query", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::None),
black_box(&FormatOptions::default()),
)
})
});
}
fn query_with_named_params(c: &mut Criterion) {
let input = "SELECT * FROM my_table WHERE id = :first OR id = :second OR id = :third";
let params = vec![
("first".to_string(), "1".to_string()),
("second".to_string(), "2".to_string()),
("third".to_string(), "3".to_string()),
];
c.bench_function("named params", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::Named(params.clone())),
black_box(&FormatOptions::default()),
)
})
});
}
fn query_with_explicit_indexed_params(c: &mut Criterion) {
let input = "SELECT * FROM my_table WHERE id = ?1 OR id = ?2 OR id = ?0";
let params = vec!["0".to_string(), "1".to_string(), "2".to_string()];
c.bench_function("explicit indexed params", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::Indexed(params.clone())),
black_box(&FormatOptions::default()),
)
})
});
}
fn query_with_implicit_indexed_params(c: &mut Criterion) {
let input = "SELECT * FROM my_table WHERE id = ? OR id = ? OR id = ?";
let params = vec!["0".to_string(), "1".to_string(), "2".to_string()];
c.bench_function("implicit indexed params", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::Indexed(params.clone())),
black_box(&FormatOptions::default()),
)
})
});
}
fn issue_633(c: &mut Criterion) {
const SIZE: usize = 1000;
pub struct UserData {
pub first_name: String,
pub last_name: String,
pub address: String,
pub email: String,
pub phone: String,
}
fn sample() -> UserData {
UserData {
first_name: "FIRST_NAME".to_string(),
last_name: "LAST_NAME".to_string(),
address: "SOME_ADDRESS".to_string(),
email: "email@example.com".to_string(),
phone: "9999999999".to_string(),
}
}
fn to_insert_params(user_data: &UserData) -> String {
format!(
r#"('{}', '{}', '{}', '{}', '{}')"#,
user_data.first_name,
user_data.last_name,
user_data.address,
user_data.email,
user_data.phone,
)
}
static INSERT_QUERY: &str = "
INSERT INTO user_data
(first_name, last_name, address, phone, email)
VALUES
";
fn generate_insert_query() -> String {
let mut query_str = String::with_capacity(1_000_000);
query_str.push_str(INSERT_QUERY);
let mut is_first = true;
let sample_data = sample();
for _ in 0..SIZE {
if is_first {
is_first = false;
} else {
query_str.push(',');
}
let params = to_insert_params(&sample_data);
query_str.push_str(¶ms);
}
query_str.push(';');
query_str
}
let input = generate_insert_query();
c.bench_function("issue 633", |b| {
b.iter(|| {
format(
black_box(&input),
black_box(&QueryParams::None),
black_box(&FormatOptions::default()),
)
})
});
}
fn issue_633_2(c: &mut Criterion) {
let input = "SELECT\n d.uuid AS uuid,\n\td.name_of_document AS name,\n\td.slug_name AS slug,\n\td.default_contract_uuid AS default_contract_uuid,\n\ta.uuid AS parent_uuid,\n\ta.name_of_agreement AS agreement_name,\n\td.icon_name AS icon\nFROM `documents` d\nLEFT JOIN agreements a ON a.uuid = d.parent_uuid\n WHERE d.uuid = ? LIMIT 1";
let params = vec!["0".to_string()];
c.bench_function("issue 633 query 2", |b| {
b.iter(|| {
format(
black_box(input),
black_box(&QueryParams::Indexed(params.clone())),
black_box(&FormatOptions::default()),
)
})
});
}
fn issue_633_3(c: &mut Criterion) {
const SIZE: usize = 1000;
let mut input = String::with_capacity(100_000);
input.push_str("INSERT INTO test_table(a) values ");
let mut is_first = true;
for _ in 0..SIZE {
if is_first {
is_first = false;
} else {
input.push_str(", ");
}
input.push_str("(?)");
}
c.bench_function("issue 633 query 3", |b| {
b.iter(|| {
format(
black_box(&input),
black_box(&QueryParams::None),
black_box(&FormatOptions::default()),
)
})
});
}
criterion_group!(
benches,
simple_query,
complex_query,
query_with_named_params,
query_with_explicit_indexed_params,
query_with_implicit_indexed_params,
issue_633,
issue_633_2,
issue_633_3
);
criterion_main!(benches);