forked from sqlancer/sqlancer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathH2Constant.java
More file actions
135 lines (96 loc) · 3.11 KB
/
H2Constant.java
File metadata and controls
135 lines (96 loc) · 3.11 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
package sqlancer.h2;
import sqlancer.common.ast.newast.Node;
public class H2Constant implements Node<H2Expression> {
private H2Constant() {
}
public static class H2NullConstant extends H2Constant {
@Override
public String toString() {
return "NULL";
}
}
public static class H2IntConstant extends H2Constant {
private final long value;
public H2IntConstant(long value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
public static class H2BoolConstant extends H2Constant {
private final boolean value;
public H2BoolConstant(boolean value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
public static class H2StringConstant extends H2Constant {
private final String value;
public H2StringConstant(String value) {
this.value = value;
}
@Override
public String toString() {
return String.format("'%s'", value.replace("'", "''"));
}
}
public static class H2DoubleConstant extends H2Constant {
private final double value;
public H2DoubleConstant(double value) {
this.value = value;
}
@Override
public String toString() {
if (value == Double.POSITIVE_INFINITY) {
return "POWER(0, -1)";
} else if (value == Double.NEGATIVE_INFINITY) {
return "(-POWER(0, -1))";
} else if (Double.compare(value, -0.0) == 0) {
return "(-CAST(0 AS DOUBLE))";
} else if (Double.isNaN(value)) {
return "SQRT(-1)";
} else {
return String.valueOf(value);
}
}
}
public static class H2BinaryConstant extends H2Constant {
private String value;
public H2BinaryConstant(long value) {
this.value = Long.toHexString(value);
if (this.value.length() % 2 == 1) {
this.value = '0' + this.value; // pad with leading zero if needed
}
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "X'" + value + "'";
}
}
public static Node<H2Expression> createIntConstant(long val) {
return new H2IntConstant(val);
}
public static Node<H2Expression> createNullConstant() {
return new H2NullConstant();
}
public static Node<H2Expression> createBoolConstant(boolean val) {
return new H2BoolConstant(val);
}
public static Node<H2Expression> createStringConstant(String val) {
return new H2StringConstant(val);
}
public static Node<H2Expression> createDoubleConstant(double val) {
return new H2DoubleConstant(val);
}
public static Node<H2Expression> createBinaryConstant(long val) {
return new H2BinaryConstant(val);
}
}