Coverage Report

Created: 2026-11-12 07:02

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.15M
    : 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.95k
DeleteStatement::DeleteStatement() : SQLStatement(kStmtDelete), schema(nullptr), tableName(nullptr), expr(nullptr) {}
78
79
1.95k
DeleteStatement::~DeleteStatement() {
80
1.95k
  free(schema);
81
1.95k
  free(tableName);
82
1.95k
  delete expr;
83
1.95k
}
84
85
// DropStatement
86
DropStatement::DropStatement(DropType type)
87
4.21k
    : SQLStatement(kStmtDrop), type(type), schema(nullptr), name(nullptr), indexName(nullptr) {}
88
89
4.21k
DropStatement::~DropStatement() {
90
4.21k
  free(schema);
91
4.21k
  free(name);
92
4.21k
  free(indexName);
93
4.21k
}
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
92.1k
    : SQLStatement(kStmtTransaction), command(command) {}
118
119
92.1k
TransactionStatement::~TransactionStatement() {}
120
121
// ExecuteStatement
122
2.54k
ExecuteStatement::ExecuteStatement() : SQLStatement(kStmtExecute), name(nullptr), parameters(nullptr) {}
123
124
2.54k
ExecuteStatement::~ExecuteStatement() {
125
2.54k
  free(name);
126
127
2.54k
  if (parameters) {
128
1.22k
    for (Expr* param : *parameters) {
129
1.22k
      delete param;
130
1.22k
    }
131
428
    delete parameters;
132
428
  }
133
2.54k
}
134
135
// ExportStatement
136
ExportStatement::ExportStatement(ImportType type)
137
5.88k
    : SQLStatement(kStmtExport),
138
5.88k
      type(type),
139
5.88k
      filePath(nullptr),
140
5.88k
      schema(nullptr),
141
5.88k
      tableName(nullptr),
142
5.88k
      select(nullptr),
143
5.88k
      encoding(nullptr),
144
5.88k
      csv_options(nullptr) {}
145
146
5.88k
ExportStatement::~ExportStatement() {
147
5.88k
  free(filePath);
148
5.88k
  free(schema);
149
5.88k
  free(tableName);
150
5.88k
  delete select;
151
5.88k
  free(encoding);
152
5.88k
  delete csv_options;
153
5.88k
}
154
155
2.45k
CsvOptions::CsvOptions() : delimiter(nullptr), null(nullptr), quote(nullptr) {}
156
2.45k
CsvOptions::~CsvOptions() {
157
2.45k
  free(delimiter);
158
2.45k
  free(null);
159
2.45k
  free(quote);
160
2.45k
}
161
162
2.73k
bool CsvOptions::accept_csv_option(std::pair<CsvOptionType, char*>* option) {
163
2.73k
  switch (option->first) {
164
1.10k
    case CsvOptionType::Delimiter:
165
1.10k
      if (delimiter != nullptr) {
166
1
        return false;
167
1
      }
168
1.10k
      delimiter = option->second;
169
1.10k
      break;
170
1.13k
    case CsvOptionType::Null:
171
1.13k
      if (null != nullptr) {
172
4
        return false;
173
4
      }
174
1.13k
      null = option->second;
175
1.13k
      break;
176
492
    case CsvOptionType::Quote:
177
492
      if (quote != nullptr) {
178
8
        return false;
179
8
      }
180
484
      quote = option->second;
181
484
      break;
182
2.73k
  }
183
184
2.71k
  return true;
185
2.73k
}
186
187
8.76k
ImportExportOptions::ImportExportOptions() : format(kImportAuto), encoding(nullptr), csv_options(nullptr) {}
188
189
8.76k
ImportExportOptions::~ImportExportOptions() {
190
8.76k
  free(encoding);
191
8.76k
  delete csv_options;
192
8.76k
}
193
194
// ImportStatement
195
ImportStatement::ImportStatement(ImportType type)
196
2.79k
    : SQLStatement(kStmtImport),
