mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-30034 UNIQUE USING HASH accepts duplicate entries for tricky collations
- Adding a new argument "flag" to MY_COLLATION_HANDLER::strnncollsp_nchars() and a flag MY_STRNNCOLLSP_NCHARS_EMULATE_TRIMMED_TRAILING_SPACES. The flag defines if strnncollsp_nchars() should emulate trailing spaces which were possibly trimmed earlier (e.g. in InnoDB CHAR compression). This is important for NOPAD collations. For example, with this input: - str1= 'a ' (Latin letter a followed by one space) - str2= 'a ' (Latin letter a followed by two spaces) - nchars= 3 if the flag is given, strnncollsp_nchars() will virtually restore one trailing space to str1 up to nchars (3) characters and compare two strings as equal: - str1= 'a ' (one extra trailing space emulated) - str2= 'a ' (as is) If the flag is not given, strnncollsp_nchars() does not add trailing virtual spaces, so in case of a NOPAD collation, str1 will be compared as less than str2 because it is shorter. - Field_string::cmp_prefix() now passes the new flag. Field_varstring::cmp_prefix() and Field_blob::cmp_prefix() do not pass the new flag. - The branch in cmp_whole_field() in storage/innobase/rem/rem0cmp.cc (which handles the CHAR data type) now also passed the new flag. - Fixing UCA collations to respect the new flag. Other collations are possibly also affected, however I had no success in making an SQL script demonstrating the problem. Other collations will be extended to respect this flags in a separate patch later. - Changing the meaning of the last parameter of Field::cmp_prefix() from "number of bytes" (internal length) to "number of characters" (user visible length). The code calling cmp_prefix() from handler.cc was wrong. After this change, the call in handler.cc became correct. The code calling cmp_prefix() from key_rec_cmp() in key.cc was adjusted according to this change. - Old strnncollsp_nchar() related tests in unittest/strings/strings-t.c now pass the new flag. A few new tests also were added, without the flag.
This commit is contained in:
@ -787,9 +787,14 @@ typedef struct
|
||||
LEX_CSTRING a;
|
||||
LEX_CSTRING b;
|
||||
size_t nchars;
|
||||
uint flags;
|
||||
int res;
|
||||
} STRNNCOLLSP_CHAR_PARAM;
|
||||
|
||||
#undef TCHAR
|
||||
#define TCHAR MY_STRNNCOLLSP_NCHARS_EMULATE_TRIMMED_TRAILING_SPACES
|
||||
|
||||
#define TVCHAR 0
|
||||
|
||||
/*
|
||||
Some lines in the below test data are marked as follows:
|
||||
@ -811,266 +816,273 @@ typedef struct
|
||||
*/
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_mbminlen1_xpad_common[]=
|
||||
{
|
||||
{{CSTR("a")}, {CSTR("a")}, 0, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 1, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 2, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 3, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 100, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 0, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 1, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 2, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 3, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("a")}, {CSTR("ab")}, 0, 0},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 1, 0},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 2, -1},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 3, -1},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 100, -1},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 0, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 1, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 2, TCHAR, -1},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 3, TCHAR, -1},
|
||||
{{CSTR("a")}, {CSTR("ab")}, 100, TCHAR, -1},
|
||||
|
||||
{{CSTR("a")}, {CSTR("a ")}, 0, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 1, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 2, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 3, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 100, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 0, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 1, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 2, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 3, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("a")}, {CSTR("a ")}, 0, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 1, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 2, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 3, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 100, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 0, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 1, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 2, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 3, TCHAR, 0},
|
||||
{{CSTR("a")}, {CSTR("a ")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 1, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 2, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 3, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 100, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 1, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 2, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 3, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("ss")}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
/* Tests for utf8, for both PAD SPACE and NOPAD collations */
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mbx_xpad_common[]=
|
||||
{
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 0, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 1, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 2, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 3, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 100, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 1, TCHAR, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 2, TCHAR, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 3, TCHAR, 0},
|
||||
{{CSTR(UTF8_sz)}, {CSTR(UTF8_sz)}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
/* Tests for latin1, for both PAD and NOPAD collations */
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_latin1_xpad_common[]=
|
||||
{
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 0, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 1, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 2, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 3, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 100, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 1, TCHAR, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 2, TCHAR, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 3, TCHAR, 0},
|
||||
{{CSTR(LATIN1_sz)}, {CSTR(LATIN1_sz)}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
/* Tests for utf8 collations that sort "A WITH DIAERESIS" equal to "A" */
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mbx_xpad_a_eq_auml[]=
|
||||
{
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 0, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 1, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 2, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 3, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 100, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 0, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 1, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 2, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 3, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 0, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 1, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 2, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 3, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 100, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 0, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 1, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 2, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 3, TCHAR, 0},
|
||||
{{CSTR(UTF8_auml "h")}, {CSTR("ah ")}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mb3_unicode_ci[]=
|
||||
{
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 1, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}/*IF*/, 2, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 3, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 4, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 100, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 1, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}/*IF*/, 2, TCHAR, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 3, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 4, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mb3_unicode_nopad_ci[]=
|
||||
{
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 1, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}/*IF*/, 2, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 3, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 4, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 100, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 1, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}/*IF*/, 2, TCHAR, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 3, TCHAR, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 4, TCHAR, 1},
|
||||
{{CSTR("ss")}, {CSTR("s" "\x00" "s")}, 100, TCHAR, 1},
|
||||
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TCHAR, -1},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, TVCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, TVCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, TVCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, TVCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, TVCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TVCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mb3_danish_ci[]=
|
||||
{
|
||||
{{CSTR("aa")}, {CSTR("")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("")}, 1, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 2, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 3, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 100, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("")}, 1, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 2, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 3, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("")}, 100, TCHAR, 1},
|
||||
|
||||
{{CSTR("aa")}, {CSTR("a")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("a")}, 1, 0},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 2, 1},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 3, 1},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 100, 1},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("a")}, 1, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 2, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 3, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("a")}, 100, TCHAR, 1},
|
||||
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("aa")}/*CF*/, 1, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 2, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 3, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 100, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("aa")}/*CF*/, 1, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 2, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 3, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("aa")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("\x00" "a")}/*IF*/, 1, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 2, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 3, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 100, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("\x00" "a")}/*IF*/, 1, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 2, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 3, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "a")}, 100, TCHAR, 1},
|
||||
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("\x00" "aa")}/*IF*/, 1, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}/*IF*/, 2, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 3, 0},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 100, 0},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("\x00" "aa")}/*IF*/, 1, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}/*IF*/, 2, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 3, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("\x00" "aa")}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("a" "\x00" "a")}, 1, 0},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}/*IF*/, 2, 1},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 3, 1},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 100, 1},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR("a" "\x00" "a")}, 1, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}/*IF*/, 2, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 3, TCHAR, 1},
|
||||
{{CSTR("aa")}, {CSTR("a" "\x00" "a")}, 100, TCHAR, 1},
|
||||
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 0, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR(UTF8_ARING)}, 1, -1},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 2, 0},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 3, 0},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 100, 0},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 0, TCHAR, 0},
|
||||
{{CSTR("aa")}/*CF*/, {CSTR(UTF8_ARING)}, 1, TCHAR, -1},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 2, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 3, TCHAR, 0},
|
||||
{{CSTR("aa")}, {CSTR(UTF8_ARING)}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_latin1_german2_ci[]=
|
||||
{
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 1, -1},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 2, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 3, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 100, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 1, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 2, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 3, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(LATIN1_sz)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 0, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 1, -1},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 2, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 3, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 100, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 0, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 1, TCHAR, -1},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 2, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 3, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 0, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 1, -1},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 2, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 3, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 100, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 0, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 1, TCHAR, -1},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 2, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 3, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(LATIN1_auml " ")}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_utf8mbx_german2_ci[]=
|
||||
{
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 0, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 1, TCHAR, -1},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 2, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 3, TCHAR, 0},
|
||||
{{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 0, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 1, -1},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 2, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 3, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 100, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 0, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 1, TCHAR, -1},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 2, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 3, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 0, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 1, -1},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 2, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 3, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 100, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 0, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 1, TCHAR, -1},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 2, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 3, TCHAR, 0},
|
||||
{{CSTR("ae")}, {CSTR(UTF8_auml " ")}, 100, TCHAR, 0},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_mbminlen1_xpad_czech[]=
|
||||
{
|
||||
{{CSTR("c")}, {CSTR("ch")}, 0, 0},
|
||||
{{CSTR("c")}, {CSTR("ch")}, 1, 0},
|
||||
{{CSTR("c")}, {CSTR("ch")}, 2, -1},
|
||||
{{CSTR("c")}, {CSTR("ch")}, 0, TCHAR, 0},
|
||||
{{CSTR("c")}, {CSTR("ch")}, 1, TCHAR, 0},
|
||||
{{CSTR("c")}, {CSTR("ch")}, 2, TCHAR, -1},
|
||||
|
||||
{{CSTR("h")}, {CSTR("ch")}, 0, 0},
|
||||
{{CSTR("h")}, {CSTR("ch")}, 1, 1},
|
||||
{{CSTR("h")}, {CSTR("ch")}, 2, -1},
|
||||
{{CSTR("h")}, {CSTR("ch")}, 0, TCHAR, 0},
|
||||
{{CSTR("h")}, {CSTR("ch")}, 1, TCHAR, 1},
|
||||
{{CSTR("h")}, {CSTR("ch")}, 2, TCHAR, -1},
|
||||
|
||||
{{CSTR("i")}, {CSTR("ch")}, 0, 0},
|
||||
{{CSTR("i")}, {CSTR("ch")}, 1, 1},
|
||||
{{CSTR("i")}, {CSTR("ch")}, 2, 1},
|
||||
{{CSTR("i")}, {CSTR("ch")}, 0, TCHAR, 0},
|
||||
{{CSTR("i")}, {CSTR("ch")}, 1, TCHAR, 1},
|
||||
{{CSTR("i")}, {CSTR("ch")}, 2, TCHAR, 1},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static STRNNCOLLSP_CHAR_PARAM strnncollsp_char_mbminlen2_xpad_common[]=
|
||||
{
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 0, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 1, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 2, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 3, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 100, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 0, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 1, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 2, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 3, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 0, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 1, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 2, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 3, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 100, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 0, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 1, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 2, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 3, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 0, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 1, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 2, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 3, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 100, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 0, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 1, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 2, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 3, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_sp UCS2_sp)}, 100, TCHAR, 0},
|
||||
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 0, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 1, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 2, -1},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 3, -1},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 100, -1},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 0, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 1, TCHAR, 0},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 2, TCHAR, -1},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 3, TCHAR, -1},
|
||||
{{CSTR(UCS2_a)}, {CSTR(UCS2_a UCS2_b)}, 100, TCHAR, -1},
|
||||
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0}
|
||||
{{NULL, 0}, {NULL, 0}, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
@ -1082,7 +1094,7 @@ strnncollsp_char_one(CHARSET_INFO *cs, const STRNNCOLLSP_CHAR_PARAM *p)
|
||||
int res= cs->coll->strnncollsp_nchars(cs,
|
||||
(uchar *) p->a.str, p->a.length,
|
||||
(uchar *) p->b.str, p->b.length,
|
||||
p->nchars);
|
||||
p->nchars, p->flags);
|
||||
str2hex(ahex, sizeof(ahex), p->a.str, p->a.length);
|
||||
str2hex(bhex, sizeof(bhex), p->b.str, p->b.length);
|
||||
diag("%-25s %-12s %-12s %3d %7d %7d%s",
|
||||
@ -1098,7 +1110,7 @@ strnncollsp_char_one(CHARSET_INFO *cs, const STRNNCOLLSP_CHAR_PARAM *p)
|
||||
res= cs->coll->strnncollsp_nchars(cs,
|
||||
(uchar *) p->b.str, p->b.length,
|
||||
(uchar *) p->a.str, p->a.length,
|
||||
p->nchars);
|
||||
p->nchars, p->flags);
|
||||
if (!eqres(res, -p->res))
|
||||
{
|
||||
diag("Comparison in reverse order failed. Expected %d, got %d",
|
||||
|
Reference in New Issue
Block a user