@@ -149,6 +149,8 @@ struct expression_parser_context
149
149
%destructor { delete $$; } <node>
150
150
%destructor { delete $$; } <nodelist>
151
151
%destructor { delete $$; } <text>
152
+ %destructor { delete $$; } <whenthen>
153
+ %destructor { delete $$; } <whenthenlist>
152
154
153
155
%%
154
156
@@ -181,26 +183,29 @@ expression:
181
183
| FUNCTION ' (' exp_list ' )'
182
184
{
183
185
int fnIndex = QgsExpression::functionIndex(*$1 );
186
+ delete $1 ;
184
187
if (fnIndex == -1 )
185
188
{
186
189
// this should not actually happen because already in lexer we check whether an identifier is a known function
187
190
// (if the name is not known the token is parsed as a column)
188
191
exp_error (parser_ctx, " Function is not known" );
192
+ delete $3 ;
189
193
YYERROR ;
190
194
}
191
195
if ( QgsExpression::Functions()[fnIndex]->params () != -1
192
196
&& QgsExpression::Functions()[fnIndex]->params() != $3->count() )
193
197
{
194
198
exp_error (parser_ctx, " Function is called with wrong number of arguments" );
199
+ delete $3 ;
195
200
YYERROR;
196
201
}
197
202
$$ = new QgsExpression::NodeFunction(fnIndex, $3 );
198
- delete $1 ;
199
203
}
200
204
201
205
| FUNCTION ' (' ' )'
202
206
{
203
207
int fnIndex = QgsExpression::functionIndex(*$1 );
208
+ delete $1 ;
204
209
if (fnIndex == -1 )
205
210
{
206
211
// this should not actually happen because already in lexer we check whether an identifier is a known function
@@ -214,7 +219,6 @@ expression:
214
219
YYERROR;
215
220
}
216
221
$$ = new QgsExpression::NodeFunction(fnIndex, new QgsExpression::NodeList());
217
- delete $1 ;
218
222
}
219
223
220
224
| expression IN ' (' exp_list ' )' { $$ = new QgsExpression::NodeInOperator($1 , $4 , false ); }
@@ -236,30 +240,31 @@ expression:
236
240
if (fnIndex == -1 )
237
241
{
238
242
if ( !QgsExpression::hasSpecialColumn( *$1 ) )
239
- {
243
+ {
240
244
exp_error (parser_ctx, " Special column is not known" );
241
- YYERROR ;
242
- }
243
- // $var is equivalent to _specialcol_( "$var" )
244
- QgsExpression::NodeList* args = new QgsExpression::NodeList();
245
- QgsExpression::NodeLiteral* literal = new QgsExpression::NodeLiteral( *$1 );
246
- args->append ( literal );
247
- $$ = new QgsExpression::NodeFunction( QgsExpression::functionIndex( " _specialcol_" ), args );
245
+ delete $1 ;
246
+ YYERROR ;
247
+ }
248
+ // $var is equivalent to _specialcol_( "$var" )
249
+ QgsExpression::NodeList* args = new QgsExpression::NodeList();
250
+ QgsExpression::NodeLiteral* literal = new QgsExpression::NodeLiteral( *$1 );
251
+ args->append ( literal );
252
+ $$ = new QgsExpression::NodeFunction( QgsExpression::functionIndex( " _specialcol_" ), args );
248
253
}
249
- else
250
- {
251
- $$ = new QgsExpression::NodeFunction( fnIndex, NULL );
252
- delete $1 ;
253
- }
254
+ else
255
+ {
256
+ $$ = new QgsExpression::NodeFunction( fnIndex, NULL );
257
+ }
258
+ delete $1 ;
254
259
}
255
260
256
261
// variables
257
262
| VARIABLE
258
263
{
259
- // @var is equivalent to var( "var" )
260
- QgsExpression::NodeList* args = new QgsExpression::NodeList();
261
- QgsExpression::NodeLiteral* literal = new QgsExpression::NodeLiteral( QString(*$1 ).mid(1 ) );
262
- args->append ( literal );
264
+ // @var is equivalent to var( "var" )
265
+ QgsExpression::NodeList* args = new QgsExpression::NodeList();
266
+ QgsExpression::NodeLiteral* literal = new QgsExpression::NodeLiteral( QString(*$1 ).mid(1 ) );
267
+ args->append ( literal );
263
268
$$ = new QgsExpression::NodeFunction( QgsExpression::functionIndex( " var" ), args );
264
269
delete $1 ;
265
270
}
@@ -308,6 +313,7 @@ QgsExpression::Node* parseExpression(const QString& str, QString& parserErrorMsg
308
313
else // error?
309
314
{
310
315
parserErrorMsg = ctx.errorMsg ;
316
+ delete ctx.rootNode ;
311
317
return NULL ;
312
318
}
313
319
}
0 commit comments