Coverage Report

Created: 2025-11-09 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/sql-parser/src/sql/statements.cpp
Line
Count
Source
1
#include "statements.h"
2
3
#include <stdint.h>
4
5
#include "AlterStatement.h"
6
#include "ImportExportOptions.h"
7
8
namespace hsql {
9
10
ColumnType::ColumnType(DataType data_type, int64_t length, int64_t precision, int64_t scale)
11
3.16M
    : data_type(data_type), length(length), precision(precision), scale(scale) {}
12
13
0
bool operator==(const ColumnType& lhs, const ColumnType& rhs) {
14
0
  if (lhs.data_type != rhs.data_type) {
15
0
    return false;
16
0
  }
17
0
  return lhs.length == rhs.length && lhs.precision == rhs.precision && lhs.scale == rhs.scale;
18
0
}
19
20
0
bool operator!=(const ColumnType& lhs, const ColumnType& rhs) { return !(lhs == rhs); }
21
22
0
std::ostream& operator<<(std::ostream& stream, const ColumnType& column_type) {
23
0
  switch (column_type.data_type) {
24
0
    case DataType::UNKNOWN:
25
0
      stream << "UNKNOWN";
26
0
      break;
27
0
    case DataType::INT:
28
0
      stream << "INT";
29
0
      break;
30
0
    case DataType::BIGINT:
31
0
      stream << "BIGINT";
32
0
      break;
33
0
    case DataType::LONG:
34
0
      stream << "LONG";
35
0
      break;
36
0
    case DataType::FLOAT:
37
0
      stream << "FLOAT";
38
0
      break;
39
0
    case DataType::DOUBLE:
40
0
      stream << "DOUBLE";
41
0
      break;
42
0
    case DataType::REAL:
43
0
      stream << "REAL";
44
0
      break;
45
0
    case DataType::CHAR:
46
0
      stream << "CHAR(" << column_type.length << ")";
47
0
      break;
48
0
    case DataType::VARCHAR:
49
0
      stream << "VARCHAR(" << column_type.length << ")";
50
0
      break;
51
0
    case DataType::DECIMAL:
52
0
      stream << "DECIMAL";
53
0
      break;
54
0
    case DataType::TEXT:
55
0
      stream << "TEXT";
56
0
      break;
57
0
    case DataType::DATETIME:
58
0
      stream << "DATETIME";
59
0
      break;
60
0
    case DataType::DATE:
61
0
      stream << "DATE";
62
0
      break;
63
0
    case DataType::TIME:
64
0
      stream << "TIME";
65
0
      break;
66
0
    case DataType::SMALLINT:
67
0
      stream << "SMALLINT";
68
0
      break;
69
0
    case DataType::BOOLEAN:
70
0
      stream << "BOOLEAN";
71
0
      break;
72
0
  }
73
0
  return stream;
74
0
}
75
76
// DeleteStatement
77
1.68k
DeleteStatement::DeleteStatement() : SQLStatement(kStmtDelete), schema(nullptr), tableName(nullptr), expr(nullptr) {}
78
79
1.68k
DeleteStatement::~DeleteStatement() {
80
1.68k
  free(schema);
81
1.68k
  free(tableName);
82
1.68k
  delete expr;
83
1.68k
}
84
85
// DropStatement
86
DropStatement::DropStatement(DropType type)
87
5.90k
    : SQLStatement(kStmtDrop), type(type), schema(nullptr), name(nullptr), indexName(nullptr) {}
88
89
5.90k
DropStatement::~DropStatement() {
90
5.90k
  free(schema);
91
5.90k
  free(name);
92
5.90k
  free(indexName);
93
5.90k
}
94
95
// AlterStatement and supportive classes
96
97
0
AlterAction::AlterAction(ActionType type) : type(type) {}
98
99
0
AlterAction::~AlterAction() = default;
100
101
DropColumnAction::DropColumnAction(char* column_name)
102
0
    : AlterAction(ActionType::DropColumn), columnName(column_name), ifExists(false) {}
103
104
0
DropColumnAction::~DropColumnAction() { free(columnName); }
105
106
AlterStatement::AlterStatement(char* name, AlterAction* action)
107
0
    : SQLStatement(kStmtAlter), schema(nullptr), ifTableExists(false), name(name), action(action) {}
108
109
0
AlterStatement::~AlterStatement() {
110
0
  free(schema);
111
0
  free(name);
112
0
  delete action;
113
0
}
114
115
// TransactionStatement
116
TransactionStatement::TransactionStatement(TransactionCommand command)
117
45.5k
    : SQLStatement(kStmtTransaction), command(command) {}
118
119
45.5k
TransactionStatement::~TransactionStatement() {}
120
121
// ExecuteStatement
122
1.75k
ExecuteStatement::ExecuteStatement() : SQLStatement(kStmtExecute), name(nullptr), parameters(nullptr) {}
123
124
1.75k
ExecuteStatement::~ExecuteStatement() {
125
1.75k
  free(name);
126
127
1.75k
  if (parameters) {
128
555
    for (Expr* param : *parameters) {
129
555
      delete param;
130
555
    }
131
210
    delete parameters;
132
210
  }
133
1.75k
}
134
135
// ExportStatement
136
ExportStatement::ExportStatement(ImportType type)
137
3.85k
    : SQLStatement(kStmtExport),
138
3.85k
      type(type),
139
3.85k
      filePath(nullptr),
140
3.85k
      schema(nullptr),
141
3.85k
      tableName(nullptr),
142
3.85k
      select(nullptr),
143
3.85k
      encoding(nullptr),
144
3.85k
      csv_options(nullptr) {}
145
146
3.85k
ExportStatement::~ExportStatement() {
147
3.85k
  free(filePath);
148
3.85k
  free(schema);
149
3.85k
  free(tableName);
150
3.85k
  delete select;
151
3.85k
  free(encoding);
152
3.85k
  delete csv_options;
153
3.85k
}
154
155
1.93k
CsvOptions::CsvOptions() : delimiter(nullptr), null(nullptr), quote(nullptr) {}
156
1.93k
CsvOptions::~CsvOptions() {
157
1.93k
  free(delimiter);
158
1.93k
  free(null);
159
1.93k
  free(quote);
160
1.93k
}
161
162
2.62k
bool CsvOptions::accept_csv_option(std::pair<CsvOptionType, char*>* option) {
163
2.62k
  switch (option->first) {
164
785
    case CsvOptionType::Delimiter:
165
785
      if (delimiter != nullptr) {
166
1
        return false;
167
1
      }
168
784
      delimiter = option->second;
169
784
      break;
170
1.02k
    case CsvOptionType::Null:
171
1.02k
      if (null != nullptr) {
172
1
        return false;
173
1
      }
174
1.02k
      null = option->second;
175
1.02k
      break;
176
818
    case CsvOptionType::Quote:
177
818
      if (quote != nullptr) {
178
5
        return false;
179
5
      }
180
813
      quote = option->second;
181
813
      break;
182
2.62k
  }
183
184
2.61k
  return true;
185
2.62k
}
186
187
6.17k
ImportExportOptions::ImportExportOptions() : format(kImportAuto), encoding(nullptr), csv_options(nullptr) {}
188
189
6.17k
ImportExportOptions::~ImportExportOptions() {
190
6.17k
  free(encoding);
191
6.17k
  delete csv_options;
192
6.17k
}
193
194
// ImportStatement
195
ImportStatement::ImportStatement(ImportType type)
196
2.26k
    : SQLStatement(kStmtImport),
197
2.26k
      type(type),
198
2.26k
      filePath(nullptr),
199
2.26k
      schema(nullptr),
200
2.26k
      tableName(nullptr),
201
2.26k
      whereClause(nullptr),
202
2.26k
      encoding(nullptr),
203
2.26k
      csv_options(nullptr) {}
204
205
2.26k
ImportStatement::~ImportStatement() {
206
2.26k
  free(filePath);
207
2.26k
  free(schema);
208
2.26k
  free(tableName);
209
2.26k
  delete whereClause;
210
2.26k
  free(encoding);
211
2.26k
  delete csv_options;
212
2.26k
}
213
214
// InsertStatement
215
InsertStatement::InsertStatement(InsertType type)
216
2.08k
    : SQLStatement(kStmtInsert),
217
2.08k
      type(type),
218
2.08k
      schema(nullptr),
219
2.08k
      tableName(nullptr),
220
2.08k
      columns(nullptr),
221
2.08k
      values(nullptr),
222
2.08k
      select(nullptr) {}
223
224
2.08k
InsertStatement::~InsertStatement() {
225
2.08k
  free(schema);
226
2.08k
  free(tableName);
227
2.08k
  delete select;
228
229
2.08k
  if (columns) {
230
439
    for (char* column : *columns) {
231
439
      free(column);
232
439
    }
233
245
    delete columns;
234
245
  }
235
236
2.08k
  if (values) {
237
1.36k
    for (Expr* expr : *values) {
238
1.36k
      delete expr;
239
1.36k
    }
240
945
    delete values;
241
945
  }
242
2.08k
}
243
244
// ShowStatament
245
3.15k
ShowStatement::ShowStatement(ShowType type) : SQLStatement(kStmtShow), type(type), schema(nullptr), name(nullptr) {}
246
247
3.15k
ShowStatement::~ShowStatement() {
248
3.15k
  free(schema);
249
3.15k
  free(name);
250
3.15k
}
251
252
// SelectStatement.h
253
254
// OrderDescription
255
OrderDescription::OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering)
256
7.62k
    : type(type), expr(expr), null_ordering(null_ordering) {}
