summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-09-24 13:57:26 +0500
committerunknown <bar@bar.mysql.r18.ru>2003-09-24 13:57:26 +0500
commite9299e6da9456307a13446ab13756ec654dc54da (patch)
tree448ed92b80853b37f5da3790377626724f67208d
parent4e09f14b18ededb18aab527abe582fca34afe79c (diff)
downloadmariadb-git-e9299e6da9456307a13446ab13756ec654dc54da.tar.gz
regexp worked only with the default character set.
Now it can work with any character set.
-rw-r--r--mysql-test/r/func_regexp.result24
-rw-r--r--mysql-test/t/func_regexp.test14
-rw-r--r--regex/cclass.h1
-rw-r--r--regex/regcomp.c55
4 files changed, 73 insertions, 21 deletions
diff --git a/mysql-test/r/func_regexp.result b/mysql-test/r/func_regexp.result
index 8d22994ef2b..35742136ee6 100644
--- a/mysql-test/r/func_regexp.result
+++ b/mysql-test/r/func_regexp.result
@@ -52,3 +52,27 @@ select * from t1 where xxx REGEXP '^this is some text: to test - out\\.reg exp [
xxx
this is some text: to test - out.reg exp (22/45)
drop table t1;
+select _latin1 0xFF regexp _latin1 '[[:lower:]]' COLLATE latin1_bin;
+_latin1 0xFF regexp _latin1 '[[:lower:]]' COLLATE latin1_bin
+1
+select _koi8r 0xFF regexp _koi8r '[[:lower:]]' COLLATE koi8r_bin;
+_koi8r 0xFF regexp _koi8r '[[:lower:]]' COLLATE koi8r_bin
+0
+select _latin1 0xFF regexp _latin1 '[[:upper:]]' COLLATE latin1_bin;
+_latin1 0xFF regexp _latin1 '[[:upper:]]' COLLATE latin1_bin
+0
+select _koi8r 0xFF regexp _koi8r '[[:upper:]]' COLLATE koi8r_bin;
+_koi8r 0xFF regexp _koi8r '[[:upper:]]' COLLATE koi8r_bin
+1
+select _latin1 0xF7 regexp _latin1 '[[:alpha:]]';
+_latin1 0xF7 regexp _latin1 '[[:alpha:]]'
+0
+select _koi8r 0xF7 regexp _koi8r '[[:alpha:]]';
+_koi8r 0xF7 regexp _koi8r '[[:alpha:]]'
+1
+select _latin1'a' regexp _latin1'A' collate latin1_general_ci;
+_latin1'a' regexp _latin1'A' collate latin1_general_ci
+1
+select _latin1'a' regexp _latin1'A' collate latin1_bin;
+_latin1'a' regexp _latin1'A' collate latin1_bin
+0
diff --git a/mysql-test/t/func_regexp.test b/mysql-test/t/func_regexp.test
index 6e5d601844e..6ecb56ef9c4 100644
--- a/mysql-test/t/func_regexp.test
+++ b/mysql-test/t/func_regexp.test
@@ -45,3 +45,17 @@ create table t1 (xxx char(128));
insert into t1 (xxx) values('this is some text: to test - out.reg exp (22/45)');
select * from t1 where xxx REGEXP '^this is some text: to test - out\\.reg exp [[(][0-9]+[/\\][0-9]+[])][ ]*$';
drop table t1;
+
+#
+# Check with different character sets and collations
+#
+select _latin1 0xFF regexp _latin1 '[[:lower:]]' COLLATE latin1_bin;
+select _koi8r 0xFF regexp _koi8r '[[:lower:]]' COLLATE koi8r_bin;
+select _latin1 0xFF regexp _latin1 '[[:upper:]]' COLLATE latin1_bin;
+select _koi8r 0xFF regexp _koi8r '[[:upper:]]' COLLATE koi8r_bin;
+
+select _latin1 0xF7 regexp _latin1 '[[:alpha:]]';
+select _koi8r 0xF7 regexp _koi8r '[[:alpha:]]';
+
+select _latin1'a' regexp _latin1'A' collate latin1_general_ci;
+select _latin1'a' regexp _latin1'A' collate latin1_bin;
diff --git a/regex/cclass.h b/regex/cclass.h
index e0f752f38b8..b877b5dee6b 100644
--- a/regex/cclass.h
+++ b/regex/cclass.h
@@ -18,4 +18,5 @@ extern struct cclass {
const char *name;
const char *chars;
const char *multis;
+ uint mask;
} cclasses[];
diff --git a/regex/regcomp.c b/regex/regcomp.c
index d95a0ddf5d0..6af99456c28 100644
--- a/regex/regcomp.c
+++ b/regex/regcomp.c
@@ -36,19 +36,19 @@ struct parse {
static char nuls[10]; /* place to point scanner in event of error */
struct cclass cclasses[CCLASS_LAST+1]= {
- { "alnum", "","" },
- { "alpha", "","" },
- { "blank", "","" },
- { "cntrl", "","" },
- { "digit", "","" },
- { "graph", "","" },
- { "lower", "","" },
- { "print", "","" },
- { "punct", "","" },
- { "space", "","" },
- { "upper", "","" },
- { "xdigit", "","" },
- { NULL,NULL,NULL }
+ { "alnum", "","", _U | _L | _NMR},
+ { "alpha", "","", _U | _L },
+ { "blank", "","", _B },
+ { "cntrl", "","", _CTR },
+ { "digit", "","", _NMR },
+ { "graph", "","", _PNT | _U | _L | _NMR},
+ { "lower", "","", _L },
+ { "print", "","", _PNT | _U | _L | _NMR | _B },
+ { "punct", "","", _PNT },
+ { "space", "","", _SPC },
+ { "upper", "","", _U },
+ { "xdigit", "","", _X },
+ { NULL,NULL,NULL, 0 }
};
/*
@@ -747,9 +747,7 @@ register cset *cs;
register char *sp = p->next;
register struct cclass *cp;
register size_t len;
- register char *u;
- register char c;
-
+
while (MORE() && my_isalpha(p->charset,PEEK()))
NEXT();
len = p->next - sp;
@@ -762,11 +760,26 @@ register cset *cs;
return;
}
- u = (char*) cp->chars;
- while ((c = *u++) != '\0')
- CHadd(cs, c);
- for (u = (char*) cp->multis; *u != '\0'; u += strlen(u) + 1)
- MCadd(p, cs, u);
+#ifndef USE_ORIG_REGEX_CODE
+ {
+ register size_t i;
+ for (i=1 ; i<256 ; i++)
+ if (p->charset->ctype[i+1] & cp->mask)
+ CHadd(cs, i);
+ }
+#else
+ {
+ register char *u = (char*) cp->chars;
+ register char c;
+
+ while ((c = *u++) != '\0')
+ CHadd(cs, c);
+
+ for (u = (char*) cp->multis; *u != '\0'; u += strlen(u) + 1)
+ MCadd(p, cs, u);
+ }
+#endif
+
}
/*