197
2.79k
      type(type),
198
2.79k
      filePath(nullptr),
199
2.79k
      schema(nullptr),
200
2.79k
      tableName(nullptr),
201
2.79k
      whereClause(nullptr),
202
2.79k
      encoding(nullptr),
203
2.79k
      csv_options(nullptr) {}
204
205
2.79k
ImportStatement::~ImportStatement() {
206
2.79k
  free(filePath);
207
2.79k
  free(schema);
208
2.79k
  free(tableName);
209
2.79k
  delete whereClause;
210
2.79k
  free(encoding);
211
2.79k
  delete csv_options;
212
2.79k
}
213
214
// InsertStatement
215
InsertStatement::InsertStatement(InsertType type)
216
2.99k
    : SQLStatement(kStmtInsert),
217
2.99k
      type(type),
218
2.99k
      schema(nullptr),
219
2.99k
      tableName(nullptr),
220
2.99k
      columns(nullptr),
221
2.99k
      values(nullptr),
222
2.99k
      select(nullptr) {}
223
224
2.99k
InsertStatement::~InsertStatement() {
225
2.99k
  free(schema);
226
2.99k
  free(tableName);
227
2.99k
  delete select;
228
229
2.99k
  if (columns) {
230
426
    for (char* column : *columns) {
231
426
      free(column);
232
426
    }
233
232
    delete columns;
234
232
  }
235
236
2.99k
  if (values) {
237
1.40k
    for (Expr* expr : *values) {
238
1.40k
      delete expr;
239
1.40k
    }
240
990
    delete values;
241
990
  }
242
2.99k
}
243
244
// ShowStatament
245
3.73k
ShowStatement::ShowStatement(ShowType type) : SQLStatement(kStmtShow), type(type), schema(nullptr), name(nullptr) {}
246
247
3.73k
ShowStatement::~ShowStatement() {
248
3.73k
  free(schema);
249
3.73k
  free(name);
250
3.73k
}
251
252
// SelectStatement.h
253
254
// OrderDescription
255
OrderDescription::OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering)
256
237k
    : type(type), expr(expr), null_ordering(null_ordering) {}
257
258
237k
OrderDescription::~OrderDescription() { delete expr; }
259
260
// LimitDescription
261
5.06k
LimitDescription::LimitDescription(Expr* limit, Expr* offset) : limit(limit), offset(offset) {}
262
263
5.06k
LimitDescription::~LimitDescription() {
264
5.06k
  delete limit;
265
5.06k
  delete offset;
266
5.06k
}
267
268
// GroypByDescription
269
2.85k
GroupByDescription::GroupByDescription() : columns(nullptr), having(nullptr) {}
270
271
2.85k
GroupByDescription::~GroupByDescription() {
272
2.85k
  delete having;
273
274
2.85k
  if (columns) {
275
4.48k
    for (Expr* expr : *columns) {
276
4.48k
      delete expr;
277
4.48k
    }
278
2.85k
    delete columns;
279
2.85k
  }
280
2.85k
}
281
282
1.42k
WithDescription::~WithDescription() {
283
1.42k
  free(alias);
284
1.42k
  delete select;
285
1.42k
}
286
287
// SelectStatement
288
SelectStatement::SelectStatement()
289
40.3k
    : SQLStatement(kStmtSelect),
290
40.3k
      fromTable(nullptr),
291
40.3k
      selectDistinct(false),
292
40.3k
      selectList(nullptr),
293
40.3k
      whereClause(nullptr),
294
40.3k
      groupBy(nullptr),
295
40.3k
      setOperations(nullptr),
296
40.3k
      order(nullptr),
297
40.3k
      withDescriptions(nullptr),
298
40.3k
      limit(nullptr),
299
40.3k
      lockings(nullptr) {}
