Commit 5c0e1d5e authored by bar@mysql.com's avatar bar@mysql.com

Merge mysql.com:/usr/home/bar/mysql-5.1-new

into  mysql.com:/usr/home/bar/mysql-5.1-new.b18285
parents 40002154 9bf1fb4c
...@@ -609,6 +609,9 @@ extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin) ...@@ -609,6 +609,9 @@ extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin)
select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]'); select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]') extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]')
select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1')
test
select extractValue('<e>1</e>','position()'); select extractValue('<e>1</e>','position()');
ERROR HY000: XPATH syntax error: '' ERROR HY000: XPATH syntax error: ''
select extractValue('<e>1</e>','last()'); select extractValue('<e>1</e>','last()');
......
...@@ -278,6 +278,12 @@ select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]'); ...@@ -278,6 +278,12 @@ select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');
select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin); select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin);
select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]'); select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
#
# Bug#18285: ExtractValue not returning character
# data within <![CDATA[]]> as expected
#
select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
# #
# Bug #18171 XML: ExtractValue: the XPath position() # Bug #18171 XML: ExtractValue: the XPath position()
# function crashes the server! # function crashes the server!
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#define MY_XML_TEXT 'T' #define MY_XML_TEXT 'T'
#define MY_XML_QUESTION '?' #define MY_XML_QUESTION '?'
#define MY_XML_EXCLAM '!' #define MY_XML_EXCLAM '!'
#define MY_XML_CDATA 'D'
typedef struct xml_attr_st typedef struct xml_attr_st
{ {
...@@ -45,6 +46,7 @@ static const char *lex2str(int lex) ...@@ -45,6 +46,7 @@ static const char *lex2str(int lex)
case MY_XML_EOF: return "EOF"; case MY_XML_EOF: return "EOF";
case MY_XML_STRING: return "STRING"; case MY_XML_STRING: return "STRING";
case MY_XML_IDENT: return "IDENT"; case MY_XML_IDENT: return "IDENT";
case MY_XML_CDATA: return "CDATA";
case MY_XML_EQ: return "'='"; case MY_XML_EQ: return "'='";
case MY_XML_LT: return "'<'"; case MY_XML_LT: return "'<'";
case MY_XML_GT: return "'>'"; case MY_XML_GT: return "'>'";
...@@ -90,6 +92,20 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a) ...@@ -90,6 +92,20 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
a->end=p->cur; a->end=p->cur;
lex=MY_XML_COMMENT; lex=MY_XML_COMMENT;
} }
else if (!bcmp(p->cur, "<![CDATA[",9))
{
p->cur+= 9;
for (; p->cur < p->end - 2 ; p->cur++)
{
if (p->cur[0] == ']' && p->cur[1] == ']' && p->cur[2] == '>')
{
p->cur+= 3;
a->end= p->cur;
break;
}
}
lex= MY_XML_CDATA;
}
else if (strchr("?=/<>!",p->cur[0])) else if (strchr("?=/<>!",p->cur[0]))
{ {
p->cur++; p->cur++;
...@@ -215,7 +231,13 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len) ...@@ -215,7 +231,13 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len)
lex=my_xml_scan(p,&a); lex=my_xml_scan(p,&a);
if (MY_XML_COMMENT == lex) if (MY_XML_COMMENT == lex)
continue;
if (lex == MY_XML_CDATA)
{ {
a.beg+= 9;
a.end-= 3;
my_xml_value(p, a.beg, (uint) (a.end-a.beg));
continue; continue;
} }
......
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