/src/sql-parser/src/sql/Expr.cpp
Line | Count | Source |
1 | | #include "Expr.h" |
2 | | |
3 | | #include <stdint.h> |
4 | | #include <stdio.h> |
5 | | #include <string.h> |
6 | | |
7 | | #include "SelectStatement.h" |
8 | | |
9 | | namespace hsql { |
10 | | |
11 | | FrameBound::FrameBound(int64_t offset, FrameBoundType type, bool unbounded) |
12 | 11.1k | : offset{offset}, type{type}, unbounded{unbounded} {} |
13 | | |
14 | | FrameDescription::FrameDescription(FrameType type, FrameBound* start, FrameBound* end) |
15 | 5.57k | : type{type}, start{start}, end{end} {} |
16 | | |
17 | 5.57k | FrameDescription::~FrameDescription() { |
18 | 5.57k | delete start; |
19 | 5.57k | delete end; |
20 | 5.57k | } |
21 | | |
22 | | WindowDescription::WindowDescription(std::vector<Expr*>* partitionList, std::vector<OrderDescription*>* orderList, |
23 | | FrameDescription* frameDescription) |
24 | 5.50k | : partitionList{partitionList}, orderList{orderList}, frameDescription{frameDescription} {} |
25 | | |
26 | 5.50k | WindowDescription::~WindowDescription() { |
27 | 5.50k | if (partitionList) { |
28 | 1.58k | for (Expr* e : *partitionList) { |
29 | 1.58k | delete e; |
30 | 1.58k | } |
31 | 670 | delete partitionList; |
32 | 670 | } |
33 | | |
34 | 5.50k | if (orderList) { |
35 | 1.99k | for (OrderDescription* orderDescription : *orderList) { |
36 | 1.99k | delete orderDescription; |
37 | 1.99k | } |
38 | 1.28k | delete orderList; |
39 | 1.28k | } |
40 | | |
41 | 5.50k | delete frameDescription; |
42 | 5.50k | } |
43 | | |
44 | | Expr::Expr(ExprType type) |
45 | 2.38M | : type(type), |
46 | 2.38M | expr(nullptr), |
47 | 2.38M | expr2(nullptr), |
48 | 2.38M | exprList(nullptr), |
49 | 2.38M | select(nullptr), |
50 | 2.38M | name(nullptr), |
51 | 2.38M | table(nullptr), |
52 | 2.38M | schema(nullptr), |
53 | 2.38M | alias(nullptr), |
54 | 2.38M | fval(0), |
55 | 2.38M | ival(0), |
56 | 2.38M | ival2(0), |
57 | 2.38M | datetimeField(kDatetimeNone), |
58 | 2.38M | columnType(DataType::UNKNOWN, 0), |
59 | 2.38M | isBoolLiteral(false), |
60 | 2.38M | opType(kOpNone), |
61 | 2.38M | distinct(false), |
62 | 2.38M | windowDescription(nullptr) {} |
63 | | |
64 | 2.38M | Expr::~Expr() { |
65 | 2.38M | delete expr; |
66 | 2.38M | delete expr2; |
67 | 2.38M | delete select; |
68 | 2.38M | delete windowDescription; |
69 | | |
70 | 2.38M | free(name); |
71 | 2.38M | free(table); |
72 | 2.38M | free(schema); |
73 | 2.38M | free(alias); |
74 | | |
75 | 2.38M | if (exprList) { |
76 | 11.8k | for (Expr* e : *exprList) { |
77 | 11.2k | delete e; |
78 | 11.2k | } |
79 | 11.8k | delete exprList; |
80 | 11.8k | } |
81 | 2.38M | } |
82 | | |
83 | 2.36k | Expr* Expr::make(ExprType type) { |
84 | 2.36k | Expr* e = new Expr(type); |
85 | 2.36k | return e; |
86 | 2.36k | } |
87 | | |
88 | 12.8k | Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { |
89 | 12.8k | Expr* e = new Expr(kExprOperator); |
90 | 12.8k | e->opType = op; |
91 | 12.8k | e->expr = expr; |
92 | 12.8k | e->expr2 = nullptr; |
93 | 12.8k | return e; |
94 | 12.8k | } |
95 | | |
96 | 1.05M | Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) { |
97 | 1.05M | Expr* e = new Expr(kExprOperator); |
98 | 1.05M | e->opType = op; |
99 | 1.05M | e->expr = expr1; |
100 | 1.05M | e->expr2 = expr2; |
101 | 1.05M | return e; |
102 | 1.05M | } |
103 | | |
104 | 487 | Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) { |
105 | 487 | Expr* e = new Expr(kExprOperator); |
106 | 487 | e->expr = expr; |
107 | 487 | e->opType = kOpBetween; |
108 | 487 | e->exprList = new std::vector<Expr*>(); |
109 | 487 | e->exprList->push_back(left); |
110 | 487 | e->exprList->push_back(right); |
111 | 487 | return e; |
112 | 487 | } |
113 | | |
114 | 1.97k | Expr* Expr::makeCaseList(Expr* caseListElement) { |
115 | 1.97k | Expr* e = new Expr(kExprOperator); |
116 | | // Case list expressions are temporary and will be integrated into the case |
117 | | // expressions exprList - thus assign operator type kOpNone |
118 | 1.97k | e->opType = kOpNone; |
119 | 1.97k | e->exprList = new std::vector<Expr*>(); |
120 | 1.97k | e->exprList->push_back(caseListElement); |
121 | 1.97k | return e; |
122 | 1.97k | } |
123 | | |
124 | 3.78k | Expr* Expr::makeCaseListElement(Expr* when, Expr* then) { |
125 | 3.78k | Expr* e = new Expr(kExprOperator); |
126 | 3.78k | e->opType = kOpCaseListElement; |
127 | 3.78k | e->expr = when; |
128 | 3.78k | e->expr2 = then; |
129 | 3.78k | return e; |
130 | 3.78k | } |
131 | | |
132 | 1.81k | Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) { |
133 | 1.81k | caseList->exprList->push_back(caseListElement); |
134 | 1.81k | return caseList; |
135 | 1.81k | } |
136 | | |
137 | 1.68k | Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) { |
138 | 1.68k | Expr* e = new Expr(kExprOperator); |
139 | 1.68k | e->opType = kOpCase; |
140 | 1.68k | e->expr = expr; |
141 | 1.68k | e->expr2 = elseExpr; |
142 | 1.68k | e->exprList = caseList->exprList; |
143 | 1.68k | caseList->exprList = nullptr; |
144 | 1.68k | delete caseList; |
145 | 1.68k | return e; |
146 | 1.68k | } |
147 | | |
148 | 14.9k | Expr* Expr::makeLiteral(int64_t val) { |
149 | 14.9k | Expr* e = new Expr(kExprLiteralInt); |
150 | 14.9k | e->ival = val; |
151 | 14.9k | return e; |
152 | 14.9k | } |
153 | | |
154 | 1.61k | Expr* Expr::makeLiteral(double value) { |
155 | 1.61k | Expr* e = new Expr(kExprLiteralFloat); |
156 | 1.61k | e->fval = value; |
157 | 1.61k | return e; |
158 | 1.61k | } |
159 | | |
160 | 5.63k | Expr* Expr::makeLiteral(char* string) { |
161 | 5.63k | Expr* e = new Expr(kExprLiteralString); |
162 | 5.63k | e->name = string; |
163 | 5.63k | return e; |
164 | 5.63k | } |
165 | | |
166 | 1.32k | Expr* Expr::makeLiteral(bool val) { |
167 | 1.32k | Expr* e = new Expr(kExprLiteralInt); |
168 | 1.32k | e->ival = (int)val; |
169 | 1.32k | e->isBoolLiteral = true; |
170 | 1.32k | return e; |
171 | 1.32k | } |
172 | | |
173 | 2.73k | Expr* Expr::makeNullLiteral() { |
174 | 2.73k | Expr* e = new Expr(kExprLiteralNull); |
175 | 2.73k | return e; |
176 | 2.73k | } |
177 | | |
178 | 202 | Expr* Expr::makeDateLiteral(char* string) { |
179 | 202 | Expr* e = new Expr(kExprLiteralDate); |
180 | 202 | e->name = string; |
181 | 202 | return e; |
182 | 202 | } |
183 | | |
184 | 12.9k | Expr* Expr::makeIntervalLiteral(int64_t duration, DatetimeField unit) { |
185 | 12.9k | Expr* e = new Expr(kExprLiteralInterval); |
186 | 12.9k | e->ival = duration; |
187 | 12.9k | e->datetimeField = unit; |
188 | 12.9k | return e; |
189 | 12.9k | } |
190 | | |
191 | 55.9k | Expr* Expr::makeColumnRef(char* name) { |
192 | 55.9k | Expr* e = new Expr(kExprColumnRef); |
193 | 55.9k | e->name = name; |
194 | 55.9k | return e; |
195 | 55.9k | } |
196 | | |
197 | 1.24k | Expr* Expr::makeColumnRef(char* table, char* name) { |
198 | 1.24k | Expr* e = new Expr(kExprColumnRef); |
199 | 1.24k | e->name = name; |
200 | 1.24k | e->table = table; |
201 | 1.24k | return e; |
202 | 1.24k | } |
203 | | |
204 | 958k | Expr* Expr::makeStar(void) { |
205 | 958k | Expr* e = new Expr(kExprStar); |
206 | 958k | return e; |
207 | 958k | } |
208 | | |
209 | 398 | Expr* Expr::makeStar(char* table) { |
210 | 398 | Expr* e = new Expr(kExprStar); |
211 | 398 | e->table = table; |
212 | 398 | return e; |
213 | 398 | } |
214 | | |
215 | 7.49k | Expr* Expr::makeFunctionRef(char* func_name, std::vector<Expr*>* exprList, bool distinct, WindowDescription* window) { |
216 | 7.49k | Expr* e = new Expr(kExprFunctionRef); |
217 | 7.49k | e->name = func_name; |
218 | 7.49k | e->exprList = exprList; |
219 | 7.49k | e->distinct = distinct; |
220 | 7.49k | e->windowDescription = window; |
221 | 7.49k | return e; |
222 | 7.49k | } |
223 | | |
224 | 431 | Expr* Expr::makeFunctionRef(char* func_name, char* schema, std::vector<Expr*>* exprList, bool distinct, WindowDescription* window) { |
225 | 431 | Expr* e = new Expr(kExprFunctionRef); |
226 | 431 | e->name = func_name; |
227 | 431 | e->schema = schema; |
228 | 431 | e->exprList = exprList; |
229 | 431 | e->distinct = distinct; |
230 | 431 | e->windowDescription = window; |
231 | 431 | return e; |
232 | 431 | } |
233 | | |
234 | 372 | Expr* Expr::makeArray(std::vector<Expr*>* exprList) { |
235 | 372 | Expr* e = new Expr(kExprArray); |
236 | 372 | e->exprList = exprList; |
237 | 372 | return e; |
238 | 372 | } |
239 | | |
240 | 194 | Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) { |
241 | 194 | Expr* e = new Expr(kExprArrayIndex); |
242 | 194 | e->expr = expr; |
243 | 194 | e->ival = index; |
244 | 194 | return e; |
245 | 194 | } |
246 | | |
247 | 244k | Expr* Expr::makeParameter(int id) { |
248 | 244k | Expr* e = new Expr(kExprParameter); |
249 | 244k | e->ival = id; |
250 | 244k | return e; |
251 | 244k | } |
252 | | |
253 | 1.53k | Expr* Expr::makeSelect(SelectStatement* select) { |
254 | 1.53k | Expr* e = new Expr(kExprSelect); |
255 | 1.53k | e->select = select; |
256 | 1.53k | return e; |
257 | 1.53k | } |
258 | | |
259 | 1.09k | Expr* Expr::makeExists(SelectStatement* select) { |
260 | 1.09k | Expr* e = new Expr(kExprOperator); |
261 | 1.09k | e->opType = kOpExists; |
262 | 1.09k | e->select = select; |
263 | 1.09k | return e; |
264 | 1.09k | } |
265 | | |
266 | 570 | Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList) { |
267 | 570 | Expr* e = new Expr(kExprOperator); |
268 | 570 | e->opType = kOpIn; |
269 | 570 | e->expr = expr; |
270 | 570 | e->exprList = exprList; |
271 | | |
272 | 570 | return e; |
273 | 570 | } |
274 | | |
275 | 500 | Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { |
276 | 500 | Expr* e = new Expr(kExprOperator); |
277 | 500 | e->opType = kOpIn; |
278 | 500 | e->expr = expr; |
279 | 500 | e->select = select; |
280 | | |
281 | 500 | return e; |
282 | 500 | } |
283 | | |
284 | 516 | Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) { |
285 | 516 | Expr* e = new Expr(kExprExtract); |
286 | 516 | e->datetimeField = datetimeField; |
287 | 516 | e->expr = expr; |
288 | 516 | return e; |
289 | 516 | } |
290 | | |
291 | 625 | Expr* Expr::makeCast(Expr* expr, ColumnType columnType) { |
292 | 625 | Expr* e = new Expr(kExprCast); |
293 | 625 | e->columnType = columnType; |
294 | 625 | e->expr = expr; |
295 | 625 | return e; |
296 | 625 | } |
297 | | |
298 | 0 | bool Expr::isType(ExprType exprType) const { return exprType == type; } |
299 | | |
300 | 0 | bool Expr::isLiteral() const { |
301 | 0 | return isType(kExprLiteralInt) || isType(kExprLiteralFloat) || isType(kExprLiteralString) || isType(kExprParameter) || |
302 | 0 | isType(kExprLiteralNull) || isType(kExprLiteralDate) || isType(kExprLiteralInterval); |
303 | 0 | } |
304 | | |
305 | 0 | bool Expr::hasAlias() const { return alias != nullptr; } |
306 | | |
307 | 0 | bool Expr::hasTable() const { return table != nullptr; } |
308 | | |
309 | 0 | const char* Expr::getName() const { |
310 | 0 | if (alias) |
311 | 0 | return alias; |
312 | 0 | else |
313 | 0 | return name; |
314 | 0 | } |
315 | | |
316 | 1.31k | char* substr(const char* source, int from, int to) { |
317 | 1.31k | int len = to - from; |
318 | 1.31k | char* copy = (char*)malloc(len + 1); |
319 | 1.31k | ; |
320 | 1.31k | strncpy(copy, source + from, len); |
321 | 1.31k | copy[len] = '\0'; |
322 | 1.31k | return copy; |
323 | 1.31k | } |
324 | | } // namespace hsql |