Coverage Report

Created: 2026-04-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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