Refactor: extract common INSERT generation logic into AbstractInsertG… by mrigger · Pull Request #1333 · sqlancer/sqlancer · GitHub
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
10 changes: 1 addition & 9 deletions src/sqlancer/clickhouse/gen/ClickHouseInsertGenerator.java
20 changes: 19 additions & 1 deletion src/sqlancer/common/gen/AbstractInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package sqlancer.common.gen;

import java.util.List;
import java.util.stream.Collectors;

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

public abstract class AbstractInsertGenerator<C> {
public abstract class AbstractInsertGenerator<C extends AbstractTableColumn<?, ?>> {

protected StringBuilder sb = new StringBuilder();
protected ExpectedErrors errors = new ExpectedErrors();

protected void appendColumnList(List<C> columns) {
sb.append("(");
sb.append(columns.stream().map(AbstractTableColumn::getName).collect(Collectors.joining(", ")));
sb.append(")");
}

protected void buildInsertInto(String tableName, List<C> columns) {
sb.append("INSERT INTO ");
sb.append(tableName);
appendColumnList(columns);
sb.append(" VALUES ");
insertColumns(columns);
}

protected void insertColumns(List<C> columns) {
for (int nrRows = 0; nrRows < Randomly.smallNumber() + 1; nrRows++) {
Expand Down
12 changes: 1 addition & 11 deletions src/sqlancer/databend/gen/DatabendInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package sqlancer.databend.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.common.schema.AbstractTableColumn;
import sqlancer.databend.DatabendErrors;
import sqlancer.databend.DatabendProvider.DatabendGlobalState;
import sqlancer.databend.DatabendSchema.DatabendColumn;
Expand All @@ -16,7 +13,6 @@
public class DatabendInsertGenerator extends AbstractInsertGenerator<DatabendColumn> {

private final DatabendGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();

public DatabendInsertGenerator(DatabendGlobalState globalState) {
this.globalState = globalState;
Expand All @@ -27,15 +23,9 @@ public static SQLQueryAdapter getQuery(DatabendGlobalState globalState) {
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
DatabendTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<DatabendColumn> columns = table.getRandomNonEmptyColumnSubset();
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(AbstractTableColumn::getName).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
buildInsertInto(table.getName(), columns);
DatabendErrors.addInsertErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}
Expand Down
15 changes: 1 addition & 14 deletions src/sqlancer/datafusion/gen/DataFusionInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sqlancer.datafusion.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.IgnoreMeException;
import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.datafusion.DataFusionProvider.DataFusionGlobalState;
import sqlancer.datafusion.DataFusionSchema.DataFusionColumn;
Expand All @@ -15,7 +13,6 @@
public class DataFusionInsertGenerator extends AbstractInsertGenerator<DataFusionColumn> {

private final DataFusionGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();

public DataFusionInsertGenerator(DataFusionGlobalState globalState) {
this.globalState = globalState;
Expand All @@ -26,21 +23,11 @@ public static SQLQueryAdapter getQuery(DataFusionGlobalState globalState, DataFu
}

private SQLQueryAdapter generate(DataFusionTable targetTable) {
// `sb` is a global `StringBuilder` for current insert query
sb.append("INSERT INTO ");

if (targetTable.getColumns().isEmpty()) {
throw new IgnoreMeException();
}
List<DataFusionColumn> columns = targetTable.getRandomNonEmptyColumnSubset();

sb.append(targetTable.getName());
sb.append("(");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns); // will finally call `insertValue()` to generate random value

buildInsertInto(targetTable.getName(), columns);
return new SQLQueryAdapter(sb.toString(), errors);
}

Expand Down
11 changes: 1 addition & 10 deletions src/sqlancer/doris/gen/DorisInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sqlancer.doris.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.Randomly;
import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.doris.DorisErrors;
import sqlancer.doris.DorisProvider.DorisGlobalState;
Expand All @@ -16,7 +14,6 @@
public class DorisInsertGenerator extends AbstractInsertGenerator<DorisColumn> {

private final DorisGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();

public DorisInsertGenerator(DorisGlobalState globalState) {
this.globalState = globalState;
Expand All @@ -27,15 +24,9 @@ public static SQLQueryAdapter getQuery(DorisGlobalState globalState) {
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
DorisTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<DorisColumn> columns = table.getRandomNonEmptyInsertColumns();
sb.append(table.getName());
sb.append(" (");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
buildInsertInto(table.getName(), columns);
DorisErrors.addInsertErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}
Expand Down
11 changes: 1 addition & 10 deletions src/sqlancer/duckdb/gen/DuckDBInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sqlancer.duckdb.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.Randomly;
import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.duckdb.DuckDBErrors;
import sqlancer.duckdb.DuckDBProvider.DuckDBGlobalState;
Expand All @@ -16,7 +14,6 @@
public class DuckDBInsertGenerator extends AbstractInsertGenerator<DuckDBColumn> {

private final DuckDBGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();

public DuckDBInsertGenerator(DuckDBGlobalState globalState) {
this.globalState = globalState;
Expand All @@ -27,15 +24,9 @@ public static SQLQueryAdapter getQuery(DuckDBGlobalState globalState) {
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
DuckDBTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<DuckDBColumn> columns = table.getRandomNonEmptyColumnSubsetFilter(p -> !p.getName().equals("rowid"));
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
buildInsertInto(table.getName(), columns);
DuckDBErrors.addInsertErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}
Expand Down
6 changes: 1 addition & 5 deletions src/sqlancer/h2/H2InsertGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import sqlancer.Randomly;
import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.h2.H2Provider.H2GlobalState;
import sqlancer.h2.H2Schema.H2Column;
Expand All @@ -14,7 +13,6 @@
public class H2InsertGenerator extends AbstractInsertGenerator<H2Column> {

private final H2GlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();
private final H2ExpressionGenerator gen;

public H2InsertGenerator(H2GlobalState globalState) {
Expand All @@ -39,9 +37,7 @@ private SQLQueryAdapter generate() {
H2Table table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<H2Column> columns = table.getRandomNonEmptyColumnSubset();
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
appendColumnList(columns);
if (mergeInto && Randomly.getBoolean()) {
sb.append(" KEY(");
sb.append(table.getRandomNonEmptyColumnSubset().stream().map(c -> c.getName())
Expand Down
2 changes: 0 additions & 2 deletions src/sqlancer/hive/gen/HiveInsertGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.util.List;

import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.hive.HiveErrors;
import sqlancer.hive.HiveGlobalState;
Expand All @@ -14,7 +13,6 @@
public class HiveInsertGenerator extends AbstractInsertGenerator<HiveColumn> {

private final HiveGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();
private final HiveExpressionGenerator gen;

public HiveInsertGenerator(HiveGlobalState globalState) {
Expand Down
12 changes: 1 addition & 11 deletions src/sqlancer/hsqldb/gen/HSQLDBInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package sqlancer.hsqldb.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.hsqldb.HSQLDBProvider;
import sqlancer.hsqldb.HSQLDBSchema;
Expand All @@ -14,7 +12,6 @@
public class HSQLDBInsertGenerator extends AbstractInsertGenerator<HSQLDBSchema.HSQLDBColumn> {

private final HSQLDBProvider.HSQLDBGlobalState globalState;
private final ExpectedErrors errors = new ExpectedErrors();

public HSQLDBInsertGenerator(HSQLDBProvider.HSQLDBGlobalState globalState) {
this.globalState = globalState;
Expand All @@ -25,16 +22,9 @@ public static SQLQueryAdapter getQuery(HSQLDBProvider.HSQLDBGlobalState globalSt
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
HSQLDBSchema.HSQLDBTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<HSQLDBSchema.HSQLDBColumn> columns = table.getRandomNonEmptyColumnSubset();
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
// HSQLDBErrors.addInsertErrors(errors);
buildInsertInto(table.getName(), columns);
return new SQLQueryAdapter(sb.toString(), errors);
}

Expand Down
11 changes: 1 addition & 10 deletions src/sqlancer/presto/gen/PrestoInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package sqlancer.presto.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.presto.PrestoErrors;
import sqlancer.presto.PrestoGlobalState;
Expand All @@ -26,16 +24,9 @@ public static SQLQueryAdapter getQuery(PrestoGlobalState globalState) {
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
PrestoTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
List<PrestoColumn> columns = table.getRandomNonEmptyColumnSubset();
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(c -> c.getName()).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
ExpectedErrors errors = new ExpectedErrors();
buildInsertInto(table.getName(), columns);
PrestoErrors.addInsertErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors, false, false);
}
Expand Down
13 changes: 1 addition & 12 deletions src/sqlancer/questdb/gen/QuestDBInsertGenerator.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package sqlancer.questdb.gen;

import java.util.List;
import java.util.stream.Collectors;

import sqlancer.common.gen.AbstractInsertGenerator;
import sqlancer.common.query.ExpectedErrors;
import sqlancer.common.query.SQLQueryAdapter;
import sqlancer.common.schema.AbstractTableColumn;
import sqlancer.questdb.QuestDBErrors;
import sqlancer.questdb.QuestDBProvider.QuestDBGlobalState;
import sqlancer.questdb.QuestDBSchema.QuestDBColumn;
Expand All @@ -17,22 +14,14 @@ public class QuestDBInsertGenerator extends AbstractInsertGenerator<QuestDBColum

private final QuestDBGlobalState globalState;

private final ExpectedErrors errors = new ExpectedErrors();

public QuestDBInsertGenerator(QuestDBGlobalState globalState) {
this.globalState = globalState;
}

private SQLQueryAdapter generate() {
sb.append("INSERT INTO ");
QuestDBTable table = globalState.getSchema().getRandomTable();
List<QuestDBColumn> columns = table.getRandomNonEmptyColumnSubset();
sb.append(table.getName());
sb.append("(");
sb.append(columns.stream().map(AbstractTableColumn::getName).collect(Collectors.joining(", ")));
sb.append(")");
sb.append(" VALUES ");
insertColumns(columns);
buildInsertInto(table.getName(), columns);
QuestDBErrors.addInsertErrors(errors);
return new SQLQueryAdapter(sb.toString(), errors);
}
Expand Down
2 changes: 0 additions & 2 deletions src/sqlancer/spark/gen/SparkInsertGenerator.java
Loading
Loading