/
NikolayIvkin
/
sqlancer2
Обзор
Документация
Войти
/
NikolayIvkin
/
sqlancer2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/sqlancer/tidb/gen/TiDBRandomQuerySynthesizer.java
61 строка
2 KB
Patrick
Continuation of Reworking Connection to DB to support non-SQL connections
26 ноя 2020, 15:40
26 ноя 2020, 15:40
62e302e
Код
Авторство
О чём код?
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<TiDBExpression> columns = new ArrayList<>(); // TODO: also generate aggregates columns.addAll(gen.generateExpressions(nrColumns)); select.setFetchColumns(columns); List<TiDBExpression> 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; } }