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
6 changes: 2 additions & 4 deletions src/sqlancer/cockroachdb/gen/CockroachDBDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,10 @@ public static SQLQueryAdapter delete(CockroachDBGlobalState globalState) {
@Override
public void buildStatement() {
CockroachDBTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
sb.append("DELETE FROM ");
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
CockroachDBErrors.addExpressionErrors(errors);
sb.append(CockroachDBVisitor.asString(new CockroachDBExpressionGenerator(globalState)
appendWhereClause(CockroachDBVisitor.asString(new CockroachDBExpressionGenerator(globalState)
.setColumns(table.getColumns()).generateExpression(CockroachDBDataType.BOOL.get())));
} else {
errors.add("rejected: DELETE without WHERE clause (sql_safe_updates = true)");
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/cockroachdb/gen/CockroachDBUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ public void buildStatement() {
sb.append(" SET ");
updateColumns(columns);
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(CockroachDBVisitor.asString(gen.generateExpression(CockroachDBDataType.BOOL.get())));
appendWhereClause(CockroachDBVisitor.asString(gen.generateExpression(CockroachDBDataType.BOOL.get())));
}
errors.add("violates unique constraint");
errors.add("violates not-null constraint");
Expand Down
50 changes: 50 additions & 0 deletions src/sqlancer/common/gen/AbstractDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,54 @@ public abstract class AbstractDeleteGenerator extends AbstractGenerator {
protected AbstractDeleteGenerator() {
}

/**
* Appends {@code DELETE FROM <tableName>}.
*
* @param tableName
* the name of the table to delete from.
*/
protected void appendDeleteFromTable(String tableName) {
appendDeleteFromTable(tableName, false);
}

/**
* Appends {@code DELETE FROM [ONLY ]<tableName>}.
*
* @param tableName
* the name of the table to delete from.
* @param only
* whether to emit the {@code ONLY} keyword (used by some databases to restrict deletion to the named
* table rather than its inheritance descendants).
*/
protected void appendDeleteFromTable(String tableName, boolean only) {
sb.append("DELETE FROM ");
if (only) {
sb.append("ONLY ");
}
sb.append(tableName);
}

/**
* Appends {@code LIMIT <value>} (with a leading space).
*
* @param value
* the LIMIT value, e.g. an integer literal or already-rendered expression. Converted via
* {@link StringBuilder#append(Object)}.
*/
protected void appendLimitClause(Object value) {
sb.append(" LIMIT ");
sb.append(value);
}

/**
* Appends {@code RETURNING <expression>} (with a leading space).
*
* @param expression
* the rendered RETURNING expression.
*/
protected void appendReturningClause(String expression) {
sb.append(" RETURNING ");
sb.append(expression);
}

}
13 changes: 13 additions & 0 deletions src/sqlancer/common/gen/AbstractGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,17 @@ public SQLQueryAdapter getStatement() {

public abstract void buildStatement();

/**
* Appends {@code WHERE <condition>} (with a leading space). Subclasses are responsible for deciding whether to
* include the WHERE clause, typically based on a randomized boolean. Used by DELETE, UPDATE, partial-INDEX, and
* INSERT...ON CONFLICT generators.
*
* @param condition
* the rendered WHERE condition.
*/
protected void appendWhereClause(String condition) {
sb.append(" WHERE ");
sb.append(condition);
}

}
6 changes: 2 additions & 4 deletions src/sqlancer/databend/gen/DatabendDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ public static SQLQueryAdapter generate(DatabendGlobalState globalState) {

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
sb.append(globalState.getSchema().getRandomTable(t -> !t.isView()).getName());
appendDeleteFromTable(globalState.getSchema().getRandomTable(t -> !t.isView()).getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(DatabendToStringVisitor.asString(
appendWhereClause(DatabendToStringVisitor.asString(
new DatabendNewExpressionGenerator(globalState).generateExpression(DatabendDataType.BOOLEAN)));
DatabendErrors.addExpressionErrors(errors);
}
Expand Down
6 changes: 2 additions & 4 deletions src/sqlancer/doris/gen/DorisDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ public static SQLQueryAdapter generate(DorisGlobalState globalState) {

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
DorisTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(DorisToStringVisitor.asString(new DorisNewExpressionGenerator(globalState)
appendWhereClause(DorisToStringVisitor.asString(new DorisNewExpressionGenerator(globalState)
.setColumns(table.getColumns()).generateExpression(DorisSchema.DorisDataType.BOOLEAN)));
DorisErrors.addExpressionErrors(errors);
}
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/doris/gen/DorisUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ public void buildStatement() {
sb.append(table.getName());
sb.append(" SET ");
updateColumns(columns);
sb.append(" WHERE ");
sb.append(DorisToStringVisitor.asString(gen.generateExpression(DorisSchema.DorisDataType.BOOLEAN)));
appendWhereClause(DorisToStringVisitor.asString(gen.generateExpression(DorisSchema.DorisDataType.BOOLEAN)));
DorisErrors.addInsertErrors(errors);
}

Expand Down
6 changes: 2 additions & 4 deletions src/sqlancer/duckdb/gen/DuckDBDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,10 @@ public static SQLQueryAdapter generate(DuckDBGlobalState globalState) {

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
DuckDBTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(DuckDBToStringVisitor.asString(
appendWhereClause(DuckDBToStringVisitor.asString(
new DuckDBExpressionGenerator(globalState).setColumns(table.getColumns()).generateExpression()));
}
DuckDBErrors.addExpressionErrors(errors);
Expand Down
9 changes: 3 additions & 6 deletions src/sqlancer/h2/H2DeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,14 @@ public static SQLQueryAdapter getQuery(H2GlobalState globalState) {

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
H2Table table = globalState.getSchema().getRandomTable(t -> !t.isView());
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(H2ToStringVisitor.asString(
appendWhereClause(H2ToStringVisitor.asString(
new H2ExpressionGenerator(globalState).setColumns(table.getColumns()).generateExpression()));
}
if (Randomly.getBoolean()) {
sb.append(" LIMIT ");
sb.append(H2ToStringVisitor.asString(new H2ExpressionGenerator(globalState).generateConstant()));
appendLimitClause(H2ToStringVisitor.asString(new H2ExpressionGenerator(globalState).generateConstant()));
}
H2Errors.addExpressionErrors(errors);
H2Errors.addDeleteErrors(errors);
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/h2/H2UpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ public void buildStatement() {
H2Errors.addInsertErrors(errors);
H2Errors.addDeleteErrors(errors);
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(H2ToStringVisitor.asString(gen.generateExpression()));
appendWhereClause(H2ToStringVisitor.asString(gen.generateExpression()));
}
H2Errors.addExpressionErrors(errors);
}
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/hsqldb/gen/HSQLDBUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ public void buildStatement() {
sb.append(" SET ");
updateColumns(columns);
if (Randomly.getBooleanWithSmallProbability()) {
sb.append(" WHERE ");
sb.append(HSQLDBToStringVisitor.asString(
appendWhereClause(HSQLDBToStringVisitor.asString(
gen.generateExpression(HSQLDBCompositeDataType.getRandomWithType(HSQLDBDataType.BOOLEAN))));
errors.add("data type of expression is not boolean");
HSQLDBErrors.addExpressionErrors(errors);
Expand Down
17 changes: 9 additions & 8 deletions src/sqlancer/mariadb/gen/MariaDBDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,13 @@ public void buildStatement() {
sb.append(table.getName());

if (Randomly.getBoolean()) {
sb.append(" WHERE ");
String condition;
if (Randomly.getBooleanWithRatherLowProbability()) {
sb.append(MariaDBVisitor.asString(MariaDBExpressionGenerator.getRandomConstant(r)));
condition = MariaDBVisitor.asString(MariaDBExpressionGenerator.getRandomConstant(r));
} else {
sb.append(MariaDBVisitor.asString(expressionGenerator.getRandomExpression()));
condition = MariaDBVisitor.asString(expressionGenerator.getRandomExpression());
}
appendWhereClause(condition);
}

// ORDER BY + LIMIT
Expand All @@ -75,18 +76,18 @@ public void buildStatement() {
}

if (Randomly.getBooleanWithRatherLowProbability()) {
sb.append(" LIMIT ");
sb.append(Randomly.getNotCachedInteger(1, 10));
appendLimitClause(Randomly.getNotCachedInteger(1, 10));
}

// RETURNING clause (MariaDB >= 10.5)
if (Randomly.getBooleanWithRatherLowProbability()) {
sb.append(" RETURNING ");
String expression;
if (Randomly.getBooleanWithRatherLowProbability()) {
sb.append(MariaDBVisitor.asString(MariaDBExpressionGenerator.getRandomConstant(r)));
expression = MariaDBVisitor.asString(MariaDBExpressionGenerator.getRandomConstant(r));
} else {
sb.append(MariaDBVisitor.asString(expressionGenerator.getRandomExpression()));
expression = MariaDBVisitor.asString(expressionGenerator.getRandomExpression());
}
appendReturningClause(expression);
}

if (sb.toString().contains("RLIKE") || sb.toString().contains("REGEXP")) {
Expand Down
7 changes: 2 additions & 5 deletions src/sqlancer/materialize/gen/MaterializeDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,9 @@ public void buildStatement() {
errors.add("violates foreign key constraint");
errors.add("violates not-null constraint");
errors.add("could not determine which collation to use for string comparison");
sb.append("DELETE FROM");
sb.append(" ");
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(MaterializeVisitor.asString(MaterializeExpressionGenerator.generateExpression(globalState,
appendWhereClause(MaterializeVisitor.asString(MaterializeExpressionGenerator.generateExpression(globalState,
table.getColumns(), MaterializeDataType.BOOLEAN)));
}
MaterializeCommon.addCommonExpressionErrors(errors);
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/materialize/gen/MaterializeUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,9 @@ public void buildStatement() {
errors.add("but expression is of type");
MaterializeCommon.addCommonExpressionErrors(errors);
if (!Randomly.getBooleanWithSmallProbability()) {
sb.append(" WHERE ");
MaterializeExpression where = MaterializeExpressionGenerator.generateExpression(globalState,
randomTable.getColumns(), MaterializeDataType.BOOLEAN);
sb.append(MaterializeVisitor.asString(where));
appendWhereClause(MaterializeVisitor.asString(where));
}
}

Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/mysql/gen/MySQLDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ public void buildStatement() {
sb.append(" FROM ");
sb.append(randomTable.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(MySQLVisitor.asString(gen.generateExpression()));
appendWhereClause(MySQLVisitor.asString(gen.generateExpression()));
MySQLErrors.addExpressionErrors(errors);
}
errors.addAll(Arrays.asList("doesn't have this option",
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/mysql/gen/MySQLUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ public void buildStatement() {
sb.append(" SET ");
updateColumns(columns);
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
MySQLErrors.addExpressionErrors(errors);
sb.append(MySQLVisitor.asString(gen.generateExpression()));
appendWhereClause(MySQLVisitor.asString(gen.generateExpression()));
}
MySQLErrors.addInsertUpdateErrors(errors);
errors.add("doesn't have this option");
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/oceanbase/gen/OceanBaseDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ public void buildStatement() {
sb.append(" FROM ");
sb.append(randomTable.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(OceanBaseVisitor.asString(gen.generateExpression()));
appendWhereClause(OceanBaseVisitor.asString(gen.generateExpression()));
OceanBaseErrors.addExpressionErrors(errors);
}
errors.addAll(Arrays.asList("doesn't have this option", "Truncated incorrect DOUBLE value",
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/oceanbase/gen/OceanBaseUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,8 @@ public void buildStatement() {
sb.append(" SET ");
updateColumns(columns);
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
OceanBaseErrors.addExpressionErrors(errors);
sb.append(OceanBaseVisitor.asString(gen.generateExpression()));
appendWhereClause(OceanBaseVisitor.asString(gen.generateExpression()));
errors.add("Data Too Long");
}
errors.add("Duplicated primary key");
Expand Down
13 changes: 3 additions & 10 deletions src/sqlancer/postgres/gen/PostgresDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,13 @@ public void buildStatement() {
errors.add("violates foreign key constraint");
errors.add("violates not-null constraint");
errors.add("could not determine which collation to use for string comparison");
sb.append("DELETE FROM");
appendDeleteFromTable(table.getName(), Randomly.getBoolean());
if (Randomly.getBoolean()) {
sb.append(" ONLY");
}
sb.append(" ");
sb.append(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(PostgresVisitor.asString(PostgresExpressionGenerator.generateExpression(globalState,
appendWhereClause(PostgresVisitor.asString(PostgresExpressionGenerator.generateExpression(globalState,
table.getColumns(), PostgresDataType.BOOLEAN)));
}
if (Randomly.getBoolean()) {
sb.append(" RETURNING ");
sb.append(PostgresVisitor
appendReturningClause(PostgresVisitor
.asString(PostgresExpressionGenerator.generateExpression(globalState, table.getColumns())));
}
PostgresCommon.addCommonExpressionErrors(errors);
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/postgres/gen/PostgresIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,9 @@ public void buildStatement() {
sb.append(")");
}
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
PostgresExpression expr = new PostgresExpressionGenerator(globalState).setColumns(randomTable.getColumns())
.setGlobalState(globalState).generateExpression(PostgresDataType.BOOLEAN);
sb.append(PostgresVisitor.asString(expr));
appendWhereClause(PostgresVisitor.asString(expr));
}
errors.add("already contains data"); // CONCURRENT INDEX failed
errors.add("You might need to add explicit type casts");
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/postgres/gen/PostgresUpdateGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,9 @@ public void buildStatement() {
errors.add("but expression is of type");
PostgresCommon.addCommonExpressionErrors(errors);
if (!Randomly.getBooleanWithSmallProbability()) {
sb.append(" WHERE ");
PostgresExpression where = PostgresExpressionGenerator.generateExpression(globalState,
randomTable.getColumns(), PostgresDataType.BOOLEAN);
sb.append(PostgresVisitor.asString(where));
appendWhereClause(PostgresVisitor.asString(where));
}
}

Expand Down
6 changes: 2 additions & 4 deletions src/sqlancer/presto/gen/PrestoDeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,10 @@ public static SQLQueryAdapter generate(PrestoGlobalState globalState) {

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
PrestoTable table = globalState.getSchema().getRandomTable(t -> !t.isView());
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(PrestoToStringVisitor
appendWhereClause(PrestoToStringVisitor
.asString(new PrestoTypedExpressionGenerator(globalState).setColumns(table.getColumns())
.generateExpression(PrestoSchema.PrestoCompositeDataType.getRandomWithoutNull())));
}
Expand Down
3 changes: 1 addition & 2 deletions src/sqlancer/presto/gen/PrestoIndexGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,9 @@ public void buildStatement() {
}
sb.append(")");
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
PrestoExpression expr = new PrestoTypedExpressionGenerator(globalState).setColumns(table.getColumns())
.generateExpression(PrestoSchema.PrestoCompositeDataType.getRandomWithoutNull());
sb.append(PrestoToStringVisitor.asString(expr));
appendWhereClause(PrestoToStringVisitor.asString(expr));
}
errors.add("already exists!");
}
Expand Down
6 changes: 2 additions & 4 deletions src/sqlancer/sqlite3/gen/dml/SQLite3DeleteGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,9 @@ public static SQLQueryAdapter deleteContent(SQLite3GlobalState globalState, SQLi

@Override
public void buildStatement() {
sb.append("DELETE FROM ");
sb.append(table.getName());
appendDeleteFromTable(table.getName());
if (Randomly.getBoolean()) {
sb.append(" WHERE ");
sb.append(SQLite3Visitor.asString(
appendWhereClause(SQLite3Visitor.asString(
new SQLite3ExpressionGenerator(globalState).setColumns(table.getColumns()).generateExpression()));
}
SQLite3Errors.addExpectedExpressionErrors(errors);
Expand Down
Loading
Loading