summaryrefslogtreecommitdiff
path: root/sql/item_xmlfunc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/item_xmlfunc.cc')
-rw-r--r--sql/item_xmlfunc.cc64
1 files changed, 26 insertions, 38 deletions
diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc
index 91f958d5b70..71900c26c2d 100644
--- a/sql/item_xmlfunc.cc
+++ b/sql/item_xmlfunc.cc
@@ -1304,30 +1304,6 @@ my_xpath_init(MY_XPATH *xpath)
}
-/*
- Some ctype-alike helper functions. Note, we cannot
- reuse cs->ident_map[], because in Xpath, unlike in SQL,
- dash character is a valid identifier part.
-*/
-static int
-my_xident_beg(int c)
-{
- return (((c) >= 'a' && (c) <= 'z') ||
- ((c) >= 'A' && (c) <= 'Z') ||
- ((c) == '_'));
-}
-
-
-static int
-my_xident_body(int c)
-{
- return (((c) >= 'a' && (c) <= 'z') ||
- ((c) >= 'A' && (c) <= 'Z') ||
- ((c) >= '0' && (c) <= '9') ||
- ((c)=='-') || ((c) == '_'));
-}
-
-
static int
my_xdigit(int c)
{
@@ -1350,7 +1326,7 @@ static void
my_xpath_lex_scan(MY_XPATH *xpath,
MY_XPATH_LEX *lex, const char *beg, const char *end)
{
- int ch;
+ int ch, ctype, length;
for ( ; beg < end && *beg == ' ' ; beg++); // skip leading spaces
lex->beg= beg;
@@ -1360,20 +1336,20 @@ my_xpath_lex_scan(MY_XPATH *xpath,
lex->term= MY_XPATH_LEX_EOF; // end of line reached
return;
}
- ch= *beg++;
-
- if (ch > 0 && ch < 128 && simpletok[ch])
- {
- // a token consisting of one character found
- lex->end= beg;
- lex->term= ch;
- return;
- }
-
- if (my_xident_beg(ch)) // ident, or a function call, or a keyword
+
+ // Check ident, or a function call, or a keyword
+ if ((length= xpath->cs->cset->ctype(xpath->cs, &ctype,
+ (const uchar*) beg,
+ (const uchar*) end)) > 0 &&
+ ((ctype & (_MY_L | _MY_U)) || *beg == '_'))
{
- // scan until the end of the identifier
- for ( ; beg < end && my_xident_body(*beg); beg++);
+ // scan untill the end of the idenfitier
+ for (beg+= length;
+ (length= xpath->cs->cset->ctype(xpath->cs, &ctype,
+ (const uchar*) beg,
+ (const uchar*) end)) > 0 &&
+ ((ctype & (_MY_L | _MY_U | _MY_NMR)) || *beg == '_' || *beg == '-') ;
+ beg+= length) /* no op */;
lex->end= beg;
// check if a function call
@@ -1388,6 +1364,18 @@ my_xpath_lex_scan(MY_XPATH *xpath,
return;
}
+
+ ch= *beg++;
+
+ if (ch > 0 && ch < 128 && simpletok[ch])
+ {
+ // a token consisting of one character found
+ lex->end= beg;
+ lex->term= ch;
+ return;
+ }
+
+
if (my_xdigit(ch)) // a sequence of digits
{
for ( ; beg < end && my_xdigit(*beg) ; beg++);