Skip to content

Commit 90d6851

Browse files
authored
Update yacc_sql.y (#595)
Fix memory leak of token when bison failed to parse SQL. Use left recursion for better performance and remove vector reverse. ### What problem were solved in this pull request? When bison fails to parse SQL, memory leaks may occur, such as select * from t where id><1; Issue Number: close #308 Problem: ### What is changed and how it works? In yacc_sql.y, use %destructor to specify the memory release action that needs to be called when parsing fails for the token, in order to prevent memory leaks that may occur in the event of an error. ### Other information
1 parent b798308 commit 90d6851

File tree

1 file changed

+37
-39
lines changed

1 file changed

+37
-39
lines changed

src/observer/sql/parser/yacc_sql.y

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,19 @@ UnboundAggregateExpr *create_aggregate_expression(const char *aggregate_name,
136136
float floats;
137137
}
138138

139+
%destructor { delete $$; } <condition>
140+
%destructor { delete $$; } <value>
141+
%destructor { delete $$; } <rel_attr>
142+
%destructor { delete $$; } <attr_infos>
143+
%destructor { delete $$; } <attr_info>
144+
%destructor { delete $$; } <expression>
145+
%destructor { delete $$; } <expression_list>
146+
%destructor { delete $$; } <value_list>
147+
%destructor { delete $$; } <condition_list>
148+
// %destructor { delete $$; } <rel_attr_list>
149+
%destructor { delete $$; } <relation_list>
150+
%destructor { delete $$; } <key_list>
151+
139152
%token <number> NUMBER
140153
%token <floats> FLOAT
141154
%token <cstring> ID
@@ -304,45 +317,37 @@ drop_index_stmt: /*drop index 语句的语法解析树*/
304317
}
305318
;
306319
create_table_stmt: /*create table 语句的语法解析树*/
307-
CREATE TABLE ID LBRACE attr_def attr_def_list primary_key RBRACE storage_format
320+
CREATE TABLE ID LBRACE attr_def_list primary_key RBRACE storage_format
308321
{
309322
$$ = new ParsedSqlNode(SCF_CREATE_TABLE);
310323
CreateTableSqlNode &create_table = $$->create_table;
311324
create_table.relation_name = $3;
312325
//free($3);
313326

314-
vector<AttrInfoSqlNode> *src_attrs = $6;
315-
316-
if (src_attrs != nullptr) {
317-
create_table.attr_infos.swap(*src_attrs);
318-
delete src_attrs;
319-
}
320-
create_table.attr_infos.emplace_back(*$5);
321-
reverse(create_table.attr_infos.begin(), create_table.attr_infos.end());
327+
create_table.attr_infos.swap(*$5);
322328
delete $5;
323-
if ($7 != nullptr) {
324-
create_table.primary_keys.swap(*$7);
325-
delete $7;
329+
330+
if ($6 != nullptr) {
331+
create_table.primary_keys.swap(*$6);
332+
delete $6;
326333
}
327-
if ($9 != nullptr) {
328-
create_table.storage_format = $9;
334+
if ($8 != nullptr) {
335+
create_table.storage_format = $8;
329336
}
330337
}
331338
;
332339

333340
attr_def_list:
334-
/* empty */
341+
attr_def
335342
{
336-
$$ = nullptr;
343+
$$ = new vector<AttrInfoSqlNode>;
344+
$$->emplace_back(*$1);
345+
delete $1;
337346
}
338347
| attr_def_list COMMA attr_def
339348
{
340-
if ($1 != nullptr) {
341-
$$ = $1;
342-
} else {
343-
$$ = new vector<AttrInfoSqlNode>;
344-
}
345-
$$->insert($$->begin(), *$3);
349+
$$ = $1;
350+
$$->emplace_back(*$3);
346351
delete $3;
347352
}
348353
;
@@ -400,33 +405,26 @@ attr_list:
400405
;
401406

402407
insert_stmt: /*insert 语句的语法解析树*/
403-
INSERT INTO ID VALUES LBRACE value value_list RBRACE
408+
INSERT INTO ID VALUES LBRACE value_list RBRACE
404409
{
405410
$$ = new ParsedSqlNode(SCF_INSERT);
406411
$$->insertion.relation_name = $3;
407-
if ($7 != nullptr) {
408-
$$->insertion.values.swap(*$7);
409-
delete $7;
410-
}
411-
$$->insertion.values.emplace_back(*$6);
412-
reverse($$->insertion.values.begin(), $$->insertion.values.end());
412+
$$->insertion.values.swap(*$6);
413413
delete $6;
414414
}
415415
;
416416

417417
value_list:
418-
/* empty */
418+
value
419419
{
420-
$$ = nullptr;
420+
$$ = new vector<Value>;
421+
$$->emplace_back(*$1);
422+
delete $1;
421423
}
422-
| COMMA value value_list {
423-
if ($3 != nullptr) {
424-
$$ = $3;
425-
} else {
426-
$$ = new vector<Value>;
427-
}
428-
$$->emplace_back(*$2);
429-
delete $2;
424+
| value_list COMMA value {
425+
$$ = $1;
426+
$$->emplace_back(*$3);
427+
delete $3;
430428
}
431429
;
432430
value:

0 commit comments

Comments
 (0)