/
NikolayIvkin
/
sqlancer2
Обзор
Документация
Войти
/
NikolayIvkin
/
sqlancer2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/sqlancer/duckdb/test/DuckDBQueryPartitioningBase.java
82 строки
3 KB
Kok Rui
Add canonicalization rule for DuckDB results
23 апр 2022, 03:39
23 апр 2022, 03:39
4a5724e
Код
Авторство
О чём код?
package sqlancer.duckdb.test; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import sqlancer.Randomly; import sqlancer.common.ast.newast.ColumnReferenceNode; import sqlancer.common.ast.newast.Node; import sqlancer.common.ast.newast.TableReferenceNode; import sqlancer.common.gen.ExpressionGenerator; import sqlancer.common.oracle.TernaryLogicPartitioningOracleBase; import sqlancer.common.oracle.TestOracle; import sqlancer.duckdb.DuckDBErrors; import sqlancer.duckdb.DuckDBProvider.DuckDBGlobalState; import sqlancer.duckdb.DuckDBSchema; import sqlancer.duckdb.DuckDBSchema.DuckDBColumn; import sqlancer.duckdb.DuckDBSchema.DuckDBTable; import sqlancer.duckdb.DuckDBSchema.DuckDBTables; import sqlancer.duckdb.ast.DuckDBExpression; import sqlancer.duckdb.ast.DuckDBJoin; import sqlancer.duckdb.ast.DuckDBSelect; import sqlancer.duckdb.gen.DuckDBExpressionGenerator; public class DuckDBQueryPartitioningBase extends TernaryLogicPartitioningOracleBase<Node<DuckDBExpression>, DuckDBGlobalState> implements TestOracle { DuckDBSchema s; DuckDBTables targetTables; DuckDBExpressionGenerator gen; DuckDBSelect select; public DuckDBQueryPartitioningBase(DuckDBGlobalState state) { super(state); DuckDBErrors.addExpressionErrors(errors); } public static String canonicalizeResultValue(String value) { // Rule: -0.0 should be canonicalized to 0.0 if (Objects.equals(value, "-0.0")) { return "0.0"; } return value; } @Override public void check() throws SQLException { s = state.getSchema(); targetTables = s.getRandomTableNonEmptyTables(); gen = new DuckDBExpressionGenerator(state).setColumns(targetTables.getColumns()); initializeTernaryPredicateVariants(); select = new DuckDBSelect(); select.setFetchColumns(generateFetchColumns()); List<DuckDBTable> tables = targetTables.getTables(); List<TableReferenceNode<DuckDBExpression, DuckDBTable>> tableList = tables.stream() .map(t -> new TableReferenceNode<DuckDBExpression, DuckDBTable>(t)).collect(Collectors.toList()); List<Node<DuckDBExpression>> joins = DuckDBJoin.getJoins(tableList, state); select.setJoinList(joins.stream().collect(Collectors.toList())); select.setFromList(tableList.stream().collect(Collectors.toList())); select.setWhereClause(null); } List<Node<DuckDBExpression>> generateFetchColumns() { List<Node<DuckDBExpression>> columns = new ArrayList<>(); if (Randomly.getBoolean()) { columns.add(new ColumnReferenceNode<>(new DuckDBColumn("*", null, false, false))); } else { columns = Randomly.nonEmptySubset(targetTables.getColumns()).stream() .map(c -> new ColumnReferenceNode<DuckDBExpression, DuckDBColumn>(c)).collect(Collectors.toList()); } return columns; } @Override protected ExpressionGenerator<Node<DuckDBExpression>> getGen() { return gen; } }