Coverage Report

Created: 2023-06-07 06:06

/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