257
258
7.62k
OrderDescription::~OrderDescription() { delete expr; }
259
260
// LimitDescription
261
4.88k
LimitDescription::LimitDescription(Expr* limit, Expr* offset) : limit(limit), offset(offset) {}
262
263
4.88k
LimitDescription::~LimitDescription() {
264
4.88k
  delete limit;
265
4.88k
  delete offset;
266
4.88k
}
267
268
// GroypByDescription
269
1.72k
GroupByDescription::GroupByDescription() : columns(nullptr), having(nullptr) {}
270
271
1.72k
GroupByDescription::~GroupByDescription() {
272
1.72k
  delete having;
273
274
1.72k
  if (columns) {
275
35.3k
    for (Expr* expr : *columns) {
276
35.3k
      delete expr;
277
35.3k
    }
278
1.72k
    delete columns;
279
1.72k
  }
280
1.72k
}
281
282
1.30k
WithDescription::~WithDescription() {
283
1.30k
  free(alias);
284
1.30k
  delete select;
285
1.30k
}
286
287
// SelectStatement
288
SelectStatement::SelectStatement()
289
25.2k
    : SQLStatement(kStmtSelect),
290
25.2k
      fromTable(nullptr),
291
25.2k
      selectDistinct(false),
292
25.2k
      selectList(nullptr),
