/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 |