sqlancer.sqlite3.oracle.tlp.SQLite3TLPBase 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.sqlite3.oracle.tlp;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import sqlancer.Randomly;
import sqlancer.common.gen.ExpressionGenerator;
import sqlancer.common.oracle.TernaryLogicPartitioningOracleBase;
import sqlancer.common.oracle.TestOracle;
import sqlancer.sqlite3.SQLite3Errors;
import sqlancer.sqlite3.SQLite3GlobalState;
import sqlancer.sqlite3.ast.SQLite3Expression;
import sqlancer.sqlite3.ast.SQLite3Expression.Join;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3ColumnName;
import sqlancer.sqlite3.ast.SQLite3Select;
import sqlancer.sqlite3.gen.SQLite3Common;
import sqlancer.sqlite3.gen.SQLite3ExpressionGenerator;
import sqlancer.sqlite3.schema.SQLite3Schema;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Tables;
public class SQLite3TLPBase extends TernaryLogicPartitioningOracleBase
implements TestOracle {
SQLite3Schema s;
SQLite3Tables targetTables;
SQLite3ExpressionGenerator gen;
SQLite3Select select;
public SQLite3TLPBase(SQLite3GlobalState state) {
super(state);
SQLite3Errors.addExpectedExpressionErrors(errors);
SQLite3Errors.addQueryErrors(errors);
}
@Override
public void check() throws SQLException {
s = state.getSchema();
targetTables = s.getRandomTableNonEmptyTables();
gen = new SQLite3ExpressionGenerator(state).setColumns(targetTables.getColumns());
initializeTernaryPredicateVariants();
select = new SQLite3Select();
select.setFetchColumns(generateFetchColumns());
List tables = targetTables.getTables();
List joinStatements = gen.getRandomJoinClauses(tables);
List tableRefs = SQLite3Common.getTableRefs(tables, s);
select.setJoinClauses(joinStatements.stream().collect(Collectors.toList()));
select.setFromTables(tableRefs);
select.setWhereClause(null);
}
List generateFetchColumns() {
List columns = new ArrayList<>();
if (Randomly.getBoolean()) {
columns.add(new SQLite3ColumnName(SQLite3Column.createDummy("*"), null));
} else {
columns = Randomly.nonEmptySubset(targetTables.getColumns()).stream()
.map(c -> new SQLite3ColumnName(c, null)).collect(Collectors.toList());
}
return columns;
}
@Override
protected ExpressionGenerator getGen() {
return gen;
}
}