mirror of
https://github.com/MariaDB/server.git
synced 2026-05-01 12:45:41 +02:00
Bug#18170: XML: ExtractValue(): XPath expression can't use QNames (colon in names)
Problem source: Qualified names (aka QName) didn't work as tag names and attribute names, because the parser lacked a real rule to scan QName, so it understood only non-qualified names without prefixes. Solution: New rule was added to check both "ident" and "ident:ident" sequences. mysql-test/r/xml.result: Adding test case mysql-test/t/xml.test: Adding test case sql/item_xmlfunc.cc: Adding real QName parser rule and using it in NodeTest rule.
This commit is contained in:
parent
3ef014862b
commit
1a3cb50c24
3 changed files with 42 additions and 1 deletions
|
|
@ -2266,6 +2266,30 @@ static int my_xpath_parse_Number(MY_XPATH *xpath)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
QName grammar can be found in a separate document
|
||||
http://www.w3.org/TR/REC-xml-names/#NT-QName
|
||||
|
||||
[6] QName ::= (Prefix ':')? LocalPart
|
||||
[7] Prefix ::= NCName
|
||||
[8] LocalPart ::= NCName
|
||||
*/
|
||||
static int
|
||||
my_xpath_parse_QName(MY_XPATH *xpath)
|
||||
{
|
||||
const char *beg;
|
||||
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))
|
||||
return 0;
|
||||
beg= xpath->prevtok.beg;
|
||||
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COLON))
|
||||
return 1; /* Non qualified name */
|
||||
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))
|
||||
return 0;
|
||||
xpath->prevtok.beg= beg;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Scan Variable reference
|
||||
|
||||
|
|
@ -2299,7 +2323,7 @@ my_xpath_parse_VariableReference(MY_XPATH *xpath)
|
|||
static int
|
||||
my_xpath_parse_NodeTest_QName(MY_XPATH *xpath)
|
||||
{
|
||||
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))
|
||||
if (!my_xpath_parse_QName(xpath))
|
||||
return 0;
|
||||
DBUG_ASSERT(xpath->context);
|
||||
uint len= xpath->prevtok.end - xpath->prevtok.beg;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue