|
3 | 3 | import java.io.File; |
4 | 4 | import java.sql.Connection; |
5 | 5 | import java.sql.DriverManager; |
6 | | -import java.sql.ResultSet; |
7 | 6 | import java.sql.SQLException; |
8 | | -import java.sql.Statement; |
9 | 7 | import java.util.ArrayList; |
10 | 8 | import java.util.Arrays; |
11 | 9 | import java.util.List; |
|
41 | 39 | import sqlancer.sqlite3.gen.ddl.SQLite3ViewGenerator; |
42 | 40 | import sqlancer.sqlite3.gen.dml.SQLite3DeleteGenerator; |
43 | 41 | import sqlancer.sqlite3.gen.dml.SQLite3InsertGenerator; |
| 42 | +import sqlancer.sqlite3.gen.dml.SQLite3StatTableGenerator; |
44 | 43 | import sqlancer.sqlite3.gen.dml.SQLite3UpdateGenerator; |
45 | 44 | import sqlancer.sqlite3.schema.SQLite3Schema; |
46 | | -import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column; |
47 | 45 | import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table; |
48 | | -import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table.TableKind; |
49 | 46 |
|
50 | 47 | public class SQLite3Provider extends ProviderAdapter<SQLite3GlobalState, SQLite3Options> { |
51 | 48 |
|
@@ -101,63 +98,7 @@ public boolean canBeRetried() { |
101 | 98 | VIRTUAL_TABLE_ACTION(SQLite3VirtualFTSTableCommandGenerator::create), // |
102 | 99 | CREATE_VIEW(SQLite3ViewGenerator::generate), // |
103 | 100 | 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); |
161 | 102 |
|
162 | 103 | private final QueryProvider<SQLite3GlobalState> queryProvider; |
163 | 104 |
|
|
0 commit comments