sqlancer.tidb.gen.TiDBRandomQuerySynthesizer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sqlancer Show documentation
Show all versions of sqlancer Show documentation
SQLancer finds logic bugs in Database Management Systems through automatic testing
package sqlancer.tidb.gen;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import sqlancer.Randomly;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.tidb.TiDBExpressionGenerator;
import sqlancer.tidb.TiDBProvider.TiDBGlobalState;
import sqlancer.tidb.TiDBSchema.TiDBTables;
import sqlancer.tidb.ast.TiDBExpression;
import sqlancer.tidb.ast.TiDBSelect;
import sqlancer.tidb.ast.TiDBTableReference;
import sqlancer.tidb.visitor.TiDBVisitor;
public final class TiDBRandomQuerySynthesizer {
private TiDBRandomQuerySynthesizer() {
}
public static SQLQueryAdapter generate(TiDBGlobalState globalState, int nrColumns) {
TiDBSelect select = generateSelect(globalState, nrColumns);
return new SQLQueryAdapter(TiDBVisitor.asString(select));
}
public static TiDBSelect generateSelect(TiDBGlobalState globalState, int nrColumns) {
TiDBTables tables = globalState.getSchema().getRandomTableNonEmptyTables();
TiDBExpressionGenerator gen = new TiDBExpressionGenerator(globalState).setColumns(tables.getColumns());
TiDBSelect select = new TiDBSelect();
// select.setDistinct(Randomly.getBoolean());
List columns = new ArrayList<>();
// TODO: also generate aggregates
columns.addAll(gen.generateExpressions(nrColumns));
select.setFetchColumns(columns);
List tableList = tables.getTables().stream().map(t -> new TiDBTableReference(t))
.collect(Collectors.toList());
// TODO: generate joins
select.setFromList(tableList);
if (Randomly.getBoolean()) {
select.setWhereClause(gen.generateExpression());
}
if (Randomly.getBooleanWithRatherLowProbability()) {
select.setOrderByExpressions(gen.generateOrderBys());
}
if (Randomly.getBoolean()) {
select.setGroupByExpressions(gen.generateExpressions(Randomly.smallNumber() + 1));
if (Randomly.getBoolean()) {
select.setHavingClause(gen.generateHavingClause());
}
}
if (Randomly.getBoolean()) {
select.setLimitClause(gen.generateExpression());
}
if (Randomly.getBoolean()) {
select.setOffsetClause(gen.generateExpression());
}
return select;
}
}