-
Notifications
You must be signed in to change notification settings - Fork 397
Expand file tree
/
Copy pathSQLite3Visitor.java
More file actions
255 lines (202 loc) · 9.34 KB
/
SQLite3Visitor.java
File metadata and controls
255 lines (202 loc) · 9.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
package sqlancer.sqlite3;
import sqlancer.sqlite3.ast.SQLite3Aggregate;
import sqlancer.sqlite3.ast.SQLite3Case.SQLite3CaseWithBaseExpression;
import sqlancer.sqlite3.ast.SQLite3Case.SQLite3CaseWithoutBaseExpression;
import sqlancer.sqlite3.ast.SQLite3Constant;
import sqlancer.sqlite3.ast.SQLite3Expression;
import sqlancer.sqlite3.ast.SQLite3Expression.BetweenOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.BinaryComparisonOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.Cast;
import sqlancer.sqlite3.ast.SQLite3Expression.CollateOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.Function;
import sqlancer.sqlite3.ast.SQLite3Expression.InOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.Join;
import sqlancer.sqlite3.ast.SQLite3Expression.MatchOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Alias;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3ColumnName;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Distinct;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Exist;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3ExpressionBag;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3OrderingTerm;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3PostfixText;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3PostfixUnaryOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3ResultMap;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3TableAndColumnRef;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3TableReference;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Text;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Typeof;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3Values;
import sqlancer.sqlite3.ast.SQLite3Expression.SQLite3WithClause;
import sqlancer.sqlite3.ast.SQLite3Expression.Sqlite3BinaryOperation;
import sqlancer.sqlite3.ast.SQLite3Expression.Subquery;
import sqlancer.sqlite3.ast.SQLite3Expression.TypeLiteral;
import sqlancer.sqlite3.ast.SQLite3Function;
import sqlancer.sqlite3.ast.SQLite3RowValueExpression;
import sqlancer.sqlite3.ast.SQLite3Select;
import sqlancer.sqlite3.ast.SQLite3SetClause;
import sqlancer.sqlite3.ast.SQLite3UnaryOperation;
import sqlancer.sqlite3.ast.SQLite3WindowFunction;
import sqlancer.sqlite3.ast.SQLite3WindowFunctionExpression;
import sqlancer.sqlite3.ast.SQLite3WindowFunctionExpression.SQLite3WindowFunctionFrameSpecBetween;
import sqlancer.sqlite3.ast.SQLite3WindowFunctionExpression.SQLite3WindowFunctionFrameSpecTerm;
public interface SQLite3Visitor {
static byte[] hexStringToByteArray(String s) {
byte[] b = new byte[s.length() / 2];
for (int i = 0; i < b.length; i++) {
int index = i * 2;
int v = Integer.parseInt(s.substring(index, index + 2), 16);
b[i] = (byte) v;
}
return b;
}
static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for (byte b : a) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
// TODO remove these default methods
default void visit(BinaryComparisonOperation op) {
}
default void visit(Sqlite3BinaryOperation op) {
}
default void visit(SQLite3UnaryOperation exp) {
}
default void visit(SQLite3PostfixText op) {
}
default void visit(SQLite3PostfixUnaryOperation exp) {
}
void visit(BetweenOperation op);
void visit(SQLite3ColumnName c);
void visit(SQLite3Constant c);
void visit(Function f);
void visit(SQLite3Select s, boolean inner);
void visit(SQLite3OrderingTerm term);
void visit(SQLite3TableReference tableReference);
void visit(SQLite3SetClause set);
void visit(CollateOperation op);
void visit(Cast cast);
void visit(TypeLiteral literal);
void visit(InOperation op);
void visit(Subquery query);
void visit(SQLite3Exist exist);
void visit(Join join);
void visit(MatchOperation match);
void visit(SQLite3Function func);
void visit(SQLite3Text func);
void visit(SQLite3Distinct distinct);
void visit(SQLite3CaseWithoutBaseExpression casExpr);
void visit(SQLite3CaseWithBaseExpression casExpr);
void visit(SQLite3Aggregate aggr);
void visit(SQLite3WindowFunction func);
void visit(SQLite3RowValueExpression rw);
void visit(SQLite3WindowFunctionExpression windowFunction);
void visit(SQLite3WindowFunctionFrameSpecTerm term);
void visit(SQLite3WindowFunctionFrameSpecBetween between);
void visit(SQLite3Alias alias);
void visit(SQLite3WithClause withClause);
void visit(SQLite3TableAndColumnRef tableAndColumnRef);
void visit(SQLite3Values values);
void visit(SQLite3ExpressionBag expr);
void visit(SQLite3Typeof expr);
void visit(SQLite3ResultMap tableSummary);
default void visit(SQLite3Expression expr) {
if (expr instanceof Sqlite3BinaryOperation) {
visit((Sqlite3BinaryOperation) expr);
} else if (expr instanceof SQLite3ColumnName) {
visit((SQLite3ColumnName) expr);
} else if (expr instanceof SQLite3Constant) {
visit((SQLite3Constant) expr);
} else if (expr instanceof SQLite3UnaryOperation) {
visit((SQLite3UnaryOperation) expr);
} else if (expr instanceof SQLite3PostfixUnaryOperation) {
visit((SQLite3PostfixUnaryOperation) expr);
} else if (expr instanceof Function) {
visit((Function) expr);
} else if (expr instanceof BetweenOperation) {
visit((BetweenOperation) expr);
} else if (expr instanceof CollateOperation) {
visit((CollateOperation) expr);
} else if (expr instanceof SQLite3OrderingTerm) {
visit((SQLite3OrderingTerm) expr);
} else if (expr instanceof SQLite3Expression.InOperation) {
visit((InOperation) expr);
} else if (expr instanceof Cast) {
visit((Cast) expr);
} else if (expr instanceof Subquery) {
visit((Subquery) expr);
} else if (expr instanceof Join) {
visit((Join) expr);
} else if (expr instanceof SQLite3Select) {
visit((SQLite3Select) expr, true);
} else if (expr instanceof SQLite3Exist) {
visit((SQLite3Exist) expr);
} else if (expr instanceof BinaryComparisonOperation) {
visit((BinaryComparisonOperation) expr);
} else if (expr instanceof SQLite3Function) {
visit((SQLite3Function) expr);
} else if (expr instanceof SQLite3Distinct) {
visit((SQLite3Distinct) expr);
} else if (expr instanceof SQLite3CaseWithoutBaseExpression) {
visit((SQLite3CaseWithoutBaseExpression) expr);
} else if (expr instanceof SQLite3CaseWithBaseExpression) {
visit((SQLite3CaseWithBaseExpression) expr);
} else if (expr instanceof SQLite3Aggregate) {
visit((SQLite3Aggregate) expr);
} else if (expr instanceof SQLite3PostfixText) {
visit((SQLite3PostfixText) expr);
} else if (expr instanceof SQLite3WindowFunction) {
visit((SQLite3WindowFunction) expr);
} else if (expr instanceof MatchOperation) {
visit((MatchOperation) expr);
} else if (expr instanceof SQLite3RowValueExpression) {
visit((SQLite3RowValueExpression) expr);
} else if (expr instanceof SQLite3Text) {
visit((SQLite3Text) expr);
} else if (expr instanceof SQLite3WindowFunctionExpression) {
visit((SQLite3WindowFunctionExpression) expr);
} else if (expr instanceof SQLite3WindowFunctionFrameSpecTerm) {
visit((SQLite3WindowFunctionFrameSpecTerm) expr);
} else if (expr instanceof SQLite3WindowFunctionFrameSpecBetween) {
visit((SQLite3WindowFunctionFrameSpecBetween) expr);
} else if (expr instanceof SQLite3TableReference) {
visit((SQLite3TableReference) expr);
} else if (expr instanceof SQLite3SetClause) {
visit((SQLite3SetClause) expr);
} else if (expr instanceof SQLite3Alias) {
visit((SQLite3Alias) expr);
} else if (expr instanceof SQLite3WithClause) {
visit((SQLite3WithClause) expr);
} else if (expr instanceof SQLite3TableAndColumnRef) {
visit((SQLite3TableAndColumnRef) expr);
} else if (expr instanceof SQLite3Values) {
visit((SQLite3Values) expr);
} else if (expr instanceof SQLite3ExpressionBag) {
visit((SQLite3ExpressionBag) expr);
} else if (expr instanceof SQLite3Typeof) {
visit((SQLite3Typeof) expr);
} else if (expr instanceof SQLite3ResultMap) {
visit((SQLite3ResultMap) expr);
} else {
throw new AssertionError(expr);
}
}
static String asString(SQLite3Expression expr) {
if (expr == null) {
throw new AssertionError();
}
SQLite3ToStringVisitor visitor = new SQLite3ToStringVisitor();
if (expr instanceof SQLite3Select) {
visitor.visit((SQLite3Select) expr, false);
} else {
visitor.visit(expr);
}
return visitor.get();
}
static String asExpectedValues(SQLite3Expression expr) {
SQLite3ExpectedValueVisitor visitor = new SQLite3ExpectedValueVisitor();
visitor.visit(expr);
return visitor.get();
}
}