293
25.2k
      whereClause(nullptr),
294
25.2k
      groupBy(nullptr),
295
25.2k
      setOperations(nullptr),
296
25.2k
      order(nullptr),
297
25.2k
      withDescriptions(nullptr),
298
25.2k
      limit(nullptr),
299
25.2k
      lockings(nullptr) {}
300
301
24.8k
SelectStatement::~SelectStatement() {
302
24.8k
  delete fromTable;
303
24.8k
  delete whereClause;
304
24.8k
  delete groupBy;
305
24.8k
  delete limit;
306
307
  // Delete each element in the select list.
308
24.8k
  if (selectList) {
309
102k
    for (Expr* expr : *selectList) {
310
102k
      delete expr;
311
102k
    }
312
24.8k
    delete selectList;
313
24.8k
  }
314
315
24.8k
  if (order) {
316
2.67k
    for (OrderDescription* desc : *order) {
317
2.67k
      delete desc;
318
2.67k
    }
319
960
    delete order;
320
960
  }
321
322
24.8k
  if (withDescriptions) {
323
1.30k
    for (WithDescription* desc : *withDescriptions) {
324
1.30k
      delete desc;
325
1.30k
    }
326
538
    delete withDescriptions;
327
538
  }
328
329
24.8k
  if (setOperations) {
330
3.72k
    for (SetOperation* setOperation : *setOperations) {
331
3.72k
      delete setOperation;
332
3.72k
    }
333
3.25k
    delete setOperations;
334
3.25k
  }
335
336
24.8k
  if (lockings) {
337
2.97k
    for (LockingClause* lockingClause : *lockings) {
338
2.97k
      if (lockingClause->tables) {
339
460
        for (char* dtable : *lockingClause->tables) {
340
460
          free(dtable);
341
460
        }
342
266
        delete lockingClause->tables;
343
266
      }
344
2.97k
      delete lockingClause;
345
2.97k
    }
346
442
    delete lockings;
347
442
  }
348
24.8k
}
349
350
// UpdateStatement
351
1.05k
UpdateStatement::UpdateStatement() : SQLStatement(kStmtUpdate), table(nullptr), updates(nullptr), where(nullptr) {}
352
353
1.05k
UpdateStatement::~UpdateStatement() {
354
1.05k
  delete table;
355
1.05k
  delete where;
356
357
1.05k
  if (updates) {
358
2.51k
    for (UpdateClause* update : *updates) {
359
2.51k
      free(update->column);
360
2.51k
      delete update->value;
361
2.51k
      delete update;
362
2.51k
    }
363
1.05k
    delete updates;
364
1.05k
  }
365
1.05k
}
366
367
// Alias
368
8.49k
Alias::Alias(char* name, std::vector<char*>* columns) : name(name), columns(columns) {}
369
370
8.49k
Alias::~Alias() {
371
8.49k
  free(name);
372
8.49k
  if (columns) {
373
1.40k
    for (char* column : *columns) {
374
1.40k
      free(column);
375
1.40k
    }
376
302
    delete columns;
377
302
  }
378
8.49k
}
379
380
// TableRef
381
TableRef::TableRef(TableRefType type)
382
248k
    : type(type), schema(nullptr), name(nullptr), alias(nullptr), select(nullptr), list(nullptr), join(nullptr) {}
