Commit 334af053 authored by bar@mysql.com's avatar bar@mysql.com

Bug#16319: XML: extractvalue() returns syntax errors for some functions

parent 3c2e84f7
...@@ -468,6 +468,30 @@ extractValue(@xml, '/a/@b[substring(.,2,1)="1"]') ...@@ -468,6 +468,30 @@ extractValue(@xml, '/a/@b[substring(.,2,1)="1"]')
select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]'); select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
extractValue(@xml, '/a/@b[substring(.,2,1)="2"]') extractValue(@xml, '/a/@b[substring(.,2,1)="2"]')
12 22 12 22
SET @xml='<a><b>b1</b><b>b2</b></a>';
SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
extractValue(@xml, '/a/b[string-length("x")=1]')
b1 b2
SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
extractValue(@xml, '/a/b[string-length("xx")=2]')
b1 b2
SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
extractValue(@xml, '/a/b[string-length("xxx")=2]')
SELECT extractValue(@xml, '/a/b[string-length("x")]');
extractValue(@xml, '/a/b[string-length("x")]')
b1
SELECT extractValue(@xml, '/a/b[string-length("xx")]');
extractValue(@xml, '/a/b[string-length("xx")]')
b2
SELECT extractValue(@xml, '/a/b[string-length()]');
extractValue(@xml, '/a/b[string-length()]')
b2
SELECT extractValue(@xml, 'string-length()');
ERROR HY000: XPATH syntax error: ''
SELECT extractValue(@xml, 'string-length("x")');
extractValue(@xml, 'string-length("x")')
1
SET @xml='<a b="b11" b="b12" b="b21" b="22"/>'; SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
select extractValue(@xml,'/a/@b'); select extractValue(@xml,'/a/@b');
extractValue(@xml,'/a/@b') extractValue(@xml,'/a/@b')
......
...@@ -192,6 +192,20 @@ select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]'); ...@@ -192,6 +192,20 @@ select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');
select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]'); select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');
select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]'); select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
#
# Bug#16319: XML: extractvalue() returns syntax errors for some functions
#
SET @xml='<a><b>b1</b><b>b2</b></a>';
SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
SELECT extractValue(@xml, '/a/b[string-length("x")]');
SELECT extractValue(@xml, '/a/b[string-length("xx")]');
SELECT extractValue(@xml, '/a/b[string-length()]');
--error 1105
SELECT extractValue(@xml, 'string-length()');
SELECT extractValue(@xml, 'string-length("x")');
SET @xml='<a b="b11" b="b12" b="b21" b="22"/>'; SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
select extractValue(@xml,'/a/@b'); select extractValue(@xml,'/a/@b');
select extractValue(@xml,'/a/@b[contains(.,"1")]'); select extractValue(@xml,'/a/@b[contains(.,"1")]');
......
...@@ -1133,6 +1133,13 @@ static Item *create_func_number(MY_XPATH *xpath, Item **args, uint nargs) ...@@ -1133,6 +1133,13 @@ static Item *create_func_number(MY_XPATH *xpath, Item **args, uint nargs)
} }
static Item *create_func_string_length(MY_XPATH *xpath, Item **args, uint nargs)
{
Item *arg= nargs ? args[0] : xpath->context;
return arg ? new Item_func_char_length(arg) : 0;
}
static Item *create_func_round(MY_XPATH *xpath, Item **args, uint nargs) static Item *create_func_round(MY_XPATH *xpath, Item **args, uint nargs)
{ {
return new Item_func_round(args[0], new Item_int((char*)"0",0,1),0); return new Item_func_round(args[0], new Item_int((char*)"0",0,1),0);
...@@ -1243,9 +1250,11 @@ static MY_XPATH_FUNC my_func_names[] = ...@@ -1243,9 +1250,11 @@ static MY_XPATH_FUNC my_func_names[] =
{"substring" , 9 , 2 , 3 , create_func_substr}, {"substring" , 9 , 2 , 3 , create_func_substr},
{"translate" , 9 , 3 , 3 , 0}, {"translate" , 9 , 3 , 3 , 0},
{"local-name" , 10 , 0 , 1 , 0}, {"local-name" , 10 , 0 , 1 , 0},
{"starts-with" , 11 , 2 , 2 , 0}, {"starts-with" , 11 , 2 , 2 , 0},
{"namespace-uri" , 13 , 0 , 1 , 0}, {"namespace-uri" , 13 , 0 , 1 , 0},
{"string-length" , 13 , 0 , 1 , create_func_string_length},
{"substring-after" , 15 , 2 , 2 , 0}, {"substring-after" , 15 , 2 , 2 , 0},
{"normalize-space" , 15 , 0 , 1 , 0}, {"normalize-space" , 15 , 0 , 1 , 0},
{"substring-before" , 16 , 2 , 2 , 0}, {"substring-before" , 16 , 2 , 2 , 0},
...@@ -1849,7 +1858,12 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath) ...@@ -1849,7 +1858,12 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath)
for (nargs= 0 ; nargs < func->maxargs; ) for (nargs= 0 ; nargs < func->maxargs; )
{ {
if (!my_xpath_parse_Expr(xpath)) if (!my_xpath_parse_Expr(xpath))
{
if (nargs < func->minargs)
return 0; return 0;
else
goto right_paren;
}
args[nargs++]= xpath->item; args[nargs++]= xpath->item;
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COMMA)) if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COMMA))
{ {
...@@ -1859,6 +1873,8 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath) ...@@ -1859,6 +1873,8 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath)
break; break;
} }
} }
right_paren:
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_RP)) if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_RP))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment