Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/sqlancer/common/gen/AbstractIndexGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package sqlancer.common.gen;

import java.util.List;

import sqlancer.Randomly;
import sqlancer.common.schema.AbstractTableColumn;

public abstract class AbstractIndexGenerator<C extends AbstractTableColumn<?, ?>> extends AbstractGenerator {

protected void appendCreateIndex(boolean unique) {
sb.append("CREATE ");
if (unique) {
sb.append("UNIQUE ");
}
sb.append("INDEX ");
}

protected void appendIndexColumnList(List<C> columns, boolean allowOrdering) {
sb.append("(");
for (int i = 0; i < columns.size(); i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(columns.get(i).getName());
if (allowOrdering && Randomly.getBoolean()) {
sb.append(" ");
sb.append(Randomly.fromOptions("ASC", "DESC"));
}
}
sb.append(")");
}

}
31 changes: 17 additions & 14 deletions src/sqlancer/doris/gen/DorisIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,45 @@

import sqlancer.IgnoreMeException;
import sqlancer.Randomly;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.doris.DorisProvider.DorisGlobalState;
import sqlancer.doris.DorisSchema.DorisColumn;
import sqlancer.doris.DorisSchema.DorisTable;

public final class DorisIndexGenerator {
public class DorisIndexGenerator extends AbstractIndexGenerator<DorisColumn> {

private DorisIndexGenerator() {
private final DorisGlobalState globalState;

public DorisIndexGenerator(DorisGlobalState globalState) {
this.globalState = globalState;
this.canAffectSchema = true;
}

public static SQLQueryAdapter getQuery(DorisGlobalState globalState) throws SQLException {
if (globalState.getSchema().getIndexCount() > globalState.getDbmsSpecificOptions().maxNumIndexes) {
throw new IgnoreMeException();
}
ExpectedErrors errors = new ExpectedErrors();
return new DorisIndexGenerator(globalState).getStatement();
}

@Override
public void buildStatement() {
DorisTable randomTable = globalState.getSchema().getRandomTable(t -> !t.isView());
String indexName = globalState.getSchema().getFreeIndexName();
StringBuilder sb = new StringBuilder("CREATE ");
sb.append("INDEX ");
appendCreateIndex(false);
if (Randomly.getBoolean()) {
sb.append("IF NOT EXISTS ");
}
sb.append(indexName);
sb.append(globalState.getSchema().getFreeIndexName());
sb.append(" ON ");
sb.append(randomTable.getName());
sb.append("(");
int nr = 1; // Doris Only support CREATE_INDEX on single column and index type is BITMAP;
List<DorisColumn> subset = Randomly.extractNrRandomColumns(randomTable.getColumns(), nr);
sb.append(subset.get(0).getName());
sb.append(") ");
// Doris only supports CREATE INDEX on a single column; index type is BITMAP
List<DorisColumn> subset = Randomly.extractNrRandomColumns(randomTable.getColumns(), 1);
appendIndexColumnList(subset, false);
sb.append(" ");
if (Randomly.getBoolean()) {
sb.append("USING BITMAP ");
}
return new SQLQueryAdapter(sb.toString(), errors, true);
}

}
25 changes: 15 additions & 10 deletions src/sqlancer/duckdb/gen/DuckDBIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,32 @@
import java.util.List;

import sqlancer.Randomly;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.duckdb.DuckDBProvider.DuckDBGlobalState;
import sqlancer.duckdb.DuckDBSchema.DuckDBColumn;
import sqlancer.duckdb.DuckDBSchema.DuckDBTable;

public final class DuckDBIndexGenerator {
public class DuckDBIndexGenerator extends AbstractIndexGenerator<DuckDBColumn> {

private DuckDBIndexGenerator() {
private final DuckDBGlobalState globalState;

public DuckDBIndexGenerator(DuckDBGlobalState globalState) {
this.globalState = globalState;
this.canAffectSchema = true;
}

public static SQLQueryAdapter getQuery(DuckDBGlobalState globalState) {
ExpectedErrors errors = new ExpectedErrors();
StringBuilder sb = new StringBuilder();
sb.append("CREATE ");
if (Randomly.getBoolean()) {
return new DuckDBIndexGenerator(globalState).getStatement();
}

@Override
public void buildStatement() {
boolean unique = Randomly.getBoolean();
if (unique) {
errors.add("Data contains duplicates on indexed column(s)");
sb.append("UNIQUE ");
}
sb.append("INDEX ");
appendCreateIndex(unique);
sb.append(globalState.getSchema().getFreeIndexName());
sb.append(" ON ");
DuckDBTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
Expand All @@ -43,7 +49,6 @@ public static SQLQueryAdapter getQuery(DuckDBGlobalState globalState) {
if (globalState.getDbmsSpecificOptions().testRowid) {
errors.add("cannot create an index on the rowid");
}
return new SQLQueryAdapter(sb.toString(), errors, true);
}

}
48 changes: 17 additions & 31 deletions src/sqlancer/mariadb/gen/MariaDBIndexGenerator.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,36 @@
package sqlancer.mariadb.gen;

import java.util.List;

import sqlancer.Randomly;
import sqlancer.common.DBMSCommon;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.mariadb.MariaDBSchema;
import sqlancer.mariadb.MariaDBSchema.MariaDBColumn;
import sqlancer.mariadb.MariaDBSchema.MariaDBTable;

public final class MariaDBIndexGenerator {
public class MariaDBIndexGenerator extends AbstractIndexGenerator<MariaDBColumn> {

private final MariaDBSchema schema;

private MariaDBIndexGenerator() {
public MariaDBIndexGenerator(MariaDBSchema schema) {
this.schema = schema;
this.canAffectSchema = true;
}

public static SQLQueryAdapter generate(MariaDBSchema s) {
ExpectedErrors errors = new ExpectedErrors();
StringBuilder sb = new StringBuilder("CREATE ");
return new MariaDBIndexGenerator(s).getStatement();
}

@Override
public void buildStatement() {
errors.add("Key/Index cannot be defined on a virtual generated column");
errors.add("Specified key was too long");
if (Randomly.getBoolean()) {
boolean unique = Randomly.getBoolean();
if (unique) {
errors.add("Duplicate entry");
errors.add("Key/Index cannot be defined on a virtual generated column");
sb.append("UNIQUE ");
}
sb.append("INDEX ");
appendCreateIndex(unique);
sb.append("i");
sb.append(DBMSCommon.createColumnName(Randomly.smallNumber()));
if (Randomly.getBoolean()) {
Expand All @@ -34,28 +39,9 @@ public static SQLQueryAdapter generate(MariaDBSchema s) {
}

sb.append(" ON ");
MariaDBTable randomTable = s.getRandomTable();
MariaDBTable randomTable = schema.getRandomTable();
sb.append(randomTable.getName());
sb.append("(");
List<MariaDBColumn> columns = Randomly.nonEmptySubset(randomTable.getColumns());
for (int i = 0; i < columns.size(); i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(columns.get(i).getName());
if (Randomly.getBoolean()) {
sb.append(" ");
sb.append(Randomly.fromOptions("ASC", "DESC"));
}
}
sb.append(")");
// if (Randomly.getBoolean()) {
// sb.append(" ALGORITHM=");
// sb.append(Randomly.fromOptions("DEFAULT", "INPLACE", "COPY", "NOCOPY", "INSTANT"));
// errors.add("is not supported for this operation");
// }

return new SQLQueryAdapter(sb.toString(), errors, true);
appendIndexColumnList(Randomly.nonEmptySubset(randomTable.getColumns()), true);
}

}
24 changes: 14 additions & 10 deletions src/sqlancer/materialize/gen/MaterializeIndexGenerator.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
package sqlancer.materialize.gen;

import sqlancer.Randomly;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.materialize.MaterializeGlobalState;
import sqlancer.materialize.MaterializeSchema.MaterializeColumn;
import sqlancer.materialize.MaterializeSchema.MaterializeTable;

public final class MaterializeIndexGenerator {
public class MaterializeIndexGenerator extends AbstractIndexGenerator<MaterializeColumn> {

private MaterializeIndexGenerator() {
private final MaterializeGlobalState globalState;

public MaterializeIndexGenerator(MaterializeGlobalState globalState) {
this.globalState = globalState;
}

public enum IndexType {
BTREE, HASH, GIST, GIN
}

public static SQLQueryAdapter generate(MaterializeGlobalState globalState) {
ExpectedErrors errors = new ExpectedErrors();
StringBuilder sb = new StringBuilder();
sb.append("CREATE");
sb.append(" INDEX ");
return new MaterializeIndexGenerator(globalState).getStatement();
}

@Override
public void buildStatement() {
appendCreateIndex(false);
MaterializeTable randomTable = globalState.getSchema().getRandomTable(t -> !t.isView()); // TODO: materialized
// views
sb.append(MaterializeCommon.getFreeIndexName(globalState.getSchema()));
sb.append(" ON ");
sb.append(randomTable.getName());
IndexType method;
method = IndexType.BTREE;
IndexType method = IndexType.BTREE;

sb.append("(");
if (method == IndexType.HASH) {
Expand Down Expand Up @@ -75,6 +80,5 @@ public static SQLQueryAdapter generate(MaterializeGlobalState globalState) {
errors.add("result of range difference would not be contiguous");
errors.add("which is part of the partition key");
MaterializeCommon.addCommonExpressionErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}
}
23 changes: 12 additions & 11 deletions src/sqlancer/postgres/gen/PostgresIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import sqlancer.Randomly;
import sqlancer.common.DBMSCommon;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.postgres.PostgresGlobalState;
import sqlancer.postgres.PostgresSchema.PostgresColumn;
Expand All @@ -15,23 +15,25 @@
import sqlancer.postgres.PostgresVisitor;
import sqlancer.postgres.ast.PostgresExpression;

public final class PostgresIndexGenerator {
public class PostgresIndexGenerator extends AbstractIndexGenerator<PostgresColumn> {

private PostgresIndexGenerator() {
private final PostgresGlobalState globalState;

public PostgresIndexGenerator(PostgresGlobalState globalState) {
this.globalState = globalState;
}

public enum IndexType {
BTREE, HASH, GIST, GIN
}

public static SQLQueryAdapter generate(PostgresGlobalState globalState) {
ExpectedErrors errors = new ExpectedErrors();
StringBuilder sb = new StringBuilder();
sb.append("CREATE");
if (Randomly.getBoolean()) {
sb.append(" UNIQUE");
}
sb.append(" INDEX ");
return new PostgresIndexGenerator(globalState).getStatement();
}

@Override
public void buildStatement() {
appendCreateIndex(Randomly.getBoolean());
/*
* Commented out as a workaround for https://www.postgresql.org/message-id/CA%2Bu7OA4XYhc-
* qyCgJqwwgMGZDWAyeH821oa5oMzm_HEifZ4BeA%40mail.gmail.com
Expand Down Expand Up @@ -136,7 +138,6 @@ public static SQLQueryAdapter generate(PostgresGlobalState globalState) {
errors.add("result of range difference would not be contiguous");
errors.add("which is part of the partition key");
PostgresCommon.addCommonExpressionErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}

private static String getNewIndexName(PostgresTable randomTable) {
Expand Down
26 changes: 16 additions & 10 deletions src/sqlancer/presto/gen/PrestoIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.List;

import sqlancer.Randomly;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.gen.AbstractIndexGenerator;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.presto.PrestoGlobalState;
import sqlancer.presto.PrestoSchema;
Expand All @@ -12,20 +12,27 @@
import sqlancer.presto.PrestoToStringVisitor;
import sqlancer.presto.ast.PrestoExpression;

public final class PrestoIndexGenerator {
public class PrestoIndexGenerator extends AbstractIndexGenerator<PrestoColumn> {

private PrestoIndexGenerator() {
private final PrestoGlobalState globalState;

public PrestoIndexGenerator(PrestoGlobalState globalState) {
this.globalState = globalState;
this.canAffectSchema = true;
this.canonicalizeString = false;
}

public static SQLQueryAdapter getQuery(PrestoGlobalState globalState) {
ExpectedErrors errors = new ExpectedErrors();
StringBuilder sb = new StringBuilder();
sb.append("CREATE ");
if (Randomly.getBoolean()) {
return new PrestoIndexGenerator(globalState).getStatement();
}

@Override
public void buildStatement() {
boolean unique = Randomly.getBoolean();
if (unique) {
errors.add("Cant create unique index, table contains duplicate data on indexed column(s)");
sb.append("UNIQUE ");
}
sb.append("INDEX ");
appendCreateIndex(unique);
sb.append(Randomly.fromOptions("i0", "i1", "i2", "i3", "i4")); // cannot query this information
sb.append(" ON ");
PrestoTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
Expand All @@ -50,7 +57,6 @@ public static SQLQueryAdapter getQuery(PrestoGlobalState globalState) {
sb.append(PrestoToStringVisitor.asString(expr));
}
errors.add("already exists!");
return new SQLQueryAdapter(sb.toString(), errors, true, false);
}

}
Loading
Loading