forked from sqlancer/sqlancer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFelderaToStringVisitor.java
More file actions
130 lines (120 loc) · 4.16 KB
/
FelderaToStringVisitor.java
File metadata and controls
130 lines (120 loc) · 4.16 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
package sqlancer.feldera;
import sqlancer.common.ast.newast.NewToStringVisitor;
import sqlancer.common.ast.newast.TableReferenceNode;
import sqlancer.feldera.ast.*;
public class FelderaToStringVisitor extends NewToStringVisitor<FelderaExpression> {
@Override
public void visitSpecific(FelderaExpression expr) {
if (expr.isBlackbox()) {
sb.append("blackbox(");
}
if (expr instanceof FelderaConstant) {
visit((FelderaConstant) expr);
} else if (expr instanceof FelderaSelect) {
visit((FelderaSelect) expr);
} else if (expr instanceof FelderaJoin) {
visit((FelderaJoin) expr);
} else if (expr instanceof FelderaCast) {
visit((FelderaCast) expr);
} else if (expr instanceof FelderaBetweenOperation) {
visit((FelderaBetweenOperation) expr);
} else if (expr instanceof FelderaFunctionCall) {
visit((FelderaFunctionCall) expr);
} else if (expr instanceof FelderaAggregate) {
visit((FelderaAggregate) expr);
} else {
throw new AssertionError(expr.toString());
}
if (expr.isBlackbox()) {
sb.append(")");
}
}
private void visit(FelderaAggregate aggr) {
sb.append(aggr.getFunc().name());
sb.append("(");
visit(aggr.getExpr());
sb.append(")");
}
private void visit(FelderaCast cast) {
sb.append("CAST(");
visit(cast.getExpression());
sb.append(cast.getStringRepresentation());
sb.append(")");
}
private void visit(FelderaBetweenOperation op) {
sb.append("(");
visit(op.getExpr());
sb.append(")");
sb.append(" ");
sb.append(op.getType().getStringRepresentation());
sb.append(" (");
visit(op.getLeft());
sb.append(") AND (");
visit(op.getRight());
sb.append(")");
}
private void visit(FelderaFunctionCall call) {
sb.append(call.getName());
sb.append("(");
visit(call.getArguments());
sb.append(")");
}
public void visit(FelderaJoin join) {
visit((TableReferenceNode<FelderaExpression, FelderaSchema.FelderaTable>) join.getLeftTable());
sb.append(" ");
sb.append(join.getJoinType());
sb.append(" JOIN ");
visit((TableReferenceNode<FelderaExpression, FelderaSchema.FelderaTable>) join.getRightTable());
if (join.getOnCondition() != null) {
sb.append(" ON ");
visit(join.getOnCondition());
}
}
private void visit(FelderaConstant constant) {
sb.append(constant.toString());
}
private void visit(FelderaSelect select) {
sb.append("SELECT ");
if (select.isDistinct()) {
sb.append("DISTINCT ");
}
visit(select.getFetchColumns());
sb.append(" FROM ");
visit(select.getFromList());
if (!select.getFromList().isEmpty() && !select.getJoinList().isEmpty()) {
sb.append(", ");
}
if (!select.getJoinList().isEmpty()) {
visit(select.getJoinList());
}
if (select.getWhereClause() != null) {
sb.append(" WHERE ");
visit(select.getWhereClause());
}
if (!select.getGroupByExpressions().isEmpty()) {
sb.append(" GROUP BY ");
visit(select.getGroupByExpressions());
}
if (select.getHavingClause() != null) {
sb.append(" HAVING ");
visit(select.getHavingClause());
}
if (!select.getOrderByClauses().isEmpty()) {
sb.append(" ORDER BY ");
visit(select.getOrderByClauses());
}
if (!select.getOrderByClauses().isEmpty()) {
sb.append(" LIMIT ");
visit(select.getOrderByClauses());
}
if (select.getOffsetClause() != null) {
sb.append(" OFFSET ");
visit(select.getOffsetClause());
}
}
public static String asString(FelderaExpression expr) {
FelderaToStringVisitor visitor = new FelderaToStringVisitor();
visitor.visit(expr);
return visitor.get();
}
}