diff options
author | unknown <bar@mysql.com> | 2006-04-07 14:07:56 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2006-04-07 14:07:56 +0500 |
commit | e84041f174684beda03b25acec82b93d04445e41 (patch) | |
tree | 8d20f849c47112de0d48b8646e94b32180cefeef | |
parent | 6de776f70afb52fd4e851f57b7165d13dfa5dc95 (diff) | |
download | mariadb-git-e84041f174684beda03b25acec82b93d04445e41.tar.gz |
Bug#16319: XML: extractvalue() returns syntax errors for some functions
mysql-test/r/xml.result:
Adding test case
mysql-test/t/xml.test:
Adding test case
sql/item_xmlfunc.cc:
Adding support for missing XPath function string-length().
Fixing function lookup to allow functions with one optional arguments
(i.e. with 0 or 1 arguments)
-rw-r--r-- | mysql-test/r/xml.result | 24 | ||||
-rw-r--r-- | mysql-test/t/xml.test | 14 | ||||
-rw-r--r-- | sql/item_xmlfunc.cc | 18 |
3 files changed, 55 insertions, 1 deletions
diff --git a/mysql-test/r/xml.result b/mysql-test/r/xml.result index 52f80000015..e8d55124778 100644 --- a/mysql-test/r/xml.result +++ b/mysql-test/r/xml.result @@ -468,6 +468,30 @@ extractValue(@xml, '/a/@b[substring(.,2,1)="1"]') select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]'); extractValue(@xml, '/a/@b[substring(.,2,1)="2"]') 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"/>'; select extractValue(@xml,'/a/@b'); extractValue(@xml,'/a/@b') diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index af3ec2d827e..cadbdcb0bb8 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -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)="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"/>'; select extractValue(@xml,'/a/@b'); select extractValue(@xml,'/a/@b[contains(.,"1")]'); diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 91f958d5b70..37ae4f27cf2 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -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) { 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[] = {"substring" , 9 , 2 , 3 , create_func_substr}, {"translate" , 9 , 3 , 3 , 0}, + {"local-name" , 10 , 0 , 1 , 0}, {"starts-with" , 11 , 2 , 2 , 0}, {"namespace-uri" , 13 , 0 , 1 , 0}, + {"string-length" , 13 , 0 , 1 , create_func_string_length}, {"substring-after" , 15 , 2 , 2 , 0}, {"normalize-space" , 15 , 0 , 1 , 0}, {"substring-before" , 16 , 2 , 2 , 0}, @@ -1849,7 +1858,12 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath) for (nargs= 0 ; nargs < func->maxargs; ) { if (!my_xpath_parse_Expr(xpath)) - return 0; + { + if (nargs < func->minargs) + return 0; + else + goto right_paren; + } args[nargs++]= xpath->item; if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COMMA)) { @@ -1859,6 +1873,8 @@ static int my_xpath_parse_FunctionCall(MY_XPATH *xpath) break; } } + +right_paren: if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_RP)) return 0; |