summaryrefslogtreecommitdiff
path: root/sql/item_xmlfunc.cc
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2006-02-28 13:59:16 +0400
committerunknown <bar@mysql.com>2006-02-28 13:59:16 +0400
commit828de833bf3d981a28c94346121d99ef6efb30b4 (patch)
tree1bec14b78e774e920471b487216af2d2bec36f3a /sql/item_xmlfunc.cc
parente2393aa24a02505688aabc73fa4ebf79aeff17d9 (diff)
downloadmariadb-git-828de833bf3d981a28c94346121d99ef6efb30b4.tar.gz
Bug#16313 XML: extractvalue() ignores '!' in names
xml.result, xml.test: Adding test case. item_xmlfunc.cc: Fixed that the "!" character written at the end was ignored. Now if we try to scan "!=", and if "!" is not followed by "=", we rollback lex scanner back to "!" token, so the parser will start to check the next rule from the "!" character again. Previously parser started from the next character, which was EOF in the example in xml.test, which led to query being successfully parsed, instead of producing a syntax error. sql/item_xmlfunc.cc: Bug#16313 XML: extractvalue() ignores '!' in names '!' at the end was ignored. Now if we try to scan "!=", and if "!" is not followed by "=", we rollback lex scanner back to "!" token, so the parser will start to check the next rule from the "!" character again. Previously it started from the next character, which was EOF in the example in xml.test, and which led to query being successfully parsed, instead of producing a syntax error. mysql-test/t/xml.test: Adding test case. mysql-test/r/xml.result: Adding test case.
Diffstat (limited to 'sql/item_xmlfunc.cc')
-rw-r--r--sql/item_xmlfunc.cc13
1 files changed, 11 insertions, 2 deletions
diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc
index d86b6acfc56..aad9e12f6c5 100644
--- a/sql/item_xmlfunc.cc
+++ b/sql/item_xmlfunc.cc
@@ -1976,8 +1976,17 @@ static int my_xpath_parse_AndExpr(MY_XPATH *xpath)
*/
static int my_xpath_parse_ne(MY_XPATH *xpath)
{
- return my_xpath_parse_term(xpath, MY_XPATH_LEX_EXCL) &&
- my_xpath_parse_term(xpath, MY_XPATH_LEX_EQ);
+ MY_XPATH_LEX prevtok= xpath->prevtok;
+ if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_EXCL))
+ return 0;
+ if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_EQ))
+ {
+ /* Unget the exclamation mark */
+ xpath->lasttok= xpath->prevtok;
+ xpath->prevtok= prevtok;
+ return 0;
+ }
+ return 1;
}
static int my_xpath_parse_EqualityOperator(MY_XPATH *xpath)
{