diff --git a/mysql-test/r/xml.result b/mysql-test/r/xml.result
index 2946c56da6b..7e44673dd78 100644
--- a/mysql-test/r/xml.result
+++ b/mysql-test/r/xml.result
@@ -609,6 +609,9 @@ extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin)
select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]');
extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]')
+select ExtractValue('','/tag1');
+ExtractValue('','/tag1')
+test
select extractValue('1','position()');
ERROR HY000: XPATH syntax error: ''
select extractValue('1','last()');
diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test
index 4bc76287fe2..8ed623883b6 100644
--- a/mysql-test/t/xml.test
+++ b/mysql-test/t/xml.test
@@ -278,6 +278,12 @@ select extractvalue('Jack','/a[contains(../a,"j")]');
select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin);
select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]');
+#
+# Bug#18285: ExtractValue not returning character
+# data within as expected
+#
+select ExtractValue('','/tag1');
+
#
# Bug #18171 XML: ExtractValue: the XPath position()
# function crashes the server!
diff --git a/strings/xml.c b/strings/xml.c
index 705da592257..4c09e85604d 100644
--- a/strings/xml.c
+++ b/strings/xml.c
@@ -30,6 +30,7 @@
#define MY_XML_TEXT 'T'
#define MY_XML_QUESTION '?'
#define MY_XML_EXCLAM '!'
+#define MY_XML_CDATA 'D'
typedef struct xml_attr_st
{
@@ -45,6 +46,7 @@ static const char *lex2str(int lex)
case MY_XML_EOF: return "EOF";
case MY_XML_STRING: return "STRING";
case MY_XML_IDENT: return "IDENT";
+ case MY_XML_CDATA: return "CDATA";
case MY_XML_EQ: return "'='";
case MY_XML_LT: return "'<'";
case MY_XML_GT: return "'>'";
@@ -90,6 +92,20 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
a->end=p->cur;
lex=MY_XML_COMMENT;
}
+ else if (!bcmp(p->cur, "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]))
{
p->cur++;
@@ -215,7 +231,13 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len)
lex=my_xml_scan(p,&a);
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;
}