/src/sql-parser/src/sql/Expr.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include "Expr.h" |
2 | | #include <stdio.h> |
3 | | #include <string.h> |
4 | | #include "SelectStatement.h" |
5 | | |
6 | | namespace hsql { |
7 | | |
8 | | Expr::Expr(ExprType type) |
9 | | : type(type), |
10 | | expr(nullptr), |
11 | | expr2(nullptr), |
12 | | exprList(nullptr), |
13 | | select(nullptr), |
14 | | name(nullptr), |
15 | | table(nullptr), |
16 | | alias(nullptr), |
17 | | fval(0), |
18 | | ival(0), |
19 | | ival2(0), |
20 | | datetimeField(kDatetimeNone), |
21 | | columnType(DataType::UNKNOWN, 0), |
22 | | isBoolLiteral(false), |
23 | | opType(kOpNone), |
24 | 4.08M | distinct(false) {} |
25 | | |
26 | 3.93M | Expr::~Expr() { |
27 | 3.93M | delete expr; |
28 | 3.93M | delete expr2; |
29 | 3.93M | delete select; |
30 | 3.93M | free(name); |
31 | 3.93M | free(table); |
32 | 3.93M | free(alias); |
33 | | |
34 | 3.93M | if (exprList) { |
35 | 9.35k | for (Expr* e : *exprList) { |
36 | 9.35k | delete e; |
37 | 9.35k | } |
38 | 6.22k | delete exprList; |
39 | 6.22k | } |
40 | 3.93M | } |
41 | | |
42 | 2.64k | Expr* Expr::make(ExprType type) { |
43 | 2.64k | Expr* e = new Expr(type); |
44 | 2.64k | return e; |
45 | 2.64k | } |
46 | | |
47 | 9.81k | Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { |
48 | 9.81k | Expr* e = new Expr(kExprOperator); |
49 | 9.81k | e->opType = op; |
50 | 9.81k | e->expr = expr; |
51 | 9.81k | e->expr2 = nullptr; |
52 | 9.81k | return e; |
53 | 9.81k | } |
54 | | |
55 | 1.24M | Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) { |
56 | 1.24M | Expr* e = new Expr(kExprOperator); |
57 | 1.24M | e->opType = op; |
58 | 1.24M | e->expr = expr1; |
59 | 1.24M | e->expr2 = expr2; |
60 | 1.24M | return e; |
61 | 1.24M | } |
62 | | |
63 | 814 | Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) { |
64 | 814 | Expr* e = new Expr(kExprOperator); |
65 | 814 | e->expr = expr; |
66 | 814 | e->opType = kOpBetween; |
67 | 814 | e->exprList = new std::vector<Expr*>(); |
68 | 814 | e->exprList->push_back(left); |
69 | 814 | e->exprList->push_back(right); |
70 | 814 | return e; |
71 | 814 | } |
72 | | |
73 | 2.12k | Expr* Expr::makeCaseList(Expr* caseListElement) { |
74 | 2.12k | Expr* e = new Expr(kExprOperator); |
75 | | // Case list expressions are temporary and will be integrated into the case |
76 | | // expressions exprList - thus assign operator type kOpNone |
77 | 2.12k | e->opType = kOpNone; |
78 | 2.12k | e->exprList = new std::vector<Expr*>(); |
79 | 2.12k | e->exprList->push_back(caseListElement); |
80 | 2.12k | return e; |
81 | 2.12k | } |
82 | | |
83 | 3.56k | Expr* Expr::makeCaseListElement(Expr* when, Expr* then) { |
84 | 3.56k | Expr* e = new Expr(kExprOperator); |
85 | 3.56k | e->opType = kOpCaseListElement; |
86 | 3.56k | e->expr = when; |
87 | 3.56k | e->expr2 = then; |
88 | 3.56k | return e; |
89 | 3.56k | } |
90 | | |
91 | 1.44k | Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) { |
92 | 1.44k | caseList->exprList->push_back(caseListElement); |
93 | 1.44k | return caseList; |
94 | 1.44k | } |
95 | | |
96 | 1.85k | Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) { |
97 | 1.85k | Expr* e = new Expr(kExprOperator); |
98 | 1.85k | e->opType = kOpCase; |
99 | 1.85k | e->expr = expr; |
100 | 1.85k | e->expr2 = elseExpr; |
101 | 1.85k | e->exprList = caseList->exprList; |
102 | 1.85k | caseList->exprList = nullptr; |
103 | 1.85k | delete caseList; |
104 | 1.85k | return e; |
105 | 1.85k | } |
106 | | |
107 | 15.1k | Expr* Expr::makeLiteral(int64_t val) { |
108 | 15.1k | Expr* e = new Expr(kExprLiteralInt); |
109 | 15.1k | e->ival = val; |
110 | 15.1k | return e; |
111 | 15.1k | } |
112 | | |
113 | 401 | Expr* Expr::makeLiteral(double value) { |
114 | 401 | Expr* e = new Expr(kExprLiteralFloat); |
115 | 401 | e->fval = value; |
116 | 401 | return e; |
117 | 401 | } |
118 | | |
119 | 2.85k | Expr* Expr::makeLiteral(char* string) { |
120 | 2.85k | Expr* e = new Expr(kExprLiteralString); |
121 | 2.85k | e->name = string; |
122 | 2.85k | return e; |
123 | 2.85k | } |
124 | | |
125 | 1.30k | Expr* Expr::makeLiteral(bool val) { |
126 | 1.30k | Expr* e = new Expr(kExprLiteralInt); |
127 | 1.30k | e->ival = (int)val; |
128 | 1.30k | e->isBoolLiteral = true; |
129 | 1.30k | return e; |
130 | 1.30k | } |
131 | | |
132 | 342 | Expr* Expr::makeNullLiteral() { |
133 | 342 | Expr* e = new Expr(kExprLiteralNull); |
134 | 342 | return e; |
135 | 342 | } |
136 | | |
137 | 633 | Expr* Expr::makeDateLiteral(char* string) { |
138 | 633 | Expr* e = new Expr(kExprLiteralDate); |
139 | 633 | e->name = string; |
140 | 633 | return e; |
141 | 633 | } |
142 | | |
143 | 12.0k | Expr* Expr::makeIntervalLiteral(int64_t duration, DatetimeField unit) { |
144 | 12.0k | Expr* e = new Expr(kExprLiteralInterval); |
145 | 12.0k | e->ival = duration; |
146 | 12.0k | e->datetimeField = unit; |
147 | 12.0k | return e; |
148 | 12.0k | } |
149 | | |
150 | 1.28M | Expr* Expr::makeColumnRef(char* name) { |
151 | 1.28M | Expr* e = new Expr(kExprColumnRef); |
152 | 1.28M | e->name = name; |
153 | 1.28M | return e; |
154 | 1.28M | } |
155 | | |
156 | 1.83k | Expr* Expr::makeColumnRef(char* table, char* name) { |
157 | 1.83k | Expr* e = new Expr(kExprColumnRef); |
158 | 1.83k | e->name = name; |
159 | 1.83k | e->table = table; |
160 | 1.83k | return e; |
161 | 1.83k | } |
162 | | |
163 | 1.14M | Expr* Expr::makeStar(void) { |
164 | 1.14M | Expr* e = new Expr(kExprStar); |
165 | 1.14M | return e; |
166 | 1.14M | } |
167 | | |
168 | 195 | Expr* Expr::makeStar(char* table) { |
169 | 195 | Expr* e = new Expr(kExprStar); |
170 | 195 | e->table = table; |
171 | 195 | return e; |
172 | 195 | } |
173 | | |
174 | 2.01k | Expr* Expr::makeFunctionRef(char* func_name, std::vector<Expr*>* exprList, bool distinct) { |
175 | 2.01k | Expr* e = new Expr(kExprFunctionRef); |
176 | 2.01k | e->name = func_name; |
177 | 2.01k | e->exprList = exprList; |
178 | 2.01k | e->distinct = distinct; |
179 | 2.01k | return e; |
180 | 2.01k | } |
181 | | |
182 | 435 | Expr* Expr::makeArray(std::vector<Expr*>* exprList) { |
183 | 435 | Expr* e = new Expr(kExprArray); |
184 | 435 | e->exprList = exprList; |
185 | 435 | return e; |
186 | 435 | } |
187 | | |
188 | 194 | Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) { |
189 | 194 | Expr* e = new Expr(kExprArrayIndex); |
190 | 194 | e->expr = expr; |
191 | 194 | e->ival = index; |
192 | 194 | return e; |
193 | 194 | } |
194 | | |
195 | 353k | Expr* Expr::makeParameter(int id) { |
196 | 353k | Expr* e = new Expr(kExprParameter); |
197 | 353k | e->ival = id; |
198 | 353k | return e; |
199 | 353k | } |
200 | | |
201 | 579 | Expr* Expr::makeSelect(SelectStatement* select) { |
202 | 579 | Expr* e = new Expr(kExprSelect); |
203 | 579 | e->select = select; |
204 | 579 | return e; |
205 | 579 | } |
206 | | |
207 | 946 | Expr* Expr::makeExists(SelectStatement* select) { |
208 | 946 | Expr* e = new Expr(kExprOperator); |
209 | 946 | e->opType = kOpExists; |
210 | 946 | e->select = select; |
211 | 946 | return e; |
212 | 946 | } |
213 | | |
214 | 561 | Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList) { |
215 | 561 | Expr* e = new Expr(kExprOperator); |
216 | 561 | e->opType = kOpIn; |
217 | 561 | e->expr = expr; |
218 | 561 | e->exprList = exprList; |
219 | | |
220 | 561 | return e; |
221 | 561 | } |
222 | | |
223 | 389 | Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { |
224 | 389 | Expr* e = new Expr(kExprOperator); |
225 | 389 | e->opType = kOpIn; |
226 | 389 | e->expr = expr; |
227 | 389 | e->select = select; |
228 | | |
229 | 389 | return e; |
230 | 389 | } |
231 | | |
232 | 466 | Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) { |
233 | 466 | Expr* e = new Expr(kExprExtract); |
234 | 466 | e->datetimeField = datetimeField; |
235 | 466 | e->expr = expr; |
236 | 466 | return e; |
237 | 466 | } |
238 | | |
239 | 373 | Expr* Expr::makeCast(Expr* expr, ColumnType columnType) { |
240 | 373 | Expr* e = new Expr(kExprCast); |
241 | 373 | e->columnType = columnType; |
242 | 373 | e->expr = expr; |
243 | 373 | return e; |
244 | 373 | } |
245 | | |
246 | 0 | bool Expr::isType(ExprType exprType) const { return exprType == type; } |
247 | | |
248 | 0 | bool Expr::isLiteral() const { |
249 | 0 | return isType(kExprLiteralInt) || isType(kExprLiteralFloat) || isType(kExprLiteralString) || isType(kExprParameter) || |
250 | 0 | isType(kExprLiteralNull) || isType(kExprLiteralDate) || isType(kExprLiteralInterval); |
251 | 0 | } |
252 | | |
253 | 0 | bool Expr::hasAlias() const { return alias != nullptr; } |
254 | | |
255 | 0 | bool Expr::hasTable() const { return table != nullptr; } |
256 | | |
257 | 0 | const char* Expr::getName() const { |
258 | 0 | if (alias) |
259 | 0 | return alias; |
260 | 0 | else |
261 | 0 | return name; |
262 | 0 | } |
263 | | |
264 | 2.11k | char* substr(const char* source, int from, int to) { |
265 | 2.11k | int len = to - from; |
266 | 2.11k | char* copy = (char*)malloc(len + 1); |
267 | 2.11k | ; |
268 | 2.11k | strncpy(copy, source + from, len); |
269 | 2.11k | copy[len] = '\0'; |
270 | 2.11k | return copy; |
271 | 2.11k | } |
272 | | } // namespace hsql |