MXS-1346: Clear value stack when a new rule is created

The values on the stack are cleared when a new rule is created.
This commit is contained in:
Markus Mäkelä
2017-09-05 10:15:43 +03:00
parent 1fcf4ef59a
commit b9698f15e7

View File

@ -629,6 +629,14 @@ struct parser_stack
ValueList values; ValueList values;
ValueList auxiliary_values; ValueList auxiliary_values;
std::string name; std::string name;
/** Helper function for adding rules */
void add(Rule* value)
{
rule.push_front(SRule(value));
values.clear();
auxiliary_values.clear();
}
}; };
/** /**
@ -815,7 +823,7 @@ void define_wildcard_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new WildCardRule(rstack->name))); rstack->add(new WildCardRule(rstack->name));
} }
/** /**
@ -827,7 +835,7 @@ void define_columns_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new ColumnsRule(rstack->name, rstack->values))); rstack->add(new ColumnsRule(rstack->name, rstack->values));
} }
/** /**
@ -839,7 +847,7 @@ void define_function_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new FunctionRule(rstack->name, rstack->values))); rstack->add(new FunctionRule(rstack->name, rstack->values));
} }
/** /**
@ -854,7 +862,7 @@ void define_function_usage_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new FunctionUsageRule(rstack->name, rstack->values))); rstack->add(new FunctionUsageRule(rstack->name, rstack->values));
} }
/** /**
@ -866,8 +874,7 @@ void define_column_function_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new ColumnFunctionRule(rstack->name, rstack->values, rstack->add(new ColumnFunctionRule(rstack->name, rstack->values, rstack->auxiliary_values));
rstack->auxiliary_values)));
} }
/** /**
@ -878,7 +885,7 @@ void define_where_clause_rule(void* scanner)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new NoWhereClauseRule(rstack->name))); rstack->add(new NoWhereClauseRule(rstack->name));
} }
/** /**
@ -889,7 +896,7 @@ void define_limit_queries_rule(void* scanner, int max, int timeperiod, int holdo
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new LimitQueriesRule(rstack->name, max, timeperiod, holdoff))); rstack->add(new LimitQueriesRule(rstack->name, max, timeperiod, holdoff));
} }
/** /**
@ -910,7 +917,7 @@ bool define_regex_rule(void* scanner, char* pattern)
{ {
struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner); struct parser_stack* rstack = (struct parser_stack*)dbfw_yyget_extra((yyscan_t) scanner);
ss_dassert(rstack); ss_dassert(rstack);
rstack->rule.push_front(SRule(new RegexRule(rstack->name, re))); rstack->add(new RegexRule(rstack->name, re));
} }
else else
{ {