Skip to content

Commit 48186ce

Browse files
committed
[SQLite] Move the stat-manipulation table generator to its own class
1 parent 658bfac commit 48186ce

2 files changed

Lines changed: 90 additions & 61 deletions

File tree

src/sqlancer/sqlite3/SQLite3Provider.java

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import java.io.File;
44
import java.sql.Connection;
55
import java.sql.DriverManager;
6-
import java.sql.ResultSet;
76
import java.sql.SQLException;
8-
import java.sql.Statement;
97
import java.util.ArrayList;
108
import java.util.Arrays;
119
import java.util.List;
@@ -41,11 +39,10 @@
4139
import sqlancer.sqlite3.gen.ddl.SQLite3ViewGenerator;
4240
import sqlancer.sqlite3.gen.dml.SQLite3DeleteGenerator;
4341
import sqlancer.sqlite3.gen.dml.SQLite3InsertGenerator;
42+
import sqlancer.sqlite3.gen.dml.SQLite3StatTableGenerator;
4443
import sqlancer.sqlite3.gen.dml.SQLite3UpdateGenerator;
4544
import sqlancer.sqlite3.schema.SQLite3Schema;
46-
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column;
4745
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table;
48-
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table.TableKind;
4946

5047
public class SQLite3Provider extends ProviderAdapter<SQLite3GlobalState, SQLite3Options> {
5148

@@ -101,63 +98,7 @@ public boolean canBeRetried() {
10198
VIRTUAL_TABLE_ACTION(SQLite3VirtualFTSTableCommandGenerator::create), //
10299
CREATE_VIEW(SQLite3ViewGenerator::generate), //
103100
CREATE_TRIGGER(SQLite3CreateTriggerGenerator::create), //
104-
MANIPULATE_STAT_TABLE((g) -> {
105-
List<SQLite3Column> columns = new ArrayList<>();
106-
SQLite3Table t = new SQLite3Table("sqlite_stat1", columns, TableKind.MAIN, false, false, false, false);
107-
if (Randomly.getBoolean()) {
108-
return SQLite3DeleteGenerator.deleteContent(g, t);
109-
} else {
110-
StringBuilder sb = new StringBuilder();
111-
sb.append("INSERT OR IGNORE INTO sqlite_stat1");
112-
String indexName;
113-
try (Statement stat = g.getConnection().createStatement()) {
114-
try (ResultSet rs = stat.executeQuery(
115-
"SELECT name FROM sqlite_master WHERE type='index' ORDER BY RANDOM() LIMIT 1;")) {
116-
if (rs.isClosed()) {
117-
throw new IgnoreMeException();
118-
}
119-
indexName = rs.getString("name");
120-
}
121-
} catch (SQLException e) {
122-
throw new IgnoreMeException();
123-
}
124-
sb.append(" VALUES");
125-
sb.append("('");
126-
sb.append(g.getSchema().getRandomTable().getName());
127-
sb.append("', ");
128-
sb.append("'");
129-
if (Randomly.getBoolean()) {
130-
sb.append(indexName);
131-
} else {
132-
sb.append(g.getSchema().getRandomTable().getName());
133-
}
134-
sb.append("'");
135-
sb.append(", '");
136-
for (int i = 0; i < Randomly.smallNumber(); i++) {
137-
if (i != 0) {
138-
sb.append(" ");
139-
}
140-
if (Randomly.getBoolean()) {
141-
sb.append(g.getRandomly().getInteger());
142-
} else {
143-
sb.append(Randomly.smallNumber());
144-
}
145-
}
146-
if (Randomly.getBoolean()) {
147-
sb.append(" sz=");
148-
sb.append(g.getRandomly().getInteger());
149-
}
150-
if (Randomly.getBoolean()) {
151-
sb.append(" unordered");
152-
}
153-
if (Randomly.getBoolean()) {
154-
sb.append(" noskipscan");
155-
}
156-
sb.append("')");
157-
return new QueryAdapter(sb.toString(),
158-
ExpectedErrors.from("no such table", "The database file is locked"));
159-
}
160-
});
101+
MANIPULATE_STAT_TABLE(SQLite3StatTableGenerator::getQuery);
161102

162103
private final QueryProvider<SQLite3GlobalState> queryProvider;
163104

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package sqlancer.sqlite3.gen.dml;
2+
3+
import java.sql.ResultSet;
4+
import java.sql.SQLException;
5+
import java.sql.Statement;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import sqlancer.IgnoreMeException;
10+
import sqlancer.Randomly;
11+
import sqlancer.common.query.ExpectedErrors;
12+
import sqlancer.common.query.Query;
13+
import sqlancer.common.query.QueryAdapter;
14+
import sqlancer.sqlite3.SQLite3Provider.SQLite3GlobalState;
15+
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column;
16+
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table;
17+
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table.TableKind;
18+
19+
public final class SQLite3StatTableGenerator {
20+
21+
private final SQLite3GlobalState globalState;
22+
23+
private SQLite3StatTableGenerator(SQLite3GlobalState globalState) {
24+
this.globalState = globalState;
25+
}
26+
27+
public static Query getQuery(SQLite3GlobalState globalState) {
28+
return new SQLite3StatTableGenerator(globalState).getQuery();
29+
}
30+
31+
private Query getQuery() {
32+
List<SQLite3Column> columns = new ArrayList<>();
33+
SQLite3Table t = new SQLite3Table("sqlite_stat1", columns, TableKind.MAIN, false, false, false, false);
34+
if (Randomly.getBoolean()) {
35+
return SQLite3DeleteGenerator.deleteContent(globalState, t);
36+
} else {
37+
StringBuilder sb = new StringBuilder();
38+
sb.append("INSERT OR IGNORE INTO sqlite_stat1");
39+
String indexName;
40+
try (Statement stat = globalState.getConnection().createStatement()) {
41+
try (ResultSet rs = stat
42+
.executeQuery("SELECT name FROM sqlite_master WHERE type='index' ORDER BY RANDOM() LIMIT 1;")) {
43+
if (rs.isClosed()) {
44+
throw new IgnoreMeException();
45+
}
46+
indexName = rs.getString("name");
47+
}
48+
} catch (SQLException e) {
49+
throw new IgnoreMeException();
50+
}
51+
sb.append(" VALUES");
52+
sb.append("('");
53+
sb.append(globalState.getSchema().getRandomTable().getName());
54+
sb.append("', ");
55+
sb.append("'");
56+
if (Randomly.getBoolean()) {
57+
sb.append(indexName);
58+
} else {
59+
sb.append(globalState.getSchema().getRandomTable().getName());
60+
}
61+
sb.append("'");
62+
sb.append(", '");
63+
for (int i = 0; i < Randomly.smallNumber(); i++) {
64+
if (i != 0) {
65+
sb.append(" ");
66+
}
67+
if (Randomly.getBoolean()) {
68+
sb.append(globalState.getRandomly().getInteger());
69+
} else {
70+
sb.append(Randomly.smallNumber());
71+
}
72+
}
73+
if (Randomly.getBoolean()) {
74+
sb.append(" sz=");
75+
sb.append(globalState.getRandomly().getInteger());
76+
}
77+
if (Randomly.getBoolean()) {
78+
sb.append(" unordered");
79+
}
80+
if (Randomly.getBoolean()) {
81+
sb.append(" noskipscan");
82+
}
83+
sb.append("')");
84+
return new QueryAdapter(sb.toString(), ExpectedErrors.from("no such table", "The database file is locked"));
85+
}
86+
}
87+
88+
}

0 commit comments

Comments
 (0)