Commit 561ee8fd authored by unknown's avatar unknown
Browse files

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.
parent 2d2d61d1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
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';
+23 −0
Original line number Diff line number Diff line
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');
+4 −0
Original line number Diff line number Diff line
@@ -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;

#
+1 −7
Original line number Diff line number Diff line
@@ -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.
+70 −3
Original line number Diff line number Diff line
@@ -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, 
/*
  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;
}