summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2004-12-01 19:25:05 +0400
committerunknown <bar@mysql.com>2004-12-01 19:25:05 +0400
commitb72c899e65375c42f9d3943c8b0229dd15da8e63 (patch)
treec41ffeff12a89bdd045bf4b468fe39f22317d7c9
parent542e2e66788381a7eea332cdaf6f068e31446662 (diff)
downloadmariadb-git-b72c899e65375c42f9d3943c8b0229dd15da8e63.tar.gz
Move common trailing space checks into an include file.
Check UCS2 trailing spaces. mysql-test/r/ctype_ucs.result: Move common trailing space checks into an include file. Check UCS2 trailing spaces. Fix UCS2 to handle trailing spaces in PAD way. mysql-test/t/ctype_ucs.test: Move common trailing space checks into an include file. Check UCS2 trailing spaces. Fix UCS2 to handle trailing spaces in PAD way. mysql-test/t/endspace.test: Move common trailing space checks into an include file. Check UCS2 trailing spaces. Fix UCS2 to handle trailing spaces in PAD way. strings/ctype-ucs2.c: Move common trailing space checks into an include file. Check UCS2 trailing spaces. Fix UCS2 to handle trailing spaces in PAD way.
-rw-r--r--mysql-test/include/endspace.inc7
-rw-r--r--mysql-test/r/ctype_ucs.result23
-rw-r--r--mysql-test/t/ctype_ucs.test4
-rw-r--r--mysql-test/t/endspace.test8
-rw-r--r--strings/ctype-ucs2.c73
5 files changed, 105 insertions, 10 deletions
diff --git a/mysql-test/include/endspace.inc b/mysql-test/include/endspace.inc
new file mode 100644
index 00000000000..1692a258bde
--- /dev/null
+++ b/mysql-test/include/endspace.inc
@@ -0,0 +1,7 @@
+select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
+select 'a\0' = 'a', 'a\0' < 'a', 'a\0' > 'a';
+select 'a' = 'a\0', 'a' < 'a\0', 'a' > 'a\0';
+select 'a\0' = 'a ', 'a\0' < 'a ', 'a\0' > 'a ';
+select 'a ' = 'a\0', 'a ' < 'a\0', 'a ' > 'a\0';
+select 'a a' > 'a', 'a \0' < 'a';
+select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result
index 6394bc28c6e..70a66ddd924 100644
--- a/mysql-test/r/ctype_ucs.result
+++ b/mysql-test/r/ctype_ucs.result
@@ -1,4 +1,27 @@
DROP TABLE IF EXISTS t1;
+SET NAMES latin1;
+SET character_set_connection=ucs2;
+select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
+'a' = 'a' 'a' = 'a ' 'a ' = 'a'
+1 1 1
+select 'a\0' = 'a', 'a\0' < 'a', 'a\0' > 'a';
+'a\0' = 'a' 'a\0' < 'a' 'a\0' > 'a'
+0 1 0
+select 'a' = 'a\0', 'a' < 'a\0', 'a' > 'a\0';
+'a' = 'a\0' 'a' < 'a\0' 'a' > 'a\0'
+0 0 1
+select 'a\0' = 'a ', 'a\0' < 'a ', 'a\0' > 'a ';
+'a\0' = 'a ' 'a\0' < 'a ' 'a\0' > 'a '
+0 1 0
+select 'a ' = 'a\0', 'a ' < 'a\0', 'a ' > 'a\0';
+'a ' = 'a\0' 'a ' < 'a\0' 'a ' > 'a\0'
+0 0 1
+select 'a a' > 'a', 'a \0' < 'a';
+'a a' > 'a' 'a \0' < 'a'
+1 1
+select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
+binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a'
+1 1 1
SET CHARACTER SET koi8r;
CREATE TABLE t1 (word VARCHAR(64) CHARACTER SET ucs2);
INSERT INTO t1 VALUES (_koi8r'ò'), (X'2004');
diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test
index 0b8678ef59b..b1d872c58a5 100644
--- a/mysql-test/t/ctype_ucs.test
+++ b/mysql-test/t/ctype_ucs.test
@@ -4,6 +4,10 @@
DROP TABLE IF EXISTS t1;
--enable_warnings
+SET NAMES latin1;
+SET character_set_connection=ucs2;
+-- source include/endspace.inc
+
SET CHARACTER SET koi8r;
#
diff --git a/mysql-test/t/endspace.test b/mysql-test/t/endspace.test
index 9ee5e32967a..462bc3083e1 100644
--- a/mysql-test/t/endspace.test
+++ b/mysql-test/t/endspace.test
@@ -7,13 +7,7 @@
drop table if exists t1;
--enable_warnings
-select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
-select 'a\0' = 'a', 'a\0' < 'a', 'a\0' > 'a';
-select 'a' = 'a\0', 'a' < 'a\0', 'a' > 'a\0';
-select 'a\0' = 'a ', 'a\0' < 'a ', 'a\0' > 'a ';
-select 'a ' = 'a\0', 'a ' < 'a\0', 'a ' > 'a\0';
-select 'a a' > 'a', 'a \0' < 'a';
-select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
+-- source include/endspace.inc
#
# Test MyISAM tables.
diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c
index 851c2044f47..403d31aa15b 100644
--- a/strings/ctype-ucs2.c
+++ b/strings/ctype-ucs2.c
@@ -218,11 +218,78 @@ static int my_strnncoll_ucs2(CHARSET_INFO *cs,
return t_is_prefix ? t-te : ((se-s) - (te-t));
}
-static int my_strnncollsp_ucs2(CHARSET_INFO *cs,
- const uchar *s, uint slen,
+/*
+ Compare strings, discarding end space
+
+ SYNOPSIS
+ my_strnncollsp_ucs2()
+ cs character set handler
+ a First string to compare
+ a_length Length of 'a'
+ b Second string to compare
+ b_length Length of 'b'
+
+ IMPLEMENTATION
+ If one string is shorter as the other, then we space extend the other
+ so that the strings have equal length.
+
+ This will ensure that the following things hold:
+
+ "a" == "a "
+ "a\0" < "a"
+ "a\0" < "a "
+
+ RETURN
+ < 0 a < b
+ = 0 a == b
+ > 0 a > b
+*/
+
+static int my_strnncollsp_ucs2(CHARSET_INFO *cs __attribute__((unused)),
+ const uchar *s, uint slen,
const uchar *t, uint tlen)
{
- return my_strnncoll_ucs2(cs,s,slen,t,tlen,0);
+ const uchar *se, *te;
+ uint minlen;
+
+ /* extra safety to make sure the lengths are even numbers */
+ slen= (slen >> 1) << 1;
+ tlen= (tlen >> 1) << 1;
+
+ se= s + slen;
+ te= t + tlen;
+
+ for (minlen= min(slen, tlen); minlen; minlen-= 2)
+ {
+ int s_wc = uni_plane[s[0]] ? (int) uni_plane[s[0]][s[1]].sort :
+ (((int) s[0]) << 8) + (int) s[1];
+
+ int t_wc = uni_plane[t[0]] ? (int) uni_plane[t[0]][t[1]].sort :
+ (((int) t[0]) << 8) + (int) t[1];
+ if ( s_wc != t_wc )
+ return s_wc - t_wc;
+
+ s+= 2;
+ t+= 2;
+ }
+
+ if (slen != tlen)
+ {
+ int swap= 0;
+ if (slen < tlen)
+ {
+ s= t;
+ se= te;
+ swap= -1;
+ }
+
+ for ( ; s < se ; s+= 2)
+ {
+ if (s[0] || s[1] != ' ')
+ return (((int)s[0] << 8) + (int) s[1] - (int) ' ') ^ swap;
+ }
+ }
+ return 0;
}