diff --git a/simulator/generation/query.rs b/simulator/generation/query.rs
index fa02858bf..541821f19 100644
--- a/simulator/generation/query.rs
+++ b/simulator/generation/query.rs
@@ -25,7 +25,12 @@ impl Arbitrary for Create {
impl ArbitraryFrom<&Vec
> for FromClause {
fn arbitrary_from(rng: &mut R, tables: &Vec) -> Self {
- let query_size = (rng.gen_range(0.0..=15.0_f32).log2().ceil() as usize).saturating_sub(2);
+ let num_joins = match rng.gen_range(0..=100) {
+ 0..=80 => 0,
+ 81..=95 => 1,
+ 96..=100 => 2,
+ _ => unreachable!(),
+ };
let mut tables = tables.clone();
let mut table = pick(&tables, rng).clone();
@@ -34,7 +39,7 @@ impl ArbitraryFrom<&Vec> for FromClause {
let name = table.name.clone();
- let joins: Vec<_> = (0..query_size)
+ let joins: Vec<_> = (0..num_joins)
.filter_map(|_| {
if tables.is_empty() {
return None;
@@ -172,22 +177,25 @@ impl ArbitraryFrom<&SimulatorEnv> for SelectFree {
impl ArbitraryFrom<&SimulatorEnv> for Select {
fn arbitrary_from(rng: &mut R, env: &SimulatorEnv) -> Self {
- let query_size = (rng.gen_range(0.0..=15.0_f32).log2().ceil() as usize).saturating_sub(2);
-
let table = pick(&env.tables, rng);
// Generate a number of selects based on the query size
// If experimental indexes are enabled, we can have selects with compounds
// Otherwise, we just have a single select with no compounds
- let num_selects = if env.opts.experimental_indexes {
- rng.gen_range(0..=query_size)
+ let num_compound_selects = if env.opts.experimental_indexes {
+ match rng.gen_range(0..=100) {
+ 0..=90 => 0,
+ 91..=97 => 1,
+ 98..=100 => 2,
+ _ => unreachable!(),
+ }
} else {
0
};
let first = SelectInner::arbitrary_from(rng, env);
- let rest: Vec = (0..num_selects)
+ let rest: Vec = (0..num_compound_selects)
.map(|_| {
let mut select = first.clone();
select.where_clause = Predicate::arbitrary_from(rng, table);