383
384
248k
TableRef::~TableRef() {
385
248k
  free(schema);
386
248k
  free(name);
387
388
248k
  delete select;
389
248k
  delete join;
390
248k
  delete alias;
391
392
248k
  if (list) {
393
5.51k
    for (TableRef* table : *list) {
394
5.51k
      delete table;
395
5.51k
    }
396
681
    delete list;
397
681
  }
398
248k
}
399
400
0
bool TableRef::hasSchema() const { return schema != nullptr; }
401
402
0
const char* TableRef::getName() const {
403
0
  if (alias)
404
0
    return alias->name;
405
0
  else
406
0
    return name;
407
0
}
408
409
// JoinDefinition
410
JoinDefinition::JoinDefinition()
411
110k
    : left(nullptr), right(nullptr), condition(nullptr), namedColumns(nullptr), type(kJoinInner) {}
412
413
110k
JoinDefinition::~JoinDefinition() {
414
110k
  delete left;
415
110k
  delete right;
416
110k
  delete condition;
417
418
110k
  if (namedColumns) {
419
929
    for (auto* column : *namedColumns) {
420
929
      free(column);
421
929
    }
422
734
    delete namedColumns;
423
734
  }
424
110k
}
425
426
4.76k
SetOperation::SetOperation() : nestedSelectStatement(nullptr), resultOrder(nullptr), resultLimit(nullptr) {}
427
428
4.76k
SetOperation::~SetOperation() {
429
4.76k
  delete nestedSelectStatement;
430
4.76k
  delete resultLimit;
431
432
4.76k
  if (resultOrder) {
433
1.56k
    for (OrderDescription* desc : *resultOrder) {
434
1.56k
      delete desc;
435
1.56k
    }
436
845
    delete resultOrder;
437
845
  }
438
4.76k
}
439
440
}  // namespace hsql