1
0
Fork 0

Bug fix 3.4/fix parsing unterminated strings (#10157)

* fix parsing of unterminated string literals

* added CHANGELOG entry

* added generated file
This commit is contained in:
Jan 2019-10-09 15:35:29 +02:00 committed by KVS85
parent 95ae2eeb11
commit b4e56f4285
4 changed files with 76 additions and 5 deletions

View File

@ -1,6 +1,16 @@
v3.4.9 (XXX-XX-XX)
-------------------
* Properly report parse errors for extraneous unterminated string literals
at the end of AQL query strings. For example, in the query `RETURN 1 "abc`,
the `RETURN 1` part was parsed fully, and the `"abc` part at the end was
parsed until the EOF and then forgotten. But as the fully parsed tokens
`RETURN 1` already form a proper query, the unterminated string literal
at the end was not reported as a parse error.
This is now fixed for unterminated string literals in double and single
quotes as well as unterminated multi-line comments at the end of the query
string.
* Fixed issue #10078: FULLTEXT with sort on same field not working.
* Fixed issue #10062: AQL: Could not extract custom attribute.

View File

@ -2021,6 +2021,12 @@ YY_RULE_SETUP
/* newline character inside backtick */
}
YY_BREAK
case YY_STATE_EOF(BACKTICK):
{
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated identifier", yylloc->first_line, yylloc->first_column);
}
YY_BREAK
case 67:
YY_RULE_SETUP
{
@ -2059,6 +2065,12 @@ YY_RULE_SETUP
/* newline character inside forwardtick */
}
YY_BREAK
case YY_STATE_EOF(FORWARDTICK):
{
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated identifier", yylloc->first_line, yylloc->first_column);
}
YY_BREAK
case 72:
YY_RULE_SETUP
{
@ -2099,6 +2111,12 @@ YY_RULE_SETUP
/* newline character inside quote */
}
YY_BREAK
case YY_STATE_EOF(DOUBLE_QUOTE):
{
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated string literal", yylloc->first_line, yylloc->first_column);
}
YY_BREAK
case 77:
YY_RULE_SETUP
{
@ -2136,6 +2154,12 @@ YY_RULE_SETUP
/* newline character inside quote */
}
YY_BREAK
case YY_STATE_EOF(SINGLE_QUOTE):
{
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated string literal", yylloc->first_line, yylloc->first_column);
}
YY_BREAK
case 82:
YY_RULE_SETUP
{
@ -2287,6 +2311,12 @@ YY_RULE_SETUP
// eat the lone star
}
YY_BREAK
case YY_STATE_EOF(COMMENT_MULTI):
{
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated multi-line comment", yylloc->first_line, yylloc->first_column);
}
YY_BREAK
case 96:
/* rule 96 can match eol */
YY_RULE_SETUP
@ -2344,12 +2374,7 @@ YY_RULE_SETUP
ECHO;
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(BACKTICK):
case YY_STATE_EOF(FORWARDTICK):
case YY_STATE_EOF(SINGLE_QUOTE):
case YY_STATE_EOF(DOUBLE_QUOTE):
case YY_STATE_EOF(COMMENT_SINGLE):
case YY_STATE_EOF(COMMENT_MULTI):
yyterminate();
case YY_END_OF_BUFFER:

View File

@ -356,6 +356,11 @@ class Parser;
/* newline character inside backtick */
}
<BACKTICK><<EOF>> {
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated identifier", yylloc->first_line, yylloc->first_column);
}
<BACKTICK>. {
/* any character (except newline) inside backtick */
}
@ -384,6 +389,11 @@ class Parser;
/* newline character inside forwardtick */
}
<FORWARDTICK><<EOF>> {
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated identifier", yylloc->first_line, yylloc->first_column);
}
<FORWARDTICK>. {
/* any character (except newline) inside forwardtick */
}
@ -414,6 +424,11 @@ class Parser;
/* newline character inside quote */
}
<DOUBLE_QUOTE><<EOF>> {
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated string literal", yylloc->first_line, yylloc->first_column);
}
<DOUBLE_QUOTE>. {
/* any character (except newline) inside quote */
}
@ -440,6 +455,11 @@ class Parser;
/* newline character inside quote */
}
<SINGLE_QUOTE><<EOF>> {
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated string literal", yylloc->first_line, yylloc->first_column);
}
<SINGLE_QUOTE>. {
/* any character (except newline) inside quote */
}
@ -566,6 +586,11 @@ class Parser;
// eat the lone star
}
<COMMENT_MULTI><<EOF>> {
auto parser = yyextra;
parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected unterminated multi-line comment", yylloc->first_line, yylloc->first_column);
}
<COMMENT_MULTI>\n {
/* line numbers are counted elsewhere already */
yycolumn = 0;

View File

@ -119,6 +119,17 @@ function ahuacatlParseTestSuite () {
assertParseError(errors.ERROR_QUERY_PARSE.code, "return 1 + 1 +");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return (1");
assertParseError(errors.ERROR_QUERY_PARSE.code, "for f1 in x1");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return 00");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return 01");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return 1.");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return -");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return +");
assertParseError(errors.ERROR_QUERY_PARSE.code, "return .");
assertParseError(errors.ERROR_QUERY_PARSE.code, "RETURN 1 /* ");
assertParseError(errors.ERROR_QUERY_PARSE.code, "RETURN 1 \" foo ");
assertParseError(errors.ERROR_QUERY_PARSE.code, "RETURN 1 ' foo ");
assertParseError(errors.ERROR_QUERY_PARSE.code, "RETURN 1 `foo ");
assertParseError(errors.ERROR_QUERY_PARSE.code, "RETURN 1 ´foo ");
},
////////////////////////////////////////////////////////////////////////////////