300
301
39.8k
SelectStatement::~SelectStatement() {
302
39.8k
  delete fromTable;
303
39.8k
  delete whereClause;
304
39.8k
  delete groupBy;
305
39.8k
  delete limit;
306
307
  // Delete each element in the select list.
308
39.8k
  if (selectList) {
309
121k
    for (Expr* expr : *selectList) {
310
121k
      delete expr;
311
121k
    }
312
39.8k
    delete selectList;
313
39.8k
  }
314
315
39.8k
  if (order) {
316
232k
    for (OrderDescription* desc : *order) {
317
232k
      delete desc;
318
232k
    }
319
1.10k
    delete order;
320
1.10k
  }
321
322
39.8k
  if (withDescriptions) {
323
1.42k
    for (WithDescription* desc : *withDescriptions) {
324
1.42k
      delete desc;
325
1.42k
    }
326
807
    delete withDescriptions;
327
807
  }
328
329
39.8k
  if (setOperations) {
330
3.88k
    for (SetOperation* setOperation : *setOperations) {
331
3.88k
      delete setOperation;
332
3.88k
    }
333
3.61k
    delete setOperations;
334
3.61k
  }
335
336
39.8k
  if (lockings) {
337
2.88k
    for (LockingClause* lockingClause : *lockings) {
338
2.88k
      if (lockingClause->tables) {
339
4.49k
        for (char* dtable : *lockingClause->tables) {
340
4.49k
          free(dtable);
341
4.49k
        }
342
203
        delete lockingClause->tables;
343
203
      }
344
2.88k
      delete lockingClause;
345
2.88k
    }
346
447
    delete lockings;
347
447
  }
348
39.8k
}
349
350
// UpdateStatement
351
1.52k
UpdateStatement::UpdateStatement() : SQLStatement(kStmtUpdate), table(nullptr), updates(nullptr), where(nullptr) {}
352
353
1.52k
UpdateStatement::~UpdateStatement() {
354
1.52k
  delete table;
355
1.52k
  delete where;
356
357
1.52k
  if (updates) {
358
2.62k
    for (UpdateClause* update : *updates) {
359
2.62k
      free(update->column);
360
2.62k
      delete update->value;
361
2.62k
      delete update;
362
2.62k
    }
363
1.52k
    delete updates;
364
1.52k
  }
365
1.52k
}
366
367
// Alias
368
14.0k
Alias::Alias(char* name, std::vector<char*>* columns) : name(name), columns(columns) {}
369
370
14.0k
Alias::~Alias() {
371
14.0k
  free(name);
372
14.0k
  if (columns) {
373
897
    for (char* column : *columns) {
374
897
      free(column);
375
897
    }
376
311
    delete columns;
377
311
  }
378
14.0k
}
379
380
// TableRef
381
TableRef::TableRef(TableRefType type)
382
746k
    : type(type), schema(nullptr), name(nullptr), alias(nullptr), select(nullptr), list(nullptr), join(nullptr) {}
383
384
746k
TableRef::~TableRef() {
385
746k
  free(schema);
386
746k
  free(name);
387
388
746k
  delete select;
389
746k
  delete join;
390
746k
  delete alias;
391
392
746k
  if (list) {
393
25.5k
    for (TableRef* table : *list) {
394
25.5k
      delete table;
395
25.5k
    }
396
1.45k
    delete list;
397
1.45k
  }
398
746k
}
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
1.06k
    for (auto* column : *namedColumns) {
420
1.06k
      free(column);
421
1.06k
    }
422
873
    delete namedColumns;
423
873
  }
424
110k
}
425
426
5.02k
SetOperation::SetOperation() : nestedSelectStatement(nullptr), resultOrder(nullptr), resultLimit(nullptr) {}
427
428
5.02k
SetOperation::~SetOperation() {
429
5.02k
  delete nestedSelectStatement;
430
5.02k
  delete resultLimit;
431
432
5.02k
  if (resultOrder) {
433
1.19k
    for (OrderDescription* desc : *resultOrder) {
434
1.19k
      delete desc;
435
1.19k
    }
436
461
    delete resultOrder;
437
461
  }
438
5.02k
}
439
440
}  // namespace hsql