From 4652260d656ea871fe1ff31176b6d85eeffde932 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Wed, 25 Jan 2023 11:46:28 -0800 Subject: [PATCH 01/70] MDEV-28616 Crash when using derived table over union with order by clause This bug manifested itself when the server processed a query containing a derived table over union whose ORDER BY clause included a subquery with unresolvable column reference. For such a query the server crashed when trying to resolve column references in the ORDER BY clause used by union. For any union with ORDER BY clause an extra SELECT_LEX structure is created and it is attached to SELECT_LEX_UNIT structure of the union via the field fake_select_lex. The outer context for fake_select_lex must be the same as for other selects of the union. If the union is used in the FROM list of a derived table then the outer context for fake_select_lex must be set to NULL in line with other selects of the union. It was not done and it caused a crash when searching for possible resolution of an unresolvable column reference occurred in a subquery used in the ORDER BY clause. Approved by Oleksandr Byelkin --- mysql-test/main/derived.result | 23 +++++++++++++++++++++++ mysql-test/main/derived.test | 30 ++++++++++++++++++++++++++++++ sql/sql_derived.cc | 3 +++ 3 files changed, 56 insertions(+) diff --git a/mysql-test/main/derived.result b/mysql-test/main/derived.result index 2761fdfa28722..0cb029fa7a43a 100644 --- a/mysql-test/main/derived.result +++ b/mysql-test/main/derived.result @@ -1327,5 +1327,28 @@ a b DROP VIEW v1; DROP TABLE t1; # +# MDEV-28616: derived table over union with order by clause that +# contains subquery with unresolvable column reference +# +SELECT 1 FROM ( +SELECT 1 UNION SELECT 2 ORDER BY (SELECT 1 FROM DUAL WHERE xxx = 0) +) dt; +ERROR 42S22: Unknown column 'xxx' in 'where clause' +create table t1 (a int, b int); +insert into t1 values (3,8), (7,2), (1,4), (5,9); +create table t2 (a int, b int); +insert into t2 values (9,1), (7,3), (2,6); +create table t3 (c int, d int); +insert into t3 values (7,8), (1,2), (3,8); +select * from +( +select a,b from t1 where t1.a > 3 +union +select a,b from t2 where t2.b < 6 +order by (a - b / (select a + max(c) from t3 where d = x)) +) dt; +ERROR 42S22: Unknown column 'x' in 'where clause' +drop table t1,t2,t3; +# # End of 10.3 tests # diff --git a/mysql-test/main/derived.test b/mysql-test/main/derived.test index 6a831000e57bb..dca7243febb15 100644 --- a/mysql-test/main/derived.test +++ b/mysql-test/main/derived.test @@ -1137,6 +1137,36 @@ SELECT * FROM v1 WHERE b > 0; DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # MDEV-28616: derived table over union with order by clause that +--echo # contains subquery with unresolvable column reference +--echo # + +--error ER_BAD_FIELD_ERROR +SELECT 1 FROM ( + SELECT 1 UNION SELECT 2 ORDER BY (SELECT 1 FROM DUAL WHERE xxx = 0) +) dt; + +create table t1 (a int, b int); +insert into t1 values (3,8), (7,2), (1,4), (5,9); + +create table t2 (a int, b int); +insert into t2 values (9,1), (7,3), (2,6); + +create table t3 (c int, d int); +insert into t3 values (7,8), (1,2), (3,8); + +--error ER_BAD_FIELD_ERROR +select * from +( + select a,b from t1 where t1.a > 3 + union + select a,b from t2 where t2.b < 6 + order by (a - b / (select a + max(c) from t3 where d = x)) +) dt; + +drop table t1,t2,t3; + --echo # --echo # End of 10.3 tests --echo # diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 93dc62828ac37..8177ee27943ba 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -771,6 +771,9 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) cursor->outer_join|= JOIN_TYPE_OUTER; } } + // Prevent it for possible ORDER BY clause + if (unit->fake_select_lex) + unit->fake_select_lex->context.outer_context= 0; /* Above cascade call of prepare is important for PS protocol, but after it From b1043ea0ed01a7caa398d4a066b415d6eeebb08e Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 26 Jan 2023 10:57:01 +0400 Subject: [PATCH 02/70] Revert "MDEV-30151 parse error 1=2 not between/in" This reverts commit eba099184e1f6704894694ea41f97f216eae5f21. A different patch with less shift-reduce conflicts is coming. --- mysql-test/main/parser.result | 11 ----------- mysql-test/main/parser.test | 8 -------- sql/sql_yacc.yy | 6 +++--- sql/sql_yacc_ora.yy | 6 +++--- 4 files changed, 6 insertions(+), 25 deletions(-) diff --git a/mysql-test/main/parser.result b/mysql-test/main/parser.result index f44478727ae3d..0bb4e82c8b8b4 100644 --- a/mysql-test/main/parser.result +++ b/mysql-test/main/parser.result @@ -1866,15 +1866,4 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc'; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"abc' at line 1 SET @@sql_mode=@save_sql_mode; -# -# MDEV-30151 parse error 1=2 not between/in -# -select 1=2 not in (3,4); -1=2 not in (3,4) -1 -select 1=2 not between 3 and 4; -1=2 not between 3 and 4 -1 -# # End of 10.3 tests -# diff --git a/mysql-test/main/parser.test b/mysql-test/main/parser.test index cfe4f9d6f532b..9df18c50ee325 100644 --- a/mysql-test/main/parser.test +++ b/mysql-test/main/parser.test @@ -1673,12 +1673,4 @@ EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc'; SET @@sql_mode=@save_sql_mode; ---echo # ---echo # MDEV-30151 parse error 1=2 not between/in ---echo # -select 1=2 not in (3,4); -select 1=2 not between 3 and 4; - ---echo # --echo # End of 10.3 tests ---echo # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3025d93de0f24..7766049c1049c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -899,7 +899,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); /* We should not introduce any further shift/reduce conflicts. */ -%expect 96 +%expect 85 /* Comments for TOKENS. @@ -1687,7 +1687,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left PREC_BELOW_NOT -%nonassoc LOW_PRIORITY_NOT +%nonassoc NOT_SYM %left '=' EQUAL_SYM GE '>' LE '<' NE %nonassoc IS %right BETWEEN_SYM @@ -9840,7 +9840,7 @@ expr: MYSQL_YYABORT; } } - | NOT_SYM expr %prec LOW_PRIORITY_NOT + | NOT_SYM expr %prec NOT_SYM { $$= negate_expression(thd, $2); if (unlikely($$ == NULL)) diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index df90ba6c634e6..a5ee1892e5e0a 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -293,7 +293,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); /* We should not introduce any further shift/reduce conflicts. */ -%expect 98 +%expect 87 /* Comments for TOKENS. @@ -1081,7 +1081,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left PREC_BELOW_NOT -%nonassoc LOW_PRIORITY_NOT +%nonassoc NOT_SYM %left '=' EQUAL_SYM GE '>' LE '<' NE %nonassoc IS %right BETWEEN_SYM @@ -9797,7 +9797,7 @@ expr: MYSQL_YYABORT; } } - | NOT_SYM expr %prec LOW_PRIORITY_NOT + | NOT_SYM expr %prec NOT_SYM { $$= negate_expression(thd, $2); if (unlikely($$ == NULL)) From 895673dae52d36c20caf900e6179694de1c7699b Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 12 Dec 2022 17:45:48 +0400 Subject: [PATCH 03/70] MDEV-30151 parse error 1=2 not between/in This patch fixes the problem by adding a new rule booleat_test. This makes the grammar clearer and less conflicting. Additionally, fixing %prec in this grammar branch: - | boolean_test IS NULL_SYM %prec PREC_BELOW_NOT + | boolean_test IS NULL_SYM %prec IS to have consistently "%prec IS" in all grammar branches starting with "boolean_test IS ...". It's not clear why these three rules needed different %prec before the fix: - boolean_test IS TRUE - boolean_test IS UNKNOWN - boolean_test IS NULL --- mysql-test/main/parser.result | 31 ++++++++++++++++++++ mysql-test/main/parser.test | 21 ++++++++++++++ sql/sql_yacc.yy | 54 +++++++++++++++++++++++++---------- sql/sql_yacc_ora.yy | 54 +++++++++++++++++++++++++---------- 4 files changed, 130 insertions(+), 30 deletions(-) diff --git a/mysql-test/main/parser.result b/mysql-test/main/parser.result index 0bb4e82c8b8b4..a8ee4440b5e91 100644 --- a/mysql-test/main/parser.result +++ b/mysql-test/main/parser.result @@ -1866,4 +1866,35 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc'; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"abc' at line 1 SET @@sql_mode=@save_sql_mode; +# +# MDEV-30151 parse error 1=2 not between/in +# +SELECT 1=2 NOT IN (3,4); +1=2 NOT IN (3,4) +1 +SELECT 1=2 NOT BETWEEN 3 AND 4; +1=2 NOT BETWEEN 3 AND 4 +1 +CREATE TABLE t1 ( f INT AS ( 1 IN ( 2 NOT BETWEEN 3 AND 4 ) ) ); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f` int(11) GENERATED ALWAYS AS (1 = 2 not between 3 and 4) VIRTUAL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 ( f INT, CHECK ( 1 IN ( 2 NOT BETWEEN 3 AND 4 ) ) ); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f` int(11) DEFAULT NULL, + CONSTRAINT `CONSTRAINT_1` CHECK (1 = 2 not between 3 and 4) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE VIEW v1 AS SELECT 1 IN ( 2 NOT BETWEEN 3 AND 4 ); +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select 1 = 2 not between 3 and 4 AS `1 IN ( 2 NOT BETWEEN 3 AND 4 )` latin1 latin1_swedish_ci +DROP VIEW v1; +# # End of 10.3 tests +# diff --git a/mysql-test/main/parser.test b/mysql-test/main/parser.test index 9df18c50ee325..9e46f859d5c19 100644 --- a/mysql-test/main/parser.test +++ b/mysql-test/main/parser.test @@ -1673,4 +1673,25 @@ EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc'; SET @@sql_mode=@save_sql_mode; +--echo # +--echo # MDEV-30151 parse error 1=2 not between/in +--echo # + +SELECT 1=2 NOT IN (3,4); +SELECT 1=2 NOT BETWEEN 3 AND 4; + +CREATE TABLE t1 ( f INT AS ( 1 IN ( 2 NOT BETWEEN 3 AND 4 ) ) ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ( f INT, CHECK ( 1 IN ( 2 NOT BETWEEN 3 AND 4 ) ) ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE VIEW v1 AS SELECT 1 IN ( 2 NOT BETWEEN 3 AND 4 ); +SHOW CREATE VIEW v1; +DROP VIEW v1; + +--echo # --echo # End of 10.3 tests +--echo # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 7766049c1049c..e03bde318326c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -899,7 +899,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); /* We should not introduce any further shift/reduce conflicts. */ -%expect 85 +%expect 78 /* Comments for TOKENS. @@ -1687,7 +1687,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left PREC_BELOW_NOT -%nonassoc NOT_SYM +/* The precendence of boolean NOT is in fact here. See the comment below. */ + %left '=' EQUAL_SYM GE '>' LE '<' NE %nonassoc IS %right BETWEEN_SYM @@ -1699,6 +1700,24 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left '*' '/' '%' DIV_SYM MOD_SYM %left '^' %left MYSQL_CONCAT_SYM +/* + Boolean negation has a special branch in "expr" starting with NOT_SYM. + The precedence of logical negation is determined by the grammar itself + (without using Bison terminal symbol precedence) in this order + - Boolean factor (i.e. logical AND) + - Boolean NOT + - Boolean test (such as '=', IS NULL, IS TRUE) + + But we also need a precedence for NOT_SYM in other contexts, + to shift (without reduce) in these cases: + predicate NOT IN ... + predicate NOT BETWEEN ... + predicate NOT LIKE ... + predicate NOT REGEXP ... + If the precedence of NOT_SYM was low, it would reduce immediately + after scanning "predicate" and then produce a syntax error on "NOT". +*/ +%nonassoc NOT_SYM %nonassoc NEG '~' NOT2_SYM BINARY %nonassoc COLLATE_SYM @@ -1938,6 +1957,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); literal insert_ident order_ident temporal_literal simple_ident expr sum_expr in_sum_expr variable variable_aux + boolean_test predicate bit_expr parenthesized_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr primary_expr string_factor_expr mysql_concatenation_expr @@ -9840,79 +9860,83 @@ expr: MYSQL_YYABORT; } } - | NOT_SYM expr %prec NOT_SYM + | NOT_SYM expr { $$= negate_expression(thd, $2); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS TRUE_SYM %prec IS + | boolean_test %prec PREC_BELOW_NOT + ; + +boolean_test: + boolean_test IS TRUE_SYM %prec IS { $$= new (thd->mem_root) Item_func_istrue(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not TRUE_SYM %prec IS + | boolean_test IS not TRUE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnottrue(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS FALSE_SYM %prec IS + | boolean_test IS FALSE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isfalse(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not FALSE_SYM %prec IS + | boolean_test IS not FALSE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotfalse(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS UNKNOWN_SYM %prec IS + | boolean_test IS UNKNOWN_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not UNKNOWN_SYM %prec IS + | boolean_test IS not UNKNOWN_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS NULL_SYM %prec PREC_BELOW_NOT + | boolean_test IS NULL_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not NULL_SYM %prec IS + | boolean_test IS not NULL_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr EQUAL_SYM predicate %prec EQUAL_SYM + | boolean_test EQUAL_SYM predicate %prec EQUAL_SYM { $$= new (thd->mem_root) Item_func_equal(thd, $1, $3); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr comp_op predicate %prec '=' + | boolean_test comp_op predicate %prec '=' { $$= (*$2)(0)->create(thd, $1, $3); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr comp_op all_or_any '(' subselect ')' %prec '=' + | boolean_test comp_op all_or_any '(' subselect ')' %prec '=' { $$= all_any_subquery_creator(thd, $1, $2, $3, $5); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | predicate + | predicate %prec BETWEEN_SYM ; predicate: diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index a5ee1892e5e0a..89f7412ea8933 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -293,7 +293,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); /* We should not introduce any further shift/reduce conflicts. */ -%expect 87 +%expect 80 /* Comments for TOKENS. @@ -1081,7 +1081,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left PREC_BELOW_NOT -%nonassoc NOT_SYM +/* The precendence of boolean NOT is in fact here. See the comment below. */ + %left '=' EQUAL_SYM GE '>' LE '<' NE %nonassoc IS %right BETWEEN_SYM @@ -1093,6 +1094,24 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left '*' '/' '%' DIV_SYM MOD_SYM %left '^' %left MYSQL_CONCAT_SYM +/* + Boolean negation has a special branch in "expr" starting with NOT_SYM. + The precedence of logical negation is determined by the grammar itself + (without using Bison terminal symbol precedence) in this order + - Boolean factor (i.e. logical AND) + - Boolean NOT + - Boolean test (such as '=', IS NULL, IS TRUE) + + But we also need a precedence for NOT_SYM in other contexts, + to shift (without reduce) in these cases: + predicate NOT IN ... + predicate NOT BETWEEN ... + predicate NOT LIKE ... + predicate NOT REGEXP ... + If the precedence of NOT_SYM was low, it would reduce immediately + after scanning "predicate" and then produce a syntax error on "NOT". +*/ +%nonassoc NOT_SYM %nonassoc NEG '~' NOT2_SYM BINARY %nonassoc COLLATE_SYM @@ -1339,6 +1358,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); literal insert_ident order_ident temporal_literal simple_ident expr sum_expr in_sum_expr variable variable_aux + boolean_test predicate bit_expr parenthesized_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr primary_expr string_factor_expr mysql_concatenation_expr @@ -9797,79 +9817,83 @@ expr: MYSQL_YYABORT; } } - | NOT_SYM expr %prec NOT_SYM + | NOT_SYM expr { $$= negate_expression(thd, $2); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS TRUE_SYM %prec IS + | boolean_test %prec PREC_BELOW_NOT + ; + +boolean_test: + boolean_test IS TRUE_SYM %prec IS { $$= new (thd->mem_root) Item_func_istrue(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not TRUE_SYM %prec IS + | boolean_test IS not TRUE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnottrue(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS FALSE_SYM %prec IS + | boolean_test IS FALSE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isfalse(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not FALSE_SYM %prec IS + | boolean_test IS not FALSE_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotfalse(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS UNKNOWN_SYM %prec IS + | boolean_test IS UNKNOWN_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not UNKNOWN_SYM %prec IS + | boolean_test IS not UNKNOWN_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS NULL_SYM %prec PREC_BELOW_NOT + | boolean_test IS NULL_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr IS not NULL_SYM %prec IS + | boolean_test IS not NULL_SYM %prec IS { $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr EQUAL_SYM predicate %prec EQUAL_SYM + | boolean_test EQUAL_SYM predicate %prec EQUAL_SYM { $$= new (thd->mem_root) Item_func_equal(thd, $1, $3); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr comp_op predicate %prec '=' + | boolean_test comp_op predicate %prec '=' { $$= (*$2)(0)->create(thd, $1, $3); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | expr comp_op all_or_any '(' subselect ')' %prec '=' + | boolean_test comp_op all_or_any '(' subselect ')' %prec '=' { $$= all_any_subquery_creator(thd, $1, $2, $3, $5); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | predicate + | predicate %prec BETWEEN_SYM ; predicate: From f812f8e1ab7acc5dd17daf5ab5f73495c7963af5 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 26 Jan 2023 12:22:38 +0100 Subject: [PATCH 04/70] MDEV-30475 Windows, mtr - Remove outdated instructions on how to install post-mortem debugger Also, use standard C:\symbols location for OS debugging symbols cache, rather than own invention C:\cdb_symbols. --- mysql-test/lib/My/CoreDump.pm | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/mysql-test/lib/My/CoreDump.pm b/mysql-test/lib/My/CoreDump.pm index 05b6edf13855c..be6d21146d147 100644 --- a/mysql-test/lib/My/CoreDump.pm +++ b/mysql-test/lib/My/CoreDump.pm @@ -310,16 +310,8 @@ sub cdb_check { `cdb -? 2>&1`; if ($? >> 8) { - print "Cannot find cdb. Please Install Debugging tools for Windows\n"; - print "from http://www.microsoft.com/whdc/devtools/debugging/"; - if($ENV{'ProgramW6432'}) - { - print "install64bit.mspx (native x64 version)\n"; - } - else - { - print "installx86.mspx\n"; - } + print "Cannot find the cdb debugger. Please install Debugging tools for Windows\n"; + print "and set PATH environment variable to include location of cdb.exe"; } } @@ -328,25 +320,6 @@ sub _cdb { my ($core_name, $format)= @_; print "\nTrying 'cdb' to get a backtrace\n"; return unless -f $core_name; - - # Try to set environment for debugging tools for Windows - if ($ENV{'PATH'} !~ /Debugging Tools/) - { - if ($ENV{'ProgramW6432'}) - { - # On x64 computer - $ENV{'PATH'}.= ";".$ENV{'ProgramW6432'}."\\Debugging Tools For Windows (x64)"; - } - else - { - # On x86 computer. Newest versions of Debugging tools are installed in the - # directory with (x86) suffix, older versions did not have this suffix. - $ENV{'PATH'}.= ";".$ENV{'ProgramFiles'}."\\Debugging Tools For Windows (x86)"; - $ENV{'PATH'}.= ";".$ENV{'ProgramFiles'}."\\Debugging Tools For Windows"; - } - } - - # Read module list, find out the name of executable and # build symbol path (required by cdb if executable was built on # different machine) @@ -384,7 +357,7 @@ sub _cdb { if (!$ENV{'_NT_SYMBOL_PATH'}) { my $windir= $ENV{'windir'}; - my $symbol_cache= substr($windir ,0, index($windir,'\\'))."\\cdb_symbols"; + my $symbol_cache= substr($windir ,0, index($windir,'\\'))."\\symbols"; print "OS debug symbols will be downloaded and stored in $symbol_cache.\n"; print "You can control the location of symbol cache with _NT_SYMBOL_PATH\n"; From 2a78c3ef6fd6663d6731dd5cec2f462420b61123 Mon Sep 17 00:00:00 2001 From: Salman Mohammadi Date: Sun, 8 Jan 2023 20:14:58 +0100 Subject: [PATCH 05/70] MDEV-30509: mariadb-plugin-connect: introduce curl as recommends in order to be able to retrieve files using REST queries. Otherwise, `ERROR 1105 (HY000): Curl not installed.` will be thrown. --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index aed073e5c8c96..09e0fd74d5778 100644 --- a/debian/control +++ b/debian/control @@ -525,6 +525,7 @@ Depends: libxml2, unixodbc, ${misc:Depends}, ${shlibs:Depends} +Recommends: curl Breaks: mariadb-connect-engine-10.1, mariadb-connect-engine-10.2, mariadb-connect-engine-10.3 From 9b32e4b192303421ca26625153ae1190429e307f Mon Sep 17 00:00:00 2001 From: Nayuta Yanagisawa Date: Tue, 27 Sep 2022 15:22:57 +0900 Subject: [PATCH 06/70] MDEV-29644 a potential bug of null pointer dereference in spider_db_mbase::print_warnings() The function spider_db_mbase::print_warnings() can potentially result in a null pointer dereference. Remove the null pointer dereference by cleaning up the function. Some small changes to the original commit 422fb63a9bbee35c50b6c7be19d199afe0bc98fa. Co-Authored-By: Yuchen Pei --- .../spider/bugfix/r/mdev_29644.result | 41 +++++++++ .../mysql-test/spider/bugfix/t/mdev_29644.cnf | 3 + .../spider/bugfix/t/mdev_29644.test | 56 ++++++++++++ storage/spider/spd_db_mysql.cc | 88 ++++++++----------- storage/spider/spd_db_mysql.h | 4 +- 5 files changed, 136 insertions(+), 56 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_29644.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_29644.cnf create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_29644.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29644.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29644.result new file mode 100644 index 0000000000000..b52cecc5bb734 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29644.result @@ -0,0 +1,41 @@ +# +# MDEV-29644 a potential bug of null pointer dereference in spider_db_mbase::print_warnings() +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a ( +a CHAR(5) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +SET GLOBAL sql_mode=''; +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +a CHAR(255) +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +SET sql_mode=''; +INSERT INTO tbl_a VALUES ("this will be truncated"); +NOT FOUND /\[WARN SPIDER RESULT\].* Warning 1265 Data truncated for column 'a' at row 1.*/ in mysqld.1.1.err +SET GLOBAL spider_log_result_errors=4; +INSERT INTO tbl_a VALUES ("this will be truncated"); +FOUND 1 /\[WARN SPIDER RESULT\].* Warning 1265 Data truncated for column 'a' at row 1.*/ in mysqld.1.1.err +connection master_1; +SET GLOBAL spider_log_result_errors=DEFAULT; +SET sql_mode=DEFAULT; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +SET GLOBAL sql_mode=DEFAULT; +DROP DATABASE IF EXISTS auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.cnf new file mode 100644 index 0000000000000..05dfd8a0bcea9 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.test new file mode 100644 index 0000000000000..3a8fbb251e1c8 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29644.test @@ -0,0 +1,56 @@ +--echo # +--echo # MDEV-29644 a potential bug of null pointer dereference in spider_db_mbase::print_warnings() +--echo # + +# The test case below does not cause the potential null pointer dereference. +# It is just for checking spider_db_mbase::fetch_and_print_warnings() works. + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +eval CREATE TABLE tbl_a ( + a CHAR(5) +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +SET GLOBAL sql_mode=''; + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; +eval CREATE TABLE tbl_a ( + a CHAR(255) +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; + +SET sql_mode=''; + +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.1.err; +let SEARCH_PATTERN= \[WARN SPIDER RESULT\].* Warning 1265 Data truncated for column 'a' at row 1.*; + +INSERT INTO tbl_a VALUES ("this will be truncated"); +--source include/search_pattern_in_file.inc # should not find + +SET GLOBAL spider_log_result_errors=4; + +INSERT INTO tbl_a VALUES ("this will be truncated"); +--source include/search_pattern_in_file.inc # should find + +--connection master_1 +SET GLOBAL spider_log_result_errors=DEFAULT; +SET sql_mode=DEFAULT; +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +SET GLOBAL sql_mode=DEFAULT; +DROP DATABASE IF EXISTS auto_test_remote; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index e942d1d90637c..b1c222d193a5c 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -2090,7 +2090,7 @@ int spider_db_mbase::exec_query( db_conn->affected_rows, db_conn->insert_id, db_conn->server_status, db_conn->warning_count); if (spider_param_log_result_errors() >= 3) - print_warnings(l_time); + fetch_and_print_warnings(l_time); } else if (log_result_errors >= 4) { time_t cur_time = (time_t) time((time_t*) 0); @@ -2172,61 +2172,43 @@ bool spider_db_mbase::is_xa_nota_error( DBUG_RETURN(xa_nota); } -void spider_db_mbase::print_warnings( - struct tm *l_time -) { - DBUG_ENTER("spider_db_mbase::print_warnings"); - DBUG_PRINT("info",("spider this=%p", this)); - if (db_conn->status == MYSQL_STATUS_READY) +void spider_db_mbase::fetch_and_print_warnings(struct tm *l_time) +{ + DBUG_ENTER("spider_db_mbase::fetch_and_print_warnings"); + + if (spider_param_dry_access() || db_conn->status != MYSQL_STATUS_READY || + db_conn->server_status & SERVER_MORE_RESULTS_EXISTS) + DBUG_VOID_RETURN; + + if (mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR, + SPIDER_SQL_SHOW_WARNINGS_LEN)) + DBUG_VOID_RETURN; + + MYSQL_RES *res= mysql_store_result(db_conn); + if (!res) + DBUG_VOID_RETURN; + + uint num_fields= mysql_num_fields(res); + if (num_fields != 3) { -#if MYSQL_VERSION_ID < 50500 - if (!(db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)) -#else - if (!(db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)) -#endif - { - if ( - spider_param_dry_access() || - !mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR, - SPIDER_SQL_SHOW_WARNINGS_LEN) - ) { - MYSQL_RES *res = NULL; - MYSQL_ROW row = NULL; - uint num_fields; - if ( - spider_param_dry_access() || - !(res = mysql_store_result(db_conn)) || - !(row = mysql_fetch_row(res)) - ) { - if (mysql_errno(db_conn)) - { - if (res) - mysql_free_result(res); - DBUG_VOID_RETURN; - } - /* no record is ok */ - } - num_fields = mysql_num_fields(res); - if (num_fields != 3) - { - mysql_free_result(res); - DBUG_VOID_RETURN; - } - while (row) - { - fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] " - "from [%s] %ld to %ld: %s %s %s\n", + mysql_free_result(res); + DBUG_VOID_RETURN; + } + + MYSQL_ROW row= mysql_fetch_row(res); + while (row) + { + fprintf(stderr, + "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] from [%s] %ld " + "to %ld: %s %s %s\n", l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday, - l_time->tm_hour, l_time->tm_min, l_time->tm_sec, - conn->tgt_host, (ulong) db_conn->thread_id, - (ulong) current_thd->thread_id, row[0], row[1], row[2]); - row = mysql_fetch_row(res); - } - if (res) - mysql_free_result(res); - } - } + l_time->tm_hour, l_time->tm_min, l_time->tm_sec, conn->tgt_host, + (ulong) db_conn->thread_id, (ulong) current_thd->thread_id, row[0], + row[1], row[2]); + row= mysql_fetch_row(res); } + mysql_free_result(res); + DBUG_VOID_RETURN; } diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 4d5327b7533ae..576162b2b55e6 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -392,9 +392,7 @@ class spider_db_mbase: public spider_db_conn bool is_xa_nota_error( int error_num ); - void print_warnings( - struct tm *l_time - ); + void fetch_and_print_warnings(struct tm *l_time); spider_db_result *store_result( spider_db_result_buffer **spider_res_buf, st_spider_db_request_key *request_key, From e62947f38bb9c15f7fa8d3faa60b1852c4fecb80 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 9 Mar 2023 15:32:24 +0100 Subject: [PATCH 07/70] bump the VERSION --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 876e7c96e8059..26166cc815102 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=3 -MYSQL_VERSION_PATCH=38 +MYSQL_VERSION_PATCH=39 SERVER_MATURITY=stable From fb7d5881535574c0e33fa8338eaed9ecc7bc65c6 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 9 Mar 2023 11:32:18 +0100 Subject: [PATCH 08/70] main.bootstrap test cleanup --- mysql-test/main/bootstrap.result | 42 ++++++++++++- mysql-test/main/bootstrap.test | 102 +++++++++++++++---------------- 2 files changed, 89 insertions(+), 55 deletions(-) diff --git a/mysql-test/main/bootstrap.result b/mysql-test/main/bootstrap.result index 0ba87be092eaf..7ea009238231d 100644 --- a/mysql-test/main/bootstrap.result +++ b/mysql-test/main/bootstrap.result @@ -1,13 +1,26 @@ -drop table if exists t1; +# +# test mysqld in bootstrap mode +# +# +# Check that --bootstrap reads from stdin +# drop table t1; +# +# Check that --bootstrap of file with SQL error returns error +# drop table t1; ERROR 42S02: Unknown table 'test.t1' +# +# Bootstrap with a large thd->net.max_packet +# set @my_max_allowed_packet= @@max_allowed_packet; set @@global.max_allowed_packet= greatest(1073741824, @@max_allowed_packet); set @max_allowed_packed=@@global.max_allowed_packet; set global max_allowed_packet=@my_max_allowed_packet; drop table t1; -End of 5.1 tests +# +# End of 5.1 tests +# # # Bug #11766306: 59393: HAVE_INNODB=YES WHEN MYSQLD # STARTED WITH --SKIP-INNODB @@ -15,7 +28,21 @@ End of 5.1 tests SELECT 'bug' as '' FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb' and SUPPORT='YES'; -End of 5.5 tests +# +# MDEV-13063 Server crashes in intern_plugin_lock or assertion `plugin_ptr->ref_count == 1' fails in plugin_init +# +# +# MDEV-19349 mysql_install_db: segfault at tmp_file_prefix check +# +# +# End of 5.5 tests +# +# +# Check that --bootstrap can install and uninstall plugins +# +# +# Check that installed plugins are *not* automatically loaded in --bootstrap +# flush tables; show create table t1; Table Create Table @@ -27,3 +54,12 @@ select * from mysql.plugin; name dl EXAMPLE ha_example.so truncate table mysql.plugin; +# +# MDEV-9969 mysql_install_db error processing ignore_db_dirs. +# +# +# MDEV-13397 MariaDB upgrade fail when using default_time_zone +# +# +# End of 10.3 tests +# diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test index 683033979fe69..318842b550b42 100644 --- a/mysql-test/main/bootstrap.test +++ b/mysql-test/main/bootstrap.test @@ -1,16 +1,20 @@ -# -# test mysqld in bootstrap mode -# ---disable_warnings -drop table if exists t1; ---enable_warnings +--echo # +--echo # test mysqld in bootstrap mode +--echo # +--source include/not_windows_embedded.inc +--source include/have_example_plugin.inc + +--let test_bootstrap=$MYSQLTEST_VARDIR/tmp/test_bootstrap.sql +--write_file $test_bootstrap +use test; +EOF # Add the datadir to the bootstrap command let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQLD_BOOTSTRAP_CMD= $MYSQLD_BOOTSTRAP_CMD --datadir=$MYSQLD_DATADIR --tmpdir=$MYSQL_TMP_DIR --default-storage-engine=MyISAM --loose-skip-innodb --plugin-maturity=unknown; -# -# Check that --bootstrap reads from stdin -# +--echo # +--echo # Check that --bootstrap reads from stdin +--echo # --write_file $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql use test; CREATE TABLE t1(a int); @@ -18,9 +22,9 @@ EOF --exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 drop table t1; remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql; -# -# Check that --bootstrap of file with SQL error returns error -# +--echo # +--echo # Check that --bootstrap of file with SQL error returns error +--echo # --write_file $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql use test; CREATE TABLE t1; @@ -32,9 +36,9 @@ EOF drop table t1; remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql; -# -# Bootstrap with a large thd->net.max_packet -# +--echo # +--echo # Bootstrap with a large thd->net.max_packet +--echo # set @my_max_allowed_packet= @@max_allowed_packet; set @@global.max_allowed_packet= greatest(1073741824, @@max_allowed_packet); set @max_allowed_packed=@@global.max_allowed_packet; @@ -49,7 +53,9 @@ remove_file $MYSQLTEST_VARDIR/tmp/long_query.sql; set global max_allowed_packet=@my_max_allowed_packet; drop table t1; ---echo End of 5.1 tests +--echo # +--echo # End of 5.1 tests +--echo # --echo # --echo # Bug #11766306: 59393: HAVE_INNODB=YES WHEN MYSQLD @@ -60,28 +66,24 @@ drop table t1; SELECT 'bug' as '' FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb' and SUPPORT='YES'; -# -# MDEV-13063 Server crashes in intern_plugin_lock or assertion `plugin_ptr->ref_count == 1' fails in plugin_init -# +--echo # +--echo # MDEV-13063 Server crashes in intern_plugin_lock or assertion `plugin_ptr->ref_count == 1' fails in plugin_init +--echo # --error 1 --exec $MYSQLD_BOOTSTRAP_CMD --myisam_recover_options=NONE -# -# MDEV-19349 mysql_install_db: segfault at tmp_file_prefix check -# ---write_file $MYSQLTEST_VARDIR/tmp/1 -use test; -EOF ---exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/1 >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 ---remove_file $MYSQLTEST_VARDIR/tmp/1 +--echo # +--echo # MDEV-19349 mysql_install_db: segfault at tmp_file_prefix check +--echo # +--exec $MYSQLD_BOOTSTRAP_CMD < $test_bootstrap >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 ---echo End of 5.5 tests +--echo # +--echo # End of 5.5 tests +--echo # ---source include/not_windows_embedded.inc ---source include/have_example_plugin.inc -# -# Check that --bootstrap can install and uninstall plugins -# +--echo # +--echo # Check that --bootstrap can install and uninstall plugins +--echo # let $PLUGIN_DIR=`select @@plugin_dir`; --write_file $MYSQLTEST_VARDIR/tmp/install_plugin.sql install soname 'ha_example'; @@ -90,9 +92,9 @@ EOF --exec $MYSQLD_BOOTSTRAP_CMD --plugin-dir=$PLUGIN_DIR < $MYSQLTEST_VARDIR/tmp/install_plugin.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 --remove_file $MYSQLTEST_VARDIR/tmp/install_plugin.sql -# -# Check that installed plugins are *not* automatically loaded in --bootstrap -# +--echo # +--echo # Check that installed plugins are *not* automatically loaded in --bootstrap +--echo # --write_file $MYSQLTEST_VARDIR/tmp/bootstrap_plugins.sql SET SQL_MODE=""; use test; @@ -107,21 +109,17 @@ drop table t1; select * from mysql.plugin; truncate table mysql.plugin; +--echo # +--echo # MDEV-9969 mysql_install_db error processing ignore_db_dirs. +--echo # +--exec $MYSQLD_BOOTSTRAP_CMD --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' < $test_bootstrap >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 -# -# MDEV-9969 mysql_install_db error processing ignore_db_dirs. -# ---write_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql -use test; -EOF ---exec $MYSQLD_BOOTSTRAP_CMD --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 ---remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql +--echo # +--echo # MDEV-13397 MariaDB upgrade fail when using default_time_zone +--echo # +--exec $MYSQLD_BOOTSTRAP_CMD --default-time-zone=Europe/Moscow < $test_bootstrap >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 -# -# MDEV-13397 MariaDB upgrade fail when using default_time_zone -# ---write_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql -use test; -EOF ---exec $MYSQLD_BOOTSTRAP_CMD --default-time-zone=Europe/Moscow < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 ---remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql +--echo # +--echo # End of 10.3 tests +--echo # +--remove_file $test_bootstrap From 4c4939bbf619d7e516131c0b3e5691b1c2d2ff8f Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 9 Mar 2023 11:22:41 +0100 Subject: [PATCH 09/70] MDEV-30818 invalid ssl prevents bootstrap in bootstrap the server reads stdin and does not listen to network. it won't use ssl anyway --- mysql-test/main/bootstrap.result | 3 +++ mysql-test/main/bootstrap.test | 5 +++++ sql/mysqld.cc | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/bootstrap.result b/mysql-test/main/bootstrap.result index 7ea009238231d..0b256263a29bb 100644 --- a/mysql-test/main/bootstrap.result +++ b/mysql-test/main/bootstrap.result @@ -61,5 +61,8 @@ truncate table mysql.plugin; # MDEV-13397 MariaDB upgrade fail when using default_time_zone # # +# MDEV-30818 invalid ssl prevents bootstrap +# +# # End of 10.3 tests # diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test index 318842b550b42..e3c121f201fb2 100644 --- a/mysql-test/main/bootstrap.test +++ b/mysql-test/main/bootstrap.test @@ -119,6 +119,11 @@ truncate table mysql.plugin; --echo # --exec $MYSQLD_BOOTSTRAP_CMD --default-time-zone=Europe/Moscow < $test_bootstrap >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 +--echo # +--echo # MDEV-30818 invalid ssl prevents bootstrap +--echo # +--exec $MYSQLD_BOOTSTRAP_CMD --ssl-ca=/dev/nonexistent < $test_bootstrap >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 + --echo # --echo # End of 10.3 tests --echo # diff --git a/sql/mysqld.cc b/sql/mysqld.cc index ea3849ed9f9a2..68f66c37b6cbb 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5026,7 +5026,10 @@ static void init_ssl() { sql_print_error("Failed to setup SSL"); sql_print_error("SSL error: %s", sslGetErrString(error)); - unireg_abort(1); + if (!opt_bootstrap) + unireg_abort(1); + opt_use_ssl = 0; + have_ssl= SHOW_OPTION_DISABLED; } if (global_system_variables.log_warnings > 0) { From 79e27a6bf9e05eb2296e59a4ea4cd1334195faca Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 5 Apr 2023 23:34:03 +0200 Subject: [PATCH 10/70] MDEV-25887 "Got notification message from PID xxxx, but reception only permitted for main PID yyyy" in systemd during SST server has systemd support and calls sd_notify() to communicate the status to systemd. mariabackup links the whole server in, but it should not notify systemd, because it's not started or managed by systemd. --- extra/mariabackup/xtrabackup.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 5e01e64f490b2..ad35749d0ff7f 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -113,6 +113,12 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #define MB_CORRUPTED_PAGES_FILE "innodb_corrupted_pages" +// disable server's systemd notification code +extern "C" { +int sd_notify() { return 0; } +int sd_notifyf() { return 0; } +} + int sys_var_init(); /* === xtrabackup specific options === */ From 54715a1074a0c9fc12a5d52152df73826a484df7 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 6 Apr 2023 09:57:58 +0400 Subject: [PATCH 11/70] MDEV-30072 Wrong ORDER BY for a partitioned prefix key + NOPAD This problem was earlier fixed by MDEV-30034. Adding MTR tests only. --- mysql-test/main/ctype_uca_partitions.result | 40 +++++++++++++++++++++ mysql-test/main/ctype_uca_partitions.test | 32 +++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/mysql-test/main/ctype_uca_partitions.result b/mysql-test/main/ctype_uca_partitions.result index d7b79046b3474..373fe9145277d 100644 --- a/mysql-test/main/ctype_uca_partitions.result +++ b/mysql-test/main/ctype_uca_partitions.result @@ -84,3 +84,43 @@ O P Y DROP TABLE t1; +# +# Start of 10.4 tests +# +# +# MDEV-30072 Wrong ORDER BY for a partitioned prefix key + NOPAD +# +SET NAMES utf8mb4; +CREATE TABLE t1 +( +id INT, +data VARCHAR(20), +KEY data_id (data,id) +) COLLATE utf8mb3_unicode_nopad_ci ENGINE=MyISAM +PARTITION BY RANGE COLUMNS (id) +( +PARTITION p10 VALUES LESS THAN (20), +PARTITION p20 VALUES LESS THAN MAXVALUE +); +INSERT INTO t1 VALUES (30, 'ss '), (10, 'ß '); +SELECT id FROM t1 WHERE data='ss ' ORDER BY id; +id +10 +30 +SELECT id FROM t1 WHERE data='ss ' ORDER BY id DESC; +id +30 +10 +ALTER TABLE t1 DROP KEY data_id, ADD KEY data_id2(data(10),id); +SELECT id FROM t1 WHERE data='ss ' ORDER BY id; +id +10 +30 +SELECT id FROM t1 WHERE data='ss ' ORDER BY id DESC; +id +30 +10 +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/ctype_uca_partitions.test b/mysql-test/main/ctype_uca_partitions.test index 5734bb520088b..81f1a091574ba 100644 --- a/mysql-test/main/ctype_uca_partitions.test +++ b/mysql-test/main/ctype_uca_partitions.test @@ -36,3 +36,35 @@ SELECT * FROM t1 PARTITION (p0) ORDER BY c1; SELECT * FROM t1 PARTITION (p1) ORDER BY c1; SELECT * FROM t1 PARTITION (p2) ORDER BY c1; DROP TABLE t1; + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-30072 Wrong ORDER BY for a partitioned prefix key + NOPAD +--echo # + +SET NAMES utf8mb4; +CREATE TABLE t1 +( + id INT, + data VARCHAR(20), + KEY data_id (data,id) +) COLLATE utf8mb3_unicode_nopad_ci ENGINE=MyISAM +PARTITION BY RANGE COLUMNS (id) +( + PARTITION p10 VALUES LESS THAN (20), + PARTITION p20 VALUES LESS THAN MAXVALUE +); +INSERT INTO t1 VALUES (30, 'ss '), (10, 'ß '); +SELECT id FROM t1 WHERE data='ss ' ORDER BY id; +SELECT id FROM t1 WHERE data='ss ' ORDER BY id DESC; +ALTER TABLE t1 DROP KEY data_id, ADD KEY data_id2(data(10),id); +SELECT id FROM t1 WHERE data='ss ' ORDER BY id; +SELECT id FROM t1 WHERE data='ss ' ORDER BY id DESC; +DROP TABLE t1; + +--echo # +--echo # End of 10.4 tests +--echo # From ed2adc8c6f986f7e9c81d7a99f85cad0e2d46d80 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 6 Apr 2023 14:50:26 +0400 Subject: [PATCH 12/70] MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic This problem was fixed earlier by MDEV-27653. Adding MTR tests only. --- .../sql_mode_pad_char_to_full_length.inc | 31 ++++++ .../sql_mode_pad_char_to_full_length.result | 94 +++++++++++++++++++ .../sql_mode_pad_char_to_full_length.test | 19 ++++ .../r/sql_mode_pad_char_to_full_length.result | 51 ++++++++++ .../t/sql_mode_pad_char_to_full_length.test | 18 ++++ 5 files changed, 213 insertions(+) create mode 100644 mysql-test/include/sql_mode_pad_char_to_full_length.inc create mode 100644 mysql-test/main/sql_mode_pad_char_to_full_length.result create mode 100644 mysql-test/main/sql_mode_pad_char_to_full_length.test create mode 100644 mysql-test/suite/innodb/r/sql_mode_pad_char_to_full_length.result create mode 100644 mysql-test/suite/innodb/t/sql_mode_pad_char_to_full_length.test diff --git a/mysql-test/include/sql_mode_pad_char_to_full_length.inc b/mysql-test/include/sql_mode_pad_char_to_full_length.inc new file mode 100644 index 0000000000000..df03c4dbc2868 --- /dev/null +++ b/mysql-test/include/sql_mode_pad_char_to_full_length.inc @@ -0,0 +1,31 @@ +--echo # +--echo # MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +--echo # + +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; + + +SET sql_mode=''; +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +SET sql_mode='pad_char_to_full_length'; +INSERT INTO t1 VALUES (0,0); +DELETE FROM t1; +DROP TABLE t1; + + +SET sql_mode=''; +CREATE OR REPLACE TABLE t1 (a CHAR(20),b CHAR(20)); +SHOW CREATE TABLE t1; +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; diff --git a/mysql-test/main/sql_mode_pad_char_to_full_length.result b/mysql-test/main/sql_mode_pad_char_to_full_length.result new file mode 100644 index 0000000000000..6f68aade613b9 --- /dev/null +++ b/mysql-test/main/sql_mode_pad_char_to_full_length.result @@ -0,0 +1,94 @@ +# +# Start of 10.4 tests +# +# +# MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +# +SET default_storage_engine=MyISAM; +# +# MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +# +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +SET sql_mode='pad_char_to_full_length'; +INSERT INTO t1 VALUES (0,0); +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE OR REPLACE TABLE t1 (a CHAR(20),b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(20) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +SET default_storage_engine=MEMORY; +# +# MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +# +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +SET sql_mode='pad_char_to_full_length'; +INSERT INTO t1 VALUES (0,0); +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE OR REPLACE TABLE t1 (a CHAR(20),b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(20) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +SET default_storage_engine=DEFAULT; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/sql_mode_pad_char_to_full_length.test b/mysql-test/main/sql_mode_pad_char_to_full_length.test new file mode 100644 index 0000000000000..4d492bc1b709a --- /dev/null +++ b/mysql-test/main/sql_mode_pad_char_to_full_length.test @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +--echo # + +SET default_storage_engine=MyISAM; +--source include/sql_mode_pad_char_to_full_length.inc + +SET default_storage_engine=MEMORY; +--source include/sql_mode_pad_char_to_full_length.inc + +SET default_storage_engine=DEFAULT; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/suite/innodb/r/sql_mode_pad_char_to_full_length.result b/mysql-test/suite/innodb/r/sql_mode_pad_char_to_full_length.result new file mode 100644 index 0000000000000..09c1cf5749706 --- /dev/null +++ b/mysql-test/suite/innodb/r/sql_mode_pad_char_to_full_length.result @@ -0,0 +1,51 @@ +SET default_storage_engine=InnoDB; +# +# Start of 10.4 tests +# +# +# MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +# +# +# MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +# +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a INT,b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +SET sql_mode='pad_char_to_full_length'; +INSERT INTO t1 VALUES (0,0); +DELETE FROM t1; +DROP TABLE t1; +SET sql_mode=''; +CREATE OR REPLACE TABLE t1 (a CHAR(20),b CHAR(20)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(20) DEFAULT NULL, + `b` char(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +CREATE UNIQUE INDEX bi USING HASH ON t1 (b); +INSERT INTO t1 VALUES (0,0); +SET sql_mode='pad_char_to_full_length'; +DELETE FROM t1; +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/suite/innodb/t/sql_mode_pad_char_to_full_length.test b/mysql-test/suite/innodb/t/sql_mode_pad_char_to_full_length.test new file mode 100644 index 0000000000000..ba286c744d90d --- /dev/null +++ b/mysql-test/suite/innodb/t/sql_mode_pad_char_to_full_length.test @@ -0,0 +1,18 @@ +--source include/have_innodb.inc + +SET default_storage_engine=InnoDB; + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-28190 sql_mode makes MDEV-371 virtual column expressions nondeterministic +--echo # + +--source include/sql_mode_pad_char_to_full_length.inc + + +--echo # +--echo # End of 10.4 tests +--echo # From 4daea2f8b69417881b4f123a252954f22b499df1 Mon Sep 17 00:00:00 2001 From: lilinjie <1136268146@qq.com> Date: Fri, 31 Mar 2023 14:11:04 +0800 Subject: [PATCH 13/70] fix typo Signed-off-by: lilinjie <1136268146@qq.com> --- sql/log.cc | 2 +- sql/log_event.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/log.cc b/sql/log.cc index d2cbb49e280f3..8c75ae847b362 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -408,7 +408,7 @@ class binlog_cache_data Rows_log_event *m_pending; /* - Bit flags for what has been writting to cache. Used to + Bit flags for what has been writing to cache. Used to discard logs without any data changes. see enum_logged_status; */ diff --git a/sql/log_event.h b/sql/log_event.h index b12ee07b0e2d8..5cd303e288c2d 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -726,7 +726,7 @@ enum Log_event_type /* - Bit flags for what has been writting to cache. Used to + Bit flags for what has been writing to cache. Used to discard logs with table map events but not row events and nothing else important. This is stored by cache. */ From f83b7ae13d9619af29d74a27dd253b67aa0ee4fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 6 Apr 2023 07:50:23 +0300 Subject: [PATCH 14/70] MDEV-26175 : Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*) If we are inside stored function or trigger we should not commit or rollback current statement transaction. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/mdev-26175.result | 24 +++++++++++++++++ .../suite/galera/t/galera_sequences.test | 1 + mysql-test/suite/galera/t/mdev-26175.test | 27 +++++++++++++++++++ sql/handler.cc | 8 +++++- 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/galera/r/mdev-26175.result create mode 100644 mysql-test/suite/galera/t/mdev-26175.test diff --git a/mysql-test/suite/galera/r/mdev-26175.result b/mysql-test/suite/galera/r/mdev-26175.result new file mode 100644 index 0000000000000..f84244fe91619 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev-26175.result @@ -0,0 +1,24 @@ +connection node_2; +connection node_1; +connection node_1; +SET sql_mode="no_zero_date"; +SET GLOBAL wsrep_max_ws_rows=1; +CREATE TABLE t2 (a INT); +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TRIGGER tgr BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (0); +INSERT INTO t1 VALUES (0),(1); +ERROR HY000: wsrep_max_ws_rows exceeded +SELECT * FROM t1; +a +SELECT * FROM t2; +a +connection node_2; +SELECT * FROM t1; +a +SELECT * FROM t2; +a +connection node_1; +SET sql_mode=DEFAULT; +SET GLOBAL wsrep_max_ws_rows=DEFAULT; +DROP TRIGGER tgr; +DROP TABLE t1, t2; diff --git a/mysql-test/suite/galera/t/galera_sequences.test b/mysql-test/suite/galera/t/galera_sequences.test index faa3b46d2a797..613823d83e905 100644 --- a/mysql-test/suite/galera/t/galera_sequences.test +++ b/mysql-test/suite/galera/t/galera_sequences.test @@ -1,4 +1,5 @@ --source include/galera_cluster.inc +--source include/have_innodb.inc # # MDEV-19353 : Alter Sequence do not replicate to another nodes with in Galera Cluster diff --git a/mysql-test/suite/galera/t/mdev-26175.test b/mysql-test/suite/galera/t/mdev-26175.test new file mode 100644 index 0000000000000..1a3f1153e03cf --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-26175.test @@ -0,0 +1,27 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# MDEV-26175 : Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*) +# +--connection node_1 +SET sql_mode="no_zero_date"; +SET GLOBAL wsrep_max_ws_rows=1; +CREATE TABLE t2 (a INT); +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TRIGGER tgr BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (0); + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 VALUES (0),(1); +SELECT * FROM t1; +SELECT * FROM t2; + +--connection node_2 +SELECT * FROM t1; +SELECT * FROM t2; + +--connection node_1 +SET sql_mode=DEFAULT; +SET GLOBAL wsrep_max_ws_rows=DEFAULT; +DROP TRIGGER tgr; +DROP TABLE t1, t2; diff --git a/sql/handler.cc b/sql/handler.cc index 8ed8ee6488091..7eaaaf63f0022 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6618,7 +6618,13 @@ static int wsrep_after_row(THD *thd) wsrep_thd_is_local(thd) && thd->wsrep_affected_rows > wsrep_max_ws_rows) { - trans_rollback_stmt(thd) || trans_rollback(thd); + /* + If we are inside stored function or trigger we should not commit or + rollback current statement transaction. See comment in ha_commit_trans() + call for more information. + */ + if (!thd->in_sub_stmt) + trans_rollback_stmt(thd) || trans_rollback(thd); my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); DBUG_RETURN(ER_ERROR_DURING_COMMIT); } From 7bcfa00a6a19ae74afe985213e09fc1f0c0540db Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 12 Apr 2023 11:40:46 +0400 Subject: [PATCH 15/70] MDEV-31039 mariadb-backup: remove global variables ds_data and ds_meta This is a non-functional change. simplifying the code logic: - removing global variables ds_data and ds_meta - passing these variables as parameters to functions instead - adding helper classes: Datasink_free_list and Backup_datasinks - moving some function accepting a ds_ctxt parameter as methods to ds_ctxt. --- extra/mariabackup/backup_copy.cc | 169 +++++++++++------------ extra/mariabackup/backup_copy.h | 19 +-- extra/mariabackup/backup_mysql.cc | 32 +++-- extra/mariabackup/backup_mysql.h | 15 +- extra/mariabackup/datasink.h | 29 ++++ extra/mariabackup/write_filt.cc | 14 +- extra/mariabackup/write_filt.h | 3 +- extra/mariabackup/xtrabackup.cc | 219 ++++++++++++++++++------------ extra/mariabackup/xtrabackup.h | 10 +- 9 files changed, 289 insertions(+), 221 deletions(-) diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index 608be7125bd52..ffaf6dc98e426 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -73,9 +73,8 @@ bool binlog_locked; static void rocksdb_create_checkpoint(); static bool has_rocksdb_plugin(); -static void copy_or_move_dir(const char *from, const char *to, bool copy, bool allow_hardlinks); -static void rocksdb_backup_checkpoint(); -static void rocksdb_copy_back(); +static void rocksdb_backup_checkpoint(ds_ctxt *ds_data); +static void rocksdb_copy_back(ds_ctxt *ds_data); static bool is_abs_path(const char *path) { @@ -131,7 +130,7 @@ struct datadir_thread_ctxt_t { bool ret; }; -static bool backup_files_from_datadir(const char *dir_path); +static bool backup_files_from_datadir(ds_ctxt *ds_data, const char *dir_path); /************************************************************************ Retirn true if character if file separator */ @@ -804,7 +803,7 @@ if passes the rules for partial backup. @return true if file backed up or skipped successfully. */ static bool -datafile_copy_backup(const char *filepath, uint thread_n) +datafile_copy_backup(ds_ctxt *ds_data, const char *filepath, uint thread_n) { const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", @@ -825,7 +824,7 @@ datafile_copy_backup(const char *filepath, uint thread_n) } if (filename_matches(filepath, ext_list)) { - return copy_file(ds_data, filepath, filepath, thread_n); + return ds_data->copy_file(filepath, filepath, thread_n); } return(true); @@ -866,7 +865,8 @@ datafile_rsync_backup(const char *filepath, bool save_to_list, FILE *f) return(true); } -bool backup_file_print_buf(const char *filename, const char *buf, int buf_len) +bool ds_ctxt_t::backup_file_print_buf(const char *filename, + const char *buf, int buf_len) { ds_file_t *dstfile = NULL; MY_STAT stat; /* unused for now */ @@ -877,7 +877,7 @@ bool backup_file_print_buf(const char *filename, const char *buf, int buf_len) stat.st_size = buf_len; stat.st_mtime = my_time(0); - dstfile = ds_open(ds_data, filename, &stat); + dstfile = ds_open(this, filename, &stat); if (dstfile == NULL) { msg("error: Can't open the destination stream for %s", filename); @@ -916,9 +916,9 @@ bool backup_file_print_buf(const char *filename, const char *buf, int buf_len) return true; }; -static bool -backup_file_vprintf(const char *filename, const char *fmt, va_list ap) +ds_ctxt_t::backup_file_vprintf(const char *filename, + const char *fmt, va_list ap) { char *buf = 0; int buf_len; @@ -929,7 +929,7 @@ backup_file_vprintf(const char *filename, const char *fmt, va_list ap) } bool -backup_file_printf(const char *filename, const char *fmt, ...) +ds_ctxt_t::backup_file_printf(const char *filename, const char *fmt, ...) { bool result; va_list ap; @@ -1055,16 +1055,15 @@ static int fix_win_file_permissions(const char *file) Copy file for backup/restore. @return true in case of success. */ bool -copy_file(ds_ctxt_t *datasink, - const char *src_file_path, - const char *dst_file_path, - uint thread_n) +ds_ctxt_t::copy_file(const char *src_file_path, + const char *dst_file_path, + uint thread_n) { char dst_name[FN_REFLEN]; ds_file_t *dstfile = NULL; datafile_cur_t cursor; xb_fil_cur_result_t res; - DBUG_ASSERT(datasink->datasink->remove); + DBUG_ASSERT(datasink->remove); const char *dst_path = (xtrabackup_copy_back || xtrabackup_move_back)? dst_file_path : trim_dotslash(dst_file_path); @@ -1075,7 +1074,7 @@ copy_file(ds_ctxt_t *datasink, strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); - dstfile = ds_open(datasink, dst_path, &cursor.statinfo); + dstfile = ds_open(this, dst_path, &cursor.statinfo); if (dstfile == NULL) { msg(thread_n,"error: " "cannot open the destination stream for %s", dst_name); @@ -1112,7 +1111,7 @@ copy_file(ds_ctxt_t *datasink, error: datafile_close(&cursor); if (dstfile != NULL) { - datasink->datasink->remove(dstfile->path); + datasink->remove(dstfile->path); ds_close(dstfile); } @@ -1126,12 +1125,10 @@ copy_file(ds_ctxt_t *datasink, Try to move file by renaming it. If source and destination are on different devices fall back to copy and unlink. @return true in case of success. */ -static bool -move_file(ds_ctxt_t *datasink, - const char *src_file_path, - const char *dst_file_path, - const char *dst_dir, uint thread_n) +ds_ctxt_t::move_file(const char *src_file_path, + const char *dst_file_path, + const char *dst_dir, uint thread_n) { char errbuf[MYSYS_STRERROR_SIZE]; char dst_file_path_abs[FN_REFLEN]; @@ -1158,7 +1155,7 @@ move_file(ds_ctxt_t *datasink, if (my_rename(src_file_path, dst_file_path_abs, MYF(0)) != 0) { if (my_errno == EXDEV) { /* Fallback to copy/unlink */ - if(!copy_file(datasink, src_file_path, + if(!copy_file(src_file_path, dst_file_path, thread_n)) return false; msg(thread_n,"Removing %s", src_file_path); @@ -1242,13 +1239,13 @@ Copy or move file depending on current mode. @return true in case of success. */ static bool -copy_or_move_file(const char *src_file_path, +copy_or_move_file(ds_ctxt *datasink0, const char *src_file_path, const char *dst_file_path, const char *dst_dir, uint thread_n, bool copy = xtrabackup_copy_back) { - ds_ctxt_t *datasink = ds_data; /* copy to datadir by default */ + ds_ctxt_t *datasink = datasink0; /* copy to datadir by default */ char filedir[FN_REFLEN]; size_t filedir_len; bool ret; @@ -1296,13 +1293,13 @@ copy_or_move_file(const char *src_file_path, } ret = (copy ? - copy_file(datasink, src_file_path, dst_file_path, thread_n) : - move_file(datasink, src_file_path, dst_file_path, + datasink->copy_file(src_file_path, dst_file_path, thread_n) : + datasink->move_file(src_file_path, dst_file_path, dst_dir, thread_n)); cleanup: - if (datasink != ds_data) { + if (datasink != datasink0) { ds_destroy(datasink); } @@ -1314,7 +1311,7 @@ copy_or_move_file(const char *src_file_path, static bool -backup_files(const char *from, bool prep_mode) +backup_files(ds_ctxt *ds_data, const char *from, bool prep_mode) { char rsync_tmpfile_name[FN_REFLEN]; FILE *rsync_tmpfile = NULL; @@ -1352,7 +1349,7 @@ backup_files(const char *from, bool prep_mode) ret = datafile_rsync_backup(node.filepath, !prep_mode, rsync_tmpfile); } else { - ret = datafile_copy_backup(node.filepath, 1); + ret = datafile_copy_backup(ds_data, node.filepath, 1); } if (!ret) { msg("Failed to copy file %s", node.filepath); @@ -1363,7 +1360,7 @@ backup_files(const char *from, bool prep_mode) char path[FN_REFLEN]; snprintf(path, sizeof(path), "%s/db.opt", node.filepath); - if (!(ret = backup_file_printf( + if (!(ret = ds_data->backup_file_printf( trim_dotslash(path), "%s", ""))) { msg("Failed to create file %s", path); goto out; @@ -1452,7 +1449,6 @@ backup_files(const char *from, bool prep_mode) return(ret); } -void backup_fix_ddl(CorruptedPages &); lsn_t get_current_lsn(MYSQL *connection) { @@ -1477,7 +1473,8 @@ lsn_t get_current_lsn(MYSQL *connection) lsn_t server_lsn_after_lock; extern void backup_wait_for_lsn(lsn_t lsn); /** Start --backup */ -bool backup_start(CorruptedPages &corrupted_pages) +bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, + CorruptedPages &corrupted_pages) { if (!opt_no_lock) { if (opt_safe_slave_backup) { @@ -1486,7 +1483,7 @@ bool backup_start(CorruptedPages &corrupted_pages) } } - if (!backup_files(fil_path_to_mysql_datadir, true)) { + if (!backup_files(ds_data, fil_path_to_mysql_datadir, true)) { return(false); } @@ -1498,11 +1495,11 @@ bool backup_start(CorruptedPages &corrupted_pages) server_lsn_after_lock = get_current_lsn(mysql_connection); } - if (!backup_files(fil_path_to_mysql_datadir, false)) { + if (!backup_files(ds_data, fil_path_to_mysql_datadir, false)) { return(false); } - if (!backup_files_from_datadir(fil_path_to_mysql_datadir)) { + if (!backup_files_from_datadir(ds_data, fil_path_to_mysql_datadir)) { return false; } @@ -1512,7 +1509,7 @@ bool backup_start(CorruptedPages &corrupted_pages) msg("Waiting for log copy thread to read lsn %llu", (ulonglong)server_lsn_after_lock); backup_wait_for_lsn(server_lsn_after_lock); - backup_fix_ddl(corrupted_pages); + corrupted_pages.backup_fix_ddl(ds_data, ds_meta); // There is no need to stop slave thread before coping non-Innodb data when // --no-lock option is used because --no-lock option requires that no DDL or @@ -1528,7 +1525,7 @@ bool backup_start(CorruptedPages &corrupted_pages) if (opt_slave_info) { lock_binlog_maybe(mysql_connection); - if (!write_slave_info(mysql_connection)) { + if (!write_slave_info(ds_data, mysql_connection)) { return(false); } } @@ -1540,7 +1537,7 @@ bool backup_start(CorruptedPages &corrupted_pages) avoid that is to have a single process, i.e. merge innobackupex and xtrabackup. */ if (opt_galera_info) { - if (!write_galera_info(mysql_connection)) { + if (!write_galera_info(ds_data, mysql_connection)) { return(false); } } @@ -1548,7 +1545,7 @@ bool backup_start(CorruptedPages &corrupted_pages) if (opt_binlog_info == BINLOG_INFO_ON) { lock_binlog_maybe(mysql_connection); - write_binlog_info(mysql_connection); + write_binlog_info(ds_data, mysql_connection); } if (have_flush_engine_logs && !opt_no_lock) { @@ -1585,20 +1582,20 @@ void backup_release() static const char *default_buffer_pool_file = "ib_buffer_pool"; /** Finish after backup_start() and backup_release() */ -bool backup_finish() +bool backup_finish(ds_ctxt *ds_data) { /* Copy buffer pool dump or LRU dump */ if (!opt_rsync && opt_galera_info) { if (buffer_pool_filename && file_exists(buffer_pool_filename)) { - copy_file(ds_data, buffer_pool_filename, default_buffer_pool_file, 0); + ds_data->copy_file(buffer_pool_filename, default_buffer_pool_file, 0); } if (file_exists("ib_lru_dump")) { - copy_file(ds_data, "ib_lru_dump", "ib_lru_dump", 0); + ds_data->copy_file("ib_lru_dump", "ib_lru_dump", 0); } } if (has_rocksdb_plugin()) { - rocksdb_backup_checkpoint(); + rocksdb_backup_checkpoint(ds_data); } msg("Backup created in directory '%s'", xtrabackup_target_dir); @@ -1610,11 +1607,11 @@ bool backup_finish() mysql_slave_position); } - if (!write_backup_config_file()) { + if (!write_backup_config_file(ds_data)) { return(false); } - if (!write_xtrabackup_info(mysql_connection, XTRABACKUP_INFO, + if (!write_xtrabackup_info(ds_data, mysql_connection, XTRABACKUP_INFO, opt_history != 0, true)) { return(false); } @@ -1681,6 +1678,7 @@ ibx_copy_incremental_over_full() bool ret = true; char path[FN_REFLEN]; int i; + ds_ctxt *ds_data= NULL; DBUG_ASSERT(!opt_galera_info); datadir_node_init(&node); @@ -1708,15 +1706,15 @@ ibx_copy_incremental_over_full() unlink(node.filepath_rel); } - if (!(ret = copy_file(ds_data, node.filepath, - node.filepath_rel, 1))) { + if (!(ret = ds_data->copy_file(node.filepath, + node.filepath_rel, 1))) { msg("Failed to copy file %s", node.filepath); goto cleanup; } } - if (!(ret = backup_files_from_datadir(xtrabackup_incremental_dir))) + if (!(ret = backup_files_from_datadir(ds_data, xtrabackup_incremental_dir))) goto cleanup; /* copy supplementary files */ @@ -1731,7 +1729,7 @@ ibx_copy_incremental_over_full() if (file_exists(sup_files[i])) { unlink(sup_files[i]); } - copy_file(ds_data, path, sup_files[i], 0); + ds_data->copy_file(path, sup_files[i], 0); } } @@ -1745,7 +1743,7 @@ ibx_copy_incremental_over_full() if (my_mkdir(ROCKSDB_BACKUP_DIR, 0777, MYF(0))) { die("my_mkdir failed for " ROCKSDB_BACKUP_DIR); } - copy_or_move_dir(path, ROCKSDB_BACKUP_DIR, true, true); + ds_data->copy_or_move_dir(path, ROCKSDB_BACKUP_DIR, true, true); } ibx_incremental_drop_databases(xtrabackup_target_dir, xtrabackup_incremental_dir); @@ -1894,7 +1892,7 @@ copy_back() dst_dir = dst_dir_buf.make(srv_undo_dir); - ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + ds_ctxt *ds_tmp = ds_create(dst_dir, DS_TYPE_LOCAL); for (uint i = 1; i <= TRX_SYS_MAX_UNDO_SPACES; i++) { char filename[20]; @@ -1902,14 +1900,14 @@ copy_back() if (!file_exists(filename)) { break; } - if (!(ret = copy_or_move_file(filename, filename, + if (!(ret = copy_or_move_file(ds_tmp, filename, filename, dst_dir, 1))) { goto cleanup; } } - ds_destroy(ds_data); - ds_data = NULL; + ds_destroy(ds_tmp); + ds_tmp = NULL; /* copy redo logs */ @@ -1918,7 +1916,7 @@ copy_back() /* --backup generates a single ib_logfile0, which we must copy if it exists. */ - ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + ds_tmp = ds_create(dst_dir, DS_TYPE_LOCAL); MY_STAT stat_arg; if (!my_stat("ib_logfile0", &stat_arg, MYF(0)) || !stat_arg.st_size) { /* After completed --prepare, redo log files are redundant. @@ -1932,17 +1930,17 @@ copy_back() dst_dir, i); unlink(filename); } - } else if (!(ret = copy_or_move_file("ib_logfile0", "ib_logfile0", + } else if (!(ret = copy_or_move_file(ds_tmp, "ib_logfile0", "ib_logfile0", dst_dir, 1))) { goto cleanup; } - ds_destroy(ds_data); + ds_destroy(ds_tmp); /* copy innodb system tablespace(s) */ dst_dir = dst_dir_buf.make(innobase_data_home_dir); - ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + ds_tmp = ds_create(dst_dir, DS_TYPE_LOCAL); for (Tablespace::const_iterator iter(srv_sys_space.begin()), end(srv_sys_space.end()); @@ -1950,16 +1948,16 @@ copy_back() ++iter) { const char *filename = base_name(iter->name()); - if (!(ret = copy_or_move_file(filename, iter->name(), + if (!(ret = copy_or_move_file(ds_tmp, filename, iter->name(), dst_dir, 1))) { goto cleanup; } } - ds_destroy(ds_data); + ds_destroy(ds_tmp); /* copy the rest of tablespaces */ - ds_data = ds_create(mysql_data_home, DS_TYPE_LOCAL); + ds_tmp = ds_create(mysql_data_home, DS_TYPE_LOCAL); it = datadir_iter_new(".", false); @@ -2046,7 +2044,7 @@ copy_back() continue; } - if (!(ret = copy_or_move_file(node.filepath, node.filepath_rel, + if (!(ret = copy_or_move_file(ds_tmp, node.filepath, node.filepath_rel, mysql_data_home, 1))) { goto cleanup; } @@ -2056,12 +2054,12 @@ copy_back() if (file_exists(default_buffer_pool_file) && innobase_buffer_pool_filename) { - copy_or_move_file(default_buffer_pool_file, + copy_or_move_file(ds_tmp, default_buffer_pool_file, innobase_buffer_pool_filename, mysql_data_home, 0); } - rocksdb_copy_back(); + rocksdb_copy_back(ds_tmp); cleanup: if (it != NULL) { @@ -2070,11 +2068,11 @@ copy_back() datadir_node_free(&node); - if (ds_data != NULL) { - ds_destroy(ds_data); + if (ds_tmp != NULL) { + ds_destroy(ds_tmp); } - ds_data = NULL; + ds_tmp = NULL; sync_check_close(); return(ret); @@ -2182,7 +2180,7 @@ decrypt_decompress() } /* copy the rest of tablespaces */ - ds_data = ds_create(".", DS_TYPE_LOCAL); + ds_ctxt *ds_tmp = ds_create(".", DS_TYPE_LOCAL); it = datadir_iter_new(".", false); @@ -2195,11 +2193,11 @@ decrypt_decompress() datadir_iter_free(it); } - if (ds_data != NULL) { - ds_destroy(ds_data); + if (ds_tmp != NULL) { + ds_destroy(ds_tmp); } - ds_data = NULL; + ds_tmp = NULL; sync_check_close(); @@ -2211,7 +2209,7 @@ decrypt_decompress() Do not copy the Innodb files (ibdata1, redo log files), as this is done in a separate step. */ -static bool backup_files_from_datadir(const char *dir_path) +static bool backup_files_from_datadir(ds_ctxt *ds_data, const char *dir_path) { os_file_dir_t dir = os_file_opendir(dir_path); if (dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr)) return false; @@ -2241,7 +2239,7 @@ static bool backup_files_from_datadir(const char *dir_path) std::string full_path(dir_path); full_path.append(1, OS_PATH_SEPARATOR).append(info.name); - if (!(ret = copy_file(ds_data, full_path.c_str() , info.name, 1))) + if (!(ret = ds_data->copy_file(full_path.c_str() , info.name, 1))) break; } os_file_closedir(dir); @@ -2291,13 +2289,14 @@ static char *trim_trailing_dir_sep(char *path) Create a file hardlink. @return true on success, false on error. */ -static bool make_hardlink(const char *from_path, const char *to_path) +bool +ds_ctxt_t::make_hardlink(const char *from_path, const char *to_path) { DBUG_EXECUTE_IF("no_hardlinks", return false;); char to_path_full[FN_REFLEN]; if (!is_abs_path(to_path)) { - fn_format(to_path_full, to_path, ds_data->root, "", MYF(MY_RELATIVE_PATH)); + fn_format(to_path_full, to_path, root, "", MYF(MY_RELATIVE_PATH)); } else { @@ -2318,7 +2317,9 @@ static bool make_hardlink(const char *from_path, const char *to_path) Has optimization that allows to use hardlinks when possible (source and destination are directories on the same device) */ -static void copy_or_move_dir(const char *from, const char *to, bool do_copy, bool allow_hardlinks) +void +ds_ctxt_t::copy_or_move_dir(const char *from, const char *to, + bool do_copy, bool allow_hardlinks) { datadir_node_t node; datadir_node_init(&node); @@ -2346,8 +2347,8 @@ static void copy_or_move_dir(const char *from, const char *to, bool do_copy, boo if (!rc) { rc = (do_copy ? - copy_file(ds_data, from_path, to_path, 1) : - move_file(ds_data, from_path, node.filepath_rel, + copy_file(from_path, to_path, 1) : + move_file(from_path, node.filepath_rel, to, 1)); } if (!rc) @@ -2444,7 +2445,7 @@ static void rocksdb_create_checkpoint() remove temp.checkpoint directory (in server's datadir) and release user level lock acquired inside rocksdb_create_checkpoint(). */ -static void rocksdb_backup_checkpoint() +static void rocksdb_backup_checkpoint(ds_ctxt *ds_data) { msg("Backing up rocksdb files."); char rocksdb_backup_dir[FN_REFLEN]; @@ -2456,7 +2457,7 @@ static void rocksdb_backup_checkpoint() die("Can't create rocksdb backup directory %s", rocksdb_backup_dir); } } - copy_or_move_dir(rocksdb_checkpoint_dir, ROCKSDB_BACKUP_DIR, true, backup_to_directory); + ds_data->copy_or_move_dir(rocksdb_checkpoint_dir, ROCKSDB_BACKUP_DIR, true, backup_to_directory); rocksdb_remove_checkpoint_directory(); rocksdb_unlock_checkpoint(); } @@ -2464,7 +2465,7 @@ static void rocksdb_backup_checkpoint() /* Copies #rocksdb directory to the $rockdb_data_dir, on copy-back */ -static void rocksdb_copy_back() { +static void rocksdb_copy_back(ds_ctxt *ds_data) { if (access(ROCKSDB_BACKUP_DIR, 0)) return; char rocksdb_home_dir[FN_REFLEN]; @@ -2476,5 +2477,5 @@ static void rocksdb_copy_back() { xb_rocksdb_datadir?trim_dotslash(xb_rocksdb_datadir): ROCKSDB_BACKUP_DIR); } mkdirp(rocksdb_home_dir, 0777, MYF(0)); - copy_or_move_dir(ROCKSDB_BACKUP_DIR, rocksdb_home_dir, xtrabackup_copy_back, xtrabackup_copy_back); + ds_data->copy_or_move_dir(ROCKSDB_BACKUP_DIR, rocksdb_home_dir, xtrabackup_copy_back, xtrabackup_copy_back); } diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h index 62b2b1bc232c4..b4a323f2e89af 100644 --- a/extra/mariabackup/backup_copy.h +++ b/extra/mariabackup/backup_copy.h @@ -14,30 +14,18 @@ extern bool binlog_locked; -bool -backup_file_printf(const char *filename, const char *fmt, ...) - ATTRIBUTE_FORMAT(printf, 2, 0); - /************************************************************************ Return true if first and second arguments are the same path. */ bool equal_paths(const char *first, const char *second); -/************************************************************************ -Copy file for backup/restore. -@return true in case of success. */ -bool -copy_file(ds_ctxt_t *datasink, - const char *src_file_path, - const char *dst_file_path, - uint thread_n); - /** Start --backup */ -bool backup_start(CorruptedPages &corrupted_pages); +bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, + CorruptedPages &corrupted_pages); /** Release resources after backup_start() */ void backup_release(); /** Finish after backup_start() and backup_release() */ -bool backup_finish(); +bool backup_finish(ds_ctxt *ds_data); bool apply_log_finish(); bool @@ -51,6 +39,5 @@ directory_exists(const char *dir, bool create); lsn_t get_current_lsn(MYSQL *connection); -bool backup_file_print_buf(const char *filename, const char *buf, int buf_len); #endif diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index b895f8c45614c..6003bfb36c41b 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -1383,7 +1383,7 @@ variable. @returns true on success */ bool -write_slave_info(MYSQL *connection) +write_slave_info(ds_ctxt *datasink, MYSQL *connection) { String sql, comment; bool show_all_slaves_status= false; @@ -1413,7 +1413,8 @@ write_slave_info(MYSQL *connection) } mysql_slave_position= strdup(comment.c_ptr()); - return backup_file_print_buf(XTRABACKUP_SLAVE_INFO, sql.ptr(), sql.length()); + return datasink->backup_file_print_buf(XTRABACKUP_SLAVE_INFO, + sql.ptr(), sql.length()); } @@ -1421,7 +1422,7 @@ write_slave_info(MYSQL *connection) Retrieves MySQL Galera and saves it in a file. It also prints it to stdout. */ bool -write_galera_info(MYSQL *connection) +write_galera_info(ds_ctxt *datasink, MYSQL *connection) { char *state_uuid = NULL, *state_uuid55 = NULL; char *last_committed = NULL, *last_committed55 = NULL; @@ -1453,12 +1454,12 @@ write_galera_info(MYSQL *connection) goto cleanup; } - result = backup_file_printf(XTRABACKUP_GALERA_INFO, + result = datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, "%s:%s\n", state_uuid ? state_uuid : state_uuid55, last_committed ? last_committed : last_committed55); if (result) { - write_current_binlog_file(connection); + write_current_binlog_file(datasink, connection); } cleanup: @@ -1472,7 +1473,7 @@ write_galera_info(MYSQL *connection) Flush and copy the current binary log file into the backup, if GTID is enabled */ bool -write_current_binlog_file(MYSQL *connection) +write_current_binlog_file(ds_ctxt *datasink, MYSQL *connection) { char *executed_gtid_set = NULL; char *gtid_binlog_state = NULL; @@ -1542,7 +1543,7 @@ write_current_binlog_file(MYSQL *connection) snprintf(filepath, sizeof(filepath), "%s%c%s", log_bin_dir, FN_LIBCHAR, log_bin_file); - result = copy_file(ds_data, filepath, log_bin_file, 0); + result = datasink->copy_file(filepath, log_bin_file, 0); } cleanup: @@ -1558,7 +1559,7 @@ write_current_binlog_file(MYSQL *connection) Retrieves MySQL binlog position and saves it in a file. It also prints it to stdout. */ bool -write_binlog_info(MYSQL *connection) +write_binlog_info(ds_ctxt *datasink, MYSQL *connection) { char *filename = NULL; char *position = NULL; @@ -1603,14 +1604,14 @@ write_binlog_info(MYSQL *connection) "filename '%s', position '%s', " "GTID of the last change '%s'", filename, position, gtid) != -1); - result = backup_file_printf(XTRABACKUP_BINLOG_INFO, + result = datasink->backup_file_printf(XTRABACKUP_BINLOG_INFO, "%s\t%s\t%s\n", filename, position, gtid); } else { ut_a(asprintf(&mysql_binlog_position, "filename '%s', position '%s'", filename, position) != -1); - result = backup_file_printf(XTRABACKUP_BINLOG_INFO, + result = datasink->backup_file_printf(XTRABACKUP_BINLOG_INFO, "%s\t%s\n", filename, position); } @@ -1650,8 +1651,9 @@ PERCONA_SCHEMA.xtrabackup_history and writes a new history record to the table containing all the history info particular to the just completed backup. */ bool -write_xtrabackup_info(MYSQL *connection, const char * filename, bool history, - bool stream) +write_xtrabackup_info(ds_ctxt *datasink, + MYSQL *connection, const char * filename, bool history, + bool stream) { bool result = true; @@ -1727,7 +1729,7 @@ write_xtrabackup_info(MYSQL *connection, const char * filename, bool history, } if (stream) { - backup_file_printf(filename, "%s", buf); + datasink->backup_file_printf(filename, "%s", buf); } else { fp = fopen(filename, "w"); if (!fp) { @@ -1848,9 +1850,9 @@ static std::string make_local_paths(const char *data_file_path) return buf.str(); } -bool write_backup_config_file() +bool write_backup_config_file(ds_ctxt *datasink) { - int rc= backup_file_printf("backup-my.cnf", + int rc= datasink->backup_file_printf("backup-my.cnf", "# This MySQL options file was generated by innobackupex.\n\n" "# The MySQL server\n" "[mysqld]\n" diff --git a/extra/mariabackup/backup_mysql.h b/extra/mariabackup/backup_mysql.h index b61fa2362c60b..d80f3bb7bc167 100644 --- a/extra/mariabackup/backup_mysql.h +++ b/extra/mariabackup/backup_mysql.h @@ -62,17 +62,18 @@ void unlock_all(MYSQL *connection); bool -write_current_binlog_file(MYSQL *connection); +write_current_binlog_file(ds_ctxt *datasink, MYSQL *connection); bool -write_binlog_info(MYSQL *connection); +write_binlog_info(ds_ctxt *datasink, MYSQL *connection); bool -write_xtrabackup_info(MYSQL *connection, const char * filename, bool history, - bool stream); +write_xtrabackup_info(ds_ctxt *datasink, + MYSQL *connection, const char * filename, bool history, + bool stream); bool -write_backup_config_file(); +write_backup_config_file(ds_ctxt *datasink); bool lock_binlog_maybe(MYSQL *connection); @@ -84,10 +85,10 @@ bool wait_for_safe_slave(MYSQL *connection); bool -write_galera_info(MYSQL *connection); +write_galera_info(ds_ctxt *datasink, MYSQL *connection); bool -write_slave_info(MYSQL *connection); +write_slave_info(ds_ctxt *datasink, MYSQL *connection); #endif diff --git a/extra/mariabackup/datasink.h b/extra/mariabackup/datasink.h index 4bede4ec9e78a..57468e0c9c739 100644 --- a/extra/mariabackup/datasink.h +++ b/extra/mariabackup/datasink.h @@ -37,6 +37,35 @@ typedef struct ds_ctxt { char *root; void *ptr; struct ds_ctxt *pipe_ctxt; + /* + Copy file for backup/restore. + @return true in case of success. + */ + bool copy_file(const char *src_file_path, + const char *dst_file_path, + uint thread_n); + + bool move_file(const char *src_file_path, + const char *dst_file_path, + const char *dst_dir, + uint thread_n); + + bool make_hardlink(const char *from_path, const char *to_path); + + void copy_or_move_dir(const char *from, const char *to, + bool do_copy, bool allow_hardlinks); + + bool backup_file_vprintf(const char *filename, + const char *fmt, va_list ap); + + bool backup_file_print_buf(const char *filename, + const char *buf, + int buf_len); + + bool backup_file_printf(const char *filename, + const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 2, 0); + } ds_ctxt_t; typedef struct { diff --git a/extra/mariabackup/write_filt.cc b/extra/mariabackup/write_filt.cc index c144a60e37844..dd77a9bb953f9 100644 --- a/extra/mariabackup/write_filt.cc +++ b/extra/mariabackup/write_filt.cc @@ -31,7 +31,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA /************************************************************************ Write-through page write filter. */ -static my_bool wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, +static my_bool wf_wt_init(ds_ctxt *ds_meta, + xb_write_filt_ctxt_t *ctxt, char *dst_name, xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages); static my_bool wf_wt_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile); @@ -44,7 +45,8 @@ xb_write_filt_t wf_write_through = { /************************************************************************ Incremental page write filter. */ -static my_bool wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, +static my_bool wf_incremental_init(ds_ctxt *ds_meta, + xb_write_filt_ctxt_t *ctxt, char *dst_name, xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages); static my_bool wf_incremental_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile); @@ -64,7 +66,8 @@ Initialize incremental page write filter. @return TRUE on success, FALSE on error. */ static my_bool -wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, +wf_incremental_init(ds_ctxt *ds_meta, + xb_write_filt_ctxt_t *ctxt, char *dst_name, xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages) { char meta_name[FN_REFLEN]; @@ -88,7 +91,7 @@ wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, XB_DELTA_INFO_SUFFIX); const xb_delta_info_t info(cursor->page_size, cursor->zip_size, cursor->space_id); - if (!xb_write_delta_metadata(meta_name, &info)) { + if (!xb_write_delta_metadata(ds_meta, meta_name, &info)) { msg(cursor->thread_n,"Error: " "failed to write meta info for %s", cursor->rel_path); @@ -195,7 +198,8 @@ Initialize the write-through page write filter. @return TRUE on success, FALSE on error. */ static my_bool -wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name __attribute__((unused)), +wf_wt_init(ds_ctxt *ds_meta __attribute__((unused)), + xb_write_filt_ctxt_t *ctxt, char *dst_name __attribute__((unused)), xb_fil_cur_t *cursor, CorruptedPages *) { ctxt->cursor = cursor; diff --git a/extra/mariabackup/write_filt.h b/extra/mariabackup/write_filt.h index 6c3ef24291f91..a0ce0778a7f6f 100644 --- a/extra/mariabackup/write_filt.h +++ b/extra/mariabackup/write_filt.h @@ -45,7 +45,8 @@ typedef struct { typedef struct { - my_bool (*init)(xb_write_filt_ctxt_t *ctxt, char *dst_name, + my_bool (*init)(ds_ctxt *ds_meta, + xb_write_filt_ctxt_t *ctxt, char *dst_name, xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages); my_bool (*process)(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile); my_bool (*finalize)(xb_write_filt_ctxt_t *, ds_file_t *dstfile); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index ad35749d0ff7f..ee12034c9109f 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -291,10 +291,66 @@ char *xb_plugin_dir; char *xb_plugin_load; my_bool xb_close_files; -/* Datasinks */ -ds_ctxt_t *ds_data = NULL; -ds_ctxt_t *ds_meta = NULL; -ds_ctxt_t *ds_redo = NULL; + +class Datasink_free_list +{ +protected: + /* + Simple datasink creation tracking... + add datasinks in the reverse order you want them destroyed. + */ +#define XTRABACKUP_MAX_DATASINKS 10 + ds_ctxt_t *m_datasinks_to_destroy[XTRABACKUP_MAX_DATASINKS]; + uint m_actual_datasinks_to_destroy; +public: + Datasink_free_list() + :m_actual_datasinks_to_destroy(0) + { } + + void add_datasink_to_destroy(ds_ctxt_t *ds) + { + xb_ad(m_actual_datasinks_to_destroy < XTRABACKUP_MAX_DATASINKS); + m_datasinks_to_destroy[m_actual_datasinks_to_destroy] = ds; + m_actual_datasinks_to_destroy++; + } + + /* + Destroy datasinks. + Destruction is done in the specific order to not violate their order in the + pipeline so that each datasink is able to flush data down the pipeline. + */ + void destroy() + { + for (uint i= m_actual_datasinks_to_destroy; i > 0; i--) + { + ds_destroy(m_datasinks_to_destroy[i - 1]); + m_datasinks_to_destroy[i - 1] = NULL; + } + } +}; + + +class Backup_datasinks: public Datasink_free_list +{ +public: + ds_ctxt_t *m_data; + ds_ctxt_t *m_meta; + ds_ctxt_t *m_redo; + + Backup_datasinks() + :m_data(NULL), + m_meta(NULL), + m_redo(NULL) + { } + void init(); + void destroy() + { + Datasink_free_list::destroy(); + *this= Backup_datasinks(); + } + bool backup_low(); +}; + static bool innobackupex_mode = false; @@ -440,7 +496,8 @@ void CorruptedPages::rename_space(ulint space_id, const std::string &new_name) ut_a(!pthread_mutex_unlock(&m_mutex)); } -bool CorruptedPages::print_to_file(const char *filename) const +bool CorruptedPages::print_to_file(ds_ctxt *ds_data, + const char *filename) const { std::ostringstream out; ut_a(!pthread_mutex_lock(&m_mutex)); @@ -468,8 +525,8 @@ bool CorruptedPages::print_to_file(const char *filename) const out << "\n"; } ut_a(!pthread_mutex_unlock(&m_mutex)); - if (xtrabackup_backup) - return backup_file_print_buf(filename, out.str().c_str(), + if (ds_data) + return ds_data->backup_file_print_buf(filename, out.str().c_str(), static_cast(out.str().size())); std::ofstream outfile; outfile.open(filename); @@ -587,19 +644,6 @@ void CorruptedPages::zero_out_free_pages() ut_free(buf); } -/* Simple datasink creation tracking...add datasinks in the reverse order you -want them destroyed. */ -#define XTRABACKUP_MAX_DATASINKS 10 -static ds_ctxt_t *datasinks[XTRABACKUP_MAX_DATASINKS]; -static uint actual_datasinks = 0; -static inline -void -xtrabackup_add_datasink(ds_ctxt_t *ds) -{ - xb_ad(actual_datasinks < XTRABACKUP_MAX_DATASINKS); - datasinks[actual_datasinks] = ds; actual_datasinks++; -} - typedef void (*process_single_tablespace_func_t)(const char *dirname, const char *filname, bool is_remote, @@ -955,6 +999,7 @@ typedef struct { pthread_mutex_t* count_mutex; os_thread_id_t id; CorruptedPages *corrupted_pages; + Backup_datasinks *datasinks; } data_thread_ctxt_t; /* ======== for option and variables ======== */ @@ -2456,7 +2501,8 @@ xb_read_delta_metadata(const char *filepath, xb_delta_info_t *info) Write meta info for an incremental delta. @return TRUE on success, FALSE on failure. */ my_bool -xb_write_delta_metadata(const char *filename, const xb_delta_info_t *info) +xb_write_delta_metadata(ds_ctxt *ds_meta, + const char *filename, const xb_delta_info_t *info) { ds_file_t *f; char buf[64]; @@ -2771,7 +2817,9 @@ xb_get_copy_action(const char *dflt) for full backup, pages filter for incremental backup, etc. @return FALSE on success and TRUE on error */ -static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n, +static my_bool xtrabackup_copy_datafile(ds_ctxt *ds_data, + ds_ctxt *ds_meta, + fil_node_t *node, uint thread_n, const char *dest_name, const xb_write_filt_t &write_filter, CorruptedPages &corrupted_pages) @@ -2839,7 +2887,7 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n, ut_a(write_filter.process != NULL); if (write_filter.init != NULL && - !write_filter.init(&write_filt_ctxt, dst_name, &cursor, + !write_filter.init(ds_meta, &write_filt_ctxt, dst_name, &cursor, opt_log_innodb_page_corruption ? &corrupted_pages : NULL)) { msg (thread_n, "mariabackup: error: failed to initialize page write filter."); goto error; @@ -3204,7 +3252,8 @@ DECLARE_THREAD(data_copy_thread_func)( DBUG_EXECUTE_FOR_KEY("wait_innodb_redo_before_copy", node->space->name, backup_wait_for_lsn(get_current_lsn(mysql_connection));); /* copy the datafile */ - if (xtrabackup_copy_datafile(node, num, NULL, + if (xtrabackup_copy_datafile(ctxt->datasinks->m_data, + ctxt->datasinks->m_meta, node, num, NULL, xtrabackup_incremental ? wf_incremental : wf_write_through, *ctxt->corrupted_pages)) die("failed to copy datafile."); @@ -3230,22 +3279,21 @@ Otherwise (i.e. when streaming in the 'tar' format) we need 2 separate datasinks for the data stream (and don't allow parallel data copying) and for metainfo files (including ib_logfile0). The second datasink writes to temporary files first, and then streams them in a serialized way when closed. */ -static void -xtrabackup_init_datasinks(void) +void Backup_datasinks::init() { /* Start building out the pipelines from the terminus back */ if (xtrabackup_stream) { /* All streaming goes to stdout */ - ds_data = ds_meta = ds_redo = ds_create(xtrabackup_target_dir, - DS_TYPE_STDOUT); + m_data = m_meta = m_redo = ds_create(xtrabackup_target_dir, + DS_TYPE_STDOUT); } else { /* Local filesystem */ - ds_data = ds_meta = ds_redo = ds_create(xtrabackup_target_dir, - DS_TYPE_LOCAL); + m_data = m_meta = m_redo = ds_create(xtrabackup_target_dir, + DS_TYPE_LOCAL); } /* Track it for destruction */ - xtrabackup_add_datasink(ds_data); + add_datasink_to_destroy(m_data); /* Stream formatting */ if (xtrabackup_stream) { @@ -3254,66 +3302,50 @@ xtrabackup_init_datasinks(void) ut_a(xtrabackup_stream_fmt == XB_STREAM_FMT_XBSTREAM); ds = ds_create(xtrabackup_target_dir, DS_TYPE_XBSTREAM); - xtrabackup_add_datasink(ds); + add_datasink_to_destroy(ds); - ds_set_pipe(ds, ds_data); - ds_data = ds; + ds_set_pipe(ds, m_data); + m_data = ds; - ds_redo = ds_meta = ds_data; + m_redo = m_meta = m_data; } - /* Compression for ds_data and ds_redo */ + /* Compression for m_data and m_redo */ if (xtrabackup_compress) { ds_ctxt_t *ds; /* Use a 1 MB buffer for compressed output stream */ ds = ds_create(xtrabackup_target_dir, DS_TYPE_BUFFER); ds_buffer_set_size(ds, 1024 * 1024); - xtrabackup_add_datasink(ds); - ds_set_pipe(ds, ds_data); - if (ds_data != ds_redo) { - ds_data = ds; + add_datasink_to_destroy(ds); + ds_set_pipe(ds, m_data); + if (m_data != m_redo) { + m_data = ds; ds = ds_create(xtrabackup_target_dir, DS_TYPE_BUFFER); ds_buffer_set_size(ds, 1024 * 1024); - xtrabackup_add_datasink(ds); - ds_set_pipe(ds, ds_redo); - ds_redo = ds; + add_datasink_to_destroy(ds); + ds_set_pipe(ds, m_redo); + m_redo = ds; } else { - ds_redo = ds_data = ds; + m_redo = m_data = ds; } ds = ds_create(xtrabackup_target_dir, DS_TYPE_COMPRESS); - xtrabackup_add_datasink(ds); - ds_set_pipe(ds, ds_data); - if (ds_data != ds_redo) { - ds_data = ds; + add_datasink_to_destroy(ds); + ds_set_pipe(ds, m_data); + if (m_data != m_redo) { + m_data = ds; ds = ds_create(xtrabackup_target_dir, DS_TYPE_COMPRESS); - xtrabackup_add_datasink(ds); - ds_set_pipe(ds, ds_redo); - ds_redo = ds; + add_datasink_to_destroy(ds); + ds_set_pipe(ds, m_redo); + m_redo = ds; } else { - ds_redo = ds_data = ds; + m_redo = m_data = ds; } } } -/************************************************************************ -Destroy datasinks. - -Destruction is done in the specific order to not violate their order in the -pipeline so that each datasink is able to flush data down the pipeline. */ -static void xtrabackup_destroy_datasinks(void) -{ - for (uint i = actual_datasinks; i > 0; i--) { - ds_destroy(datasinks[i-1]); - datasinks[i-1] = NULL; - } - ds_data = NULL; - ds_meta = NULL; - ds_redo = NULL; -} - #define SRV_MAX_N_PENDING_SYNC_IOS 100 /** Initialize the tablespace cache subsystem. */ @@ -4447,7 +4479,7 @@ static void stop_backup_threads() /** Implement the core of --backup @return whether the operation succeeded */ -static bool xtrabackup_backup_low() +bool Backup_datasinks::backup_low() { ut_ad(!metadata_to_lsn); @@ -4499,7 +4531,7 @@ static bool xtrabackup_backup_low() } metadata_last_lsn = log_copy_scanned_lsn; - if (!xtrabackup_stream_metadata(ds_meta)) { + if (!xtrabackup_stream_metadata(m_meta)) { msg("Error: failed to stream metadata."); return false; } @@ -4515,7 +4547,8 @@ static bool xtrabackup_backup_low() } sprintf(filename, "%s/%s", xtrabackup_extra_lsndir, XTRABACKUP_INFO); - if (!write_xtrabackup_info(mysql_connection, filename, false, false)) { + if (!write_xtrabackup_info(m_data, + mysql_connection, filename, false, false)) { msg("Error: failed to write info " "to '%s'.", filename); return false; @@ -4535,6 +4568,7 @@ static bool xtrabackup_backup_func() pthread_mutex_t count_mutex; CorruptedPages corrupted_pages; data_thread_ctxt_t *data_threads; + Backup_datasinks backup_datasinks; pthread_mutex_init(&backup_mutex, NULL); pthread_cond_init(&scanned_lsn_cond, NULL); @@ -4686,7 +4720,7 @@ static bool xtrabackup_backup_func() log_mutex_exit(); - xtrabackup_init_datasinks(); + backup_datasinks.init(); if (!select_history()) { goto fail; @@ -4694,7 +4728,7 @@ static bool xtrabackup_backup_func() /* open the log file */ memset(&stat_info, 0, sizeof(MY_STAT)); - dst_log_file = ds_open(ds_redo, "ib_logfile0", &stat_info); + dst_log_file = ds_open(backup_datasinks.m_redo, "ib_logfile0", &stat_info); if (dst_log_file == NULL) { msg("Error: failed to open the target stream for " "'ib_logfile0'."); @@ -4812,6 +4846,7 @@ static bool xtrabackup_backup_func() data_threads[i].count = &count; data_threads[i].count_mutex = &count_mutex; data_threads[i].corrupted_pages = &corrupted_pages; + data_threads[i].datasinks= &backup_datasinks; os_thread_create(data_copy_thread_func, data_threads + i, &data_threads[i].id); } @@ -4832,10 +4867,13 @@ static bool xtrabackup_backup_func() datafiles_iter_free(it); } - bool ok = backup_start(corrupted_pages); + DBUG_ASSERT(backup_datasinks.m_data); + DBUG_ASSERT(backup_datasinks.m_meta); + bool ok = backup_start(backup_datasinks.m_data, + backup_datasinks.m_meta, corrupted_pages); if (ok) { - ok = xtrabackup_backup_low(); + ok = backup_datasinks.backup_low(); backup_release(); @@ -4845,12 +4883,13 @@ static bool xtrabackup_backup_func() ); if (ok) { - backup_finish(); + backup_finish(backup_datasinks.m_data); } } if (opt_log_innodb_page_corruption) - ok = corrupted_pages.print_to_file(MB_CORRUPTED_PAGES_FILE); + ok = corrupted_pages.print_to_file(backup_datasinks.m_data, + MB_CORRUPTED_PAGES_FILE); if (!ok) { goto fail; @@ -4859,7 +4898,7 @@ static bool xtrabackup_backup_func() if (changed_page_bitmap) { xb_page_bitmap_deinit(changed_page_bitmap); } - xtrabackup_destroy_datasinks(); + backup_datasinks.destroy(); msg("Redo log (from LSN " LSN_PF " to " LSN_PF ") was copied.", checkpoint_lsn_start, log_copy_scanned_lsn); @@ -4906,7 +4945,7 @@ FTWRL. This ensures consistent backup in presence of DDL. It is the responsibility of the prepare phase to deal with .new, .ren, and .del files. */ -void backup_fix_ddl(CorruptedPages &corrupted_pages) +void CorruptedPages::backup_fix_ddl(ds_ctxt *ds_data, ds_ctxt *ds_meta) { std::set new_tables; std::set dropped_tables; @@ -4929,7 +4968,7 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) if (ddl_tracker.drops.find(id) != ddl_tracker.drops.end()) { dropped_tables.insert(name); - corrupted_pages.drop_space(id); + drop_space(id); continue; } @@ -4951,20 +4990,20 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) of it because of optimized DDL. We emulate a drop/create.*/ dropped_tables.insert(name); if (opt_log_innodb_page_corruption) - corrupted_pages.drop_space(id); + drop_space(id); new_tables.insert(new_name); } else { /* Renamed, and no optimized DDL*/ renamed_tables[name] = new_name; if (opt_log_innodb_page_corruption) - corrupted_pages.rename_space(id, new_name); + rename_space(id, new_name); } } else if (has_optimized_ddl) { /* Table was recreated, or optimized DDL ran. In both cases we need a full copy in the backup.*/ new_tables.insert(name); if (opt_log_innodb_page_corruption) - corrupted_pages.drop_space(id); + drop_space(id); } } @@ -4985,7 +5024,7 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) dropped_tables.erase(name); new_tables.insert(name); if (opt_log_innodb_page_corruption) - corrupted_pages.drop_space(id); + drop_space(id); } } @@ -4994,7 +5033,8 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) iter != renamed_tables.end(); ++iter) { const std::string old_name = iter->first; std::string new_name = iter->second; - backup_file_printf((old_name + ".ren").c_str(), "%s", new_name.c_str()); + DBUG_ASSERT(ds_data); + ds_data->backup_file_printf((old_name + ".ren").c_str(), "%s", new_name.c_str()); } // Mark tablespaces for drop @@ -5002,7 +5042,7 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) iter != dropped_tables.end(); iter++) { const std::string name(*iter); - backup_file_printf((name + ".del").c_str(), "%s", ""); + ds_data->backup_file_printf((name + ".del").c_str(), "%s", ""); } // Load and copy new tables. @@ -5046,8 +5086,9 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages) continue; std::string dest_name(node->space->name); dest_name.append(".new"); - xtrabackup_copy_datafile(node, 0, dest_name.c_str(), wf_write_through, - corrupted_pages); + xtrabackup_copy_datafile(ds_data, ds_meta, + node, 0, dest_name.c_str(), + wf_write_through, *this); } datafiles_iter_free(it); @@ -6163,7 +6204,7 @@ static bool xtrabackup_prepare_func(char** argv) } } else - corrupted_pages.print_to_file(MB_CORRUPTED_PAGES_FILE); + corrupted_pages.print_to_file(NULL, MB_CORRUPTED_PAGES_FILE); if (xtrabackup_rollback_xa) { diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h index 854456c3afd7f..de3a96443a39c 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -46,11 +46,13 @@ class CorruptedPages bool contains(ulint space_id, ulint page_no) const; void drop_space(ulint space_id); void rename_space(ulint space_id, const std::string &new_name); - bool print_to_file(const char *file_name) const; + bool print_to_file(ds_ctxt *ds_data, const char *file_name) const; void read_from_file(const char *file_name); bool empty() const; void zero_out_free_pages(); + void backup_fix_ddl(ds_ctxt *ds_data, ds_ctxt *ds_meta); + private: void add_page_no_lock(const char *space_name, ulint space_id, ulint page_no, bool convert_space_name); @@ -63,6 +65,7 @@ class CorruptedPages container_t m_spaces; }; + /* value of the --incremental option */ extern lsn_t incremental_lsn; @@ -76,8 +79,6 @@ extern char *xb_rocksdb_datadir; extern my_bool xb_backup_rocksdb; extern uint opt_protocol; -extern ds_ctxt_t *ds_meta; -extern ds_ctxt_t *ds_data; /* The last checkpoint LSN at the backup startup time */ extern lsn_t checkpoint_lsn_start; @@ -177,7 +178,8 @@ extern ulong opt_binlog_info; extern ulong xtrabackup_innodb_force_recovery; void xtrabackup_io_throttling(void); -my_bool xb_write_delta_metadata(const char *filename, +my_bool xb_write_delta_metadata(ds_ctxt *ds_meta, + const char *filename, const xb_delta_info_t *info); /************************************************************************ From ef4d09948d5ff38f5dff8974005ba222a4b18462 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 11 Apr 2023 21:21:45 -0700 Subject: [PATCH 16/70] MDEV-20773 Error from UPDATE when estimating selectivity of a range This bug could affect multi-update statements as well as single-table update statements processed as multi-updates when the where condition contained a range condition over a non-indexed varchar column. The optimizer calculates selectivity of such range conditions using histograms. For each range the buckets containing endpoints of the the range are determined with a procedure that stores the values of the endpoints in the space of the record buffer where values of the columns are usually stored. For a range over a varchar column the value of a endpoint may exceed the size of the buffer and in such case the value is stored with truncation. This truncations cannot affect the result of the calculation of the range selectivity as the calculation employes only the beginning of the value string. However it can trigger generation of an unexpected error on this truncation if an update statement is processed. This patch prohibits truncation messages when selectivity of a range condition is calculated for a non-indexed column. Approved by Oleksandr Byelkin --- mysql-test/main/update.result | 29 +++++++++++++++++++++++++++++ mysql-test/main/update.test | 23 +++++++++++++++++++++++ sql/opt_range.cc | 3 +++ 3 files changed, 55 insertions(+) diff --git a/mysql-test/main/update.result b/mysql-test/main/update.result index f5edf1c6be36a..7b6426d2ec5e5 100644 --- a/mysql-test/main/update.result +++ b/mysql-test/main/update.result @@ -734,3 +734,32 @@ UPDATE t1,t2 SET t1.i1 = -39 WHERE t2.d1 <> t1.i1 AND t2.d1 = t1.d2; ERROR 22007: Incorrect datetime value: '19' for column `test`.`t1`.`i1` at row 1 DROP TABLE t1,t2; # End of MariaDB 10.2 tests +# +# MDEV-20773: UPDATE with LIKE predicate over non-indexed column +# of VARCHAR type +# +create table t1 (a1 varchar(30), a2 varchar(30) collate utf8_bin); +insert into t1 values +('aa','zzz'), ('b','xxaa'), ('ccc','yyy'), ('ddd','xxb'); +analyze table t1 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +explain extended +update t1 set a1 = 'u' + where a2 like 'xx%' and exists(select 1 from t1 where t1.a1 < 'c'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 4 49.22 Using where +2 SUBQUERY t1 ALL NULL NULL NULL NULL 4 50.00 Using where +Warnings: +Note 1003 /* select#1 */ update `test`.`t1` set `test`.`t1`.`a1` = 'u' where `test`.`t1`.`a2` like 'xx%' +update t1 set a1 = 'u' + where a2 like 'xx%' and exists(select 1 from t1 where t1.a1 < 'c'); +select * from t1; +a1 a2 +aa zzz +u xxaa +ccc yyy +u xxb +drop table t1; +# End of MariaDB 10.4 tests diff --git a/mysql-test/main/update.test b/mysql-test/main/update.test index 8a6949447eee6..147d69d50c957 100644 --- a/mysql-test/main/update.test +++ b/mysql-test/main/update.test @@ -676,3 +676,26 @@ UPDATE t1,t2 SET t1.i1 = -39 WHERE t2.d1 <> t1.i1 AND t2.d1 = t1.d2; DROP TABLE t1,t2; --echo # End of MariaDB 10.2 tests + +--echo # +--echo # MDEV-20773: UPDATE with LIKE predicate over non-indexed column +--echo # of VARCHAR type +--echo # + +create table t1 (a1 varchar(30), a2 varchar(30) collate utf8_bin); +insert into t1 values + ('aa','zzz'), ('b','xxaa'), ('ccc','yyy'), ('ddd','xxb'); +analyze table t1 persistent for all; + +explain extended +update t1 set a1 = 'u' + where a2 like 'xx%' and exists(select 1 from t1 where t1.a1 < 'c'); + +update t1 set a1 = 'u' + where a2 like 'xx%' and exists(select 1 from t1 where t1.a1 < 'c'); + +select * from t1; + +drop table t1; + +--echo # End of MariaDB 10.4 tests diff --git a/sql/opt_range.cc b/sql/opt_range.cc index c34420181a2e6..69a95f8da4454 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -3518,7 +3518,10 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item **cond) } else { + enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; + thd->count_cuted_fields= CHECK_FIELD_IGNORE; rows= records_in_column_ranges(¶m, idx, key); + thd->count_cuted_fields= save_count_cuted_fields; if (rows != DBL_MAX) { key->field->cond_selectivity= rows/table_records; From d1a4315f4cb096c2fd81c96bc4afc6bb618bae49 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Thu, 13 Apr 2023 07:49:35 +0200 Subject: [PATCH 17/70] MDEV-30402: Encrypted mariabackup SST breaks on distributions with newer socat This commit adds a new 'no-sni' option to socat which is required to properly authenticate with newer socat versions (after version 1.7.4+). This option is needed to disable the automatic use of the SNI feature (Server Name Indication) since the SST script directly specifies the commonname if necessary and automatic activation of the SNI feature is unnecessary in such scenarios. --- scripts/wsrep_sst_mariabackup.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index 7e26af83701ce..b46e64a9e8bba 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -340,6 +340,9 @@ get_transfer() "Use workaround for socat $SOCAT_VERSION bug" fi fi + if check_for_version "$SOCAT_VERSION" '1.7.4'; then + tcmd="$tcmd,no-sni=1" + fi fi if [ "${sockopt#*,dhparam=}" = "$sockopt" ]; then From 2e1c532bd2d9f9a35559e54f66d33c81e33009b1 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Fri, 24 Mar 2023 13:04:05 +1100 Subject: [PATCH 18/70] alloca() fix Corrections from 1e58b8afc086da755cf9209ed17fc36351da5563. * Re-add #pragma alloca for AIX - now in my_alloca.h --- include/my_alloca.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/my_alloca.h b/include/my_alloca.h index 25fd8867e698c..de5f32bb886e7 100644 --- a/include/my_alloca.h +++ b/include/my_alloca.h @@ -34,7 +34,10 @@ #endif #endif -#if defined(HAVE_ALLOCA) +#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43) +#pragma alloca +#endif /* _AIX */ + /* If the GCC/LLVM compiler from the MinGW is used, alloca may not be defined when using the MSVC CRT: @@ -42,6 +45,5 @@ #if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && !defined(alloca) #define alloca __builtin_alloca #endif /* GNUC */ -#endif #endif /* MY_ALLOCA_INCLUDED */ From 6c196090c8c265bfd93df1e2ee6b18cda2b1d2d8 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 13 Apr 2023 20:13:13 +0300 Subject: [PATCH 19/70] Fix compilation on gcc 11.2.0 It is used in the out-of date Ubuntu 21.10 Impish. --- storage/innobase/rem/rem0rec.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index ae8c3c4513eff..d202afa9e2057 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -242,9 +242,9 @@ enum rec_leaf_format { REC_LEAF_INSTANT }; -#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 11 +#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 12 # pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wconversion" /* GCC 5 to 10 need this */ +# pragma GCC diagnostic ignored "-Wconversion" /* GCC 5 to 11 need this */ #endif /** Determine the offset to each field in a leaf-page record in ROW_FORMAT=COMPACT,DYNAMIC,COMPRESSED. From 0cca8166f3111901019dcd33747a1a1dfd9e66d1 Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Fri, 7 Apr 2023 00:16:16 +0300 Subject: [PATCH 20/70] MDEV-30775 Performance regression in fil_space_t::try_to_close() introduced in MDEV-23855 Post-push fix. 10.5 MDEV-30775 fix inserts just opened tablespace just after the element which fil_system.space_list_last_opened points to. In MDEV-25223 fil_system_t::space_list was changed from UT_LIST to ilist. ilist<...>::insert(iterator pos, reference value) inserts element to list before pos. But it was not taken into account during 10.5->10.6 merge in 85cbfaefee694cdd490b357444f24ff16b8042e8, and the fix does not work properly, i.e. it inserted just opened tablespace to the position preceding fil_system.space_list_last_opened. --- storage/innobase/fil/fil0fil.cc | 17 +++++++++++++---- storage/innobase/include/fil0fil.h | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 7e2b04eaa7388..00ded1ab27e5b 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -803,8 +803,17 @@ pfs_os_file_t fil_system_t::detach(fil_space_t *space, bool detach_handle) space_list_t::iterator s= space_list_t::iterator(space); if (space_list_last_opened == space) { - space_list_t::iterator prev= s; - space_list_last_opened= &*--prev; + if (s == space_list.begin()) + { + ut_ad(srv_operation > SRV_OPERATION_EXPORT_RESTORED || + srv_shutdown_state > SRV_SHUTDOWN_NONE); + space_list_last_opened= nullptr; + } + else + { + space_list_t::iterator prev= s; + space_list_last_opened= &*--prev; + } } space_list.erase(s); } @@ -1317,9 +1326,9 @@ void fil_system_t::close() void fil_system_t::add_opened_last_to_space_list(fil_space_t *space) { if (UNIV_LIKELY(space_list_last_opened != nullptr)) - space_list.insert(space_list_t::iterator(space_list_last_opened), *space); + space_list.insert(++space_list_t::iterator(space_list_last_opened), *space); else - space_list.push_back(*space); + space_list.push_front(*space); space_list_last_opened= space; } diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 12ac86dc9beb5..165994eef3513 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1552,6 +1552,7 @@ struct fil_system_t { if (space_list_last_opened == space) { + ut_ad(s != space_list.begin()); space_list_t::iterator prev= s; space_list_last_opened= &*--prev; } From 71f16c836f5f91e2983c28d6a14bf3687bea78bb Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Thu, 13 Apr 2023 17:56:38 +0300 Subject: [PATCH 21/70] MDEV-31049 fil_delete_tablespace() returns wrong file handle if tablespace was closed by parallel thread fil_delete_tablespace() stores file handle in local variable and calls mtr_t::commit_file()=>fil_system_t::detach(..., detach_handle=true), which sets space->chain.start->handle = OS_FILE_CLOSED. fil_system_t::detach() is invoked under fil_system.mutex. But before the mutex is acquired some parallel thread can change space->chain.start->handle. fil_delete_tablespace() returns value, stored in local variable, i.e. wrong value. File handle can be closed, for example, from buf_flush_space() when the limit of innodb_open_files exceded and fil_space_t::get() causes fil_space_t::try_to_close() call. fil_space_t::try_to_close() is executed under fil_system.mutex. And mtr_t::commit_file() locks it for fil_system_t::detach() call. fil_system_t::detach() returns detached file handle if its argument detach_handle is true. The fix is to let mtr_t::commit_file() to pass that detached file handle to fil_delete_tablespace(). --- storage/innobase/fil/fil0fil.cc | 4 +--- storage/innobase/include/mtr0mtr.h | 12 +++++++++--- storage/innobase/mtr/mtr0mtr.cc | 12 ++++++++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 00ded1ab27e5b..19ebdc8d67ebf 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -1687,9 +1687,7 @@ pfs_os_file_t fil_delete_tablespace(ulint id) mtr_t mtr; mtr.start(); mtr.log_file_op(FILE_DELETE, id, space->chain.start->name); - handle= space->chain.start->handle; - mtr.commit_file(*space, nullptr); - + mtr.commit_file(*space, nullptr, &handle); fil_space_free_low(space); } diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index 60e01abe18d29..1c044319ca072 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -93,10 +93,16 @@ struct mtr_t { ATTRIBUTE_COLD void commit_shrink(fil_space_t &space); /** Commit a mini-transaction that is deleting or renaming a file. - @param space tablespace that is being renamed or deleted - @param name new file name (nullptr=the file will be deleted) + @param space tablespace that is being renamed or deleted + @param name new file name (nullptr=the file will be deleted) + @param detached_handle if detached_handle != nullptr and if space is detached + during the function execution the file handle if its + node will be set to OS_FILE_CLOSED, and the previous + value of the file handle will be assigned to the + address, pointed by detached_handle. @return whether the operation succeeded */ - ATTRIBUTE_COLD bool commit_file(fil_space_t &space, const char *name); + ATTRIBUTE_COLD bool commit_file(fil_space_t &space, const char *name, + pfs_os_file_t *detached_handle= nullptr); /** Commit a mini-transaction that did not modify any pages, but generated some redo log on a higher level, such as diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 2c004cb0aa6a3..8817c77a6f4bf 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -333,8 +333,14 @@ void mtr_t::commit_shrink(fil_space_t &space) /** Commit a mini-transaction that is deleting or renaming a file. @param space tablespace that is being renamed or deleted @param name new file name (nullptr=the file will be deleted) +@param detached_handle if detached_handle != nullptr and if space is detached + during the function execution the file handle if its + node will be set to OS_FILE_CLOSED, and the previous + value of the file handle will be assigned to the + address, pointed by detached_handle. @return whether the operation succeeded */ -bool mtr_t::commit_file(fil_space_t &space, const char *name) +bool mtr_t::commit_file(fil_space_t &space, const char *name, + pfs_os_file_t *detached_handle) { ut_ad(is_active()); ut_ad(!is_inside_ibuf()); @@ -402,7 +408,9 @@ bool mtr_t::commit_file(fil_space_t &space, const char *name) ut_ad(!space.referenced()); ut_ad(space.is_stopping()); - fil_system.detach(&space, true); + pfs_os_file_t handle = fil_system.detach(&space, true); + if (detached_handle) + *detached_handle = handle; mysql_mutex_unlock(&fil_system.mutex); success= true; From 2230c2e7aa47326da22bfee72da8022f8247e92a Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 17 Apr 2023 10:14:21 +1000 Subject: [PATCH 22/70] MDEV-27009: Add UCA-14.0.0 collations - License Update UCA license based on: https://www.unicode.org/license.txt and https://www.unicode.org/copyright.html. --- THIRDPARTY | 360 ++++++++++++++++++++++++++++------------------------- 1 file changed, 191 insertions(+), 169 deletions(-) diff --git a/THIRDPARTY b/THIRDPARTY index 35bb238ed1ea5..87f9bb7a3b5fe 100644 --- a/THIRDPARTY +++ b/THIRDPARTY @@ -930,180 +930,202 @@ archived older versions of code and data; there is also a smaller HTTP mirror. *************************************************************************** %%The following software may be included in this product: -UnicodeData.txt - -Use of any of this software is governed by the terms of the license below: - -Unicode Terms of Use - - For the general privacy policy governing access to this site, see the - Unicode Privacy Policy. For trademark usage, see the Unicode - Consortium (R) Trademarks and Logo Policy. - Notice to End User: Terms of Use - Carefully read the following legal agreement ("Agreement"). Use or - copying of the software and/or codes provided with this agreement (The - "Software") constitutes your acceptance of these terms - - 1. Unicode Copyright. - 1. Copyright (c) 1991-2008 Unicode, Inc. All rights reserved. - 2. Certain documents and files on this website contain a - legend indicating that "Modification is permitted." Any person - is hereby authorized, without fee, to modify such documents - and files to create derivative works conforming to the - Unicode (R) Standard, subject to Terms and Conditions herein. - 3. Any person is hereby authorized, without fee, to view, use, - reproduce, and distribute all documents and files solely for - informational purposes in the creation of products supporting - the Unicode Standard, subject to the Terms and Conditions - herein. - 4. Further specifications of rights and restrictions - pertaining to the use of the particular set of data files - known as the "Unicode Character Database" can be found in - Exhibit 1. - 5. Each version of the Unicode Standard has further - specifications of rights and restrictions of use. For the book - editions, these are found on the back of the title page. For - the online edition, certain files (such as the PDF files for - book chapters and code charts) carry specific restrictions. - All other files are covered under these general Terms of Use. - To request a permission to reproduce any part of the Unicode - Standard, please contact the Unicode Consortium. - 6. No license is granted to "mirror" the Unicode website where - a fee is charged for access to the "mirror" site. - 7. Modification is not permitted with respect to this - document. All copies of this document must be verbatim. - 2. Restricted Rights Legend. Any technical data or software which is - licensed to the United States of America, its agencies and/or - instrumentalities under this Agreement is commercial technical data - or commercial computer software developed exclusively at private - expense as defined in FAR 2.101, or DFARS 252.227-7014 (June 1995), - as applicable. For technical data, use, duplication, or disclosure - by the Government is subject to restrictions as set forth in DFARS - 202.227-7015 Technical Data, Commercial and Items (Nov 1995) and - this Agreement. For Software, in accordance with FAR 12-212 or DFARS - 227-7202, as applicable, use, duplication or disclosure by the - Government is subject to the restrictions set forth in this - Agreement. - 3. Warranties and Disclaimers. - 1. This publication and/or website may include technical or - typographical errors or other inaccuracies . Changes are - periodically added to the information herein; these changes - will be incorporated in new editions of the publication and/or - website. Unicode may make improvements and/or changes in the - product(s) and/or program(s) described in this publication - and/or website at any time. - 2. If this file has been purchased on magnetic or optical - media from Unicode, Inc. the sole and exclusive remedy for any - claim will be exchange of the defective media within ninety - (90) days of original purchase. - 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR - SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND - EITHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT - LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UNICODE AND ITS - LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR OMISSIONS IN - THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH ARE - REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE - WEBSITE. - 4. Waiver of Damages. In no event shall Unicode or its licensors be - liable for any special, incidental, indirect or consequential - damages of any kind, or any damages whatsoever, whether or not - Unicode was advised of the possibility of the damage, including, - without limitation, those resulting from the following: loss of use, - data or profits, in connection with the use, modification or - distribution of this information or its derivatives. - 5. Trademarks. - 1. Unicode and the Unicode logo are registered trademarks of - Unicode, Inc. - 2. This site contains product names and corporate names of - other companies. All product names and company names and logos - mentioned herein are the trademarks or registered trademarks - of their respective owners. Other products and corporate names - mentioned herein which are trademarks of a third party are - used only for explanation and for the owners' benefit and with - no intent to infringe. - 3. Use of third party products or information referred to - herein is at the user's risk. - 6. Miscellaneous. - 1. Jurisdiction and Venue. This server is operated from a - location in the State of California, United States of America. - Unicode makes no representation that the materials are - appropriate for use in other locations. If you access this - server from other locations, you are responsible for - compliance with local laws. This Agreement, all use of this - site and any claims and damages resulting from use of this - site are governed solely by the laws of the State of - California without regard to any principles which would apply - the laws of a different jurisdiction. The user agrees that any - disputes regarding this site shall be resolved solely in the - courts located in Santa Clara County, California. The user - agrees said courts have personal jurisdiction and agree to - waive any right to transfer the dispute to any other forum. - 2. Modification by Unicode Unicode shall have the right to - modify this Agreement at any time by posting it to this site. - The user may not assign any part of this Agreement without - Unicode's prior written consent. - 3. Taxes. The user agrees to pay any taxes arising from access - to this website or use of the information herein, except for - those based on Unicode's net income. - 4. Severability. If any provision of this Agreement is - declared invalid or unenforceable, the remaining provisions of - this Agreement shall remain in effect. - 5. Entire Agreement. This Agreement constitutes the entire - agreement between the parties. +http://www.unicode.org/copyright.html + + Unicode® Copyright and Terms of Use + + For the general privacy policy governing access to this site, see the Unicode Privacy Policy. + + Unicode Copyright + Copyright © 1991-2023 Unicode, Inc. All rights reserved. + Definitions + + Unicode Data Files ("DATA FILES") include all data files under the directories: + https://www.unicode.org/Public/ + https://www.unicode.org/reports/ + https://www.unicode.org/ivd/data/ + + Unicode Data Files do not include PDF online code charts under the directory: + https://www.unicode.org/Public/ + + Unicode Software ("SOFTWARE") includes any source code published in the Unicode Standard + or any source code or compiled code under the directories: + https://www.unicode.org/Public/PROGRAMS/ + https://www.unicode.org/Public/cldr/ + http://site.icu-project.org/download/ + + Terms of Use + Certain documents and files on this website contain a legend + indicating that "Modification is permitted." Any person is hereby + authorized, without fee, to modify such documents and files to + create derivative works conforming to the Unicode® Standard, subject + to Terms and Conditions herein. + + Any person is hereby authorized, without fee, to view, use, + reproduce, and distribute all documents and files, subject to the + Terms and Conditions herein. + + Further specifications of rights and restrictions pertaining to the + use of the Unicode DATA FILES and SOFTWARE can be found in the + Unicode Data Files and Software License. + + Each version of the Unicode Standard has further specifications of + rights and restrictions of use. For the book editions (Unicode 5.0 + and earlier), these are found on the back of the title page. + + The Unicode PDF online code charts carry specific restrictions. + Those restrictions are incorporated as the first page of each PDF + code chart. + + All other files, including online documentation of the core + specification for Unicode 6.0 and later, are covered under these + general Terms of Use. + + No license is granted to "mirror" the Unicode website where a fee is + charged for access to the "mirror" site. + + Modification is not permitted with respect to this document. All + copies of this document must be verbatim. + + Restricted Rights Legend + + Any technical data or software which is licensed to the United + States of America, its agencies and/or instrumentalities under this + Agreement is commercial technical data or commercial computer + software developed exclusively at private expense as defined in FAR + 2.101, or DFARS 252.227-7014 (June 1995), as applicable. For + technical data, use, duplication, or disclosure by the Government is + subject to restrictions as set forth in DFARS 202.227-7015 Technical + Data, Commercial and Items (Nov 1995) and this Agreement. For + Software, in accordance with FAR 12-212 or DFARS 227-7202, as + applicable, use, duplication or disclosure by the Government is + subject to the restrictions set forth in this Agreement. + + Warranties and Disclaimers + This publication and/or website may include technical or + typographical errors or other inaccuracies. Changes are periodically + added to the information herein; these changes will be incorporated + in new editions of the publication and/or website. Unicode, Inc. may + make improvements and/or changes in the product(s) and/or program(s) + described in this publication and/or website at any time. + + If this file has been purchased on magnetic or optical media from + Unicode, Inc. the sole and exclusive remedy for any claim will be + exchange of the defective media within ninety (90) days of original + purchase. + + EXCEPT AS PROVIDED IN SECTION E.2, THIS PUBLICATION AND/OR SOFTWARE + IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, + IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR + NON-INFRINGEMENT. UNICODE, INC. AND ITS LICENSORS ASSUME NO + RESPONSIBILITY FOR ERRORS OR OMISSIONS IN THIS PUBLICATION AND/OR + SOFTWARE OR OTHER DOCUMENTS WHICH ARE REFERENCED BY OR LINKED TO + THIS PUBLICATION OR THE UNICODE WEBSITE. + + Waiver of Damages + In no event shall Unicode, Inc. or its licensors be liable for any + special, incidental, indirect or consequential damages of any kind, + or any damages whatsoever, whether or not Unicode, Inc. was advised + of the possibility of the damage, including, without limitation, + those resulting from the following: loss of use, data or profits, in + connection with the use, modification or distribution of this + information or its derivatives. + + Trademarks & Logos + The Unicode Word Mark and the Unicode Logo are trademarks of + Unicode, Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade + names of Unicode, Inc. Use of the information and materials found on + this website indicates your acknowledgement of Unicode, Inc.’s + exclusive worldwide rights in the Unicode Word Mark, the Unicode + Logo, and the Unicode trade names. + + The Unicode Consortium Name and Trademark Usage Policy (“Trademark + Policy”) are incorporated herein by reference and you agree to abide + by the provisions of the Trademark Policy, which may be changed from + time to time in the sole discretion of Unicode, Inc. + + All third party trademarks referenced herein are the property of + their respective owners. + + Miscellaneous + Jurisdiction and Venue. This website is operated from a location in + the State of California, United States of America. Unicode, Inc. + makes no representation that the materials are appropriate for use + in other locations. If you access this website from other locations, + you are responsible for compliance with local laws. This Agreement, + all use of this website and any claims and damages resulting from + use of this website are governed solely by the laws of the State of + California without regard to any principles which would apply the + laws of a different jurisdiction. The user agrees that any disputes + regarding this website shall be resolved solely in the courts + located in Santa Clara County, California. The user agrees said + courts have personal jurisdiction and agree to waive any right to + transfer the dispute to any other forum. + + Modification by Unicode, Inc. Unicode, Inc. shall have the right to + modify this Agreement at any time by posting it to this website. The + user may not assign any part of this Agreement without Unicode, + Inc.’s prior written consent. + + Taxes. The user agrees to pay any taxes arising from access to this + website or use of the information herein, except for those based on + Unicode’s net income. + + Severability. If any provision of this Agreement is declared + invalid or unenforceable, the remaining provisions of this Agreement + shall remain in effect. + + Entire Agreement. This Agreement constitutes the entire agreement + between the parties. EXHIBIT 1 UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE - Unicode Data Files include all data files under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/ . Unicode Software includes any source code -published in the Unicode Standard or under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/. - - NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES -("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND -AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU -DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES -OR SOFTWARE. - - COPYRIGHT AND PERMISSION NOTICE - - Copyright (c) 1991-2008 Unicode, Inc. All rights reserved. Distributed under -the Terms of Use in http://www.unicode.org/copyright.html. - - Permission is hereby granted, free of charge, to any person obtaining a copy -of the Unicode data files and any associated documentation (the "Data Files") or -Unicode software and any associated documentation (the "Software") to deal in -the Data Files or Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files or -Software are furnished to do so, provided that (a) the above copyright notice(s) -and this permission notice appear with all copies of the Data Files or Software, -(b) both the above copyright notice(s) and this permission notice appear in -associated documentation, and (c) there is clear notice in each modified Data -File or in the Software as well as in the documentation associated with the Data -File(s) or Software that the data or software has been modified. - - THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD -PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +See Terms of Use +for definitions of Unicode Inc.’s Data Files and Software. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. - - Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in these Data Files or Software without prior written authorization of the -copyright holder. - - Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be -registered in some jurisdictions. All other trademarks and registered trademarks -mentioned herein are the property of their respective owners. +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. *************************************************************************** From f575de39afacb24cd43c40bf43c27bfcf97a670b Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Tue, 11 Apr 2023 09:39:40 +0200 Subject: [PATCH 23/70] rocksdb: Define _GNU_SOURCE during fallocate CMake probe The glibc headers declare fallocate only if _GNU_SOURCE is defined. Without this change, the probe fails with C compilers which do not support implicit function declarations even if the system does in fact support the fallocate function. Upstream rocksdb does not need this because the probe is run with the C++ compiler, and current g++ versions define _GNU_SOURCE automatically. --- storage/rocksdb/build_rocksdb.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 647e51e2f90d9..ba894d83d75c0 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -134,8 +134,8 @@ option(WITH_FALLOCATE "build with fallocate" ON) if(WITH_FALLOCATE AND UNIX) include(CheckCSourceCompiles) CHECK_C_SOURCE_COMPILES(" +#define _GNU_SOURCE #include -#include int main() { int fd = open(\"/dev/null\", 0); fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, 1024); From 3b85e3dcc11e9638c9670a299eccdb77a51c1a19 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Sat, 15 Apr 2023 07:52:17 +0800 Subject: [PATCH 24/70] MDEV-30687: Make small facelifting to autobake-debs.sh (fix) Appending to 'eatmydata' will obviously cause an executable that doesn't exist. Use an array to create the entire executable. Also while we are at it, check the fakeroot actually works before using it. --- debian/autobake-deb.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh index cf14eb701b525..eed1f65fef6cb 100755 --- a/debian/autobake-deb.sh +++ b/debian/autobake-deb.sh @@ -170,34 +170,39 @@ dch -b -D "${LSBNAME}" -v "${VERSION}" "Automatic build with ${LOGSTRING}." --co echo "Creating package version ${VERSION} ... " -BUILDPACKAGE_DPKGCMD="" +BUILDPACKAGE_DPKGCMD=() + +# Fakeroot test +if fakeroot true; then + BUILDPACKAGE_DPKGCMD+=( "fakeroot" "--" ) +fi # Use eatmydata is available to build faster with less I/O, skipping fsync() # during the entire build process (safe because a build can always be restarted) if which eatmydata > /dev/null then - BUILDPACKAGE_DPKGCMD="eatmydata" + BUILDPACKAGE_DPKGCMD+=("eatmydata") fi -BUILDPACKAGE_DPKGCMD+="dpkg-buildpackage" +BUILDPACKAGE_DPKGCMD+=("dpkg-buildpackage") # Using dpkg-buildpackage args # -us Allow unsigned sources # -uc Allow unsigned changes # -I Tar ignore -BUILDPACKAGE_DPKG_ARGS=(-us -uc -I) +BUILDPACKAGE_DPKGCMD+=(-us -uc -I) # There can be also extra flags that are appended to args if [ -n "$BUILDPACKAGE_FLAGS" ] then read -ra BUILDPACKAGE_TMP_ARGS <<< "$BUILDPACKAGE_FLAGS" - BUILDPACKAGE_DPKG_ARGS=("${BUILDPACKAGE_DPKG_ARGS[@]} ${BUILDPACKAGE_TMP_ARGS[@]}") + BUILDPACKAGE_DPKGCMD+=( "${BUILDPACKAGE_TMP_ARGS[@]}" ) fi # Build the package # Pass -I so that .git and other unnecessary temporary and source control files # will be ignored by dpkg-source when creating the tar.gz source package. -fakeroot -- "${BUILDPACKAGE_DPKGCMD}" "${BUILDPACKAGE_DPKG_ARGS[@]}" +"${BUILDPACKAGE_DPKGCMD[@]}" # If the step above fails due to missing dependencies, you can manually run # sudo mk-build-deps debian/control -r -i From d6c8696724c3a803d85f0b4738237bbce8e90f64 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 17 Apr 2023 16:46:52 +0300 Subject: [PATCH 25/70] Update BUILD scripts - align compile-am64-debug-max and compile-amd64-debug-all with the 'pentium' versions. - Use system SSL by default - Use "--with-plugin-auth_gssapi=DYNAMIC" as default for max and all builds - all and max builds are now the same (we should probably remove 'all' at some point. --- BUILD/SETUP.sh | 14 +++++++------- BUILD/compile-amd64-debug-all | 5 ++++- BUILD/compile-amd64-debug-max | 7 ++++--- BUILD/compile-pentium64-debug-all | 2 -- BUILD/compile-pentium64-debug-max | 1 - 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index d990608f14ecf..e51f9df6a6d2e 100755 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -127,7 +127,7 @@ get_make_parallel_flag # implementation of SSL. --with-ssl=yes will first try system library # then the bundled one --with-ssl=system will use the system library. # We use bundled by default as this is guaranteed to work with Galera -SSL_LIBRARY=--with-ssl +SSL_LIBRARY=--with-ssl=system if [ "x$warning_mode" = "xpedantic" ]; then warnings="-W -Wall -ansi -pedantic -Wno-long-long -Wno-unused -D_POSIX_SOURCE" @@ -202,6 +202,7 @@ base_configs="$base_configs --with-extra-charsets=complex " base_configs="$base_configs --enable-thread-safe-client " base_configs="$base_configs --with-big-tables $maintainer_mode" base_configs="$base_configs --with-plugin-aria --with-aria-tmp-tables --with-plugin-s3=STATIC" +base_configs="$base_configs $SSL_LIBRARY" if test -d "$path/../cmd-line-utils/readline" then @@ -212,18 +213,17 @@ then fi max_plugins="--with-plugins=max" -max_no_embedded_configs="$SSL_LIBRARY $max_plugins" -max_no_qc_configs="$SSL_LIBRARY $max_plugins --without-query-cache" -max_configs="$SSL_LIBRARY $max_plugins --with-embedded-server --with-libevent --with-plugin-rocksdb=dynamic --with-plugin-test_sql_discovery=DYNAMIC --with-plugin-file_key_management=DYNAMIC --with-plugin-hashicorp_key_management=DYNAMIC" -all_configs="$SSL_LIBRARY $max_plugins --with-embedded-server --with-innodb_plugin --with-libevent" +max_no_embedded_configs="$max_plugins" +max_no_qc_configs="$max_plugins --without-query-cache" +max_configs="$max_plugins --with-embedded-server --with-libevent --with-plugin-rocksdb=dynamic --with-plugin-test_sql_discovery=DYNAMIC --with-plugin-file_key_management=DYNAMIC --with-plugin-hashicorp_key_management=DYNAMIC --with-plugin-auth_gssapi=DYNAMIC" +all_configs="$max_configs" # # CPU and platform specific compilation flags. # alpha_cflags="$check_cpu_cflags -Wa,-m$cpu_flag" -amd64_cflags="$check_cpu_cflags" -amd64_cxxflags="" # If dropping '--with-big-tables', add here "-DBIG_TABLES" pentium_cflags="$check_cpu_cflags -m32" +amd64_cflags="$check_cpu_cflags -m64" pentium64_cflags="$check_cpu_cflags -m64" ppc_cflags="$check_cpu_cflags" sparc_cflags="" diff --git a/BUILD/compile-amd64-debug-all b/BUILD/compile-amd64-debug-all index b8b2ed0540290..66f6f3309e2d6 100755 --- a/BUILD/compile-amd64-debug-all +++ b/BUILD/compile-amd64-debug-all @@ -1,7 +1,10 @@ #! /bin/sh + path=`dirname $0` +set -- "$@" --with-debug=full . "$path/SETUP.sh" + extra_flags="$amd64_cflags $debug_cflags" extra_configs="$amd64_configs $debug_configs $all_configs" - +CC="$CC --pipe" . "$path/FINISH.sh" diff --git a/BUILD/compile-amd64-debug-max b/BUILD/compile-amd64-debug-max index 281f2775cb189..0af32f5decd9a 100755 --- a/BUILD/compile-amd64-debug-max +++ b/BUILD/compile-amd64-debug-max @@ -1,7 +1,6 @@ #! /bin/sh -# Copyright (c) 2005, 2006 MySQL AB -# Use is subject to license terms +# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,11 +13,13 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA path=`dirname $0` . "$path/SETUP.sh" + extra_flags="$amd64_cflags $debug_cflags" extra_configs="$amd64_configs $debug_configs $max_configs" +CC="$CC --pipe" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium64-debug-all b/BUILD/compile-pentium64-debug-all index 7824f7ad47f08..8733ad00c0208 100755 --- a/BUILD/compile-pentium64-debug-all +++ b/BUILD/compile-pentium64-debug-all @@ -6,7 +6,5 @@ set -- "$@" --with-debug=full extra_flags="$pentium64_cflags $debug_cflags" extra_configs="$pentium_configs $debug_configs $all_configs" - -extra_configs="$extra_configs " CC="$CC --pipe" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium64-debug-max b/BUILD/compile-pentium64-debug-max index 09061de6891af..c68a6326e7f7f 100755 --- a/BUILD/compile-pentium64-debug-max +++ b/BUILD/compile-pentium64-debug-max @@ -21,6 +21,5 @@ path=`dirname $0` extra_flags="$pentium64_cflags $debug_cflags" extra_configs="$pentium_configs $debug_configs $max_configs" -extra_configs="$extra_configs " CC="$CC --pipe" . "$path/FINISH.sh" From 8f87023d3f3fbaad4e33991713db884cbe052fbc Mon Sep 17 00:00:00 2001 From: Andrei Date: Fri, 14 Apr 2023 13:13:03 +0300 Subject: [PATCH 26/70] MDEV-28777 binlog.binlog_truncate_multi_engine failed in bb with Lost connection The 2013 error was right to catch the case B of the test unprepared for an expected simulated crash. The test gets refined to SELECT a (type of) bool value before the crash is invoked. --- .../suite/binlog/t/binlog_truncate_multi_engine.inc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.inc b/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.inc index 52ce4741eaa1c..f380107085134 100644 --- a/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.inc +++ b/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.inc @@ -20,7 +20,9 @@ connect(con1,localhost,root,,); --source include/show_binary_logs.inc INSERT INTO t1 VALUES (1, REPEAT("x", 1)); INSERT INTO t2 VALUES (1, REPEAT("x", 1)); -if (`SELECT $case = "B"`) +--let $is_case_B=`SELECT $case = "B"` + +if ($is_case_B) { --write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect wait-binlog_truncate_multi_engine.test @@ -39,12 +41,12 @@ if (`SELECT $debug_sync_action != ""`) send COMMIT; --connection default -if (`SELECT $case = "B"`) +if ($is_case_B) { --source include/wait_until_disconnected.inc --source include/start_mysqld.inc } -if (`SELECT $case != "B"`) +if (!$is_case_B) { SET DEBUG_SYNC= "now WAIT_FOR con1_ready"; --echo List of binary logs after rotation From 30b4bb4204cb7d259eaff595c46e69d16b55adc7 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 18 Apr 2023 06:44:03 +0400 Subject: [PATCH 27/70] MDEV-31068 Reuse duplicate case conversion code in ctype-utf8.c and ctype-ucs2.c --- strings/ctype-ucs2.c | 66 ++++-------------------------------- strings/ctype-unidata.h | 56 +++++++++++++++++++++++++++++++ strings/ctype-utf8.c | 74 +++++++++-------------------------------- 3 files changed, 78 insertions(+), 118 deletions(-) diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 4b29d65673116..6b52ade443123 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1284,24 +1284,6 @@ my_uni_utf16(CHARSET_INFO *cs __attribute__((unused)), const char charset_name_utf16le[]= "utf16le"; #define charset_name_utf16le_length (sizeof(charset_name_utf16le)-1) -static inline void -my_tolower_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].tolower; -} - - -static inline void -my_toupper_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].toupper; -} - - static inline void my_tosort_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) { @@ -1335,7 +1317,7 @@ my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, while ((src < srcend) && (res= mb_wc(cs, &wc, (uchar *) src, (uchar *) srcend)) > 0) { - my_toupper_utf16(uni_plane, &wc); + my_toupper_unicode(uni_plane, &wc); if (res != wc_mb(cs, wc, (uchar *) dst, (uchar *) dstend)) break; src+= res; @@ -1393,7 +1375,7 @@ my_casedn_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, while ((src < srcend) && (res= mb_wc(cs, &wc, (uchar *) src, (uchar *) srcend)) > 0) { - my_tolower_utf16(uni_plane, &wc); + my_tolower_unicode(uni_plane, &wc); if (res != wc_mb(cs, wc, (uchar *) dst, (uchar *) dstend)) break; src+= res; @@ -2196,24 +2178,6 @@ my_uni_utf32(CHARSET_INFO *cs __attribute__((unused)), } -static inline void -my_tolower_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].tolower; -} - - -static inline void -my_toupper_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].toupper; -} - - static inline void my_tosort_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) { @@ -2256,7 +2220,7 @@ my_caseup_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, while ((src < srcend) && (res= my_utf32_uni(cs, &wc, (uchar *)src, (uchar*) srcend)) > 0) { - my_toupper_utf32(uni_plane, &wc); + my_toupper_unicode(uni_plane, &wc); if (res != my_uni_utf32(cs, wc, (uchar*) dst, (uchar*) dstend)) break; src+= res; @@ -2312,7 +2276,7 @@ my_casedn_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) { - my_tolower_utf32(uni_plane,&wc); + my_tolower_unicode(uni_plane,&wc); if (res != my_uni_utf32(cs, wc, (uchar*) dst, (uchar*) dstend)) break; src+= res; @@ -3118,24 +3082,6 @@ static int my_uni_ucs2(CHARSET_INFO *cs __attribute__((unused)) , } -static inline void -my_tolower_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8) & 0xFF])) - *wc= page[*wc & 0xFF].tolower; -} - - -static inline void -my_toupper_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8) & 0xFF])) - *wc= page[*wc & 0xFF].toupper; -} - - static inline void my_tosort_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) { @@ -3157,7 +3103,7 @@ static size_t my_caseup_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, while ((src < srcend) && (res= my_ucs2_uni(cs, &wc, (uchar *)src, (uchar*) srcend)) > 0) { - my_toupper_ucs2(uni_plane, &wc); + my_toupper_unicode_bmp(uni_plane, &wc); if (res != my_uni_ucs2(cs, wc, (uchar*) dst, (uchar*) dstend)) break; src+= res; @@ -3208,7 +3154,7 @@ static size_t my_casedn_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, while ((src < srcend) && (res= my_ucs2_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) { - my_tolower_ucs2(uni_plane, &wc); + my_tolower_unicode_bmp(uni_plane, &wc); if (res != my_uni_ucs2(cs, wc, (uchar*) dst, (uchar*) dstend)) break; src+= res; diff --git a/strings/ctype-unidata.h b/strings/ctype-unidata.h index 9900fd0ceddda..df591b6cf8396 100644 --- a/strings/ctype-unidata.h +++ b/strings/ctype-unidata.h @@ -24,6 +24,62 @@ extern MY_UNICASE_CHARACTER *my_unicase_default_pages[256]; extern MY_UNICASE_CHARACTER my_unicase_mysql500_page00[256]; extern MY_UNICASE_CHARACTER *my_unicase_mysql500_pages[256]; + +static inline my_wc_t my_u300_tolower_7bit(uchar ch) +{ + return my_unicase_default_page00[ch].tolower; +} + +static inline my_wc_t my_u300_toupper_7bit(uchar ch) +{ + return my_unicase_default_page00[ch].toupper; +} + + +static inline void +my_tolower_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +{ + const MY_UNICASE_CHARACTER *page; + DBUG_ASSERT(*wc <= uni_plane->maxchar); + if ((page= uni_plane->page[*wc >> 8])) + *wc= page[*wc & 0xFF].tolower; +} + + +static inline void +my_toupper_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +{ + const MY_UNICASE_CHARACTER *page; + DBUG_ASSERT(*wc <= uni_plane->maxchar); + if ((page= uni_plane->page[*wc >> 8])) + *wc= page[*wc & 0xFF].toupper; +} + + +static inline void +my_tolower_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +{ + if (*wc <= uni_plane->maxchar) + { + const MY_UNICASE_CHARACTER *page; + if ((page= uni_plane->page[(*wc >> 8)])) + *wc= page[*wc & 0xFF].tolower; + } +} + + +static inline void +my_toupper_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +{ + if (*wc <= uni_plane->maxchar) + { + const MY_UNICASE_CHARACTER *page; + if ((page= uni_plane->page[(*wc >> 8)])) + *wc= page[*wc & 0xFF].toupper; + } +} + + size_t my_strxfrm_pad_nweights_unicode(uchar *str, uchar *strend, size_t nweights); size_t my_strxfrm_pad_unicode(uchar *str, uchar *strend); diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 06a10034a33a8..75c12e6354b46 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -5207,24 +5207,6 @@ static int my_uni_utf8mb3_no_range(CHARSET_INFO *cs __attribute__((unused)), } -static inline void -my_tolower_utf8mb3(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8) & 0xFF])) - *wc= page[*wc & 0xFF].tolower; -} - - -static inline void -my_toupper_utf8mb3(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8) & 0xFF])) - *wc= page[*wc & 0xFF].toupper; -} - - static size_t my_caseup_utf8mb3(CHARSET_INFO *cs, const char *src, size_t srclen, char *dst, size_t dstlen) @@ -5239,7 +5221,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs, while ((src < srcend) && (srcres= my_utf8mb3_uni(cs, &wc, (uchar *) src, (uchar*) srcend)) > 0) { - my_toupper_utf8mb3(uni_plane, &wc); + my_toupper_unicode_bmp(uni_plane, &wc); if ((dstres= my_uni_utf8mb3(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0) break; src+= srcres; @@ -5292,7 +5274,7 @@ static size_t my_caseup_str_utf8mb3(CHARSET_INFO *cs, char *src) while (*src && (srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0) { - my_toupper_utf8mb3(uni_plane, &wc); + my_toupper_unicode_bmp(uni_plane, &wc); if ((dstres= my_uni_utf8mb3_no_range(cs, wc, (uchar*) dst)) <= 0) break; src+= srcres; @@ -5317,7 +5299,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs, while ((src < srcend) && (srcres= my_utf8mb3_uni(cs, &wc, (uchar*) src, (uchar*)srcend)) > 0) { - my_tolower_utf8mb3(uni_plane, &wc); + my_tolower_unicode_bmp(uni_plane, &wc); if ((dstres= my_uni_utf8mb3(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0) break; src+= srcres; @@ -5338,7 +5320,7 @@ static size_t my_casedn_str_utf8mb3(CHARSET_INFO *cs, char *src) while (*src && (srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0) { - my_tolower_utf8mb3(uni_plane, &wc); + my_tolower_unicode_bmp(uni_plane, &wc); if ((dstres= my_uni_utf8mb3_no_range(cs, wc, (uchar*) dst)) <= 0) break; src+= srcres; @@ -5397,7 +5379,7 @@ int my_strcasecmp_utf8mb3(CHARSET_INFO *cs, const char *s, const char *t) It represents a single byte character. Convert it into weight according to collation. */ - s_wc= my_unicase_default_page00[(uchar) s[0]].tolower; + s_wc= my_u300_tolower_7bit((uchar) s[0]); s++; } else @@ -5430,7 +5412,7 @@ int my_strcasecmp_utf8mb3(CHARSET_INFO *cs, const char *s, const char *t) s+= res; /* Convert Unicode code into weight according to collation */ - my_tolower_utf8mb3(uni_plane, &s_wc); + my_tolower_unicode_bmp(uni_plane, &s_wc); } @@ -5439,7 +5421,7 @@ int my_strcasecmp_utf8mb3(CHARSET_INFO *cs, const char *s, const char *t) if ((uchar) t[0] < 128) { /* Convert single byte character into weight */ - t_wc= my_unicase_default_page00[(uchar) t[0]].tolower; + t_wc= my_u300_tolower_7bit((uchar) t[0]); t++; } else @@ -5450,7 +5432,7 @@ int my_strcasecmp_utf8mb3(CHARSET_INFO *cs, const char *s, const char *t) t+= res; /* Convert code into weight */ - my_tolower_utf8mb3(uni_plane, &t_wc); + my_tolower_unicode_bmp(uni_plane, &t_wc); } /* Now we have two weights, let's compare them */ @@ -7678,30 +7660,6 @@ my_wc_mb_utf8mb4_no_range(CHARSET_INFO *cs __attribute__((unused)), } -static inline void -my_tolower_utf8mb4(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - if (*wc <= uni_plane->maxchar) - { - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8)])) - *wc= page[*wc & 0xFF].tolower; - } -} - - -static inline void -my_toupper_utf8mb4(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - if (*wc <= uni_plane->maxchar) - { - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8)])) - *wc= page[*wc & 0xFF].toupper; - } -} - - static size_t my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen, char *dst, size_t dstlen) @@ -7717,7 +7675,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen, (srcres= my_mb_wc_utf8mb4(cs, &wc, (uchar *) src, (uchar*) srcend)) > 0) { - my_toupper_utf8mb4(uni_plane, &wc); + my_toupper_unicode(uni_plane, &wc); if ((dstres= my_wc_mb_utf8mb4(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0) break; src+= srcres; @@ -7784,7 +7742,7 @@ my_caseup_str_utf8mb4(CHARSET_INFO *cs, char *src) while (*src && (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0) { - my_toupper_utf8mb4(uni_plane, &wc); + my_toupper_unicode(uni_plane, &wc); if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (uchar*) dst)) <= 0) break; src+= srcres; @@ -7811,7 +7769,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs, (srcres= my_mb_wc_utf8mb4(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) { - my_tolower_utf8mb4(uni_plane, &wc); + my_tolower_unicode(uni_plane, &wc); if ((dstres= my_wc_mb_utf8mb4(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0) break; src+= srcres; @@ -7833,7 +7791,7 @@ my_casedn_str_utf8mb4(CHARSET_INFO *cs, char *src) while (*src && (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0) { - my_tolower_utf8mb4(uni_plane, &wc); + my_tolower_unicode(uni_plane, &wc); if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (uchar*) dst)) <= 0) break; src+= srcres; @@ -7888,7 +7846,7 @@ my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t) It represents a single byte character. Convert it into weight according to collation. */ - s_wc= my_unicase_default_page00[(uchar) s[0]].tolower; + s_wc= my_u300_tolower_7bit((uchar) s[0]); s++; } else @@ -7903,7 +7861,7 @@ my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t) return strcmp(s, t); s+= res; - my_tolower_utf8mb4(uni_plane, &s_wc); + my_tolower_unicode(uni_plane, &s_wc); } @@ -7912,7 +7870,7 @@ my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t) if ((uchar) t[0] < 128) { /* Convert single byte character into weight */ - t_wc= my_unicase_default_page00[(uchar) t[0]].tolower; + t_wc= my_u300_tolower_7bit((uchar) t[0]); t++; } else @@ -7922,7 +7880,7 @@ my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t) return strcmp(s, t); t+= res; - my_tolower_utf8mb4(uni_plane, &t_wc); + my_tolower_unicode(uni_plane, &t_wc); } /* Now we have two weights, let's compare them */ From 2ad287caad59f7dd9f403cea16885e862a839564 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 18 Apr 2023 09:40:41 +0400 Subject: [PATCH 28/70] MDEV-31069 Reuse duplicate char-to-weight conversion code in ctype-utf8.c and ctype-ucs2.c Removing similar functions from ctype-utf8.c and ctype-ucs2.c - my_tosort_utf16() - my_tosort_utf32() - my_tosort_ucs2() - my_tosort_unicode() Adding new shared functions into ctype-unidata.h: - my_tosort_unicode_bmp() - reused for utf8mb3, ucs2 - my_tosort_unicode() - reused for utf8mb4, utf16, utf32 For simplicity, the new version of my_tosort_unicode*() does not include the code handling the MY_CS_LOWER_SORT flag because: - it affects performance negatively - we don't have any collations with this flag yet anyway (This code was most likely earlier erroneously merged from MySQL's utf8_tolower_ci at some point.) --- strings/ctype-ucs2.c | 46 +++-------------------------------------- strings/ctype-unidata.h | 26 +++++++++++++++++++++++ strings/ctype-utf8.c | 37 +++++++++------------------------ 3 files changed, 39 insertions(+), 70 deletions(-) diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 6b52ade443123..c4ac54e4462d2 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1284,22 +1284,6 @@ my_uni_utf16(CHARSET_INFO *cs __attribute__((unused)), const char charset_name_utf16le[]= "utf16le"; #define charset_name_utf16le_length (sizeof(charset_name_utf16le)-1) -static inline void -my_tosort_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - if (*wc <= uni_plane->maxchar) - { - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].sort; - } - else - { - *wc= MY_CS_REPLACEMENT_CHARACTER; - } -} - - static size_t my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, @@ -1341,7 +1325,7 @@ my_hash_sort_utf16_nopad(CHARSET_INFO *cs, while ((s < e) && (res= mb_wc(cs, &wc, (uchar *) s, (uchar *) e)) > 0) { - my_tosort_utf16(uni_plane, &wc); + my_tosort_unicode(uni_plane, &wc); MY_HASH_ADD_16(m1, m2, wc); s+= res; } @@ -2178,22 +2162,6 @@ my_uni_utf32(CHARSET_INFO *cs __attribute__((unused)), } -static inline void -my_tosort_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - if (*wc <= uni_plane->maxchar) - { - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].sort; - } - else - { - *wc= MY_CS_REPLACEMENT_CHARACTER; - } -} - - static size_t my_lengthsp_utf32(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, size_t length) @@ -2242,7 +2210,7 @@ my_hash_sort_utf32_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, while ((res= my_utf32_uni(cs, &wc, (uchar*) s, (uchar*) e)) > 0) { - my_tosort_utf32(uni_plane, &wc); + my_tosort_unicode(uni_plane, &wc); MY_HASH_ADD(m1, m2, (uint) (wc >> 24)); MY_HASH_ADD(m1, m2, (uint) (wc >> 16) & 0xFF); MY_HASH_ADD(m1, m2, (uint) (wc >> 8) & 0xFF); @@ -3082,14 +3050,6 @@ static int my_uni_ucs2(CHARSET_INFO *cs __attribute__((unused)) , } -static inline void -my_tosort_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) -{ - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[(*wc >> 8) & 0xFF])) - *wc= page[*wc & 0xFF].sort; -} - static size_t my_caseup_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, char *dst, size_t dstlen) { @@ -3125,7 +3085,7 @@ my_hash_sort_ucs2_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, while ((s < e) && (res=my_ucs2_uni(cs,&wc, (uchar *)s, (uchar*)e)) >0) { - my_tosort_ucs2(uni_plane, &wc); + my_tosort_unicode_bmp(uni_plane, &wc); MY_HASH_ADD_16(m1, m2, wc); s+=res; } diff --git a/strings/ctype-unidata.h b/strings/ctype-unidata.h index df591b6cf8396..24cf3e3ea05e9 100644 --- a/strings/ctype-unidata.h +++ b/strings/ctype-unidata.h @@ -36,6 +36,32 @@ static inline my_wc_t my_u300_toupper_7bit(uchar ch) } +static inline void my_tosort_unicode_bmp(MY_UNICASE_INFO *uni_plane, + my_wc_t *wc) +{ + const MY_UNICASE_CHARACTER *page; + DBUG_ASSERT(*wc <= uni_plane->maxchar); + if ((page= uni_plane->page[*wc >> 8])) + *wc= page[*wc & 0xFF].sort; +} + + +static inline void my_tosort_unicode(MY_UNICASE_INFO *uni_plane, + my_wc_t *wc) +{ + if (*wc <= uni_plane->maxchar) + { + const MY_UNICASE_CHARACTER *page; + if ((page= uni_plane->page[*wc >> 8])) + *wc= page[*wc & 0xFF].sort; + } + else + { + *wc= MY_CS_REPLACEMENT_CHARACTER; + } +} + + static inline void my_tolower_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) { diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 75c12e6354b46..01beb8c9f198e 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -4638,23 +4638,6 @@ MY_UNICASE_INFO my_unicase_unicode520= }; -static inline void -my_tosort_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc, uint flags) -{ - if (*wc <= uni_plane->maxchar) - { - MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[*wc >> 8])) - *wc= (flags & MY_CS_LOWER_SORT) ? - page[*wc & 0xFF].tolower : - page[*wc & 0xFF].sort; - } - else - { - *wc= MY_CS_REPLACEMENT_CHARACTER; - } -} - static uint my_casefold_multiply_utf8mbx(CHARSET_INFO *cs) @@ -4734,8 +4717,8 @@ int my_wildcmp_unicode_impl(CHARSET_INFO *cs, { if (weights) { - my_tosort_unicode(weights, &s_wc, cs->state); - my_tosort_unicode(weights, &w_wc, cs->state); + my_tosort_unicode(weights, &s_wc); + my_tosort_unicode(weights, &w_wc); } if (s_wc != w_wc) return 1; /* No match */ @@ -4803,8 +4786,8 @@ int my_wildcmp_unicode_impl(CHARSET_INFO *cs, return 1; if (weights) { - my_tosort_unicode(weights, &s_wc, cs->state); - my_tosort_unicode(weights, &w_wc, cs->state); + my_tosort_unicode(weights, &s_wc); + my_tosort_unicode(weights, &w_wc); } if (s_wc == w_wc) @@ -5242,7 +5225,7 @@ static void my_hash_sort_utf8mb3_nopad(CHARSET_INFO *cs, const uchar *s, size_t while ((s < e) && (res=my_utf8mb3_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) { - my_tosort_unicode(uni_plane, &wc, cs->state); + my_tosort_unicode(uni_plane, &wc); MY_HASH_ADD_16(m1, m2, wc); s+= res; } @@ -5976,8 +5959,8 @@ static int my_strnncoll_utf8mb3_cs(CHARSET_INFO *cs, save_diff = ((int)s_wc) - ((int)t_wc); } - my_tosort_unicode(uni_plane, &s_wc, cs->state); - my_tosort_unicode(uni_plane, &t_wc, cs->state); + my_tosort_unicode(uni_plane, &s_wc); + my_tosort_unicode(uni_plane, &t_wc); if ( s_wc != t_wc ) { @@ -6018,8 +6001,8 @@ static int my_strnncollsp_utf8mb3_cs(CHARSET_INFO *cs, save_diff = ((int)s_wc) - ((int)t_wc); } - my_tosort_unicode(uni_plane, &s_wc, cs->state); - my_tosort_unicode(uni_plane, &t_wc, cs->state); + my_tosort_unicode(uni_plane, &s_wc); + my_tosort_unicode(uni_plane, &t_wc); if ( s_wc != t_wc ) { @@ -7697,7 +7680,7 @@ my_hash_sort_utf8mb4_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, while ((res= my_mb_wc_utf8mb4(cs, &wc, (uchar*) s, (uchar*) e)) > 0) { - my_tosort_unicode(uni_plane, &wc, cs->state); + my_tosort_unicode(uni_plane, &wc); MY_HASH_ADD_16(m1, m2, (uint) (wc & 0xFFFF)); if (wc > 0xFFFF) { From 1995c626a563aa3b2760704fdc6502f69aa35dbf Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Fri, 14 Apr 2023 12:38:16 -0700 Subject: [PATCH 29/70] [MDEV-30854] Do not use " as string delimiter in mariadb-tzinfo-to-sql If SQL_MODE contains ANSI_QUOTES (https://mariadb.com/kb/en/sql-mode/), then the double-quote character (") is not a legal string delimiter. In https://github.com/MariaDB/server/commit/13e77930e615f05cc74d408110e887b00e1abcc9#diff-a333d4ebb2d73b6361ef7dfebc86d883f7e19853b4a9eb85984b039058fae47cR2431-R2435, Daniel Black introduced a case where the double-quote character would be used as a string delimiter in the SQL queries generated by mariadb-tzinfo-to-sql. This tool tool generates SQL queries which should be able to run on any MariaDB server of the matching version. Therefore, it should be extremely conservative in the SQL that it outputs, in order to maximize the chance that it can run regardless of the build or execution environment of the server. See MDEV-18778, MDEV-28263, and MDEV-28782 for previous cases where MariaDB has FAILED TO ENSURE that the generated timezone.sql actually works in different build and execution environments. More test coverage is clearly needed here. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- .../main/mysql_tzinfo_to_sql_symlink.result | 42 +++++++++---------- sql/tztime.cc | 4 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/mysql-test/main/mysql_tzinfo_to_sql_symlink.result b/mysql-test/main/mysql_tzinfo_to_sql_symlink.result index b6b35e4498861..97548768a2dec 100644 --- a/mysql-test/main/mysql_tzinfo_to_sql_symlink.result +++ b/mysql-test/main/mysql_tzinfo_to_sql_symlink.result @@ -10,13 +10,13 @@ CREATE TABLE time_zone_leap_second LIKE mysql.time_zone_leap_second; set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_name''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_name ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition_type'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; @@ -59,13 +59,13 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_t set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_name''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_name ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition_type'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; @@ -191,13 +191,13 @@ TRUNCATE TABLE time_zone_leap_second; set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_name''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_name ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition_type'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); /*M!100602 execute immediate if(@wsrep_cannot_replicate_tz, 'start transaction', 'LOCK TABLES time_zone WRITE, time_zone_leap_second WRITE, @@ -313,20 +313,20 @@ TRUNCATE TABLE time_zone_leap_second; set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_name''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_name ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition_type'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); /*M!100602 execute immediate if(@wsrep_cannot_replicate_tz, 'start transaction', 'LOCK TABLES time_zone WRITE, time_zone_leap_second WRITE, time_zone_name WRITE, time_zone_transition WRITE, time_zone_transition_type WRITE')*/; -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_leap_second_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_leap_second'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_leap_second_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_leap_second''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_leap_second ENGINE=InnoDB', 'do 0'); TRUNCATE TABLE time_zone_leap_second; execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_leap_second ENGINE=', @time_zone_leap_second_engine), 'do 0'); @@ -497,13 +497,13 @@ set sql_mode=default; set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_name''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_name ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); -execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_transition_type'", 'do 0'); +execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; diff --git a/sql/tztime.cc b/sql/tztime.cc index 8286744e1923c..1c482718cc8c0 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -2429,9 +2429,9 @@ print_tz_as_sql(const char* tz_name, const TIME_ZONE_INFO *sp) #define SAVE_ENGINE(e) \ - "\"select ENGINE into @" e "_engine" \ + "'select ENGINE into @" e "_engine" \ " from information_schema.TABLES" \ - " where TABLE_SCHEMA=DATABASE() and TABLE_NAME='" e "'\"" + " where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''" e "'''" /* Print info about leap seconds in time zone as SQL statements From 6075f12c657b103446d230e0d308778d3852b0db Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 24 Feb 2023 19:22:32 +0400 Subject: [PATCH 30/70] MDEV-31071 Refactor case folding data types in Unicode collations This is a non-functional change. It changes the way how case folding data and weight data (for simple Unicode collations) are stored: - Removing data types MY_UNICASE_CHARACTER, MY_UNICASE_INFO - Using data types MY_CASEFOLD_CHARACTER, MY_CASEFOLD_INFO instead. This patch changes simple Unicode collations in a similar way how MDEV-30695 previously changed Asian collations. No new MTR tests are needed. The underlying code is thoroughly covered by a number of ctype_*_ws.test and ctype_*_casefold.test files, which were added recently as a preparation for this change. Old and new Unicode data layout ------------------------------- Case folding data is now stored in separate tables consisting of MY_CASEFOLD_CHARACTER elements with two members: typedef struct casefold_info_char_t { uint32 toupper; uint32 tolower; } MY_CASEFOLD_CHARACTER; while weight data (for simple non-UCA collations xxx_general_ci and xxx_general_mysql500_ci) is stored in separate arrays of uint16 elements. Before this change case folding data and simple weight data were stored together, in tables of the following elements with three members: typedef struct unicase_info_char_st { uint32 toupper; uint32 tolower; uint32 sort; /* weights for simple collations */ } MY_UNICASE_CHARACTER; This data format was redundant, because weights (the "sort" member) were needed only for these two simple Unicode collations: - xxx_general_ci - xxx_general_mysql500_ci Adding case folding information for Unicode-14.0.0 using the old format would waste memory without purpose. Detailed changes ---------------- - Changing the underlying data types as described above - Including unidata-dump.c into the sources. This program was earlier used to dump UnicodeData.txt (e.g. https://www.unicode.org/Public/14.0.0/ucd/UnicodeData.txt) into MySQL / MariaDB source files. It was originally written in 2002, but has not been distributed yet together with MySQL / MariaDB sources. - Removing the old format Unicode data earlier dumped from UnicodeData.txt (versions 3.0.0 and 5.2.0) from ctype-utf8.c. Adding Unicode data in the new format into separate header files, to maintain the code easier: - ctype-unicode300-casefold.h - ctype-unicode300-casefold-tr.h - ctype-unicode300-general_ci.h - ctype-unicode300-general_mysql500_ci.h - ctype-unicode520-casefold.h - Adding a new file ctype-unidata.c as an aggregator for the header files listed above. --- include/m_ctype.h | 25 +- strings/CMakeLists.txt | 1 + strings/conf_to_src.c | 1 - strings/ctype-big5.c | 7 +- strings/ctype-bin.c | 1 - strings/ctype-cp932.c | 7 +- strings/ctype-czech.c | 1 - strings/ctype-euc_kr.c | 7 +- strings/ctype-eucjpms.c | 7 +- strings/ctype-extra.c | 108 - strings/ctype-gb2312.c | 7 +- strings/ctype-gbk.c | 7 +- strings/ctype-latin1.c | 5 - strings/ctype-sjis.c | 7 +- strings/ctype-tis620.c | 4 - strings/ctype-uca.c | 454 +- strings/ctype-ucs2.c | 112 +- strings/ctype-ujis.c | 7 +- strings/ctype-unicode300-casefold-tr.h | 193 + strings/ctype-unicode300-casefold.h | 1764 +++++++ strings/ctype-unicode300-general_ci.h | 610 +++ .../ctype-unicode300-general_mysql500_ci.h | 190 + strings/ctype-unicode520-casefold.h | 3192 +++++++++++ strings/ctype-unidata.c | 79 + strings/ctype-unidata.h | 80 +- strings/ctype-utf8.c | 4651 +---------------- strings/ctype-win1250ch.c | 1 - strings/strcoll.inl | 28 +- strings/unidata-dump.c | 1110 ++++ 29 files changed, 7471 insertions(+), 5195 deletions(-) create mode 100644 strings/ctype-unicode300-casefold-tr.h create mode 100644 strings/ctype-unicode300-casefold.h create mode 100644 strings/ctype-unicode300-general_ci.h create mode 100644 strings/ctype-unicode300-general_mysql500_ci.h create mode 100644 strings/ctype-unicode520-casefold.h create mode 100644 strings/ctype-unidata.c create mode 100644 strings/unidata-dump.c diff --git a/include/m_ctype.h b/include/m_ctype.h index 2f1767433ad18..6812445c6d54b 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -79,7 +79,6 @@ extern "C" { typedef const struct my_charset_handler_st MY_CHARSET_HANDLER; typedef const struct my_collation_handler_st MY_COLLATION_HANDLER; -typedef const struct unicase_info_st MY_UNICASE_INFO; typedef const struct casefold_info_st MY_CASEFOLD_INFO; typedef const struct uni_ctype_st MY_UNI_CTYPE; typedef const struct my_uni_idx_st MY_UNI_IDX; @@ -97,29 +96,10 @@ struct casefold_info_st { my_wc_t maxchar; const MY_CASEFOLD_CHARACTER * const *page; + const uint16 * const *simple_weight; /* For general_ci-alike collations */ }; -typedef struct unicase_info_char_st -{ - uint32 toupper; - uint32 tolower; - uint32 sort; -} MY_UNICASE_CHARACTER; - - -struct unicase_info_st -{ - my_wc_t maxchar; - MY_UNICASE_CHARACTER **page; -}; - - -extern MY_UNICASE_INFO my_unicase_default; -extern MY_UNICASE_INFO my_unicase_turkish; -extern MY_UNICASE_INFO my_unicase_mysql500; -extern MY_UNICASE_INFO my_unicase_unicode520; - #define MY_UCA_MAX_CONTRACTION 6 /* The DUCET tables in ctype-uca.c are dumped with a limit of 8 weights @@ -795,7 +775,6 @@ struct charset_info_st const uint16 *tab_to_uni; MY_UNI_IDX *tab_from_uni; MY_CASEFOLD_INFO *casefold; - MY_UNICASE_INFO *caseinfo; const uchar *state_map; const uchar *ident_map; uint strxfrm_multiply; @@ -1691,7 +1670,7 @@ int my_wildcmp_unicode(CHARSET_INFO *cs, const char *str, const char *str_end, const char *wildstr, const char *wildend, int escape, int w_one, int w_many, - MY_UNICASE_INFO *weights); + MY_CASEFOLD_INFO *weights); extern my_bool my_parse_charset_xml(MY_CHARSET_LOADER *loader, const char *buf, size_t buflen); diff --git a/strings/CMakeLists.txt b/strings/CMakeLists.txt index 85e8cd0581664..099f3c6766012 100644 --- a/strings/CMakeLists.txt +++ b/strings/CMakeLists.txt @@ -22,6 +22,7 @@ SET(STRINGS_SOURCES bchange.c bmove_upp.c ctype-big5.c ctype-bin.c ctype-cp932.c ctype-czech.c ctype-euc_kr.c ctype-eucjpms.c ctype-extra.c ctype-gb2312.c ctype-gbk.c ctype-latin1.c ctype-mb.c ctype-simple.c ctype-sjis.c ctype-tis620.c ctype-uca.c ctype-ucs2.c ctype-ujis.c ctype-utf8.c ctype-win1250ch.c ctype.c decimal.c dtoa.c int2str.c + ctype-unidata.c is_prefix.c llstr.c longlong2str.c my_strtoll10.c my_vsnprintf.c str2int.c strcend.c strend.c strfill.c strmake.c strmov.c strnmov.c strxmov.c strxnmov.c xml.c diff --git a/strings/conf_to_src.c b/strings/conf_to_src.c index 692effbd3f466..fce763b4fc794 100644 --- a/strings/conf_to_src.c +++ b/strings/conf_to_src.c @@ -409,7 +409,6 @@ void dispcset(FILE *f,CHARSET_INFO *cs) fprintf(f," NULL, /* from_uni */\n"); fprintf(f," NULL, /* casefold */\n"); - fprintf(f," &my_unicase_default, /* caseinfo */\n"); fprintf(f," NULL, /* state map */\n"); fprintf(f," NULL, /* ident map */\n"); fprintf(f," 1, /* strxfrm_multiply*/\n"); diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index ef01b45aec0f8..aaf6769989b31 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -806,7 +806,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_big5[256]= static MY_CASEFOLD_INFO my_casefold_big5= { 0xFFFF, - my_casefold_pages_big5 + my_casefold_pages_big5, + NULL /* ws */ }; @@ -6847,7 +6848,6 @@ struct charset_info_st my_charset_big5_chinese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_big5, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6879,7 +6879,6 @@ struct charset_info_st my_charset_big5_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_big5, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6911,7 +6910,6 @@ struct charset_info_st my_charset_big5_chinese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_big5, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6943,7 +6941,6 @@ struct charset_info_st my_charset_big5_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_big5, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index a6c3fb6d0eaa8..f11fe6114827a 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -625,7 +625,6 @@ struct charset_info_st my_charset_bin = NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index 0f1e84570722a..f01909d4f659e 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -1706,7 +1706,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_cp932[256]= MY_CASEFOLD_INFO my_casefold_cp932= { 0xFFFF, - my_casefold_pages_cp932 + my_casefold_pages_cp932, + NULL /* ws */ }; @@ -34805,7 +34806,6 @@ struct charset_info_st my_charset_cp932_japanese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_cp932, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34836,7 +34836,6 @@ struct charset_info_st my_charset_cp932_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_cp932, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34868,7 +34867,6 @@ struct charset_info_st my_charset_cp932_japanese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_cp932, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34899,7 +34897,6 @@ struct charset_info_st my_charset_cp932_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_cp932, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 109731abaaf00..64aff2e7be0ab 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -618,7 +618,6 @@ struct charset_info_st my_charset_latin2_czech_cs = tab_8859_2_uni, /* tab_to_uni */ idx_uni_8859_2, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index ab27074f20dac..dd6ab60bd3a9e 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -1483,7 +1483,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_euckr[256]= static MY_CASEFOLD_INFO my_casefold_euckr= { 0xFFFF, - my_casefold_pages_euckr + my_casefold_pages_euckr, + NULL /* ws */ }; @@ -10095,7 +10096,6 @@ struct charset_info_st my_charset_euckr_korean_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_euckr, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10127,7 +10127,6 @@ struct charset_info_st my_charset_euckr_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_euckr, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10159,7 +10158,6 @@ struct charset_info_st my_charset_euckr_korean_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_euckr, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10191,7 +10189,6 @@ struct charset_info_st my_charset_euckr_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_euckr, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 1812c74d46574..a5f727551aafb 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -1779,7 +1779,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_eucjpms[512]= static MY_CASEFOLD_INFO my_casefold_eucjpms= { 0x0FFFF, - my_casefold_pages_eucjpms + my_casefold_pages_eucjpms, + NULL /* ws */ }; @@ -67634,7 +67635,6 @@ struct charset_info_st my_charset_eucjpms_japanese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_eucjpms,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67666,7 +67666,6 @@ struct charset_info_st my_charset_eucjpms_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_eucjpms,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67698,7 +67697,6 @@ struct charset_info_st my_charset_eucjpms_japanese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_eucjpms,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67730,7 +67728,6 @@ struct charset_info_st my_charset_eucjpms_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_eucjpms,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-extra.c b/strings/ctype-extra.c index 82df1088a62a3..8a25a9c6a611e 100644 --- a/strings/ctype-extra.c +++ b/strings/ctype-extra.c @@ -3690,7 +3690,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_dec8_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3722,7 +3721,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp850_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3754,7 +3752,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin1_german1_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3786,7 +3783,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hp8_english_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3818,7 +3814,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8r_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3850,7 +3845,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3882,7 +3876,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_swe7_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3914,7 +3907,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_ascii_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3946,7 +3938,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -3978,7 +3969,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin1_danish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4010,7 +4000,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hebrew_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4042,7 +4031,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4074,7 +4062,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4106,7 +4093,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8u_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4138,7 +4124,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4170,7 +4155,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_greek_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4202,7 +4186,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4234,7 +4217,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4266,7 +4248,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1257_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4298,7 +4279,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin5_turkish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4330,7 +4310,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_armscii8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4362,7 +4341,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp866_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4394,7 +4372,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_keybcs2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4426,7 +4403,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macce_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4458,7 +4434,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macroman_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4490,7 +4465,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp852_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4522,7 +4496,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4554,7 +4527,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4586,7 +4558,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macce_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4618,7 +4589,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4650,7 +4620,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin1_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4682,7 +4651,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin1_general_cs, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4714,7 +4682,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4746,7 +4713,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4778,7 +4744,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4810,7 +4775,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macroman_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4842,7 +4806,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1256_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4874,7 +4837,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1257_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4906,7 +4868,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1257_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4938,7 +4899,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_armscii8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -4970,7 +4930,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_ascii_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5002,7 +4961,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5034,7 +4992,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1256_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5066,7 +5023,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp866_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5098,7 +5054,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_dec8_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5130,7 +5085,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_greek_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5162,7 +5116,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hebrew_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5194,7 +5147,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hp8_english_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5226,7 +5178,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_keybcs2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5258,7 +5209,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8r_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5290,7 +5240,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8u_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5322,7 +5271,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5354,7 +5302,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin5_turkish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5386,7 +5333,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5418,7 +5364,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp850_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5450,7 +5395,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp852_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5482,7 +5426,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_swe7_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5514,7 +5457,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_geostd8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5546,7 +5488,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_geostd8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5578,7 +5519,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin1_spanish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5610,7 +5550,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5642,7 +5581,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_dec8_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5674,7 +5612,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp850_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5706,7 +5643,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hp8_english_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5738,7 +5674,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8r_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5770,7 +5705,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5802,7 +5736,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_swe7_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5834,7 +5767,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_ascii_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5866,7 +5798,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hebrew_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5898,7 +5829,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8u_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5930,7 +5860,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_greek_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5962,7 +5891,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -5994,7 +5922,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin5_turkish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6026,7 +5953,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_armscii8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6058,7 +5984,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp866_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6090,7 +6015,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_keybcs2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6122,7 +6046,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macce_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6154,7 +6077,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macroman_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6186,7 +6108,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp852_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6218,7 +6139,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6250,7 +6170,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macce_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6282,7 +6201,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6314,7 +6232,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1251_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6346,7 +6263,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_macroman_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6378,7 +6294,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1256_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6410,7 +6325,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1257_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6442,7 +6356,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1257_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6474,7 +6387,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_armscii8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6506,7 +6418,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_ascii_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6538,7 +6449,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1250_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6570,7 +6480,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp1256_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6602,7 +6511,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp866_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6634,7 +6542,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_dec8_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6666,7 +6573,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_greek_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6698,7 +6604,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hebrew_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6730,7 +6635,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_hp8_english_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6762,7 +6666,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_keybcs2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6794,7 +6697,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8r_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6826,7 +6728,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_koi8u_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6858,7 +6759,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin2_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6890,7 +6790,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin5_turkish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6922,7 +6821,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_latin7_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6954,7 +6852,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp850_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -6986,7 +6883,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_cp852_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -7018,7 +6914,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_swe7_swedish_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -7050,7 +6945,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_geostd8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -7082,7 +6976,6 @@ struct charset_info_st compiled_charsets[] = { to_uni_geostd8_general_ci, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ @@ -7113,7 +7006,6 @@ struct charset_info_st compiled_charsets[] = { NULL, /* to_uni */ NULL, /* from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state map */ NULL, /* ident map */ 1, /* strxfrm_multiply*/ diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 9e6ed3cfabe26..f3e9c90238984 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -822,7 +822,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_gb2312[256]= static MY_CASEFOLD_INFO my_casefold_gb2312= { 0xFFFF, - my_casefold_pages_gb2312 + my_casefold_pages_gb2312, + NULL /* ws */ }; @@ -6499,7 +6500,6 @@ struct charset_info_st my_charset_gb2312_chinese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gb2312,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6531,7 +6531,6 @@ struct charset_info_st my_charset_gb2312_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gb2312,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6563,7 +6562,6 @@ struct charset_info_st my_charset_gb2312_chinese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gb2312,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -6595,7 +6593,6 @@ struct charset_info_st my_charset_gb2312_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gb2312,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index a81e246515769..a22e6aa8d848e 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -1006,7 +1006,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_gbk[256]= static MY_CASEFOLD_INFO my_casefold_gbk= { 0xFFFF, - my_casefold_pages_gbk + my_casefold_pages_gbk, + NULL /* ws */ }; @@ -10780,7 +10781,6 @@ struct charset_info_st my_charset_gbk_chinese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gbk, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10811,7 +10811,6 @@ struct charset_info_st my_charset_gbk_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gbk, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10843,7 +10842,6 @@ struct charset_info_st my_charset_gbk_chinese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gbk, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -10874,7 +10872,6 @@ struct charset_info_st my_charset_gbk_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_gbk, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index a0bee911af55d..5d763c6a56121 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -449,7 +449,6 @@ struct charset_info_st my_charset_latin1= cs_to_uni, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -481,7 +480,6 @@ struct charset_info_st my_charset_latin1_nopad= cs_to_uni, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -763,7 +761,6 @@ struct charset_info_st my_charset_latin1_german2_ci= cs_to_uni, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 2, /* strxfrm_multiply */ @@ -795,7 +792,6 @@ struct charset_info_st my_charset_latin1_bin= cs_to_uni, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -827,7 +823,6 @@ struct charset_info_st my_charset_latin1_nopad_bin= cs_to_uni, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 1e3ef16bdb50c..a5fed41b96477 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -1076,7 +1076,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_sjis[256]= static MY_CASEFOLD_INFO my_casefold_sjis= { 0xFFFF, - my_casefold_pages_sjis + my_casefold_pages_sjis, + NULL /* ws */ }; @@ -34193,7 +34194,6 @@ struct charset_info_st my_charset_sjis_japanese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_sjis, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34224,7 +34224,6 @@ struct charset_info_st my_charset_sjis_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_sjis, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34256,7 +34255,6 @@ struct charset_info_st my_charset_sjis_japanese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_sjis, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -34287,7 +34285,6 @@ struct charset_info_st my_charset_sjis_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_sjis, /* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 7ca33807fe4ee..0b728346f6a94 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -957,7 +957,6 @@ struct charset_info_st my_charset_tis620_thai_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -988,7 +987,6 @@ struct charset_info_st my_charset_tis620_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1020,7 +1018,6 @@ struct charset_info_st my_charset_tis620_thai_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -1052,7 +1049,6 @@ struct charset_info_st my_charset_tis620_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 8e94a18a47818..1e8661bef5489 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -35,6 +35,7 @@ #include "strings_def.h" #include #include "ctype-uca.h" +#include "ctype-unidata.h" #include "my_bit.h" typedef struct @@ -34611,8 +34612,8 @@ my_coll_init_uca(struct charset_info_st *cs, MY_CHARSET_LOADER *loader) { cs->pad_char= ' '; cs->m_ctype= my_charset_utf8mb3_unicode_ci.m_ctype; - if (!cs->caseinfo) - cs->caseinfo= &my_unicase_default; + if (!cs->casefold) + cs->casefold= &my_casefold_default; return create_tailoring(cs, loader); } @@ -34762,23 +34763,23 @@ create_tailoring(struct charset_info_st *cs, if (rules.version == 520) /* Unicode-5.2.0 requested */ { src_uca= &my_uca_v520; - cs->caseinfo= &my_unicase_unicode520; + cs->casefold= &my_casefold_unicode520; } else if (rules.version == 1400) /* Unicode-14.0.0 */ { src_uca= &my_uca_v1400; - cs->caseinfo= &my_unicase_unicode520; + cs->casefold= &my_casefold_unicode520; } else if (rules.version == 400) /* Unicode-4.0.0 requested */ { src_uca= &my_uca_v400; - cs->caseinfo= &my_unicase_default; + cs->casefold= &my_casefold_default; } else /* No Unicode version specified */ { src_uca= cs->uca ? cs->uca : &my_uca_v400; - if (!cs->caseinfo) - cs->caseinfo= &my_unicase_default; + if (!cs->casefold) + cs->casefold= &my_casefold_default; } if (rules.strength) my_ci_set_strength(cs, rules.strength); @@ -34855,8 +34856,7 @@ struct charset_info_st my_charset_ucs2_unicode_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -34886,8 +34886,7 @@ struct charset_info_st my_charset_ucs2_icelandic_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -34917,8 +34916,7 @@ struct charset_info_st my_charset_ucs2_latvian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -34948,8 +34946,7 @@ struct charset_info_st my_charset_ucs2_romanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -34979,8 +34976,7 @@ struct charset_info_st my_charset_ucs2_slovenian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35010,8 +35006,7 @@ struct charset_info_st my_charset_ucs2_polish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35041,8 +35036,7 @@ struct charset_info_st my_charset_ucs2_estonian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35072,8 +35066,7 @@ struct charset_info_st my_charset_ucs2_spanish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35103,8 +35096,7 @@ struct charset_info_st my_charset_ucs2_swedish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35134,8 +35126,7 @@ struct charset_info_st my_charset_ucs2_turkish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_turkish,/* caseinfo */ + &my_casefold_turkish,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35165,8 +35156,7 @@ struct charset_info_st my_charset_ucs2_czech_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35197,8 +35187,7 @@ struct charset_info_st my_charset_ucs2_danish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35228,8 +35217,7 @@ struct charset_info_st my_charset_ucs2_lithuanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35259,8 +35247,7 @@ struct charset_info_st my_charset_ucs2_slovak_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35290,8 +35277,7 @@ struct charset_info_st my_charset_ucs2_spanish2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35322,8 +35308,7 @@ struct charset_info_st my_charset_ucs2_roman_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35354,8 +35339,7 @@ struct charset_info_st my_charset_ucs2_persian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35386,8 +35370,7 @@ struct charset_info_st my_charset_ucs2_esperanto_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35418,8 +35401,7 @@ struct charset_info_st my_charset_ucs2_hungarian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35449,8 +35431,7 @@ struct charset_info_st my_charset_ucs2_sinhala_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35482,8 +35463,7 @@ struct charset_info_st my_charset_ucs2_german2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35513,8 +35493,7 @@ struct charset_info_st my_charset_ucs2_croatian_mysql561_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35545,8 +35524,7 @@ struct charset_info_st my_charset_ucs2_croatian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35577,8 +35555,7 @@ struct charset_info_st my_charset_ucs2_myanmar_uca_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35609,8 +35586,7 @@ struct charset_info_st my_charset_ucs2_thai_520_w2= &my_uca_v520_th, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -35640,8 +35616,7 @@ struct charset_info_st my_charset_ucs2_unicode_520_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35672,8 +35647,7 @@ struct charset_info_st my_charset_ucs2_vietnamese_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35704,8 +35678,7 @@ struct charset_info_st my_charset_ucs2_unicode_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35736,8 +35709,7 @@ struct charset_info_st my_charset_ucs2_unicode_520_nopad_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520, /* caseinfo */ + &my_casefold_unicode520, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35837,8 +35809,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35869,8 +35840,7 @@ struct charset_info_st my_charset_utf8mb3_icelandic_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35900,8 +35870,7 @@ struct charset_info_st my_charset_utf8mb3_latvian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35931,8 +35900,7 @@ struct charset_info_st my_charset_utf8mb3_romanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35962,8 +35930,7 @@ struct charset_info_st my_charset_utf8mb3_slovenian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -35993,8 +35960,7 @@ struct charset_info_st my_charset_utf8mb3_polish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36024,8 +35990,7 @@ struct charset_info_st my_charset_utf8mb3_estonian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36055,8 +36020,7 @@ struct charset_info_st my_charset_utf8mb3_spanish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36086,8 +36050,7 @@ struct charset_info_st my_charset_utf8mb3_swedish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36117,8 +36080,7 @@ struct charset_info_st my_charset_utf8mb3_turkish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_turkish,/* caseinfo */ + &my_casefold_turkish,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36148,8 +36110,7 @@ struct charset_info_st my_charset_utf8mb3_czech_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36180,8 +36141,7 @@ struct charset_info_st my_charset_utf8mb3_danish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36211,8 +36171,7 @@ struct charset_info_st my_charset_utf8mb3_lithuanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36242,8 +36201,7 @@ struct charset_info_st my_charset_utf8mb3_slovak_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36273,8 +36231,7 @@ struct charset_info_st my_charset_utf8mb3_spanish2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36304,8 +36261,7 @@ struct charset_info_st my_charset_utf8mb3_roman_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36335,8 +36291,7 @@ struct charset_info_st my_charset_utf8mb3_persian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36366,8 +36321,7 @@ struct charset_info_st my_charset_utf8mb3_esperanto_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36397,8 +36351,7 @@ struct charset_info_st my_charset_utf8mb3_hungarian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36428,8 +36381,7 @@ struct charset_info_st my_charset_utf8mb3_sinhala_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36460,8 +36412,7 @@ struct charset_info_st my_charset_utf8mb3_german2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36491,8 +36442,7 @@ struct charset_info_st my_charset_utf8mb3_croatian_mysql561_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36523,8 +36473,7 @@ struct charset_info_st my_charset_utf8mb3_croatian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36555,8 +36504,7 @@ struct charset_info_st my_charset_utf8mb3_myanmar_uca_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36587,8 +36535,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_520_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36618,8 +36565,7 @@ struct charset_info_st my_charset_utf8mb3_thai_520_w2= &my_uca_v520_th, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -36649,8 +36595,7 @@ struct charset_info_st my_charset_utf8mb3_vietnamese_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36681,8 +36626,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36713,8 +36657,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_520_nopad_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520, /* caseinfo */ + &my_casefold_unicode520, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36787,8 +36730,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36819,8 +36761,7 @@ struct charset_info_st my_charset_utf8mb4_icelandic_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36850,8 +36791,7 @@ struct charset_info_st my_charset_utf8mb4_latvian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36881,8 +36821,7 @@ struct charset_info_st my_charset_utf8mb4_romanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36912,8 +36851,7 @@ struct charset_info_st my_charset_utf8mb4_slovenian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36943,8 +36881,7 @@ struct charset_info_st my_charset_utf8mb4_polish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -36974,8 +36911,7 @@ struct charset_info_st my_charset_utf8mb4_estonian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37005,8 +36941,7 @@ struct charset_info_st my_charset_utf8mb4_spanish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37036,8 +36971,7 @@ struct charset_info_st my_charset_utf8mb4_swedish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37067,8 +37001,7 @@ struct charset_info_st my_charset_utf8mb4_turkish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_turkish, /* caseinfo */ + &my_casefold_turkish,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37098,8 +37031,7 @@ struct charset_info_st my_charset_utf8mb4_czech_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37130,8 +37062,7 @@ struct charset_info_st my_charset_utf8mb4_danish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37161,8 +37092,7 @@ struct charset_info_st my_charset_utf8mb4_lithuanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37192,8 +37122,7 @@ struct charset_info_st my_charset_utf8mb4_slovak_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37223,8 +37152,7 @@ struct charset_info_st my_charset_utf8mb4_spanish2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37254,8 +37182,7 @@ struct charset_info_st my_charset_utf8mb4_roman_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37285,8 +37212,7 @@ struct charset_info_st my_charset_utf8mb4_persian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37316,8 +37242,7 @@ struct charset_info_st my_charset_utf8mb4_esperanto_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37347,8 +37272,7 @@ struct charset_info_st my_charset_utf8mb4_hungarian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37378,8 +37302,7 @@ struct charset_info_st my_charset_utf8mb4_sinhala_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37409,8 +37332,7 @@ struct charset_info_st my_charset_utf8mb4_german2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37440,8 +37362,7 @@ struct charset_info_st my_charset_utf8mb4_croatian_mysql561_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37472,8 +37393,7 @@ struct charset_info_st my_charset_utf8mb4_croatian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37504,8 +37424,7 @@ struct charset_info_st my_charset_utf8mb4_myanmar_uca_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37535,8 +37454,7 @@ struct charset_info_st my_charset_utf8mb4_thai_520_w2= &my_uca_v520_th, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -37566,8 +37484,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_520_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37598,8 +37515,7 @@ struct charset_info_st my_charset_utf8mb4_vietnamese_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37630,8 +37546,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37662,8 +37577,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_520_nopad_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520, /* caseinfo */ + &my_casefold_unicode520, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37713,8 +37627,7 @@ struct charset_info_st my_charset_utf32_unicode_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37745,8 +37658,7 @@ struct charset_info_st my_charset_utf32_icelandic_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37776,8 +37688,7 @@ struct charset_info_st my_charset_utf32_latvian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37807,8 +37718,7 @@ struct charset_info_st my_charset_utf32_romanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37838,8 +37748,7 @@ struct charset_info_st my_charset_utf32_slovenian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37869,8 +37778,7 @@ struct charset_info_st my_charset_utf32_polish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37900,8 +37808,7 @@ struct charset_info_st my_charset_utf32_estonian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37931,8 +37838,7 @@ struct charset_info_st my_charset_utf32_spanish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37962,8 +37868,7 @@ struct charset_info_st my_charset_utf32_swedish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -37993,8 +37898,7 @@ struct charset_info_st my_charset_utf32_turkish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_turkish, /* caseinfo */ + &my_casefold_turkish,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38024,8 +37928,7 @@ struct charset_info_st my_charset_utf32_czech_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38056,8 +37959,7 @@ struct charset_info_st my_charset_utf32_danish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38087,8 +37989,7 @@ struct charset_info_st my_charset_utf32_lithuanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38118,8 +38019,7 @@ struct charset_info_st my_charset_utf32_slovak_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38149,8 +38049,7 @@ struct charset_info_st my_charset_utf32_spanish2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38180,8 +38079,7 @@ struct charset_info_st my_charset_utf32_roman_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38211,8 +38109,7 @@ struct charset_info_st my_charset_utf32_persian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38242,8 +38139,7 @@ struct charset_info_st my_charset_utf32_esperanto_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38273,8 +38169,7 @@ struct charset_info_st my_charset_utf32_hungarian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38304,8 +38199,7 @@ struct charset_info_st my_charset_utf32_sinhala_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38335,8 +38229,7 @@ struct charset_info_st my_charset_utf32_german2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38366,8 +38259,7 @@ struct charset_info_st my_charset_utf32_croatian_mysql561_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38397,8 +38289,7 @@ struct charset_info_st my_charset_utf32_croatian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38429,8 +38320,7 @@ struct charset_info_st my_charset_utf32_myanmar_uca_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38461,8 +38351,7 @@ struct charset_info_st my_charset_utf32_thai_520_w2= &my_uca_v520_th, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -38493,8 +38382,7 @@ struct charset_info_st my_charset_utf32_unicode_520_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38525,8 +38413,7 @@ struct charset_info_st my_charset_utf32_vietnamese_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38557,8 +38444,7 @@ struct charset_info_st my_charset_utf32_unicode_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38589,8 +38475,7 @@ struct charset_info_st my_charset_utf32_unicode_520_nopad_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520, /* caseinfo */ + &my_casefold_unicode520, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38641,8 +38526,7 @@ struct charset_info_st my_charset_utf16_unicode_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38673,8 +38557,7 @@ struct charset_info_st my_charset_utf16_icelandic_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38704,8 +38587,7 @@ struct charset_info_st my_charset_utf16_latvian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38735,8 +38617,7 @@ struct charset_info_st my_charset_utf16_romanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38766,8 +38647,7 @@ struct charset_info_st my_charset_utf16_slovenian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38797,8 +38677,7 @@ struct charset_info_st my_charset_utf16_polish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38828,8 +38707,7 @@ struct charset_info_st my_charset_utf16_estonian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38859,8 +38737,7 @@ struct charset_info_st my_charset_utf16_spanish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38890,8 +38767,7 @@ struct charset_info_st my_charset_utf16_swedish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38921,8 +38797,7 @@ struct charset_info_st my_charset_utf16_turkish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_turkish, /* caseinfo */ + &my_casefold_turkish,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38952,8 +38827,7 @@ struct charset_info_st my_charset_utf16_czech_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -38984,8 +38858,7 @@ struct charset_info_st my_charset_utf16_danish_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39015,8 +38888,7 @@ struct charset_info_st my_charset_utf16_lithuanian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39046,8 +38918,7 @@ struct charset_info_st my_charset_utf16_slovak_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39077,8 +38948,7 @@ struct charset_info_st my_charset_utf16_spanish2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39108,8 +38978,7 @@ struct charset_info_st my_charset_utf16_roman_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39139,8 +39008,7 @@ struct charset_info_st my_charset_utf16_persian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39170,8 +39038,7 @@ struct charset_info_st my_charset_utf16_esperanto_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39201,8 +39068,7 @@ struct charset_info_st my_charset_utf16_hungarian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39232,8 +39098,7 @@ struct charset_info_st my_charset_utf16_sinhala_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39263,8 +39128,7 @@ struct charset_info_st my_charset_utf16_german2_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39295,8 +39159,7 @@ struct charset_info_st my_charset_utf16_croatian_mysql561_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39327,8 +39190,7 @@ struct charset_info_st my_charset_utf16_croatian_uca_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39359,8 +39221,7 @@ struct charset_info_st my_charset_utf16_myanmar_uca_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold*/ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39391,8 +39252,7 @@ struct charset_info_st my_charset_utf16_thai_520_w2= &my_uca_v520_th, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold*/ NULL, /* state_map */ NULL, /* ident_map */ 4, /* strxfrm_multiply */ @@ -39423,8 +39283,7 @@ struct charset_info_st my_charset_utf16_unicode_520_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520,/* caseinfo */ + &my_casefold_unicode520,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39455,8 +39314,7 @@ struct charset_info_st my_charset_utf16_vietnamese_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39487,8 +39345,7 @@ struct charset_info_st my_charset_utf16_unicode_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39519,8 +39376,7 @@ struct charset_info_st my_charset_utf16_unicode_520_nopad_ci= &my_uca_v520, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_unicode520, /* caseinfo */ + &my_casefold_unicode520, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 8, /* strxfrm_multiply */ @@ -39599,9 +39455,9 @@ my_uca1400_collation_definition_init(MY_CHARSET_LOADER *loader, dst->uca= &my_uca_v1400; dst->tailoring= def->tailoring; if (def->tailoring == turkish) - dst->caseinfo= &my_unicase_turkish; /*TODO: unicase_1400_turkish */ + dst->casefold= &my_casefold_turkish; /*TODO: casefold_1400_turkish */ else - dst->caseinfo= &my_unicase_unicode520; /*TODO: unicase_1400*/ + dst->casefold= &my_casefold_unicode520; /*TODO: casefold_1400*/ if (nopad) dst->state|= MY_CS_NOPAD; my_ci_set_level_flags(dst, (1 << MY_CS_LEVEL_BIT_PRIMARY) | diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index c4ac54e4462d2..5d67762ac2f3c 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1197,17 +1197,14 @@ my_lengthsp_mb2(CHARSET_INFO *cs __attribute__((unused)), static inline int my_weight_mb2_utf16mb2_general_ci(uchar b0, uchar b1) { my_wc_t wc= MY_UTF16_WC2(b0, b1); - MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); + return my_general_ci_bmp_char_to_weight((uint16) wc); } #define MY_FUNCTION_NAME(x) my_ ## x ## _utf16_general_ci #define DEFINE_STRNXFRM_UNICODE #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_utf16_quick(pwc, s, e) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB2(b0,b1) my_weight_mb2_utf16mb2_general_ci(b0,b1) #define WEIGHT_MB4(b0,b1,b2,b3) MY_CS_REPLACEMENT_CHARACTER @@ -1295,7 +1292,7 @@ my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -1320,7 +1317,7 @@ my_hash_sort_utf16_nopad(CHARSET_INFO *cs, my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc; int res; const uchar *e= s + slen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; register ulong m1= *nr1, m2= *nr2; while ((s < e) && (res= mb_wc(cs, &wc, (uchar *) s, (uchar *) e)) > 0) @@ -1353,7 +1350,7 @@ my_casedn_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -1425,7 +1422,7 @@ my_wildcmp_utf16_ci(CHARSET_INFO *cs, const char *wildstr,const char *wildend, int escape, int w_one, int w_many) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; return my_wildcmp_unicode(cs, str, str_end, wildstr, wildend, escape, w_one, w_many, uni_plane); } @@ -1603,8 +1600,7 @@ struct charset_info_st my_charset_utf16_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1635,8 +1631,7 @@ struct charset_info_st my_charset_utf16_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1667,8 +1662,7 @@ struct charset_info_st my_charset_utf16_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1700,8 +1694,7 @@ struct charset_info_st my_charset_utf16_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1725,9 +1718,7 @@ struct charset_info_st my_charset_utf16_nopad_bin= #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) (my_ci_mb_wc(cs, pwc, s, e)) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB2(b0,b1) my_weight_mb2_utf16mb2_general_ci(b1,b0) #define WEIGHT_MB4(b0,b1,b2,b3) MY_CS_REPLACEMENT_CHARACTER @@ -1962,8 +1953,7 @@ struct charset_info_st my_charset_utf16le_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -1994,8 +1984,7 @@ struct charset_info_st my_charset_utf16le_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2026,8 +2015,7 @@ struct charset_info_st my_charset_utf16le_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2059,8 +2047,7 @@ struct charset_info_st my_charset_utf16le_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2096,21 +2083,14 @@ static inline int my_weight_utf32_general_ci(uchar b0, uchar b1, uchar b2, uchar b3) { my_wc_t wc= MY_UTF32_WC4(b0, b1, b2, b3); - if (wc <= 0xFFFF) - { - MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); - } - return MY_CS_REPLACEMENT_CHARACTER; + return my_general_ci_char_to_weight(wc); } #define MY_FUNCTION_NAME(x) my_ ## x ## _utf32_general_ci #define DEFINE_STRNXFRM_UNICODE #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_utf32_quick(pwc, s, e) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB4(b0,b1,b2,b3) my_weight_utf32_general_ci(b0, b1, b2, b3) #include "strcoll.inl" @@ -2182,7 +2162,7 @@ my_caseup_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -2205,7 +2185,7 @@ my_hash_sort_utf32_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, my_wc_t wc; int res; const uchar *e= s + slen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; register ulong m1= *nr1, m2= *nr2; while ((res= my_utf32_uni(cs, &wc, (uchar*) s, (uchar*) e)) > 0) @@ -2239,7 +2219,7 @@ my_casedn_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) @@ -2593,7 +2573,7 @@ my_wildcmp_utf32_ci(CHARSET_INFO *cs, const char *wildstr, const char *wildend, int escape, int w_one, int w_many) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; return my_wildcmp_unicode(cs, str, str_end, wildstr, wildend, escape, w_one, w_many, uni_plane); } @@ -2772,8 +2752,7 @@ struct charset_info_st my_charset_utf32_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2804,8 +2783,7 @@ struct charset_info_st my_charset_utf32_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2836,8 +2814,7 @@ struct charset_info_st my_charset_utf32_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2869,8 +2846,7 @@ struct charset_info_st my_charset_utf32_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -2960,16 +2936,14 @@ static const uchar to_upper_ucs2[] = { static inline int my_weight_mb2_ucs2_general_ci(uchar b0, uchar b1) { my_wc_t wc= UCS2_CODE(b0, b1); - MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); + return my_general_ci_bmp_char_to_weight((uint16) wc); } static inline int my_weight_mb2_ucs2_general_mysql500_ci(uchar b0, uchar b1) { my_wc_t wc= UCS2_CODE(b0, b1); - MY_UNICASE_CHARACTER *page= my_unicase_mysql500_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); + return my_general_mysql500_ci_bmp_char_to_weight((uint16) wc); } @@ -2978,21 +2952,18 @@ static inline int my_weight_mb2_ucs2_general_mysql500_ci(uchar b0, uchar b1) #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_ucs2_quick(pwc, s, e) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_bmp_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB2(b0,b1) my_weight_mb2_ucs2_general_ci(b0,b1) #include "strcoll.inl" + #define MY_FUNCTION_NAME(x) my_ ## x ## _ucs2_general_mysql500_ci #define DEFINE_STRNXFRM_UNICODE #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_ucs2_quick(pwc, s, e) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_mysql500_page00 -#define UNICASE_PAGES my_unicase_mysql500_pages +#define MY_WC_WEIGHT(x) my_general_mysql500_ci_bmp_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB2(b0,b1) my_weight_mb2_ucs2_general_mysql500_ci(b0,b1) #include "strcoll.inl" @@ -3057,7 +3028,7 @@ static size_t my_caseup_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -3080,7 +3051,7 @@ my_hash_sort_ucs2_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, my_wc_t wc; int res; const uchar *e=s+slen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; register ulong m1= *nr1, m2= *nr2; while ((s < e) && (res=my_ucs2_uni(cs,&wc, (uchar *)s, (uchar*)e)) >0) @@ -3108,7 +3079,7 @@ static size_t my_casedn_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, int res; const char *srcend= src + srclen; char *dstend= dst + dstlen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -3198,7 +3169,7 @@ int my_wildcmp_ucs2_ci(CHARSET_INFO *cs, const char *wildstr,const char *wildend, int escape, int w_one, int w_many) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; return my_wildcmp_unicode(cs,str,str_end,wildstr,wildend, escape,w_one,w_many,uni_plane); } @@ -3396,8 +3367,7 @@ struct charset_info_st my_charset_ucs2_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -3428,8 +3398,7 @@ struct charset_info_st my_charset_ucs2_general_mysql500_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_mysql500, /* caseinfo */ + &my_casefold_mysql500, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -3460,8 +3429,7 @@ struct charset_info_st my_charset_ucs2_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -3492,8 +3460,7 @@ struct charset_info_st my_charset_ucs2_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -3524,8 +3491,7 @@ struct charset_info_st my_charset_ucs2_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 76f000e9ed617..a5624a8c34148 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -67140,7 +67140,8 @@ static const MY_CASEFOLD_CHARACTER *my_casefold_pages_ujis[512]= static MY_CASEFOLD_INFO my_casefold_info_ujis= { 0x0FFFF, - my_casefold_pages_ujis + my_casefold_pages_ujis, + NULL /* ws */ }; @@ -67378,7 +67379,6 @@ struct charset_info_st my_charset_ujis_japanese_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_info_ujis,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67410,7 +67410,6 @@ struct charset_info_st my_charset_ujis_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_info_ujis,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67442,7 +67441,6 @@ struct charset_info_st my_charset_ujis_japanese_nopad_ci= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_info_ujis,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -67474,7 +67472,6 @@ struct charset_info_st my_charset_ujis_nopad_bin= NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ &my_casefold_info_ujis,/* casefold */ - NULL, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-unicode300-casefold-tr.h b/strings/ctype-unicode300-casefold-tr.h new file mode 100644 index 0000000000000..ff4281123824b --- /dev/null +++ b/strings/ctype-unicode300-casefold-tr.h @@ -0,0 +1,193 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=casefold-tr \ + --page-name=u300tr_casefold_page \ + --page-name-derived=u300_casefold_page \ + --index-name=my_u300tr_casefold_index \ + --max-char=0xFFFF \ + UnicodeData-3.0.0.txt + +*/ +const MY_CASEFOLD_CHARACTER u300tr_casefold_page00[256]={ + {0x0000,0x0000},{0x0001,0x0001}, /* 0000 */ + {0x0002,0x0002},{0x0003,0x0003}, /* 0002 */ + {0x0004,0x0004},{0x0005,0x0005}, /* 0004 */ + {0x0006,0x0006},{0x0007,0x0007}, /* 0006 */ + {0x0008,0x0008},{0x0009,0x0009}, /* 0008 */ + {0x000A,0x000A},{0x000B,0x000B}, /* 000A */ + {0x000C,0x000C},{0x000D,0x000D}, /* 000C */ + {0x000E,0x000E},{0x000F,0x000F}, /* 000E */ + {0x0010,0x0010},{0x0011,0x0011}, /* 0010 */ + {0x0012,0x0012},{0x0013,0x0013}, /* 0012 */ + {0x0014,0x0014},{0x0015,0x0015}, /* 0014 */ + {0x0016,0x0016},{0x0017,0x0017}, /* 0016 */ + {0x0018,0x0018},{0x0019,0x0019}, /* 0018 */ + {0x001A,0x001A},{0x001B,0x001B}, /* 001A */ + {0x001C,0x001C},{0x001D,0x001D}, /* 001C */ + {0x001E,0x001E},{0x001F,0x001F}, /* 001E */ + {0x0020,0x0020},{0x0021,0x0021}, /* 0020 */ + {0x0022,0x0022},{0x0023,0x0023}, /* 0022 */ + {0x0024,0x0024},{0x0025,0x0025}, /* 0024 */ + {0x0026,0x0026},{0x0027,0x0027}, /* 0026 */ + {0x0028,0x0028},{0x0029,0x0029}, /* 0028 */ + {0x002A,0x002A},{0x002B,0x002B}, /* 002A */ + {0x002C,0x002C},{0x002D,0x002D}, /* 002C */ + {0x002E,0x002E},{0x002F,0x002F}, /* 002E */ + {0x0030,0x0030},{0x0031,0x0031}, /* 0030 */ + {0x0032,0x0032},{0x0033,0x0033}, /* 0032 */ + {0x0034,0x0034},{0x0035,0x0035}, /* 0034 */ + {0x0036,0x0036},{0x0037,0x0037}, /* 0036 */ + {0x0038,0x0038},{0x0039,0x0039}, /* 0038 */ + {0x003A,0x003A},{0x003B,0x003B}, /* 003A */ + {0x003C,0x003C},{0x003D,0x003D}, /* 003C */ + {0x003E,0x003E},{0x003F,0x003F}, /* 003E */ + {0x0040,0x0040},{0x0041,0x0061}, /* 0040 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0042 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0044 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0046 */ + {0x0048,0x0068},{0x0049,0x0131}, /* 0048 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 004A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 004C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 004E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0050 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0052 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0054 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0056 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0058 */ + {0x005A,0x007A},{0x005B,0x005B}, /* 005A */ + {0x005C,0x005C},{0x005D,0x005D}, /* 005C */ + {0x005E,0x005E},{0x005F,0x005F}, /* 005E */ + {0x0060,0x0060},{0x0041,0x0061}, /* 0060 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0062 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0064 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0066 */ + {0x0048,0x0068},{0x0130,0x0069}, /* 0068 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 006A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 006C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 006E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0070 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0072 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0074 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0076 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0078 */ + {0x005A,0x007A},{0x007B,0x007B}, /* 007A */ + {0x007C,0x007C},{0x007D,0x007D}, /* 007C */ + {0x007E,0x007E},{0x007F,0x007F}, /* 007E */ + {0x0080,0x0080},{0x0081,0x0081}, /* 0080 */ + {0x0082,0x0082},{0x0083,0x0083}, /* 0082 */ + {0x0084,0x0084},{0x0085,0x0085}, /* 0084 */ + {0x0086,0x0086},{0x0087,0x0087}, /* 0086 */ + {0x0088,0x0088},{0x0089,0x0089}, /* 0088 */ + {0x008A,0x008A},{0x008B,0x008B}, /* 008A */ + {0x008C,0x008C},{0x008D,0x008D}, /* 008C */ + {0x008E,0x008E},{0x008F,0x008F}, /* 008E */ + {0x0090,0x0090},{0x0091,0x0091}, /* 0090 */ + {0x0092,0x0092},{0x0093,0x0093}, /* 0092 */ + {0x0094,0x0094},{0x0095,0x0095}, /* 0094 */ + {0x0096,0x0096},{0x0097,0x0097}, /* 0096 */ + {0x0098,0x0098},{0x0099,0x0099}, /* 0098 */ + {0x009A,0x009A},{0x009B,0x009B}, /* 009A */ + {0x009C,0x009C},{0x009D,0x009D}, /* 009C */ + {0x009E,0x009E},{0x009F,0x009F}, /* 009E */ + {0x00A0,0x00A0},{0x00A1,0x00A1}, /* 00A0 */ + {0x00A2,0x00A2},{0x00A3,0x00A3}, /* 00A2 */ + {0x00A4,0x00A4},{0x00A5,0x00A5}, /* 00A4 */ + {0x00A6,0x00A6},{0x00A7,0x00A7}, /* 00A6 */ + {0x00A8,0x00A8},{0x00A9,0x00A9}, /* 00A8 */ + {0x00AA,0x00AA},{0x00AB,0x00AB}, /* 00AA */ + {0x00AC,0x00AC},{0x00AD,0x00AD}, /* 00AC */ + {0x00AE,0x00AE},{0x00AF,0x00AF}, /* 00AE */ + {0x00B0,0x00B0},{0x00B1,0x00B1}, /* 00B0 */ + {0x00B2,0x00B2},{0x00B3,0x00B3}, /* 00B2 */ + {0x00B4,0x00B4},{0x039C,0x00B5}, /* 00B4 */ + {0x00B6,0x00B6},{0x00B7,0x00B7}, /* 00B6 */ + {0x00B8,0x00B8},{0x00B9,0x00B9}, /* 00B8 */ + {0x00BA,0x00BA},{0x00BB,0x00BB}, /* 00BA */ + {0x00BC,0x00BC},{0x00BD,0x00BD}, /* 00BC */ + {0x00BE,0x00BE},{0x00BF,0x00BF}, /* 00BE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00C0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00C2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00C4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00C6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00C8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00CA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00CC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00CE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00D0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00D2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00D4 */ + {0x00D6,0x00F6},{0x00D7,0x00D7}, /* 00D6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00D8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00DA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00DC */ + {0x00DE,0x00FE},{0x00DF,0x00DF}, /* 00DE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00E0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00E2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00E4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00E6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00E8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00EA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00EC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00EE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00F0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00F2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00F4 */ + {0x00D6,0x00F6},{0x00F7,0x00F7}, /* 00F6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00F8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00FA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00FC */ + {0x00DE,0x00FE},{0x0178,0x00FF} /* 00FE */ +}; + +const MY_CASEFOLD_CHARACTER * my_u300tr_casefold_index[256]={ + u300tr_casefold_page00, u300_casefold_page01, u300_casefold_page02, u300_casefold_page03, u300_casefold_page04, u300_casefold_page05, u300_casefold_page06, u300_casefold_page07, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u300_casefold_page1E, u300_casefold_page1F, + NULL, u300_casefold_page21, NULL, NULL, u300_casefold_page24, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, u300_casefold_pageFF +}; diff --git a/strings/ctype-unicode300-casefold.h b/strings/ctype-unicode300-casefold.h new file mode 100644 index 0000000000000..353cba0846a4b --- /dev/null +++ b/strings/ctype-unicode300-casefold.h @@ -0,0 +1,1764 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=casefold \ + --page-name=u300_casefold_page \ + --index-name=my_u300_casefold_index \ + --max-char=0xFFFF \ + UnicodeData-3.0.0.txt + +*/ +const MY_CASEFOLD_CHARACTER u300_casefold_page00[256]={ + {0x0000,0x0000},{0x0001,0x0001}, /* 0000 */ + {0x0002,0x0002},{0x0003,0x0003}, /* 0002 */ + {0x0004,0x0004},{0x0005,0x0005}, /* 0004 */ + {0x0006,0x0006},{0x0007,0x0007}, /* 0006 */ + {0x0008,0x0008},{0x0009,0x0009}, /* 0008 */ + {0x000A,0x000A},{0x000B,0x000B}, /* 000A */ + {0x000C,0x000C},{0x000D,0x000D}, /* 000C */ + {0x000E,0x000E},{0x000F,0x000F}, /* 000E */ + {0x0010,0x0010},{0x0011,0x0011}, /* 0010 */ + {0x0012,0x0012},{0x0013,0x0013}, /* 0012 */ + {0x0014,0x0014},{0x0015,0x0015}, /* 0014 */ + {0x0016,0x0016},{0x0017,0x0017}, /* 0016 */ + {0x0018,0x0018},{0x0019,0x0019}, /* 0018 */ + {0x001A,0x001A},{0x001B,0x001B}, /* 001A */ + {0x001C,0x001C},{0x001D,0x001D}, /* 001C */ + {0x001E,0x001E},{0x001F,0x001F}, /* 001E */ + {0x0020,0x0020},{0x0021,0x0021}, /* 0020 */ + {0x0022,0x0022},{0x0023,0x0023}, /* 0022 */ + {0x0024,0x0024},{0x0025,0x0025}, /* 0024 */ + {0x0026,0x0026},{0x0027,0x0027}, /* 0026 */ + {0x0028,0x0028},{0x0029,0x0029}, /* 0028 */ + {0x002A,0x002A},{0x002B,0x002B}, /* 002A */ + {0x002C,0x002C},{0x002D,0x002D}, /* 002C */ + {0x002E,0x002E},{0x002F,0x002F}, /* 002E */ + {0x0030,0x0030},{0x0031,0x0031}, /* 0030 */ + {0x0032,0x0032},{0x0033,0x0033}, /* 0032 */ + {0x0034,0x0034},{0x0035,0x0035}, /* 0034 */ + {0x0036,0x0036},{0x0037,0x0037}, /* 0036 */ + {0x0038,0x0038},{0x0039,0x0039}, /* 0038 */ + {0x003A,0x003A},{0x003B,0x003B}, /* 003A */ + {0x003C,0x003C},{0x003D,0x003D}, /* 003C */ + {0x003E,0x003E},{0x003F,0x003F}, /* 003E */ + {0x0040,0x0040},{0x0041,0x0061}, /* 0040 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0042 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0044 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0046 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0048 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 004A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 004C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 004E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0050 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0052 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0054 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0056 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0058 */ + {0x005A,0x007A},{0x005B,0x005B}, /* 005A */ + {0x005C,0x005C},{0x005D,0x005D}, /* 005C */ + {0x005E,0x005E},{0x005F,0x005F}, /* 005E */ + {0x0060,0x0060},{0x0041,0x0061}, /* 0060 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0062 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0064 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0066 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0068 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 006A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 006C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 006E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0070 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0072 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0074 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0076 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0078 */ + {0x005A,0x007A},{0x007B,0x007B}, /* 007A */ + {0x007C,0x007C},{0x007D,0x007D}, /* 007C */ + {0x007E,0x007E},{0x007F,0x007F}, /* 007E */ + {0x0080,0x0080},{0x0081,0x0081}, /* 0080 */ + {0x0082,0x0082},{0x0083,0x0083}, /* 0082 */ + {0x0084,0x0084},{0x0085,0x0085}, /* 0084 */ + {0x0086,0x0086},{0x0087,0x0087}, /* 0086 */ + {0x0088,0x0088},{0x0089,0x0089}, /* 0088 */ + {0x008A,0x008A},{0x008B,0x008B}, /* 008A */ + {0x008C,0x008C},{0x008D,0x008D}, /* 008C */ + {0x008E,0x008E},{0x008F,0x008F}, /* 008E */ + {0x0090,0x0090},{0x0091,0x0091}, /* 0090 */ + {0x0092,0x0092},{0x0093,0x0093}, /* 0092 */ + {0x0094,0x0094},{0x0095,0x0095}, /* 0094 */ + {0x0096,0x0096},{0x0097,0x0097}, /* 0096 */ + {0x0098,0x0098},{0x0099,0x0099}, /* 0098 */ + {0x009A,0x009A},{0x009B,0x009B}, /* 009A */ + {0x009C,0x009C},{0x009D,0x009D}, /* 009C */ + {0x009E,0x009E},{0x009F,0x009F}, /* 009E */ + {0x00A0,0x00A0},{0x00A1,0x00A1}, /* 00A0 */ + {0x00A2,0x00A2},{0x00A3,0x00A3}, /* 00A2 */ + {0x00A4,0x00A4},{0x00A5,0x00A5}, /* 00A4 */ + {0x00A6,0x00A6},{0x00A7,0x00A7}, /* 00A6 */ + {0x00A8,0x00A8},{0x00A9,0x00A9}, /* 00A8 */ + {0x00AA,0x00AA},{0x00AB,0x00AB}, /* 00AA */ + {0x00AC,0x00AC},{0x00AD,0x00AD}, /* 00AC */ + {0x00AE,0x00AE},{0x00AF,0x00AF}, /* 00AE */ + {0x00B0,0x00B0},{0x00B1,0x00B1}, /* 00B0 */ + {0x00B2,0x00B2},{0x00B3,0x00B3}, /* 00B2 */ + {0x00B4,0x00B4},{0x039C,0x00B5}, /* 00B4 */ + {0x00B6,0x00B6},{0x00B7,0x00B7}, /* 00B6 */ + {0x00B8,0x00B8},{0x00B9,0x00B9}, /* 00B8 */ + {0x00BA,0x00BA},{0x00BB,0x00BB}, /* 00BA */ + {0x00BC,0x00BC},{0x00BD,0x00BD}, /* 00BC */ + {0x00BE,0x00BE},{0x00BF,0x00BF}, /* 00BE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00C0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00C2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00C4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00C6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00C8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00CA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00CC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00CE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00D0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00D2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00D4 */ + {0x00D6,0x00F6},{0x00D7,0x00D7}, /* 00D6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00D8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00DA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00DC */ + {0x00DE,0x00FE},{0x00DF,0x00DF}, /* 00DE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00E0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00E2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00E4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00E6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00E8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00EA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00EC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00EE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00F0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00F2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00F4 */ + {0x00D6,0x00F6},{0x00F7,0x00F7}, /* 00F6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00F8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00FA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00FC */ + {0x00DE,0x00FE},{0x0178,0x00FF} /* 00FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page01[256]={ + {0x0100,0x0101},{0x0100,0x0101}, /* 0100 */ + {0x0102,0x0103},{0x0102,0x0103}, /* 0102 */ + {0x0104,0x0105},{0x0104,0x0105}, /* 0104 */ + {0x0106,0x0107},{0x0106,0x0107}, /* 0106 */ + {0x0108,0x0109},{0x0108,0x0109}, /* 0108 */ + {0x010A,0x010B},{0x010A,0x010B}, /* 010A */ + {0x010C,0x010D},{0x010C,0x010D}, /* 010C */ + {0x010E,0x010F},{0x010E,0x010F}, /* 010E */ + {0x0110,0x0111},{0x0110,0x0111}, /* 0110 */ + {0x0112,0x0113},{0x0112,0x0113}, /* 0112 */ + {0x0114,0x0115},{0x0114,0x0115}, /* 0114 */ + {0x0116,0x0117},{0x0116,0x0117}, /* 0116 */ + {0x0118,0x0119},{0x0118,0x0119}, /* 0118 */ + {0x011A,0x011B},{0x011A,0x011B}, /* 011A */ + {0x011C,0x011D},{0x011C,0x011D}, /* 011C */ + {0x011E,0x011F},{0x011E,0x011F}, /* 011E */ + {0x0120,0x0121},{0x0120,0x0121}, /* 0120 */ + {0x0122,0x0123},{0x0122,0x0123}, /* 0122 */ + {0x0124,0x0125},{0x0124,0x0125}, /* 0124 */ + {0x0126,0x0127},{0x0126,0x0127}, /* 0126 */ + {0x0128,0x0129},{0x0128,0x0129}, /* 0128 */ + {0x012A,0x012B},{0x012A,0x012B}, /* 012A */ + {0x012C,0x012D},{0x012C,0x012D}, /* 012C */ + {0x012E,0x012F},{0x012E,0x012F}, /* 012E */ + {0x0130,0x0069},{0x0049,0x0131}, /* 0130 */ + {0x0132,0x0133},{0x0132,0x0133}, /* 0132 */ + {0x0134,0x0135},{0x0134,0x0135}, /* 0134 */ + {0x0136,0x0137},{0x0136,0x0137}, /* 0136 */ + {0x0138,0x0138},{0x0139,0x013A}, /* 0138 */ + {0x0139,0x013A},{0x013B,0x013C}, /* 013A */ + {0x013B,0x013C},{0x013D,0x013E}, /* 013C */ + {0x013D,0x013E},{0x013F,0x0140}, /* 013E */ + {0x013F,0x0140},{0x0141,0x0142}, /* 0140 */ + {0x0141,0x0142},{0x0143,0x0144}, /* 0142 */ + {0x0143,0x0144},{0x0145,0x0146}, /* 0144 */ + {0x0145,0x0146},{0x0147,0x0148}, /* 0146 */ + {0x0147,0x0148},{0x0149,0x0149}, /* 0148 */ + {0x014A,0x014B},{0x014A,0x014B}, /* 014A */ + {0x014C,0x014D},{0x014C,0x014D}, /* 014C */ + {0x014E,0x014F},{0x014E,0x014F}, /* 014E */ + {0x0150,0x0151},{0x0150,0x0151}, /* 0150 */ + {0x0152,0x0153},{0x0152,0x0153}, /* 0152 */ + {0x0154,0x0155},{0x0154,0x0155}, /* 0154 */ + {0x0156,0x0157},{0x0156,0x0157}, /* 0156 */ + {0x0158,0x0159},{0x0158,0x0159}, /* 0158 */ + {0x015A,0x015B},{0x015A,0x015B}, /* 015A */ + {0x015C,0x015D},{0x015C,0x015D}, /* 015C */ + {0x015E,0x015F},{0x015E,0x015F}, /* 015E */ + {0x0160,0x0161},{0x0160,0x0161}, /* 0160 */ + {0x0162,0x0163},{0x0162,0x0163}, /* 0162 */ + {0x0164,0x0165},{0x0164,0x0165}, /* 0164 */ + {0x0166,0x0167},{0x0166,0x0167}, /* 0166 */ + {0x0168,0x0169},{0x0168,0x0169}, /* 0168 */ + {0x016A,0x016B},{0x016A,0x016B}, /* 016A */ + {0x016C,0x016D},{0x016C,0x016D}, /* 016C */ + {0x016E,0x016F},{0x016E,0x016F}, /* 016E */ + {0x0170,0x0171},{0x0170,0x0171}, /* 0170 */ + {0x0172,0x0173},{0x0172,0x0173}, /* 0172 */ + {0x0174,0x0175},{0x0174,0x0175}, /* 0174 */ + {0x0176,0x0177},{0x0176,0x0177}, /* 0176 */ + {0x0178,0x00FF},{0x0179,0x017A}, /* 0178 */ + {0x0179,0x017A},{0x017B,0x017C}, /* 017A */ + {0x017B,0x017C},{0x017D,0x017E}, /* 017C */ + {0x017D,0x017E},{0x0053,0x017F}, /* 017E */ + {0x0180,0x0180},{0x0181,0x0253}, /* 0180 */ + {0x0182,0x0183},{0x0182,0x0183}, /* 0182 */ + {0x0184,0x0185},{0x0184,0x0185}, /* 0184 */ + {0x0186,0x0254},{0x0187,0x0188}, /* 0186 */ + {0x0187,0x0188},{0x0189,0x0256}, /* 0188 */ + {0x018A,0x0257},{0x018B,0x018C}, /* 018A */ + {0x018B,0x018C},{0x018D,0x018D}, /* 018C */ + {0x018E,0x01DD},{0x018F,0x0259}, /* 018E */ + {0x0190,0x025B},{0x0191,0x0192}, /* 0190 */ + {0x0191,0x0192},{0x0193,0x0260}, /* 0192 */ + {0x0194,0x0263},{0x01F6,0x0195}, /* 0194 */ + {0x0196,0x0269},{0x0197,0x0268}, /* 0196 */ + {0x0198,0x0199},{0x0198,0x0199}, /* 0198 */ + {0x019A,0x019A},{0x019B,0x019B}, /* 019A */ + {0x019C,0x026F},{0x019D,0x0272}, /* 019C */ + {0x019E,0x019E},{0x019F,0x0275}, /* 019E */ + {0x01A0,0x01A1},{0x01A0,0x01A1}, /* 01A0 */ + {0x01A2,0x01A3},{0x01A2,0x01A3}, /* 01A2 */ + {0x01A4,0x01A5},{0x01A4,0x01A5}, /* 01A4 */ + {0x01A6,0x0280},{0x01A7,0x01A8}, /* 01A6 */ + {0x01A7,0x01A8},{0x01A9,0x0283}, /* 01A8 */ + {0x01AA,0x01AA},{0x01AB,0x01AB}, /* 01AA */ + {0x01AC,0x01AD},{0x01AC,0x01AD}, /* 01AC */ + {0x01AE,0x0288},{0x01AF,0x01B0}, /* 01AE */ + {0x01AF,0x01B0},{0x01B1,0x028A}, /* 01B0 */ + {0x01B2,0x028B},{0x01B3,0x01B4}, /* 01B2 */ + {0x01B3,0x01B4},{0x01B5,0x01B6}, /* 01B4 */ + {0x01B5,0x01B6},{0x01B7,0x0292}, /* 01B6 */ + {0x01B8,0x01B9},{0x01B8,0x01B9}, /* 01B8 */ + {0x01BA,0x01BA},{0x01BB,0x01BB}, /* 01BA */ + {0x01BC,0x01BD},{0x01BC,0x01BD}, /* 01BC */ + {0x01BE,0x01BE},{0x01F7,0x01BF}, /* 01BE */ + {0x01C0,0x01C0},{0x01C1,0x01C1}, /* 01C0 */ + {0x01C2,0x01C2},{0x01C3,0x01C3}, /* 01C2 */ + {0x01C4,0x01C6},{0x01C4,0x01C6}, /* 01C4 */ + {0x01C4,0x01C6},{0x01C7,0x01C9}, /* 01C6 */ + {0x01C7,0x01C9},{0x01C7,0x01C9}, /* 01C8 */ + {0x01CA,0x01CC},{0x01CA,0x01CC}, /* 01CA */ + {0x01CA,0x01CC},{0x01CD,0x01CE}, /* 01CC */ + {0x01CD,0x01CE},{0x01CF,0x01D0}, /* 01CE */ + {0x01CF,0x01D0},{0x01D1,0x01D2}, /* 01D0 */ + {0x01D1,0x01D2},{0x01D3,0x01D4}, /* 01D2 */ + {0x01D3,0x01D4},{0x01D5,0x01D6}, /* 01D4 */ + {0x01D5,0x01D6},{0x01D7,0x01D8}, /* 01D6 */ + {0x01D7,0x01D8},{0x01D9,0x01DA}, /* 01D8 */ + {0x01D9,0x01DA},{0x01DB,0x01DC}, /* 01DA */ + {0x01DB,0x01DC},{0x018E,0x01DD}, /* 01DC */ + {0x01DE,0x01DF},{0x01DE,0x01DF}, /* 01DE */ + {0x01E0,0x01E1},{0x01E0,0x01E1}, /* 01E0 */ + {0x01E2,0x01E3},{0x01E2,0x01E3}, /* 01E2 */ + {0x01E4,0x01E5},{0x01E4,0x01E5}, /* 01E4 */ + {0x01E6,0x01E7},{0x01E6,0x01E7}, /* 01E6 */ + {0x01E8,0x01E9},{0x01E8,0x01E9}, /* 01E8 */ + {0x01EA,0x01EB},{0x01EA,0x01EB}, /* 01EA */ + {0x01EC,0x01ED},{0x01EC,0x01ED}, /* 01EC */ + {0x01EE,0x01EF},{0x01EE,0x01EF}, /* 01EE */ + {0x01F0,0x01F0},{0x01F1,0x01F3}, /* 01F0 */ + {0x01F1,0x01F3},{0x01F1,0x01F3}, /* 01F2 */ + {0x01F4,0x01F5},{0x01F4,0x01F5}, /* 01F4 */ + {0x01F6,0x0195},{0x01F7,0x01BF}, /* 01F6 */ + {0x01F8,0x01F9},{0x01F8,0x01F9}, /* 01F8 */ + {0x01FA,0x01FB},{0x01FA,0x01FB}, /* 01FA */ + {0x01FC,0x01FD},{0x01FC,0x01FD}, /* 01FC */ + {0x01FE,0x01FF},{0x01FE,0x01FF} /* 01FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page02[256]={ + {0x0200,0x0201},{0x0200,0x0201}, /* 0200 */ + {0x0202,0x0203},{0x0202,0x0203}, /* 0202 */ + {0x0204,0x0205},{0x0204,0x0205}, /* 0204 */ + {0x0206,0x0207},{0x0206,0x0207}, /* 0206 */ + {0x0208,0x0209},{0x0208,0x0209}, /* 0208 */ + {0x020A,0x020B},{0x020A,0x020B}, /* 020A */ + {0x020C,0x020D},{0x020C,0x020D}, /* 020C */ + {0x020E,0x020F},{0x020E,0x020F}, /* 020E */ + {0x0210,0x0211},{0x0210,0x0211}, /* 0210 */ + {0x0212,0x0213},{0x0212,0x0213}, /* 0212 */ + {0x0214,0x0215},{0x0214,0x0215}, /* 0214 */ + {0x0216,0x0217},{0x0216,0x0217}, /* 0216 */ + {0x0218,0x0219},{0x0218,0x0219}, /* 0218 */ + {0x021A,0x021B},{0x021A,0x021B}, /* 021A */ + {0x021C,0x021D},{0x021C,0x021D}, /* 021C */ + {0x021E,0x021F},{0x021E,0x021F}, /* 021E */ + {0x0220,0x0220},{0x0221,0x0221}, /* 0220 */ + {0x0222,0x0223},{0x0222,0x0223}, /* 0222 */ + {0x0224,0x0225},{0x0224,0x0225}, /* 0224 */ + {0x0226,0x0227},{0x0226,0x0227}, /* 0226 */ + {0x0228,0x0229},{0x0228,0x0229}, /* 0228 */ + {0x022A,0x022B},{0x022A,0x022B}, /* 022A */ + {0x022C,0x022D},{0x022C,0x022D}, /* 022C */ + {0x022E,0x022F},{0x022E,0x022F}, /* 022E */ + {0x0230,0x0231},{0x0230,0x0231}, /* 0230 */ + {0x0232,0x0233},{0x0232,0x0233}, /* 0232 */ + {0x0234,0x0234},{0x0235,0x0235}, /* 0234 */ + {0x0236,0x0236},{0x0237,0x0237}, /* 0236 */ + {0x0238,0x0238},{0x0239,0x0239}, /* 0238 */ + {0x023A,0x023A},{0x023B,0x023B}, /* 023A */ + {0x023C,0x023C},{0x023D,0x023D}, /* 023C */ + {0x023E,0x023E},{0x023F,0x023F}, /* 023E */ + {0x0240,0x0240},{0x0241,0x0241}, /* 0240 */ + {0x0242,0x0242},{0x0243,0x0243}, /* 0242 */ + {0x0244,0x0244},{0x0245,0x0245}, /* 0244 */ + {0x0246,0x0246},{0x0247,0x0247}, /* 0246 */ + {0x0248,0x0248},{0x0249,0x0249}, /* 0248 */ + {0x024A,0x024A},{0x024B,0x024B}, /* 024A */ + {0x024C,0x024C},{0x024D,0x024D}, /* 024C */ + {0x024E,0x024E},{0x024F,0x024F}, /* 024E */ + {0x0250,0x0250},{0x0251,0x0251}, /* 0250 */ + {0x0252,0x0252},{0x0181,0x0253}, /* 0252 */ + {0x0186,0x0254},{0x0255,0x0255}, /* 0254 */ + {0x0189,0x0256},{0x018A,0x0257}, /* 0256 */ + {0x0258,0x0258},{0x018F,0x0259}, /* 0258 */ + {0x025A,0x025A},{0x0190,0x025B}, /* 025A */ + {0x025C,0x025C},{0x025D,0x025D}, /* 025C */ + {0x025E,0x025E},{0x025F,0x025F}, /* 025E */ + {0x0193,0x0260},{0x0261,0x0261}, /* 0260 */ + {0x0262,0x0262},{0x0194,0x0263}, /* 0262 */ + {0x0264,0x0264},{0x0265,0x0265}, /* 0264 */ + {0x0266,0x0266},{0x0267,0x0267}, /* 0266 */ + {0x0197,0x0268},{0x0196,0x0269}, /* 0268 */ + {0x026A,0x026A},{0x026B,0x026B}, /* 026A */ + {0x026C,0x026C},{0x026D,0x026D}, /* 026C */ + {0x026E,0x026E},{0x019C,0x026F}, /* 026E */ + {0x0270,0x0270},{0x0271,0x0271}, /* 0270 */ + {0x019D,0x0272},{0x0273,0x0273}, /* 0272 */ + {0x0274,0x0274},{0x019F,0x0275}, /* 0274 */ + {0x0276,0x0276},{0x0277,0x0277}, /* 0276 */ + {0x0278,0x0278},{0x0279,0x0279}, /* 0278 */ + {0x027A,0x027A},{0x027B,0x027B}, /* 027A */ + {0x027C,0x027C},{0x027D,0x027D}, /* 027C */ + {0x027E,0x027E},{0x027F,0x027F}, /* 027E */ + {0x01A6,0x0280},{0x0281,0x0281}, /* 0280 */ + {0x0282,0x0282},{0x01A9,0x0283}, /* 0282 */ + {0x0284,0x0284},{0x0285,0x0285}, /* 0284 */ + {0x0286,0x0286},{0x0287,0x0287}, /* 0286 */ + {0x01AE,0x0288},{0x0289,0x0289}, /* 0288 */ + {0x01B1,0x028A},{0x01B2,0x028B}, /* 028A */ + {0x028C,0x028C},{0x028D,0x028D}, /* 028C */ + {0x028E,0x028E},{0x028F,0x028F}, /* 028E */ + {0x0290,0x0290},{0x0291,0x0291}, /* 0290 */ + {0x01B7,0x0292},{0x0293,0x0293}, /* 0292 */ + {0x0294,0x0294},{0x0295,0x0295}, /* 0294 */ + {0x0296,0x0296},{0x0297,0x0297}, /* 0296 */ + {0x0298,0x0298},{0x0299,0x0299}, /* 0298 */ + {0x029A,0x029A},{0x029B,0x029B}, /* 029A */ + {0x029C,0x029C},{0x029D,0x029D}, /* 029C */ + {0x029E,0x029E},{0x029F,0x029F}, /* 029E */ + {0x02A0,0x02A0},{0x02A1,0x02A1}, /* 02A0 */ + {0x02A2,0x02A2},{0x02A3,0x02A3}, /* 02A2 */ + {0x02A4,0x02A4},{0x02A5,0x02A5}, /* 02A4 */ + {0x02A6,0x02A6},{0x02A7,0x02A7}, /* 02A6 */ + {0x02A8,0x02A8},{0x02A9,0x02A9}, /* 02A8 */ + {0x02AA,0x02AA},{0x02AB,0x02AB}, /* 02AA */ + {0x02AC,0x02AC},{0x02AD,0x02AD}, /* 02AC */ + {0x02AE,0x02AE},{0x02AF,0x02AF}, /* 02AE */ + {0x02B0,0x02B0},{0x02B1,0x02B1}, /* 02B0 */ + {0x02B2,0x02B2},{0x02B3,0x02B3}, /* 02B2 */ + {0x02B4,0x02B4},{0x02B5,0x02B5}, /* 02B4 */ + {0x02B6,0x02B6},{0x02B7,0x02B7}, /* 02B6 */ + {0x02B8,0x02B8},{0x02B9,0x02B9}, /* 02B8 */ + {0x02BA,0x02BA},{0x02BB,0x02BB}, /* 02BA */ + {0x02BC,0x02BC},{0x02BD,0x02BD}, /* 02BC */ + {0x02BE,0x02BE},{0x02BF,0x02BF}, /* 02BE */ + {0x02C0,0x02C0},{0x02C1,0x02C1}, /* 02C0 */ + {0x02C2,0x02C2},{0x02C3,0x02C3}, /* 02C2 */ + {0x02C4,0x02C4},{0x02C5,0x02C5}, /* 02C4 */ + {0x02C6,0x02C6},{0x02C7,0x02C7}, /* 02C6 */ + {0x02C8,0x02C8},{0x02C9,0x02C9}, /* 02C8 */ + {0x02CA,0x02CA},{0x02CB,0x02CB}, /* 02CA */ + {0x02CC,0x02CC},{0x02CD,0x02CD}, /* 02CC */ + {0x02CE,0x02CE},{0x02CF,0x02CF}, /* 02CE */ + {0x02D0,0x02D0},{0x02D1,0x02D1}, /* 02D0 */ + {0x02D2,0x02D2},{0x02D3,0x02D3}, /* 02D2 */ + {0x02D4,0x02D4},{0x02D5,0x02D5}, /* 02D4 */ + {0x02D6,0x02D6},{0x02D7,0x02D7}, /* 02D6 */ + {0x02D8,0x02D8},{0x02D9,0x02D9}, /* 02D8 */ + {0x02DA,0x02DA},{0x02DB,0x02DB}, /* 02DA */ + {0x02DC,0x02DC},{0x02DD,0x02DD}, /* 02DC */ + {0x02DE,0x02DE},{0x02DF,0x02DF}, /* 02DE */ + {0x02E0,0x02E0},{0x02E1,0x02E1}, /* 02E0 */ + {0x02E2,0x02E2},{0x02E3,0x02E3}, /* 02E2 */ + {0x02E4,0x02E4},{0x02E5,0x02E5}, /* 02E4 */ + {0x02E6,0x02E6},{0x02E7,0x02E7}, /* 02E6 */ + {0x02E8,0x02E8},{0x02E9,0x02E9}, /* 02E8 */ + {0x02EA,0x02EA},{0x02EB,0x02EB}, /* 02EA */ + {0x02EC,0x02EC},{0x02ED,0x02ED}, /* 02EC */ + {0x02EE,0x02EE},{0x02EF,0x02EF}, /* 02EE */ + {0x02F0,0x02F0},{0x02F1,0x02F1}, /* 02F0 */ + {0x02F2,0x02F2},{0x02F3,0x02F3}, /* 02F2 */ + {0x02F4,0x02F4},{0x02F5,0x02F5}, /* 02F4 */ + {0x02F6,0x02F6},{0x02F7,0x02F7}, /* 02F6 */ + {0x02F8,0x02F8},{0x02F9,0x02F9}, /* 02F8 */ + {0x02FA,0x02FA},{0x02FB,0x02FB}, /* 02FA */ + {0x02FC,0x02FC},{0x02FD,0x02FD}, /* 02FC */ + {0x02FE,0x02FE},{0x02FF,0x02FF} /* 02FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page03[256]={ + {0x0300,0x0300},{0x0301,0x0301}, /* 0300 */ + {0x0302,0x0302},{0x0303,0x0303}, /* 0302 */ + {0x0304,0x0304},{0x0305,0x0305}, /* 0304 */ + {0x0306,0x0306},{0x0307,0x0307}, /* 0306 */ + {0x0308,0x0308},{0x0309,0x0309}, /* 0308 */ + {0x030A,0x030A},{0x030B,0x030B}, /* 030A */ + {0x030C,0x030C},{0x030D,0x030D}, /* 030C */ + {0x030E,0x030E},{0x030F,0x030F}, /* 030E */ + {0x0310,0x0310},{0x0311,0x0311}, /* 0310 */ + {0x0312,0x0312},{0x0313,0x0313}, /* 0312 */ + {0x0314,0x0314},{0x0315,0x0315}, /* 0314 */ + {0x0316,0x0316},{0x0317,0x0317}, /* 0316 */ + {0x0318,0x0318},{0x0319,0x0319}, /* 0318 */ + {0x031A,0x031A},{0x031B,0x031B}, /* 031A */ + {0x031C,0x031C},{0x031D,0x031D}, /* 031C */ + {0x031E,0x031E},{0x031F,0x031F}, /* 031E */ + {0x0320,0x0320},{0x0321,0x0321}, /* 0320 */ + {0x0322,0x0322},{0x0323,0x0323}, /* 0322 */ + {0x0324,0x0324},{0x0325,0x0325}, /* 0324 */ + {0x0326,0x0326},{0x0327,0x0327}, /* 0326 */ + {0x0328,0x0328},{0x0329,0x0329}, /* 0328 */ + {0x032A,0x032A},{0x032B,0x032B}, /* 032A */ + {0x032C,0x032C},{0x032D,0x032D}, /* 032C */ + {0x032E,0x032E},{0x032F,0x032F}, /* 032E */ + {0x0330,0x0330},{0x0331,0x0331}, /* 0330 */ + {0x0332,0x0332},{0x0333,0x0333}, /* 0332 */ + {0x0334,0x0334},{0x0335,0x0335}, /* 0334 */ + {0x0336,0x0336},{0x0337,0x0337}, /* 0336 */ + {0x0338,0x0338},{0x0339,0x0339}, /* 0338 */ + {0x033A,0x033A},{0x033B,0x033B}, /* 033A */ + {0x033C,0x033C},{0x033D,0x033D}, /* 033C */ + {0x033E,0x033E},{0x033F,0x033F}, /* 033E */ + {0x0340,0x0340},{0x0341,0x0341}, /* 0340 */ + {0x0342,0x0342},{0x0343,0x0343}, /* 0342 */ + {0x0344,0x0344},{0x0399,0x0345}, /* 0344 */ + {0x0346,0x0346},{0x0347,0x0347}, /* 0346 */ + {0x0348,0x0348},{0x0349,0x0349}, /* 0348 */ + {0x034A,0x034A},{0x034B,0x034B}, /* 034A */ + {0x034C,0x034C},{0x034D,0x034D}, /* 034C */ + {0x034E,0x034E},{0x034F,0x034F}, /* 034E */ + {0x0350,0x0350},{0x0351,0x0351}, /* 0350 */ + {0x0352,0x0352},{0x0353,0x0353}, /* 0352 */ + {0x0354,0x0354},{0x0355,0x0355}, /* 0354 */ + {0x0356,0x0356},{0x0357,0x0357}, /* 0356 */ + {0x0358,0x0358},{0x0359,0x0359}, /* 0358 */ + {0x035A,0x035A},{0x035B,0x035B}, /* 035A */ + {0x035C,0x035C},{0x035D,0x035D}, /* 035C */ + {0x035E,0x035E},{0x035F,0x035F}, /* 035E */ + {0x0360,0x0360},{0x0361,0x0361}, /* 0360 */ + {0x0362,0x0362},{0x0363,0x0363}, /* 0362 */ + {0x0364,0x0364},{0x0365,0x0365}, /* 0364 */ + {0x0366,0x0366},{0x0367,0x0367}, /* 0366 */ + {0x0368,0x0368},{0x0369,0x0369}, /* 0368 */ + {0x036A,0x036A},{0x036B,0x036B}, /* 036A */ + {0x036C,0x036C},{0x036D,0x036D}, /* 036C */ + {0x036E,0x036E},{0x036F,0x036F}, /* 036E */ + {0x0370,0x0370},{0x0371,0x0371}, /* 0370 */ + {0x0372,0x0372},{0x0373,0x0373}, /* 0372 */ + {0x0374,0x0374},{0x0375,0x0375}, /* 0374 */ + {0x0376,0x0376},{0x0377,0x0377}, /* 0376 */ + {0x0378,0x0378},{0x0379,0x0379}, /* 0378 */ + {0x037A,0x037A},{0x037B,0x037B}, /* 037A */ + {0x037C,0x037C},{0x037D,0x037D}, /* 037C */ + {0x037E,0x037E},{0x037F,0x037F}, /* 037E */ + {0x0380,0x0380},{0x0381,0x0381}, /* 0380 */ + {0x0382,0x0382},{0x0383,0x0383}, /* 0382 */ + {0x0384,0x0384},{0x0385,0x0385}, /* 0384 */ + {0x0386,0x03AC},{0x0387,0x0387}, /* 0386 */ + {0x0388,0x03AD},{0x0389,0x03AE}, /* 0388 */ + {0x038A,0x03AF},{0x038B,0x038B}, /* 038A */ + {0x038C,0x03CC},{0x038D,0x038D}, /* 038C */ + {0x038E,0x03CD},{0x038F,0x03CE}, /* 038E */ + {0x0390,0x0390},{0x0391,0x03B1}, /* 0390 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 0392 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 0394 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 0396 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 0398 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 039A */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 039C */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 039E */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03A0 */ + {0x03A2,0x03A2},{0x03A3,0x03C3}, /* 03A2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03A4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03A6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03A8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03AA */ + {0x0386,0x03AC},{0x0388,0x03AD}, /* 03AC */ + {0x0389,0x03AE},{0x038A,0x03AF}, /* 03AE */ + {0x03B0,0x03B0},{0x0391,0x03B1}, /* 03B0 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 03B2 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 03B4 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 03B6 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 03B8 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 03BA */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 03BC */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 03BE */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03C0 */ + {0x03A3,0x03C2},{0x03A3,0x03C3}, /* 03C2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03C4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03C6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03C8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03CA */ + {0x038C,0x03CC},{0x038E,0x03CD}, /* 03CC */ + {0x038F,0x03CE},{0x03CF,0x03CF}, /* 03CE */ + {0x0392,0x03D0},{0x0398,0x03D1}, /* 03D0 */ + {0x03D2,0x03D2},{0x03D3,0x03D3}, /* 03D2 */ + {0x03D4,0x03D4},{0x03A6,0x03D5}, /* 03D4 */ + {0x03A0,0x03D6},{0x03D7,0x03D7}, /* 03D6 */ + {0x03D8,0x03D8},{0x03D9,0x03D9}, /* 03D8 */ + {0x03DA,0x03DB},{0x03DA,0x03DB}, /* 03DA */ + {0x03DC,0x03DD},{0x03DC,0x03DD}, /* 03DC */ + {0x03DE,0x03DF},{0x03DE,0x03DF}, /* 03DE */ + {0x03E0,0x03E1},{0x03E0,0x03E1}, /* 03E0 */ + {0x03E2,0x03E3},{0x03E2,0x03E3}, /* 03E2 */ + {0x03E4,0x03E5},{0x03E4,0x03E5}, /* 03E4 */ + {0x03E6,0x03E7},{0x03E6,0x03E7}, /* 03E6 */ + {0x03E8,0x03E9},{0x03E8,0x03E9}, /* 03E8 */ + {0x03EA,0x03EB},{0x03EA,0x03EB}, /* 03EA */ + {0x03EC,0x03ED},{0x03EC,0x03ED}, /* 03EC */ + {0x03EE,0x03EF},{0x03EE,0x03EF}, /* 03EE */ + {0x039A,0x03F0},{0x03A1,0x03F1}, /* 03F0 */ + {0x03A3,0x03F2},{0x03F3,0x03F3}, /* 03F2 */ + {0x03F4,0x03F4},{0x03F5,0x03F5}, /* 03F4 */ + {0x03F6,0x03F6},{0x03F7,0x03F7}, /* 03F6 */ + {0x03F8,0x03F8},{0x03F9,0x03F9}, /* 03F8 */ + {0x03FA,0x03FA},{0x03FB,0x03FB}, /* 03FA */ + {0x03FC,0x03FC},{0x03FD,0x03FD}, /* 03FC */ + {0x03FE,0x03FE},{0x03FF,0x03FF} /* 03FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page04[256]={ + {0x0400,0x0450},{0x0401,0x0451}, /* 0400 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0402 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0404 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0406 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0408 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 040A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 040C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 040E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0410 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0412 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0414 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0416 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0418 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 041A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 041C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 041E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0420 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0422 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0424 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0426 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0428 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 042A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 042C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 042E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0430 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0432 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0434 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0436 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0438 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 043A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 043C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 043E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0440 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0442 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0444 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0446 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0448 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 044A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 044C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 044E */ + {0x0400,0x0450},{0x0401,0x0451}, /* 0450 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0452 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0454 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0456 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0458 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 045A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 045C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 045E */ + {0x0460,0x0461},{0x0460,0x0461}, /* 0460 */ + {0x0462,0x0463},{0x0462,0x0463}, /* 0462 */ + {0x0464,0x0465},{0x0464,0x0465}, /* 0464 */ + {0x0466,0x0467},{0x0466,0x0467}, /* 0466 */ + {0x0468,0x0469},{0x0468,0x0469}, /* 0468 */ + {0x046A,0x046B},{0x046A,0x046B}, /* 046A */ + {0x046C,0x046D},{0x046C,0x046D}, /* 046C */ + {0x046E,0x046F},{0x046E,0x046F}, /* 046E */ + {0x0470,0x0471},{0x0470,0x0471}, /* 0470 */ + {0x0472,0x0473},{0x0472,0x0473}, /* 0472 */ + {0x0474,0x0475},{0x0474,0x0475}, /* 0474 */ + {0x0476,0x0477},{0x0476,0x0477}, /* 0476 */ + {0x0478,0x0479},{0x0478,0x0479}, /* 0478 */ + {0x047A,0x047B},{0x047A,0x047B}, /* 047A */ + {0x047C,0x047D},{0x047C,0x047D}, /* 047C */ + {0x047E,0x047F},{0x047E,0x047F}, /* 047E */ + {0x0480,0x0481},{0x0480,0x0481}, /* 0480 */ + {0x0482,0x0482},{0x0483,0x0483}, /* 0482 */ + {0x0484,0x0484},{0x0485,0x0485}, /* 0484 */ + {0x0486,0x0486},{0x0487,0x0487}, /* 0486 */ + {0x0488,0x0488},{0x0489,0x0489}, /* 0488 */ + {0x048A,0x048A},{0x048B,0x048B}, /* 048A */ + {0x048C,0x048D},{0x048C,0x048D}, /* 048C */ + {0x048E,0x048F},{0x048E,0x048F}, /* 048E */ + {0x0490,0x0491},{0x0490,0x0491}, /* 0490 */ + {0x0492,0x0493},{0x0492,0x0493}, /* 0492 */ + {0x0494,0x0495},{0x0494,0x0495}, /* 0494 */ + {0x0496,0x0497},{0x0496,0x0497}, /* 0496 */ + {0x0498,0x0499},{0x0498,0x0499}, /* 0498 */ + {0x049A,0x049B},{0x049A,0x049B}, /* 049A */ + {0x049C,0x049D},{0x049C,0x049D}, /* 049C */ + {0x049E,0x049F},{0x049E,0x049F}, /* 049E */ + {0x04A0,0x04A1},{0x04A0,0x04A1}, /* 04A0 */ + {0x04A2,0x04A3},{0x04A2,0x04A3}, /* 04A2 */ + {0x04A4,0x04A5},{0x04A4,0x04A5}, /* 04A4 */ + {0x04A6,0x04A7},{0x04A6,0x04A7}, /* 04A6 */ + {0x04A8,0x04A9},{0x04A8,0x04A9}, /* 04A8 */ + {0x04AA,0x04AB},{0x04AA,0x04AB}, /* 04AA */ + {0x04AC,0x04AD},{0x04AC,0x04AD}, /* 04AC */ + {0x04AE,0x04AF},{0x04AE,0x04AF}, /* 04AE */ + {0x04B0,0x04B1},{0x04B0,0x04B1}, /* 04B0 */ + {0x04B2,0x04B3},{0x04B2,0x04B3}, /* 04B2 */ + {0x04B4,0x04B5},{0x04B4,0x04B5}, /* 04B4 */ + {0x04B6,0x04B7},{0x04B6,0x04B7}, /* 04B6 */ + {0x04B8,0x04B9},{0x04B8,0x04B9}, /* 04B8 */ + {0x04BA,0x04BB},{0x04BA,0x04BB}, /* 04BA */ + {0x04BC,0x04BD},{0x04BC,0x04BD}, /* 04BC */ + {0x04BE,0x04BF},{0x04BE,0x04BF}, /* 04BE */ + {0x04C0,0x04C0},{0x04C1,0x04C2}, /* 04C0 */ + {0x04C1,0x04C2},{0x04C3,0x04C4}, /* 04C2 */ + {0x04C3,0x04C4},{0x04C5,0x04C5}, /* 04C4 */ + {0x04C6,0x04C6},{0x04C7,0x04C8}, /* 04C6 */ + {0x04C7,0x04C8},{0x04C9,0x04C9}, /* 04C8 */ + {0x04CA,0x04CA},{0x04CB,0x04CC}, /* 04CA */ + {0x04CB,0x04CC},{0x04CD,0x04CD}, /* 04CC */ + {0x04CE,0x04CE},{0x04CF,0x04CF}, /* 04CE */ + {0x04D0,0x04D1},{0x04D0,0x04D1}, /* 04D0 */ + {0x04D2,0x04D3},{0x04D2,0x04D3}, /* 04D2 */ + {0x04D4,0x04D5},{0x04D4,0x04D5}, /* 04D4 */ + {0x04D6,0x04D7},{0x04D6,0x04D7}, /* 04D6 */ + {0x04D8,0x04D9},{0x04D8,0x04D9}, /* 04D8 */ + {0x04DA,0x04DB},{0x04DA,0x04DB}, /* 04DA */ + {0x04DC,0x04DD},{0x04DC,0x04DD}, /* 04DC */ + {0x04DE,0x04DF},{0x04DE,0x04DF}, /* 04DE */ + {0x04E0,0x04E1},{0x04E0,0x04E1}, /* 04E0 */ + {0x04E2,0x04E3},{0x04E2,0x04E3}, /* 04E2 */ + {0x04E4,0x04E5},{0x04E4,0x04E5}, /* 04E4 */ + {0x04E6,0x04E7},{0x04E6,0x04E7}, /* 04E6 */ + {0x04E8,0x04E9},{0x04E8,0x04E9}, /* 04E8 */ + {0x04EA,0x04EB},{0x04EA,0x04EB}, /* 04EA */ + {0x04EC,0x04ED},{0x04EC,0x04ED}, /* 04EC */ + {0x04EE,0x04EF},{0x04EE,0x04EF}, /* 04EE */ + {0x04F0,0x04F1},{0x04F0,0x04F1}, /* 04F0 */ + {0x04F2,0x04F3},{0x04F2,0x04F3}, /* 04F2 */ + {0x04F4,0x04F5},{0x04F4,0x04F5}, /* 04F4 */ + {0x04F6,0x04F6},{0x04F7,0x04F7}, /* 04F6 */ + {0x04F8,0x04F9},{0x04F8,0x04F9}, /* 04F8 */ + {0x04FA,0x04FA},{0x04FB,0x04FB}, /* 04FA */ + {0x04FC,0x04FC},{0x04FD,0x04FD}, /* 04FC */ + {0x04FE,0x04FE},{0x04FF,0x04FF} /* 04FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page05[256]={ + {0x0500,0x0500},{0x0501,0x0501}, /* 0500 */ + {0x0502,0x0502},{0x0503,0x0503}, /* 0502 */ + {0x0504,0x0504},{0x0505,0x0505}, /* 0504 */ + {0x0506,0x0506},{0x0507,0x0507}, /* 0506 */ + {0x0508,0x0508},{0x0509,0x0509}, /* 0508 */ + {0x050A,0x050A},{0x050B,0x050B}, /* 050A */ + {0x050C,0x050C},{0x050D,0x050D}, /* 050C */ + {0x050E,0x050E},{0x050F,0x050F}, /* 050E */ + {0x0510,0x0510},{0x0511,0x0511}, /* 0510 */ + {0x0512,0x0512},{0x0513,0x0513}, /* 0512 */ + {0x0514,0x0514},{0x0515,0x0515}, /* 0514 */ + {0x0516,0x0516},{0x0517,0x0517}, /* 0516 */ + {0x0518,0x0518},{0x0519,0x0519}, /* 0518 */ + {0x051A,0x051A},{0x051B,0x051B}, /* 051A */ + {0x051C,0x051C},{0x051D,0x051D}, /* 051C */ + {0x051E,0x051E},{0x051F,0x051F}, /* 051E */ + {0x0520,0x0520},{0x0521,0x0521}, /* 0520 */ + {0x0522,0x0522},{0x0523,0x0523}, /* 0522 */ + {0x0524,0x0524},{0x0525,0x0525}, /* 0524 */ + {0x0526,0x0526},{0x0527,0x0527}, /* 0526 */ + {0x0528,0x0528},{0x0529,0x0529}, /* 0528 */ + {0x052A,0x052A},{0x052B,0x052B}, /* 052A */ + {0x052C,0x052C},{0x052D,0x052D}, /* 052C */ + {0x052E,0x052E},{0x052F,0x052F}, /* 052E */ + {0x0530,0x0530},{0x0531,0x0561}, /* 0530 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0532 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0534 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0536 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0538 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 053A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 053C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 053E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0540 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0542 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0544 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0546 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0548 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 054A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 054C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 054E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0550 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0552 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0554 */ + {0x0556,0x0586},{0x0557,0x0557}, /* 0556 */ + {0x0558,0x0558},{0x0559,0x0559}, /* 0558 */ + {0x055A,0x055A},{0x055B,0x055B}, /* 055A */ + {0x055C,0x055C},{0x055D,0x055D}, /* 055C */ + {0x055E,0x055E},{0x055F,0x055F}, /* 055E */ + {0x0560,0x0560},{0x0531,0x0561}, /* 0560 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0562 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0564 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0566 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0568 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 056A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 056C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 056E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0570 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0572 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0574 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0576 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0578 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 057A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 057C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 057E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0580 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0582 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0584 */ + {0x0556,0x0586},{0x0587,0x0587}, /* 0586 */ + {0x0588,0x0588},{0x0589,0x0589}, /* 0588 */ + {0x058A,0x058A},{0x058B,0x058B}, /* 058A */ + {0x058C,0x058C},{0x058D,0x058D}, /* 058C */ + {0x058E,0x058E},{0x058F,0x058F}, /* 058E */ + {0x0590,0x0590},{0x0591,0x0591}, /* 0590 */ + {0x0592,0x0592},{0x0593,0x0593}, /* 0592 */ + {0x0594,0x0594},{0x0595,0x0595}, /* 0594 */ + {0x0596,0x0596},{0x0597,0x0597}, /* 0596 */ + {0x0598,0x0598},{0x0599,0x0599}, /* 0598 */ + {0x059A,0x059A},{0x059B,0x059B}, /* 059A */ + {0x059C,0x059C},{0x059D,0x059D}, /* 059C */ + {0x059E,0x059E},{0x059F,0x059F}, /* 059E */ + {0x05A0,0x05A0},{0x05A1,0x05A1}, /* 05A0 */ + {0x05A2,0x05A2},{0x05A3,0x05A3}, /* 05A2 */ + {0x05A4,0x05A4},{0x05A5,0x05A5}, /* 05A4 */ + {0x05A6,0x05A6},{0x05A7,0x05A7}, /* 05A6 */ + {0x05A8,0x05A8},{0x05A9,0x05A9}, /* 05A8 */ + {0x05AA,0x05AA},{0x05AB,0x05AB}, /* 05AA */ + {0x05AC,0x05AC},{0x05AD,0x05AD}, /* 05AC */ + {0x05AE,0x05AE},{0x05AF,0x05AF}, /* 05AE */ + {0x05B0,0x05B0},{0x05B1,0x05B1}, /* 05B0 */ + {0x05B2,0x05B2},{0x05B3,0x05B3}, /* 05B2 */ + {0x05B4,0x05B4},{0x05B5,0x05B5}, /* 05B4 */ + {0x05B6,0x05B6},{0x05B7,0x05B7}, /* 05B6 */ + {0x05B8,0x05B8},{0x05B9,0x05B9}, /* 05B8 */ + {0x05BA,0x05BA},{0x05BB,0x05BB}, /* 05BA */ + {0x05BC,0x05BC},{0x05BD,0x05BD}, /* 05BC */ + {0x05BE,0x05BE},{0x05BF,0x05BF}, /* 05BE */ + {0x05C0,0x05C0},{0x05C1,0x05C1}, /* 05C0 */ + {0x05C2,0x05C2},{0x05C3,0x05C3}, /* 05C2 */ + {0x05C4,0x05C4},{0x05C5,0x05C5}, /* 05C4 */ + {0x05C6,0x05C6},{0x05C7,0x05C7}, /* 05C6 */ + {0x05C8,0x05C8},{0x05C9,0x05C9}, /* 05C8 */ + {0x05CA,0x05CA},{0x05CB,0x05CB}, /* 05CA */ + {0x05CC,0x05CC},{0x05CD,0x05CD}, /* 05CC */ + {0x05CE,0x05CE},{0x05CF,0x05CF}, /* 05CE */ + {0x05D0,0x05D0},{0x05D1,0x05D1}, /* 05D0 */ + {0x05D2,0x05D2},{0x05D3,0x05D3}, /* 05D2 */ + {0x05D4,0x05D4},{0x05D5,0x05D5}, /* 05D4 */ + {0x05D6,0x05D6},{0x05D7,0x05D7}, /* 05D6 */ + {0x05D8,0x05D8},{0x05D9,0x05D9}, /* 05D8 */ + {0x05DA,0x05DA},{0x05DB,0x05DB}, /* 05DA */ + {0x05DC,0x05DC},{0x05DD,0x05DD}, /* 05DC */ + {0x05DE,0x05DE},{0x05DF,0x05DF}, /* 05DE */ + {0x05E0,0x05E0},{0x05E1,0x05E1}, /* 05E0 */ + {0x05E2,0x05E2},{0x05E3,0x05E3}, /* 05E2 */ + {0x05E4,0x05E4},{0x05E5,0x05E5}, /* 05E4 */ + {0x05E6,0x05E6},{0x05E7,0x05E7}, /* 05E6 */ + {0x05E8,0x05E8},{0x05E9,0x05E9}, /* 05E8 */ + {0x05EA,0x05EA},{0x05EB,0x05EB}, /* 05EA */ + {0x05EC,0x05EC},{0x05ED,0x05ED}, /* 05EC */ + {0x05EE,0x05EE},{0x05EF,0x05EF}, /* 05EE */ + {0x05F0,0x05F0},{0x05F1,0x05F1}, /* 05F0 */ + {0x05F2,0x05F2},{0x05F3,0x05F3}, /* 05F2 */ + {0x05F4,0x05F4},{0x05F5,0x05F5}, /* 05F4 */ + {0x05F6,0x05F6},{0x05F7,0x05F7}, /* 05F6 */ + {0x05F8,0x05F8},{0x05F9,0x05F9}, /* 05F8 */ + {0x05FA,0x05FA},{0x05FB,0x05FB}, /* 05FA */ + {0x05FC,0x05FC},{0x05FD,0x05FD}, /* 05FC */ + {0x05FE,0x05FE},{0x05FF,0x05FF} /* 05FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page06[256]={ /* This page is dummy */ + {0x0600,0x0600},{0x0601,0x0601}, /* 0600 */ + {0x0602,0x0602},{0x0603,0x0603}, /* 0602 */ + {0x0604,0x0604},{0x0605,0x0605}, /* 0604 */ + {0x0606,0x0606},{0x0607,0x0607}, /* 0606 */ + {0x0608,0x0608},{0x0609,0x0609}, /* 0608 */ + {0x060A,0x060A},{0x060B,0x060B}, /* 060A */ + {0x060C,0x060C},{0x060D,0x060D}, /* 060C */ + {0x060E,0x060E},{0x060F,0x060F}, /* 060E */ + {0x0610,0x0610},{0x0611,0x0611}, /* 0610 */ + {0x0612,0x0612},{0x0613,0x0613}, /* 0612 */ + {0x0614,0x0614},{0x0615,0x0615}, /* 0614 */ + {0x0616,0x0616},{0x0617,0x0617}, /* 0616 */ + {0x0618,0x0618},{0x0619,0x0619}, /* 0618 */ + {0x061A,0x061A},{0x061B,0x061B}, /* 061A */ + {0x061C,0x061C},{0x061D,0x061D}, /* 061C */ + {0x061E,0x061E},{0x061F,0x061F}, /* 061E */ + {0x0620,0x0620},{0x0621,0x0621}, /* 0620 */ + {0x0622,0x0622},{0x0623,0x0623}, /* 0622 */ + {0x0624,0x0624},{0x0625,0x0625}, /* 0624 */ + {0x0626,0x0626},{0x0627,0x0627}, /* 0626 */ + {0x0628,0x0628},{0x0629,0x0629}, /* 0628 */ + {0x062A,0x062A},{0x062B,0x062B}, /* 062A */ + {0x062C,0x062C},{0x062D,0x062D}, /* 062C */ + {0x062E,0x062E},{0x062F,0x062F}, /* 062E */ + {0x0630,0x0630},{0x0631,0x0631}, /* 0630 */ + {0x0632,0x0632},{0x0633,0x0633}, /* 0632 */ + {0x0634,0x0634},{0x0635,0x0635}, /* 0634 */ + {0x0636,0x0636},{0x0637,0x0637}, /* 0636 */ + {0x0638,0x0638},{0x0639,0x0639}, /* 0638 */ + {0x063A,0x063A},{0x063B,0x063B}, /* 063A */ + {0x063C,0x063C},{0x063D,0x063D}, /* 063C */ + {0x063E,0x063E},{0x063F,0x063F}, /* 063E */ + {0x0640,0x0640},{0x0641,0x0641}, /* 0640 */ + {0x0642,0x0642},{0x0643,0x0643}, /* 0642 */ + {0x0644,0x0644},{0x0645,0x0645}, /* 0644 */ + {0x0646,0x0646},{0x0647,0x0647}, /* 0646 */ + {0x0648,0x0648},{0x0649,0x0649}, /* 0648 */ + {0x064A,0x064A},{0x064B,0x064B}, /* 064A */ + {0x064C,0x064C},{0x064D,0x064D}, /* 064C */ + {0x064E,0x064E},{0x064F,0x064F}, /* 064E */ + {0x0650,0x0650},{0x0651,0x0651}, /* 0650 */ + {0x0652,0x0652},{0x0653,0x0653}, /* 0652 */ + {0x0654,0x0654},{0x0655,0x0655}, /* 0654 */ + {0x0656,0x0656},{0x0657,0x0657}, /* 0656 */ + {0x0658,0x0658},{0x0659,0x0659}, /* 0658 */ + {0x065A,0x065A},{0x065B,0x065B}, /* 065A */ + {0x065C,0x065C},{0x065D,0x065D}, /* 065C */ + {0x065E,0x065E},{0x065F,0x065F}, /* 065E */ + {0x0660,0x0660},{0x0661,0x0661}, /* 0660 */ + {0x0662,0x0662},{0x0663,0x0663}, /* 0662 */ + {0x0664,0x0664},{0x0665,0x0665}, /* 0664 */ + {0x0666,0x0666},{0x0667,0x0667}, /* 0666 */ + {0x0668,0x0668},{0x0669,0x0669}, /* 0668 */ + {0x066A,0x066A},{0x066B,0x066B}, /* 066A */ + {0x066C,0x066C},{0x066D,0x066D}, /* 066C */ + {0x066E,0x066E},{0x066F,0x066F}, /* 066E */ + {0x0670,0x0670},{0x0671,0x0671}, /* 0670 */ + {0x0672,0x0672},{0x0673,0x0673}, /* 0672 */ + {0x0674,0x0674},{0x0675,0x0675}, /* 0674 */ + {0x0676,0x0676},{0x0677,0x0677}, /* 0676 */ + {0x0678,0x0678},{0x0679,0x0679}, /* 0678 */ + {0x067A,0x067A},{0x067B,0x067B}, /* 067A */ + {0x067C,0x067C},{0x067D,0x067D}, /* 067C */ + {0x067E,0x067E},{0x067F,0x067F}, /* 067E */ + {0x0680,0x0680},{0x0681,0x0681}, /* 0680 */ + {0x0682,0x0682},{0x0683,0x0683}, /* 0682 */ + {0x0684,0x0684},{0x0685,0x0685}, /* 0684 */ + {0x0686,0x0686},{0x0687,0x0687}, /* 0686 */ + {0x0688,0x0688},{0x0689,0x0689}, /* 0688 */ + {0x068A,0x068A},{0x068B,0x068B}, /* 068A */ + {0x068C,0x068C},{0x068D,0x068D}, /* 068C */ + {0x068E,0x068E},{0x068F,0x068F}, /* 068E */ + {0x0690,0x0690},{0x0691,0x0691}, /* 0690 */ + {0x0692,0x0692},{0x0693,0x0693}, /* 0692 */ + {0x0694,0x0694},{0x0695,0x0695}, /* 0694 */ + {0x0696,0x0696},{0x0697,0x0697}, /* 0696 */ + {0x0698,0x0698},{0x0699,0x0699}, /* 0698 */ + {0x069A,0x069A},{0x069B,0x069B}, /* 069A */ + {0x069C,0x069C},{0x069D,0x069D}, /* 069C */ + {0x069E,0x069E},{0x069F,0x069F}, /* 069E */ + {0x06A0,0x06A0},{0x06A1,0x06A1}, /* 06A0 */ + {0x06A2,0x06A2},{0x06A3,0x06A3}, /* 06A2 */ + {0x06A4,0x06A4},{0x06A5,0x06A5}, /* 06A4 */ + {0x06A6,0x06A6},{0x06A7,0x06A7}, /* 06A6 */ + {0x06A8,0x06A8},{0x06A9,0x06A9}, /* 06A8 */ + {0x06AA,0x06AA},{0x06AB,0x06AB}, /* 06AA */ + {0x06AC,0x06AC},{0x06AD,0x06AD}, /* 06AC */ + {0x06AE,0x06AE},{0x06AF,0x06AF}, /* 06AE */ + {0x06B0,0x06B0},{0x06B1,0x06B1}, /* 06B0 */ + {0x06B2,0x06B2},{0x06B3,0x06B3}, /* 06B2 */ + {0x06B4,0x06B4},{0x06B5,0x06B5}, /* 06B4 */ + {0x06B6,0x06B6},{0x06B7,0x06B7}, /* 06B6 */ + {0x06B8,0x06B8},{0x06B9,0x06B9}, /* 06B8 */ + {0x06BA,0x06BA},{0x06BB,0x06BB}, /* 06BA */ + {0x06BC,0x06BC},{0x06BD,0x06BD}, /* 06BC */ + {0x06BE,0x06BE},{0x06BF,0x06BF}, /* 06BE */ + {0x06C0,0x06C0},{0x06C1,0x06C1}, /* 06C0 */ + {0x06C2,0x06C2},{0x06C3,0x06C3}, /* 06C2 */ + {0x06C4,0x06C4},{0x06C5,0x06C5}, /* 06C4 */ + {0x06C6,0x06C6},{0x06C7,0x06C7}, /* 06C6 */ + {0x06C8,0x06C8},{0x06C9,0x06C9}, /* 06C8 */ + {0x06CA,0x06CA},{0x06CB,0x06CB}, /* 06CA */ + {0x06CC,0x06CC},{0x06CD,0x06CD}, /* 06CC */ + {0x06CE,0x06CE},{0x06CF,0x06CF}, /* 06CE */ + {0x06D0,0x06D0},{0x06D1,0x06D1}, /* 06D0 */ + {0x06D2,0x06D2},{0x06D3,0x06D3}, /* 06D2 */ + {0x06D4,0x06D4},{0x06D5,0x06D5}, /* 06D4 */ + {0x06D6,0x06D6},{0x06D7,0x06D7}, /* 06D6 */ + {0x06D8,0x06D8},{0x06D9,0x06D9}, /* 06D8 */ + {0x06DA,0x06DA},{0x06DB,0x06DB}, /* 06DA */ + {0x06DC,0x06DC},{0x06DD,0x06DD}, /* 06DC */ + {0x06DE,0x06DE},{0x06DF,0x06DF}, /* 06DE */ + {0x06E0,0x06E0},{0x06E1,0x06E1}, /* 06E0 */ + {0x06E2,0x06E2},{0x06E3,0x06E3}, /* 06E2 */ + {0x06E4,0x06E4},{0x06E5,0x06E5}, /* 06E4 */ + {0x06E6,0x06E6},{0x06E7,0x06E7}, /* 06E6 */ + {0x06E8,0x06E8},{0x06E9,0x06E9}, /* 06E8 */ + {0x06EA,0x06EA},{0x06EB,0x06EB}, /* 06EA */ + {0x06EC,0x06EC},{0x06ED,0x06ED}, /* 06EC */ + {0x06EE,0x06EE},{0x06EF,0x06EF}, /* 06EE */ + {0x06F0,0x06F0},{0x06F1,0x06F1}, /* 06F0 */ + {0x06F2,0x06F2},{0x06F3,0x06F3}, /* 06F2 */ + {0x06F4,0x06F4},{0x06F5,0x06F5}, /* 06F4 */ + {0x06F6,0x06F6},{0x06F7,0x06F7}, /* 06F6 */ + {0x06F8,0x06F8},{0x06F9,0x06F9}, /* 06F8 */ + {0x06FA,0x06FA},{0x06FB,0x06FB}, /* 06FA */ + {0x06FC,0x06FC},{0x06FD,0x06FD}, /* 06FC */ + {0x06FE,0x06FE},{0x06FF,0x06FF} /* 06FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page07[256]={ /* This page is dummy */ + {0x0700,0x0700},{0x0701,0x0701}, /* 0700 */ + {0x0702,0x0702},{0x0703,0x0703}, /* 0702 */ + {0x0704,0x0704},{0x0705,0x0705}, /* 0704 */ + {0x0706,0x0706},{0x0707,0x0707}, /* 0706 */ + {0x0708,0x0708},{0x0709,0x0709}, /* 0708 */ + {0x070A,0x070A},{0x070B,0x070B}, /* 070A */ + {0x070C,0x070C},{0x070D,0x070D}, /* 070C */ + {0x070E,0x070E},{0x070F,0x070F}, /* 070E */ + {0x0710,0x0710},{0x0711,0x0711}, /* 0710 */ + {0x0712,0x0712},{0x0713,0x0713}, /* 0712 */ + {0x0714,0x0714},{0x0715,0x0715}, /* 0714 */ + {0x0716,0x0716},{0x0717,0x0717}, /* 0716 */ + {0x0718,0x0718},{0x0719,0x0719}, /* 0718 */ + {0x071A,0x071A},{0x071B,0x071B}, /* 071A */ + {0x071C,0x071C},{0x071D,0x071D}, /* 071C */ + {0x071E,0x071E},{0x071F,0x071F}, /* 071E */ + {0x0720,0x0720},{0x0721,0x0721}, /* 0720 */ + {0x0722,0x0722},{0x0723,0x0723}, /* 0722 */ + {0x0724,0x0724},{0x0725,0x0725}, /* 0724 */ + {0x0726,0x0726},{0x0727,0x0727}, /* 0726 */ + {0x0728,0x0728},{0x0729,0x0729}, /* 0728 */ + {0x072A,0x072A},{0x072B,0x072B}, /* 072A */ + {0x072C,0x072C},{0x072D,0x072D}, /* 072C */ + {0x072E,0x072E},{0x072F,0x072F}, /* 072E */ + {0x0730,0x0730},{0x0731,0x0731}, /* 0730 */ + {0x0732,0x0732},{0x0733,0x0733}, /* 0732 */ + {0x0734,0x0734},{0x0735,0x0735}, /* 0734 */ + {0x0736,0x0736},{0x0737,0x0737}, /* 0736 */ + {0x0738,0x0738},{0x0739,0x0739}, /* 0738 */ + {0x073A,0x073A},{0x073B,0x073B}, /* 073A */ + {0x073C,0x073C},{0x073D,0x073D}, /* 073C */ + {0x073E,0x073E},{0x073F,0x073F}, /* 073E */ + {0x0740,0x0740},{0x0741,0x0741}, /* 0740 */ + {0x0742,0x0742},{0x0743,0x0743}, /* 0742 */ + {0x0744,0x0744},{0x0745,0x0745}, /* 0744 */ + {0x0746,0x0746},{0x0747,0x0747}, /* 0746 */ + {0x0748,0x0748},{0x0749,0x0749}, /* 0748 */ + {0x074A,0x074A},{0x074B,0x074B}, /* 074A */ + {0x074C,0x074C},{0x074D,0x074D}, /* 074C */ + {0x074E,0x074E},{0x074F,0x074F}, /* 074E */ + {0x0750,0x0750},{0x0751,0x0751}, /* 0750 */ + {0x0752,0x0752},{0x0753,0x0753}, /* 0752 */ + {0x0754,0x0754},{0x0755,0x0755}, /* 0754 */ + {0x0756,0x0756},{0x0757,0x0757}, /* 0756 */ + {0x0758,0x0758},{0x0759,0x0759}, /* 0758 */ + {0x075A,0x075A},{0x075B,0x075B}, /* 075A */ + {0x075C,0x075C},{0x075D,0x075D}, /* 075C */ + {0x075E,0x075E},{0x075F,0x075F}, /* 075E */ + {0x0760,0x0760},{0x0761,0x0761}, /* 0760 */ + {0x0762,0x0762},{0x0763,0x0763}, /* 0762 */ + {0x0764,0x0764},{0x0765,0x0765}, /* 0764 */ + {0x0766,0x0766},{0x0767,0x0767}, /* 0766 */ + {0x0768,0x0768},{0x0769,0x0769}, /* 0768 */ + {0x076A,0x076A},{0x076B,0x076B}, /* 076A */ + {0x076C,0x076C},{0x076D,0x076D}, /* 076C */ + {0x076E,0x076E},{0x076F,0x076F}, /* 076E */ + {0x0770,0x0770},{0x0771,0x0771}, /* 0770 */ + {0x0772,0x0772},{0x0773,0x0773}, /* 0772 */ + {0x0774,0x0774},{0x0775,0x0775}, /* 0774 */ + {0x0776,0x0776},{0x0777,0x0777}, /* 0776 */ + {0x0778,0x0778},{0x0779,0x0779}, /* 0778 */ + {0x077A,0x077A},{0x077B,0x077B}, /* 077A */ + {0x077C,0x077C},{0x077D,0x077D}, /* 077C */ + {0x077E,0x077E},{0x077F,0x077F}, /* 077E */ + {0x0780,0x0780},{0x0781,0x0781}, /* 0780 */ + {0x0782,0x0782},{0x0783,0x0783}, /* 0782 */ + {0x0784,0x0784},{0x0785,0x0785}, /* 0784 */ + {0x0786,0x0786},{0x0787,0x0787}, /* 0786 */ + {0x0788,0x0788},{0x0789,0x0789}, /* 0788 */ + {0x078A,0x078A},{0x078B,0x078B}, /* 078A */ + {0x078C,0x078C},{0x078D,0x078D}, /* 078C */ + {0x078E,0x078E},{0x078F,0x078F}, /* 078E */ + {0x0790,0x0790},{0x0791,0x0791}, /* 0790 */ + {0x0792,0x0792},{0x0793,0x0793}, /* 0792 */ + {0x0794,0x0794},{0x0795,0x0795}, /* 0794 */ + {0x0796,0x0796},{0x0797,0x0797}, /* 0796 */ + {0x0798,0x0798},{0x0799,0x0799}, /* 0798 */ + {0x079A,0x079A},{0x079B,0x079B}, /* 079A */ + {0x079C,0x079C},{0x079D,0x079D}, /* 079C */ + {0x079E,0x079E},{0x079F,0x079F}, /* 079E */ + {0x07A0,0x07A0},{0x07A1,0x07A1}, /* 07A0 */ + {0x07A2,0x07A2},{0x07A3,0x07A3}, /* 07A2 */ + {0x07A4,0x07A4},{0x07A5,0x07A5}, /* 07A4 */ + {0x07A6,0x07A6},{0x07A7,0x07A7}, /* 07A6 */ + {0x07A8,0x07A8},{0x07A9,0x07A9}, /* 07A8 */ + {0x07AA,0x07AA},{0x07AB,0x07AB}, /* 07AA */ + {0x07AC,0x07AC},{0x07AD,0x07AD}, /* 07AC */ + {0x07AE,0x07AE},{0x07AF,0x07AF}, /* 07AE */ + {0x07B0,0x07B0},{0x07B1,0x07B1}, /* 07B0 */ + {0x07B2,0x07B2},{0x07B3,0x07B3}, /* 07B2 */ + {0x07B4,0x07B4},{0x07B5,0x07B5}, /* 07B4 */ + {0x07B6,0x07B6},{0x07B7,0x07B7}, /* 07B6 */ + {0x07B8,0x07B8},{0x07B9,0x07B9}, /* 07B8 */ + {0x07BA,0x07BA},{0x07BB,0x07BB}, /* 07BA */ + {0x07BC,0x07BC},{0x07BD,0x07BD}, /* 07BC */ + {0x07BE,0x07BE},{0x07BF,0x07BF}, /* 07BE */ + {0x07C0,0x07C0},{0x07C1,0x07C1}, /* 07C0 */ + {0x07C2,0x07C2},{0x07C3,0x07C3}, /* 07C2 */ + {0x07C4,0x07C4},{0x07C5,0x07C5}, /* 07C4 */ + {0x07C6,0x07C6},{0x07C7,0x07C7}, /* 07C6 */ + {0x07C8,0x07C8},{0x07C9,0x07C9}, /* 07C8 */ + {0x07CA,0x07CA},{0x07CB,0x07CB}, /* 07CA */ + {0x07CC,0x07CC},{0x07CD,0x07CD}, /* 07CC */ + {0x07CE,0x07CE},{0x07CF,0x07CF}, /* 07CE */ + {0x07D0,0x07D0},{0x07D1,0x07D1}, /* 07D0 */ + {0x07D2,0x07D2},{0x07D3,0x07D3}, /* 07D2 */ + {0x07D4,0x07D4},{0x07D5,0x07D5}, /* 07D4 */ + {0x07D6,0x07D6},{0x07D7,0x07D7}, /* 07D6 */ + {0x07D8,0x07D8},{0x07D9,0x07D9}, /* 07D8 */ + {0x07DA,0x07DA},{0x07DB,0x07DB}, /* 07DA */ + {0x07DC,0x07DC},{0x07DD,0x07DD}, /* 07DC */ + {0x07DE,0x07DE},{0x07DF,0x07DF}, /* 07DE */ + {0x07E0,0x07E0},{0x07E1,0x07E1}, /* 07E0 */ + {0x07E2,0x07E2},{0x07E3,0x07E3}, /* 07E2 */ + {0x07E4,0x07E4},{0x07E5,0x07E5}, /* 07E4 */ + {0x07E6,0x07E6},{0x07E7,0x07E7}, /* 07E6 */ + {0x07E8,0x07E8},{0x07E9,0x07E9}, /* 07E8 */ + {0x07EA,0x07EA},{0x07EB,0x07EB}, /* 07EA */ + {0x07EC,0x07EC},{0x07ED,0x07ED}, /* 07EC */ + {0x07EE,0x07EE},{0x07EF,0x07EF}, /* 07EE */ + {0x07F0,0x07F0},{0x07F1,0x07F1}, /* 07F0 */ + {0x07F2,0x07F2},{0x07F3,0x07F3}, /* 07F2 */ + {0x07F4,0x07F4},{0x07F5,0x07F5}, /* 07F4 */ + {0x07F6,0x07F6},{0x07F7,0x07F7}, /* 07F6 */ + {0x07F8,0x07F8},{0x07F9,0x07F9}, /* 07F8 */ + {0x07FA,0x07FA},{0x07FB,0x07FB}, /* 07FA */ + {0x07FC,0x07FC},{0x07FD,0x07FD}, /* 07FC */ + {0x07FE,0x07FE},{0x07FF,0x07FF} /* 07FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page1E[256]={ + {0x1E00,0x1E01},{0x1E00,0x1E01}, /* 1E00 */ + {0x1E02,0x1E03},{0x1E02,0x1E03}, /* 1E02 */ + {0x1E04,0x1E05},{0x1E04,0x1E05}, /* 1E04 */ + {0x1E06,0x1E07},{0x1E06,0x1E07}, /* 1E06 */ + {0x1E08,0x1E09},{0x1E08,0x1E09}, /* 1E08 */ + {0x1E0A,0x1E0B},{0x1E0A,0x1E0B}, /* 1E0A */ + {0x1E0C,0x1E0D},{0x1E0C,0x1E0D}, /* 1E0C */ + {0x1E0E,0x1E0F},{0x1E0E,0x1E0F}, /* 1E0E */ + {0x1E10,0x1E11},{0x1E10,0x1E11}, /* 1E10 */ + {0x1E12,0x1E13},{0x1E12,0x1E13}, /* 1E12 */ + {0x1E14,0x1E15},{0x1E14,0x1E15}, /* 1E14 */ + {0x1E16,0x1E17},{0x1E16,0x1E17}, /* 1E16 */ + {0x1E18,0x1E19},{0x1E18,0x1E19}, /* 1E18 */ + {0x1E1A,0x1E1B},{0x1E1A,0x1E1B}, /* 1E1A */ + {0x1E1C,0x1E1D},{0x1E1C,0x1E1D}, /* 1E1C */ + {0x1E1E,0x1E1F},{0x1E1E,0x1E1F}, /* 1E1E */ + {0x1E20,0x1E21},{0x1E20,0x1E21}, /* 1E20 */ + {0x1E22,0x1E23},{0x1E22,0x1E23}, /* 1E22 */ + {0x1E24,0x1E25},{0x1E24,0x1E25}, /* 1E24 */ + {0x1E26,0x1E27},{0x1E26,0x1E27}, /* 1E26 */ + {0x1E28,0x1E29},{0x1E28,0x1E29}, /* 1E28 */ + {0x1E2A,0x1E2B},{0x1E2A,0x1E2B}, /* 1E2A */ + {0x1E2C,0x1E2D},{0x1E2C,0x1E2D}, /* 1E2C */ + {0x1E2E,0x1E2F},{0x1E2E,0x1E2F}, /* 1E2E */ + {0x1E30,0x1E31},{0x1E30,0x1E31}, /* 1E30 */ + {0x1E32,0x1E33},{0x1E32,0x1E33}, /* 1E32 */ + {0x1E34,0x1E35},{0x1E34,0x1E35}, /* 1E34 */ + {0x1E36,0x1E37},{0x1E36,0x1E37}, /* 1E36 */ + {0x1E38,0x1E39},{0x1E38,0x1E39}, /* 1E38 */ + {0x1E3A,0x1E3B},{0x1E3A,0x1E3B}, /* 1E3A */ + {0x1E3C,0x1E3D},{0x1E3C,0x1E3D}, /* 1E3C */ + {0x1E3E,0x1E3F},{0x1E3E,0x1E3F}, /* 1E3E */ + {0x1E40,0x1E41},{0x1E40,0x1E41}, /* 1E40 */ + {0x1E42,0x1E43},{0x1E42,0x1E43}, /* 1E42 */ + {0x1E44,0x1E45},{0x1E44,0x1E45}, /* 1E44 */ + {0x1E46,0x1E47},{0x1E46,0x1E47}, /* 1E46 */ + {0x1E48,0x1E49},{0x1E48,0x1E49}, /* 1E48 */ + {0x1E4A,0x1E4B},{0x1E4A,0x1E4B}, /* 1E4A */ + {0x1E4C,0x1E4D},{0x1E4C,0x1E4D}, /* 1E4C */ + {0x1E4E,0x1E4F},{0x1E4E,0x1E4F}, /* 1E4E */ + {0x1E50,0x1E51},{0x1E50,0x1E51}, /* 1E50 */ + {0x1E52,0x1E53},{0x1E52,0x1E53}, /* 1E52 */ + {0x1E54,0x1E55},{0x1E54,0x1E55}, /* 1E54 */ + {0x1E56,0x1E57},{0x1E56,0x1E57}, /* 1E56 */ + {0x1E58,0x1E59},{0x1E58,0x1E59}, /* 1E58 */ + {0x1E5A,0x1E5B},{0x1E5A,0x1E5B}, /* 1E5A */ + {0x1E5C,0x1E5D},{0x1E5C,0x1E5D}, /* 1E5C */ + {0x1E5E,0x1E5F},{0x1E5E,0x1E5F}, /* 1E5E */ + {0x1E60,0x1E61},{0x1E60,0x1E61}, /* 1E60 */ + {0x1E62,0x1E63},{0x1E62,0x1E63}, /* 1E62 */ + {0x1E64,0x1E65},{0x1E64,0x1E65}, /* 1E64 */ + {0x1E66,0x1E67},{0x1E66,0x1E67}, /* 1E66 */ + {0x1E68,0x1E69},{0x1E68,0x1E69}, /* 1E68 */ + {0x1E6A,0x1E6B},{0x1E6A,0x1E6B}, /* 1E6A */ + {0x1E6C,0x1E6D},{0x1E6C,0x1E6D}, /* 1E6C */ + {0x1E6E,0x1E6F},{0x1E6E,0x1E6F}, /* 1E6E */ + {0x1E70,0x1E71},{0x1E70,0x1E71}, /* 1E70 */ + {0x1E72,0x1E73},{0x1E72,0x1E73}, /* 1E72 */ + {0x1E74,0x1E75},{0x1E74,0x1E75}, /* 1E74 */ + {0x1E76,0x1E77},{0x1E76,0x1E77}, /* 1E76 */ + {0x1E78,0x1E79},{0x1E78,0x1E79}, /* 1E78 */ + {0x1E7A,0x1E7B},{0x1E7A,0x1E7B}, /* 1E7A */ + {0x1E7C,0x1E7D},{0x1E7C,0x1E7D}, /* 1E7C */ + {0x1E7E,0x1E7F},{0x1E7E,0x1E7F}, /* 1E7E */ + {0x1E80,0x1E81},{0x1E80,0x1E81}, /* 1E80 */ + {0x1E82,0x1E83},{0x1E82,0x1E83}, /* 1E82 */ + {0x1E84,0x1E85},{0x1E84,0x1E85}, /* 1E84 */ + {0x1E86,0x1E87},{0x1E86,0x1E87}, /* 1E86 */ + {0x1E88,0x1E89},{0x1E88,0x1E89}, /* 1E88 */ + {0x1E8A,0x1E8B},{0x1E8A,0x1E8B}, /* 1E8A */ + {0x1E8C,0x1E8D},{0x1E8C,0x1E8D}, /* 1E8C */ + {0x1E8E,0x1E8F},{0x1E8E,0x1E8F}, /* 1E8E */ + {0x1E90,0x1E91},{0x1E90,0x1E91}, /* 1E90 */ + {0x1E92,0x1E93},{0x1E92,0x1E93}, /* 1E92 */ + {0x1E94,0x1E95},{0x1E94,0x1E95}, /* 1E94 */ + {0x1E96,0x1E96},{0x1E97,0x1E97}, /* 1E96 */ + {0x1E98,0x1E98},{0x1E99,0x1E99}, /* 1E98 */ + {0x1E9A,0x1E9A},{0x1E60,0x1E9B}, /* 1E9A */ + {0x1E9C,0x1E9C},{0x1E9D,0x1E9D}, /* 1E9C */ + {0x1E9E,0x1E9E},{0x1E9F,0x1E9F}, /* 1E9E */ + {0x1EA0,0x1EA1},{0x1EA0,0x1EA1}, /* 1EA0 */ + {0x1EA2,0x1EA3},{0x1EA2,0x1EA3}, /* 1EA2 */ + {0x1EA4,0x1EA5},{0x1EA4,0x1EA5}, /* 1EA4 */ + {0x1EA6,0x1EA7},{0x1EA6,0x1EA7}, /* 1EA6 */ + {0x1EA8,0x1EA9},{0x1EA8,0x1EA9}, /* 1EA8 */ + {0x1EAA,0x1EAB},{0x1EAA,0x1EAB}, /* 1EAA */ + {0x1EAC,0x1EAD},{0x1EAC,0x1EAD}, /* 1EAC */ + {0x1EAE,0x1EAF},{0x1EAE,0x1EAF}, /* 1EAE */ + {0x1EB0,0x1EB1},{0x1EB0,0x1EB1}, /* 1EB0 */ + {0x1EB2,0x1EB3},{0x1EB2,0x1EB3}, /* 1EB2 */ + {0x1EB4,0x1EB5},{0x1EB4,0x1EB5}, /* 1EB4 */ + {0x1EB6,0x1EB7},{0x1EB6,0x1EB7}, /* 1EB6 */ + {0x1EB8,0x1EB9},{0x1EB8,0x1EB9}, /* 1EB8 */ + {0x1EBA,0x1EBB},{0x1EBA,0x1EBB}, /* 1EBA */ + {0x1EBC,0x1EBD},{0x1EBC,0x1EBD}, /* 1EBC */ + {0x1EBE,0x1EBF},{0x1EBE,0x1EBF}, /* 1EBE */ + {0x1EC0,0x1EC1},{0x1EC0,0x1EC1}, /* 1EC0 */ + {0x1EC2,0x1EC3},{0x1EC2,0x1EC3}, /* 1EC2 */ + {0x1EC4,0x1EC5},{0x1EC4,0x1EC5}, /* 1EC4 */ + {0x1EC6,0x1EC7},{0x1EC6,0x1EC7}, /* 1EC6 */ + {0x1EC8,0x1EC9},{0x1EC8,0x1EC9}, /* 1EC8 */ + {0x1ECA,0x1ECB},{0x1ECA,0x1ECB}, /* 1ECA */ + {0x1ECC,0x1ECD},{0x1ECC,0x1ECD}, /* 1ECC */ + {0x1ECE,0x1ECF},{0x1ECE,0x1ECF}, /* 1ECE */ + {0x1ED0,0x1ED1},{0x1ED0,0x1ED1}, /* 1ED0 */ + {0x1ED2,0x1ED3},{0x1ED2,0x1ED3}, /* 1ED2 */ + {0x1ED4,0x1ED5},{0x1ED4,0x1ED5}, /* 1ED4 */ + {0x1ED6,0x1ED7},{0x1ED6,0x1ED7}, /* 1ED6 */ + {0x1ED8,0x1ED9},{0x1ED8,0x1ED9}, /* 1ED8 */ + {0x1EDA,0x1EDB},{0x1EDA,0x1EDB}, /* 1EDA */ + {0x1EDC,0x1EDD},{0x1EDC,0x1EDD}, /* 1EDC */ + {0x1EDE,0x1EDF},{0x1EDE,0x1EDF}, /* 1EDE */ + {0x1EE0,0x1EE1},{0x1EE0,0x1EE1}, /* 1EE0 */ + {0x1EE2,0x1EE3},{0x1EE2,0x1EE3}, /* 1EE2 */ + {0x1EE4,0x1EE5},{0x1EE4,0x1EE5}, /* 1EE4 */ + {0x1EE6,0x1EE7},{0x1EE6,0x1EE7}, /* 1EE6 */ + {0x1EE8,0x1EE9},{0x1EE8,0x1EE9}, /* 1EE8 */ + {0x1EEA,0x1EEB},{0x1EEA,0x1EEB}, /* 1EEA */ + {0x1EEC,0x1EED},{0x1EEC,0x1EED}, /* 1EEC */ + {0x1EEE,0x1EEF},{0x1EEE,0x1EEF}, /* 1EEE */ + {0x1EF0,0x1EF1},{0x1EF0,0x1EF1}, /* 1EF0 */ + {0x1EF2,0x1EF3},{0x1EF2,0x1EF3}, /* 1EF2 */ + {0x1EF4,0x1EF5},{0x1EF4,0x1EF5}, /* 1EF4 */ + {0x1EF6,0x1EF7},{0x1EF6,0x1EF7}, /* 1EF6 */ + {0x1EF8,0x1EF9},{0x1EF8,0x1EF9}, /* 1EF8 */ + {0x1EFA,0x1EFA},{0x1EFB,0x1EFB}, /* 1EFA */ + {0x1EFC,0x1EFC},{0x1EFD,0x1EFD}, /* 1EFC */ + {0x1EFE,0x1EFE},{0x1EFF,0x1EFF} /* 1EFE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page1F[256]={ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F00 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F02 */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F04 */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F06 */ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F08 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F0A */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F0C */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F0E */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F10 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F12 */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F14 */ + {0x1F16,0x1F16},{0x1F17,0x1F17}, /* 1F16 */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F18 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F1A */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F1C */ + {0x1F1E,0x1F1E},{0x1F1F,0x1F1F}, /* 1F1E */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F20 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F22 */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F24 */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F26 */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F28 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F2A */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F2C */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F2E */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F30 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F32 */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F34 */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F36 */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F38 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F3A */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F3C */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F3E */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F40 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F42 */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F44 */ + {0x1F46,0x1F46},{0x1F47,0x1F47}, /* 1F46 */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F48 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F4A */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F4C */ + {0x1F4E,0x1F4E},{0x1F4F,0x1F4F}, /* 1F4E */ + {0x1F50,0x1F50},{0x1F59,0x1F51}, /* 1F50 */ + {0x1F52,0x1F52},{0x1F5B,0x1F53}, /* 1F52 */ + {0x1F54,0x1F54},{0x1F5D,0x1F55}, /* 1F54 */ + {0x1F56,0x1F56},{0x1F5F,0x1F57}, /* 1F56 */ + {0x1F58,0x1F58},{0x1F59,0x1F51}, /* 1F58 */ + {0x1F5A,0x1F5A},{0x1F5B,0x1F53}, /* 1F5A */ + {0x1F5C,0x1F5C},{0x1F5D,0x1F55}, /* 1F5C */ + {0x1F5E,0x1F5E},{0x1F5F,0x1F57}, /* 1F5E */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F60 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F62 */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F64 */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F66 */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F68 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F6A */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F6C */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F6E */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1F70 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1F72 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1F74 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1F76 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1F78 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1F7A */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1F7C */ + {0x1F7E,0x1F7E},{0x1F7F,0x1F7F}, /* 1F7E */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F80 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F82 */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F84 */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F86 */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F88 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F8A */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F8C */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F8E */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F90 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F92 */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F94 */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F96 */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F98 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F9A */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F9C */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F9E */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA0 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FA2 */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FA4 */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FA6 */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA8 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FAA */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FAC */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FAE */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB0 */ + {0x1FB2,0x1FB2},{0x1FBC,0x1FB3}, /* 1FB2 */ + {0x1FB4,0x1FB4},{0x1FB5,0x1FB5}, /* 1FB4 */ + {0x1FB6,0x1FB6},{0x1FB7,0x1FB7}, /* 1FB6 */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB8 */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1FBA */ + {0x1FBC,0x1FB3},{0x1FBD,0x1FBD}, /* 1FBC */ + {0x0399,0x1FBE},{0x1FBF,0x1FBF}, /* 1FBE */ + {0x1FC0,0x1FC0},{0x1FC1,0x1FC1}, /* 1FC0 */ + {0x1FC2,0x1FC2},{0x1FCC,0x1FC3}, /* 1FC2 */ + {0x1FC4,0x1FC4},{0x1FC5,0x1FC5}, /* 1FC4 */ + {0x1FC6,0x1FC6},{0x1FC7,0x1FC7}, /* 1FC6 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1FC8 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1FCA */ + {0x1FCC,0x1FC3},{0x1FCD,0x1FCD}, /* 1FCC */ + {0x1FCE,0x1FCE},{0x1FCF,0x1FCF}, /* 1FCE */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD0 */ + {0x1FD2,0x1FD2},{0x1FD3,0x1FD3}, /* 1FD2 */ + {0x1FD4,0x1FD4},{0x1FD5,0x1FD5}, /* 1FD4 */ + {0x1FD6,0x1FD6},{0x1FD7,0x1FD7}, /* 1FD6 */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD8 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1FDA */ + {0x1FDC,0x1FDC},{0x1FDD,0x1FDD}, /* 1FDC */ + {0x1FDE,0x1FDE},{0x1FDF,0x1FDF}, /* 1FDE */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE0 */ + {0x1FE2,0x1FE2},{0x1FE3,0x1FE3}, /* 1FE2 */ + {0x1FE4,0x1FE4},{0x1FEC,0x1FE5}, /* 1FE4 */ + {0x1FE6,0x1FE6},{0x1FE7,0x1FE7}, /* 1FE6 */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE8 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1FEA */ + {0x1FEC,0x1FE5},{0x1FED,0x1FED}, /* 1FEC */ + {0x1FEE,0x1FEE},{0x1FEF,0x1FEF}, /* 1FEE */ + {0x1FF0,0x1FF0},{0x1FF1,0x1FF1}, /* 1FF0 */ + {0x1FF2,0x1FF2},{0x1FFC,0x1FF3}, /* 1FF2 */ + {0x1FF4,0x1FF4},{0x1FF5,0x1FF5}, /* 1FF4 */ + {0x1FF6,0x1FF6},{0x1FF7,0x1FF7}, /* 1FF6 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1FF8 */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1FFA */ + {0x1FFC,0x1FF3},{0x1FFD,0x1FFD}, /* 1FFC */ + {0x1FFE,0x1FFE},{0x1FFF,0x1FFF} /* 1FFE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page21[256]={ + {0x2100,0x2100},{0x2101,0x2101}, /* 2100 */ + {0x2102,0x2102},{0x2103,0x2103}, /* 2102 */ + {0x2104,0x2104},{0x2105,0x2105}, /* 2104 */ + {0x2106,0x2106},{0x2107,0x2107}, /* 2106 */ + {0x2108,0x2108},{0x2109,0x2109}, /* 2108 */ + {0x210A,0x210A},{0x210B,0x210B}, /* 210A */ + {0x210C,0x210C},{0x210D,0x210D}, /* 210C */ + {0x210E,0x210E},{0x210F,0x210F}, /* 210E */ + {0x2110,0x2110},{0x2111,0x2111}, /* 2110 */ + {0x2112,0x2112},{0x2113,0x2113}, /* 2112 */ + {0x2114,0x2114},{0x2115,0x2115}, /* 2114 */ + {0x2116,0x2116},{0x2117,0x2117}, /* 2116 */ + {0x2118,0x2118},{0x2119,0x2119}, /* 2118 */ + {0x211A,0x211A},{0x211B,0x211B}, /* 211A */ + {0x211C,0x211C},{0x211D,0x211D}, /* 211C */ + {0x211E,0x211E},{0x211F,0x211F}, /* 211E */ + {0x2120,0x2120},{0x2121,0x2121}, /* 2120 */ + {0x2122,0x2122},{0x2123,0x2123}, /* 2122 */ + {0x2124,0x2124},{0x2125,0x2125}, /* 2124 */ + {0x2126,0x03C9},{0x2127,0x2127}, /* 2126 */ + {0x2128,0x2128},{0x2129,0x2129}, /* 2128 */ + {0x212A,0x006B},{0x212B,0x00E5}, /* 212A */ + {0x212C,0x212C},{0x212D,0x212D}, /* 212C */ + {0x212E,0x212E},{0x212F,0x212F}, /* 212E */ + {0x2130,0x2130},{0x2131,0x2131}, /* 2130 */ + {0x2132,0x2132},{0x2133,0x2133}, /* 2132 */ + {0x2134,0x2134},{0x2135,0x2135}, /* 2134 */ + {0x2136,0x2136},{0x2137,0x2137}, /* 2136 */ + {0x2138,0x2138},{0x2139,0x2139}, /* 2138 */ + {0x213A,0x213A},{0x213B,0x213B}, /* 213A */ + {0x213C,0x213C},{0x213D,0x213D}, /* 213C */ + {0x213E,0x213E},{0x213F,0x213F}, /* 213E */ + {0x2140,0x2140},{0x2141,0x2141}, /* 2140 */ + {0x2142,0x2142},{0x2143,0x2143}, /* 2142 */ + {0x2144,0x2144},{0x2145,0x2145}, /* 2144 */ + {0x2146,0x2146},{0x2147,0x2147}, /* 2146 */ + {0x2148,0x2148},{0x2149,0x2149}, /* 2148 */ + {0x214A,0x214A},{0x214B,0x214B}, /* 214A */ + {0x214C,0x214C},{0x214D,0x214D}, /* 214C */ + {0x214E,0x214E},{0x214F,0x214F}, /* 214E */ + {0x2150,0x2150},{0x2151,0x2151}, /* 2150 */ + {0x2152,0x2152},{0x2153,0x2153}, /* 2152 */ + {0x2154,0x2154},{0x2155,0x2155}, /* 2154 */ + {0x2156,0x2156},{0x2157,0x2157}, /* 2156 */ + {0x2158,0x2158},{0x2159,0x2159}, /* 2158 */ + {0x215A,0x215A},{0x215B,0x215B}, /* 215A */ + {0x215C,0x215C},{0x215D,0x215D}, /* 215C */ + {0x215E,0x215E},{0x215F,0x215F}, /* 215E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2160 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2162 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2164 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2166 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2168 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 216A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 216C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 216E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2170 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2172 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2174 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2176 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2178 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 217A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 217C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 217E */ + {0x2180,0x2180},{0x2181,0x2181}, /* 2180 */ + {0x2182,0x2182},{0x2183,0x2183}, /* 2182 */ + {0x2184,0x2184},{0x2185,0x2185}, /* 2184 */ + {0x2186,0x2186},{0x2187,0x2187}, /* 2186 */ + {0x2188,0x2188},{0x2189,0x2189}, /* 2188 */ + {0x218A,0x218A},{0x218B,0x218B}, /* 218A */ + {0x218C,0x218C},{0x218D,0x218D}, /* 218C */ + {0x218E,0x218E},{0x218F,0x218F}, /* 218E */ + {0x2190,0x2190},{0x2191,0x2191}, /* 2190 */ + {0x2192,0x2192},{0x2193,0x2193}, /* 2192 */ + {0x2194,0x2194},{0x2195,0x2195}, /* 2194 */ + {0x2196,0x2196},{0x2197,0x2197}, /* 2196 */ + {0x2198,0x2198},{0x2199,0x2199}, /* 2198 */ + {0x219A,0x219A},{0x219B,0x219B}, /* 219A */ + {0x219C,0x219C},{0x219D,0x219D}, /* 219C */ + {0x219E,0x219E},{0x219F,0x219F}, /* 219E */ + {0x21A0,0x21A0},{0x21A1,0x21A1}, /* 21A0 */ + {0x21A2,0x21A2},{0x21A3,0x21A3}, /* 21A2 */ + {0x21A4,0x21A4},{0x21A5,0x21A5}, /* 21A4 */ + {0x21A6,0x21A6},{0x21A7,0x21A7}, /* 21A6 */ + {0x21A8,0x21A8},{0x21A9,0x21A9}, /* 21A8 */ + {0x21AA,0x21AA},{0x21AB,0x21AB}, /* 21AA */ + {0x21AC,0x21AC},{0x21AD,0x21AD}, /* 21AC */ + {0x21AE,0x21AE},{0x21AF,0x21AF}, /* 21AE */ + {0x21B0,0x21B0},{0x21B1,0x21B1}, /* 21B0 */ + {0x21B2,0x21B2},{0x21B3,0x21B3}, /* 21B2 */ + {0x21B4,0x21B4},{0x21B5,0x21B5}, /* 21B4 */ + {0x21B6,0x21B6},{0x21B7,0x21B7}, /* 21B6 */ + {0x21B8,0x21B8},{0x21B9,0x21B9}, /* 21B8 */ + {0x21BA,0x21BA},{0x21BB,0x21BB}, /* 21BA */ + {0x21BC,0x21BC},{0x21BD,0x21BD}, /* 21BC */ + {0x21BE,0x21BE},{0x21BF,0x21BF}, /* 21BE */ + {0x21C0,0x21C0},{0x21C1,0x21C1}, /* 21C0 */ + {0x21C2,0x21C2},{0x21C3,0x21C3}, /* 21C2 */ + {0x21C4,0x21C4},{0x21C5,0x21C5}, /* 21C4 */ + {0x21C6,0x21C6},{0x21C7,0x21C7}, /* 21C6 */ + {0x21C8,0x21C8},{0x21C9,0x21C9}, /* 21C8 */ + {0x21CA,0x21CA},{0x21CB,0x21CB}, /* 21CA */ + {0x21CC,0x21CC},{0x21CD,0x21CD}, /* 21CC */ + {0x21CE,0x21CE},{0x21CF,0x21CF}, /* 21CE */ + {0x21D0,0x21D0},{0x21D1,0x21D1}, /* 21D0 */ + {0x21D2,0x21D2},{0x21D3,0x21D3}, /* 21D2 */ + {0x21D4,0x21D4},{0x21D5,0x21D5}, /* 21D4 */ + {0x21D6,0x21D6},{0x21D7,0x21D7}, /* 21D6 */ + {0x21D8,0x21D8},{0x21D9,0x21D9}, /* 21D8 */ + {0x21DA,0x21DA},{0x21DB,0x21DB}, /* 21DA */ + {0x21DC,0x21DC},{0x21DD,0x21DD}, /* 21DC */ + {0x21DE,0x21DE},{0x21DF,0x21DF}, /* 21DE */ + {0x21E0,0x21E0},{0x21E1,0x21E1}, /* 21E0 */ + {0x21E2,0x21E2},{0x21E3,0x21E3}, /* 21E2 */ + {0x21E4,0x21E4},{0x21E5,0x21E5}, /* 21E4 */ + {0x21E6,0x21E6},{0x21E7,0x21E7}, /* 21E6 */ + {0x21E8,0x21E8},{0x21E9,0x21E9}, /* 21E8 */ + {0x21EA,0x21EA},{0x21EB,0x21EB}, /* 21EA */ + {0x21EC,0x21EC},{0x21ED,0x21ED}, /* 21EC */ + {0x21EE,0x21EE},{0x21EF,0x21EF}, /* 21EE */ + {0x21F0,0x21F0},{0x21F1,0x21F1}, /* 21F0 */ + {0x21F2,0x21F2},{0x21F3,0x21F3}, /* 21F2 */ + {0x21F4,0x21F4},{0x21F5,0x21F5}, /* 21F4 */ + {0x21F6,0x21F6},{0x21F7,0x21F7}, /* 21F6 */ + {0x21F8,0x21F8},{0x21F9,0x21F9}, /* 21F8 */ + {0x21FA,0x21FA},{0x21FB,0x21FB}, /* 21FA */ + {0x21FC,0x21FC},{0x21FD,0x21FD}, /* 21FC */ + {0x21FE,0x21FE},{0x21FF,0x21FF} /* 21FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_page24[256]={ + {0x2400,0x2400},{0x2401,0x2401}, /* 2400 */ + {0x2402,0x2402},{0x2403,0x2403}, /* 2402 */ + {0x2404,0x2404},{0x2405,0x2405}, /* 2404 */ + {0x2406,0x2406},{0x2407,0x2407}, /* 2406 */ + {0x2408,0x2408},{0x2409,0x2409}, /* 2408 */ + {0x240A,0x240A},{0x240B,0x240B}, /* 240A */ + {0x240C,0x240C},{0x240D,0x240D}, /* 240C */ + {0x240E,0x240E},{0x240F,0x240F}, /* 240E */ + {0x2410,0x2410},{0x2411,0x2411}, /* 2410 */ + {0x2412,0x2412},{0x2413,0x2413}, /* 2412 */ + {0x2414,0x2414},{0x2415,0x2415}, /* 2414 */ + {0x2416,0x2416},{0x2417,0x2417}, /* 2416 */ + {0x2418,0x2418},{0x2419,0x2419}, /* 2418 */ + {0x241A,0x241A},{0x241B,0x241B}, /* 241A */ + {0x241C,0x241C},{0x241D,0x241D}, /* 241C */ + {0x241E,0x241E},{0x241F,0x241F}, /* 241E */ + {0x2420,0x2420},{0x2421,0x2421}, /* 2420 */ + {0x2422,0x2422},{0x2423,0x2423}, /* 2422 */ + {0x2424,0x2424},{0x2425,0x2425}, /* 2424 */ + {0x2426,0x2426},{0x2427,0x2427}, /* 2426 */ + {0x2428,0x2428},{0x2429,0x2429}, /* 2428 */ + {0x242A,0x242A},{0x242B,0x242B}, /* 242A */ + {0x242C,0x242C},{0x242D,0x242D}, /* 242C */ + {0x242E,0x242E},{0x242F,0x242F}, /* 242E */ + {0x2430,0x2430},{0x2431,0x2431}, /* 2430 */ + {0x2432,0x2432},{0x2433,0x2433}, /* 2432 */ + {0x2434,0x2434},{0x2435,0x2435}, /* 2434 */ + {0x2436,0x2436},{0x2437,0x2437}, /* 2436 */ + {0x2438,0x2438},{0x2439,0x2439}, /* 2438 */ + {0x243A,0x243A},{0x243B,0x243B}, /* 243A */ + {0x243C,0x243C},{0x243D,0x243D}, /* 243C */ + {0x243E,0x243E},{0x243F,0x243F}, /* 243E */ + {0x2440,0x2440},{0x2441,0x2441}, /* 2440 */ + {0x2442,0x2442},{0x2443,0x2443}, /* 2442 */ + {0x2444,0x2444},{0x2445,0x2445}, /* 2444 */ + {0x2446,0x2446},{0x2447,0x2447}, /* 2446 */ + {0x2448,0x2448},{0x2449,0x2449}, /* 2448 */ + {0x244A,0x244A},{0x244B,0x244B}, /* 244A */ + {0x244C,0x244C},{0x244D,0x244D}, /* 244C */ + {0x244E,0x244E},{0x244F,0x244F}, /* 244E */ + {0x2450,0x2450},{0x2451,0x2451}, /* 2450 */ + {0x2452,0x2452},{0x2453,0x2453}, /* 2452 */ + {0x2454,0x2454},{0x2455,0x2455}, /* 2454 */ + {0x2456,0x2456},{0x2457,0x2457}, /* 2456 */ + {0x2458,0x2458},{0x2459,0x2459}, /* 2458 */ + {0x245A,0x245A},{0x245B,0x245B}, /* 245A */ + {0x245C,0x245C},{0x245D,0x245D}, /* 245C */ + {0x245E,0x245E},{0x245F,0x245F}, /* 245E */ + {0x2460,0x2460},{0x2461,0x2461}, /* 2460 */ + {0x2462,0x2462},{0x2463,0x2463}, /* 2462 */ + {0x2464,0x2464},{0x2465,0x2465}, /* 2464 */ + {0x2466,0x2466},{0x2467,0x2467}, /* 2466 */ + {0x2468,0x2468},{0x2469,0x2469}, /* 2468 */ + {0x246A,0x246A},{0x246B,0x246B}, /* 246A */ + {0x246C,0x246C},{0x246D,0x246D}, /* 246C */ + {0x246E,0x246E},{0x246F,0x246F}, /* 246E */ + {0x2470,0x2470},{0x2471,0x2471}, /* 2470 */ + {0x2472,0x2472},{0x2473,0x2473}, /* 2472 */ + {0x2474,0x2474},{0x2475,0x2475}, /* 2474 */ + {0x2476,0x2476},{0x2477,0x2477}, /* 2476 */ + {0x2478,0x2478},{0x2479,0x2479}, /* 2478 */ + {0x247A,0x247A},{0x247B,0x247B}, /* 247A */ + {0x247C,0x247C},{0x247D,0x247D}, /* 247C */ + {0x247E,0x247E},{0x247F,0x247F}, /* 247E */ + {0x2480,0x2480},{0x2481,0x2481}, /* 2480 */ + {0x2482,0x2482},{0x2483,0x2483}, /* 2482 */ + {0x2484,0x2484},{0x2485,0x2485}, /* 2484 */ + {0x2486,0x2486},{0x2487,0x2487}, /* 2486 */ + {0x2488,0x2488},{0x2489,0x2489}, /* 2488 */ + {0x248A,0x248A},{0x248B,0x248B}, /* 248A */ + {0x248C,0x248C},{0x248D,0x248D}, /* 248C */ + {0x248E,0x248E},{0x248F,0x248F}, /* 248E */ + {0x2490,0x2490},{0x2491,0x2491}, /* 2490 */ + {0x2492,0x2492},{0x2493,0x2493}, /* 2492 */ + {0x2494,0x2494},{0x2495,0x2495}, /* 2494 */ + {0x2496,0x2496},{0x2497,0x2497}, /* 2496 */ + {0x2498,0x2498},{0x2499,0x2499}, /* 2498 */ + {0x249A,0x249A},{0x249B,0x249B}, /* 249A */ + {0x249C,0x249C},{0x249D,0x249D}, /* 249C */ + {0x249E,0x249E},{0x249F,0x249F}, /* 249E */ + {0x24A0,0x24A0},{0x24A1,0x24A1}, /* 24A0 */ + {0x24A2,0x24A2},{0x24A3,0x24A3}, /* 24A2 */ + {0x24A4,0x24A4},{0x24A5,0x24A5}, /* 24A4 */ + {0x24A6,0x24A6},{0x24A7,0x24A7}, /* 24A6 */ + {0x24A8,0x24A8},{0x24A9,0x24A9}, /* 24A8 */ + {0x24AA,0x24AA},{0x24AB,0x24AB}, /* 24AA */ + {0x24AC,0x24AC},{0x24AD,0x24AD}, /* 24AC */ + {0x24AE,0x24AE},{0x24AF,0x24AF}, /* 24AE */ + {0x24B0,0x24B0},{0x24B1,0x24B1}, /* 24B0 */ + {0x24B2,0x24B2},{0x24B3,0x24B3}, /* 24B2 */ + {0x24B4,0x24B4},{0x24B5,0x24B5}, /* 24B4 */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24B6 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24B8 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24BA */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24BC */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24BE */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24C0 */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24C2 */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24C4 */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24C6 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24C8 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24CA */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24CC */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24CE */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24D0 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24D2 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24D4 */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24D6 */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24D8 */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24DA */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24DC */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24DE */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24E0 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24E2 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24E4 */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24E6 */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24E8 */ + {0x24EA,0x24EA},{0x24EB,0x24EB}, /* 24EA */ + {0x24EC,0x24EC},{0x24ED,0x24ED}, /* 24EC */ + {0x24EE,0x24EE},{0x24EF,0x24EF}, /* 24EE */ + {0x24F0,0x24F0},{0x24F1,0x24F1}, /* 24F0 */ + {0x24F2,0x24F2},{0x24F3,0x24F3}, /* 24F2 */ + {0x24F4,0x24F4},{0x24F5,0x24F5}, /* 24F4 */ + {0x24F6,0x24F6},{0x24F7,0x24F7}, /* 24F6 */ + {0x24F8,0x24F8},{0x24F9,0x24F9}, /* 24F8 */ + {0x24FA,0x24FA},{0x24FB,0x24FB}, /* 24FA */ + {0x24FC,0x24FC},{0x24FD,0x24FD}, /* 24FC */ + {0x24FE,0x24FE},{0x24FF,0x24FF} /* 24FE */ +}; + +static const MY_CASEFOLD_CHARACTER u300_casefold_pageFF[256]={ + {0xFF00,0xFF00},{0xFF01,0xFF01}, /* FF00 */ + {0xFF02,0xFF02},{0xFF03,0xFF03}, /* FF02 */ + {0xFF04,0xFF04},{0xFF05,0xFF05}, /* FF04 */ + {0xFF06,0xFF06},{0xFF07,0xFF07}, /* FF06 */ + {0xFF08,0xFF08},{0xFF09,0xFF09}, /* FF08 */ + {0xFF0A,0xFF0A},{0xFF0B,0xFF0B}, /* FF0A */ + {0xFF0C,0xFF0C},{0xFF0D,0xFF0D}, /* FF0C */ + {0xFF0E,0xFF0E},{0xFF0F,0xFF0F}, /* FF0E */ + {0xFF10,0xFF10},{0xFF11,0xFF11}, /* FF10 */ + {0xFF12,0xFF12},{0xFF13,0xFF13}, /* FF12 */ + {0xFF14,0xFF14},{0xFF15,0xFF15}, /* FF14 */ + {0xFF16,0xFF16},{0xFF17,0xFF17}, /* FF16 */ + {0xFF18,0xFF18},{0xFF19,0xFF19}, /* FF18 */ + {0xFF1A,0xFF1A},{0xFF1B,0xFF1B}, /* FF1A */ + {0xFF1C,0xFF1C},{0xFF1D,0xFF1D}, /* FF1C */ + {0xFF1E,0xFF1E},{0xFF1F,0xFF1F}, /* FF1E */ + {0xFF20,0xFF20},{0xFF21,0xFF41}, /* FF20 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF22 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF24 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF26 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF28 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF2A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF2C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF2E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF30 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF32 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF34 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF36 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF38 */ + {0xFF3A,0xFF5A},{0xFF3B,0xFF3B}, /* FF3A */ + {0xFF3C,0xFF3C},{0xFF3D,0xFF3D}, /* FF3C */ + {0xFF3E,0xFF3E},{0xFF3F,0xFF3F}, /* FF3E */ + {0xFF40,0xFF40},{0xFF21,0xFF41}, /* FF40 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF42 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF44 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF46 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF48 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF4A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF4C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF4E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF50 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF52 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF54 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF56 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF58 */ + {0xFF3A,0xFF5A},{0xFF5B,0xFF5B}, /* FF5A */ + {0xFF5C,0xFF5C},{0xFF5D,0xFF5D}, /* FF5C */ + {0xFF5E,0xFF5E},{0xFF5F,0xFF5F}, /* FF5E */ + {0xFF60,0xFF60},{0xFF61,0xFF61}, /* FF60 */ + {0xFF62,0xFF62},{0xFF63,0xFF63}, /* FF62 */ + {0xFF64,0xFF64},{0xFF65,0xFF65}, /* FF64 */ + {0xFF66,0xFF66},{0xFF67,0xFF67}, /* FF66 */ + {0xFF68,0xFF68},{0xFF69,0xFF69}, /* FF68 */ + {0xFF6A,0xFF6A},{0xFF6B,0xFF6B}, /* FF6A */ + {0xFF6C,0xFF6C},{0xFF6D,0xFF6D}, /* FF6C */ + {0xFF6E,0xFF6E},{0xFF6F,0xFF6F}, /* FF6E */ + {0xFF70,0xFF70},{0xFF71,0xFF71}, /* FF70 */ + {0xFF72,0xFF72},{0xFF73,0xFF73}, /* FF72 */ + {0xFF74,0xFF74},{0xFF75,0xFF75}, /* FF74 */ + {0xFF76,0xFF76},{0xFF77,0xFF77}, /* FF76 */ + {0xFF78,0xFF78},{0xFF79,0xFF79}, /* FF78 */ + {0xFF7A,0xFF7A},{0xFF7B,0xFF7B}, /* FF7A */ + {0xFF7C,0xFF7C},{0xFF7D,0xFF7D}, /* FF7C */ + {0xFF7E,0xFF7E},{0xFF7F,0xFF7F}, /* FF7E */ + {0xFF80,0xFF80},{0xFF81,0xFF81}, /* FF80 */ + {0xFF82,0xFF82},{0xFF83,0xFF83}, /* FF82 */ + {0xFF84,0xFF84},{0xFF85,0xFF85}, /* FF84 */ + {0xFF86,0xFF86},{0xFF87,0xFF87}, /* FF86 */ + {0xFF88,0xFF88},{0xFF89,0xFF89}, /* FF88 */ + {0xFF8A,0xFF8A},{0xFF8B,0xFF8B}, /* FF8A */ + {0xFF8C,0xFF8C},{0xFF8D,0xFF8D}, /* FF8C */ + {0xFF8E,0xFF8E},{0xFF8F,0xFF8F}, /* FF8E */ + {0xFF90,0xFF90},{0xFF91,0xFF91}, /* FF90 */ + {0xFF92,0xFF92},{0xFF93,0xFF93}, /* FF92 */ + {0xFF94,0xFF94},{0xFF95,0xFF95}, /* FF94 */ + {0xFF96,0xFF96},{0xFF97,0xFF97}, /* FF96 */ + {0xFF98,0xFF98},{0xFF99,0xFF99}, /* FF98 */ + {0xFF9A,0xFF9A},{0xFF9B,0xFF9B}, /* FF9A */ + {0xFF9C,0xFF9C},{0xFF9D,0xFF9D}, /* FF9C */ + {0xFF9E,0xFF9E},{0xFF9F,0xFF9F}, /* FF9E */ + {0xFFA0,0xFFA0},{0xFFA1,0xFFA1}, /* FFA0 */ + {0xFFA2,0xFFA2},{0xFFA3,0xFFA3}, /* FFA2 */ + {0xFFA4,0xFFA4},{0xFFA5,0xFFA5}, /* FFA4 */ + {0xFFA6,0xFFA6},{0xFFA7,0xFFA7}, /* FFA6 */ + {0xFFA8,0xFFA8},{0xFFA9,0xFFA9}, /* FFA8 */ + {0xFFAA,0xFFAA},{0xFFAB,0xFFAB}, /* FFAA */ + {0xFFAC,0xFFAC},{0xFFAD,0xFFAD}, /* FFAC */ + {0xFFAE,0xFFAE},{0xFFAF,0xFFAF}, /* FFAE */ + {0xFFB0,0xFFB0},{0xFFB1,0xFFB1}, /* FFB0 */ + {0xFFB2,0xFFB2},{0xFFB3,0xFFB3}, /* FFB2 */ + {0xFFB4,0xFFB4},{0xFFB5,0xFFB5}, /* FFB4 */ + {0xFFB6,0xFFB6},{0xFFB7,0xFFB7}, /* FFB6 */ + {0xFFB8,0xFFB8},{0xFFB9,0xFFB9}, /* FFB8 */ + {0xFFBA,0xFFBA},{0xFFBB,0xFFBB}, /* FFBA */ + {0xFFBC,0xFFBC},{0xFFBD,0xFFBD}, /* FFBC */ + {0xFFBE,0xFFBE},{0xFFBF,0xFFBF}, /* FFBE */ + {0xFFC0,0xFFC0},{0xFFC1,0xFFC1}, /* FFC0 */ + {0xFFC2,0xFFC2},{0xFFC3,0xFFC3}, /* FFC2 */ + {0xFFC4,0xFFC4},{0xFFC5,0xFFC5}, /* FFC4 */ + {0xFFC6,0xFFC6},{0xFFC7,0xFFC7}, /* FFC6 */ + {0xFFC8,0xFFC8},{0xFFC9,0xFFC9}, /* FFC8 */ + {0xFFCA,0xFFCA},{0xFFCB,0xFFCB}, /* FFCA */ + {0xFFCC,0xFFCC},{0xFFCD,0xFFCD}, /* FFCC */ + {0xFFCE,0xFFCE},{0xFFCF,0xFFCF}, /* FFCE */ + {0xFFD0,0xFFD0},{0xFFD1,0xFFD1}, /* FFD0 */ + {0xFFD2,0xFFD2},{0xFFD3,0xFFD3}, /* FFD2 */ + {0xFFD4,0xFFD4},{0xFFD5,0xFFD5}, /* FFD4 */ + {0xFFD6,0xFFD6},{0xFFD7,0xFFD7}, /* FFD6 */ + {0xFFD8,0xFFD8},{0xFFD9,0xFFD9}, /* FFD8 */ + {0xFFDA,0xFFDA},{0xFFDB,0xFFDB}, /* FFDA */ + {0xFFDC,0xFFDC},{0xFFDD,0xFFDD}, /* FFDC */ + {0xFFDE,0xFFDE},{0xFFDF,0xFFDF}, /* FFDE */ + {0xFFE0,0xFFE0},{0xFFE1,0xFFE1}, /* FFE0 */ + {0xFFE2,0xFFE2},{0xFFE3,0xFFE3}, /* FFE2 */ + {0xFFE4,0xFFE4},{0xFFE5,0xFFE5}, /* FFE4 */ + {0xFFE6,0xFFE6},{0xFFE7,0xFFE7}, /* FFE6 */ + {0xFFE8,0xFFE8},{0xFFE9,0xFFE9}, /* FFE8 */ + {0xFFEA,0xFFEA},{0xFFEB,0xFFEB}, /* FFEA */ + {0xFFEC,0xFFEC},{0xFFED,0xFFED}, /* FFEC */ + {0xFFEE,0xFFEE},{0xFFEF,0xFFEF}, /* FFEE */ + {0xFFF0,0xFFF0},{0xFFF1,0xFFF1}, /* FFF0 */ + {0xFFF2,0xFFF2},{0xFFF3,0xFFF3}, /* FFF2 */ + {0xFFF4,0xFFF4},{0xFFF5,0xFFF5}, /* FFF4 */ + {0xFFF6,0xFFF6},{0xFFF7,0xFFF7}, /* FFF6 */ + {0xFFF8,0xFFF8},{0xFFF9,0xFFF9}, /* FFF8 */ + {0xFFFA,0xFFFA},{0xFFFB,0xFFFB}, /* FFFA */ + {0xFFFC,0xFFFC},{0xFFFD,0xFFFD}, /* FFFC */ + {0xFFFE,0xFFFE},{0xFFFF,0xFFFF} /* FFFE */ +}; + +const MY_CASEFOLD_CHARACTER * my_u300_casefold_index[256]={ + u300_casefold_page00, u300_casefold_page01, u300_casefold_page02, u300_casefold_page03, u300_casefold_page04, u300_casefold_page05, u300_casefold_page06, u300_casefold_page07, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u300_casefold_page1E, u300_casefold_page1F, + NULL, u300_casefold_page21, NULL, NULL, u300_casefold_page24, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, u300_casefold_pageFF +}; diff --git a/strings/ctype-unicode300-general_ci.h b/strings/ctype-unicode300-general_ci.h new file mode 100644 index 0000000000000..fd8cd71bf1ad5 --- /dev/null +++ b/strings/ctype-unicode300-general_ci.h @@ -0,0 +1,610 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=weight_general_ci \ + --max-char=0xFFFF \ + UnicodeData-3.0.0.txt + +*/ +const uint16 weight_general_ci_page00[256]={ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, /* 0000 */ + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, /* 0008 */ + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, /* 0010 */ + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, /* 0018 */ + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, /* 0020 */ + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, /* 0028 */ + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, /* 0030 */ + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, /* 0038 */ + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, /* 0040 */ + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, /* 0048 */ + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, /* 0050 */ + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, /* 0058 */ + 0x0060,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, /* 0060 */ + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, /* 0068 */ + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, /* 0070 */ + 0x0058,0x0059,0x005A,0x007B,0x007C,0x007D,0x007E,0x007F, /* 0078 */ + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, /* 0080 */ + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, /* 0088 */ + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, /* 0090 */ + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, /* 0098 */ + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, /* 00A0 */ + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, /* 00A8 */ + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x039C,0x00B6,0x00B7, /* 00B0 */ + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, /* 00B8 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x00C6,0x0043, /* 00C0 */ + 0x0045,0x0045,0x0045,0x0045,0x0049,0x0049,0x0049,0x0049, /* 00C8 */ + 0x00D0,0x004E,0x004F,0x004F,0x004F,0x004F,0x004F,0x00D7, /* 00D0 */ + 0x00D8,0x0055,0x0055,0x0055,0x0055,0x0059,0x00DE,0x0053, /* 00D8 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x00C6,0x0043, /* 00E0 */ + 0x0045,0x0045,0x0045,0x0045,0x0049,0x0049,0x0049,0x0049, /* 00E8 */ + 0x00D0,0x004E,0x004F,0x004F,0x004F,0x004F,0x004F,0x00F7, /* 00F0 */ + 0x00D8,0x0055,0x0055,0x0055,0x0055,0x0059,0x00DE,0x0059 /* 00F8 */ +}; + +static const uint16 weight_general_ci_page01[256]={ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0043,0x0043, /* 0100 */ + 0x0043,0x0043,0x0043,0x0043,0x0043,0x0043,0x0044,0x0044, /* 0108 */ + 0x0110,0x0110,0x0045,0x0045,0x0045,0x0045,0x0045,0x0045, /* 0110 */ + 0x0045,0x0045,0x0045,0x0045,0x0047,0x0047,0x0047,0x0047, /* 0118 */ + 0x0047,0x0047,0x0047,0x0047,0x0048,0x0048,0x0126,0x0126, /* 0120 */ + 0x0049,0x0049,0x0049,0x0049,0x0049,0x0049,0x0049,0x0049, /* 0128 */ + 0x0049,0x0049,0x0132,0x0132,0x004A,0x004A,0x004B,0x004B, /* 0130 */ + 0x0138,0x004C,0x004C,0x004C,0x004C,0x004C,0x004C,0x013F, /* 0138 */ + 0x013F,0x0141,0x0141,0x004E,0x004E,0x004E,0x004E,0x004E, /* 0140 */ + 0x004E,0x0149,0x014A,0x014A,0x004F,0x004F,0x004F,0x004F, /* 0148 */ + 0x004F,0x004F,0x0152,0x0152,0x0052,0x0052,0x0052,0x0052, /* 0150 */ + 0x0052,0x0052,0x0053,0x0053,0x0053,0x0053,0x0053,0x0053, /* 0158 */ + 0x0053,0x0053,0x0054,0x0054,0x0054,0x0054,0x0166,0x0166, /* 0160 */ + 0x0055,0x0055,0x0055,0x0055,0x0055,0x0055,0x0055,0x0055, /* 0168 */ + 0x0055,0x0055,0x0055,0x0055,0x0057,0x0057,0x0059,0x0059, /* 0170 */ + 0x0059,0x005A,0x005A,0x005A,0x005A,0x005A,0x005A,0x0053, /* 0178 */ + 0x0180,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187, /* 0180 */ + 0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F, /* 0188 */ + 0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197, /* 0190 */ + 0x0198,0x0198,0x019A,0x019B,0x019C,0x019D,0x019E,0x019F, /* 0198 */ + 0x004F,0x004F,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7, /* 01A0 */ + 0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x0055, /* 01A8 */ + 0x0055,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7, /* 01B0 */ + 0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7, /* 01B8 */ + 0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C4,0x01C4,0x01C7, /* 01C0 */ + 0x01C7,0x01C7,0x01CA,0x01CA,0x01CA,0x0041,0x0041,0x0049, /* 01C8 */ + 0x0049,0x004F,0x004F,0x0055,0x0055,0x0055,0x0055,0x0055, /* 01D0 */ + 0x0055,0x0055,0x0055,0x0055,0x0055,0x018E,0x0041,0x0041, /* 01D8 */ + 0x0041,0x0041,0x00C6,0x00C6,0x01E4,0x01E4,0x0047,0x0047, /* 01E0 */ + 0x004B,0x004B,0x004F,0x004F,0x004F,0x004F,0x01B7,0x01B7, /* 01E8 */ + 0x004A,0x01F1,0x01F1,0x01F1,0x0047,0x0047,0x01F6,0x01F7, /* 01F0 */ + 0x004E,0x004E,0x0041,0x0041,0x00C6,0x00C6,0x00D8,0x00D8 /* 01F8 */ +}; + +static const uint16 weight_general_ci_page02[256]={ + 0x0041,0x0041,0x0041,0x0041,0x0045,0x0045,0x0045,0x0045, /* 0200 */ + 0x0049,0x0049,0x0049,0x0049,0x004F,0x004F,0x004F,0x004F, /* 0208 */ + 0x0052,0x0052,0x0052,0x0052,0x0055,0x0055,0x0055,0x0055, /* 0210 */ + 0x0053,0x0053,0x0054,0x0054,0x021C,0x021C,0x0048,0x0048, /* 0218 */ + 0x0220,0x0221,0x0222,0x0222,0x0224,0x0224,0x0041,0x0041, /* 0220 */ + 0x0045,0x0045,0x004F,0x004F,0x004F,0x004F,0x004F,0x004F, /* 0228 */ + 0x004F,0x004F,0x0059,0x0059,0x0234,0x0235,0x0236,0x0237, /* 0230 */ + 0x0238,0x0239,0x023A,0x023B,0x023C,0x023D,0x023E,0x023F, /* 0238 */ + 0x0240,0x0241,0x0242,0x0243,0x0244,0x0245,0x0246,0x0247, /* 0240 */ + 0x0248,0x0249,0x024A,0x024B,0x024C,0x024D,0x024E,0x024F, /* 0248 */ + 0x0250,0x0251,0x0252,0x0181,0x0186,0x0255,0x0189,0x018A, /* 0250 */ + 0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F, /* 0258 */ + 0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267, /* 0260 */ + 0x0197,0x0196,0x026A,0x026B,0x026C,0x026D,0x026E,0x019C, /* 0268 */ + 0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277, /* 0270 */ + 0x0278,0x0279,0x027A,0x027B,0x027C,0x027D,0x027E,0x027F, /* 0278 */ + 0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287, /* 0280 */ + 0x01AE,0x0289,0x01B1,0x01B2,0x028C,0x028D,0x028E,0x028F, /* 0288 */ + 0x0290,0x0291,0x01B7,0x0293,0x0294,0x0295,0x0296,0x0297, /* 0290 */ + 0x0298,0x0299,0x029A,0x029B,0x029C,0x029D,0x029E,0x029F, /* 0298 */ + 0x02A0,0x02A1,0x02A2,0x02A3,0x02A4,0x02A5,0x02A6,0x02A7, /* 02A0 */ + 0x02A8,0x02A9,0x02AA,0x02AB,0x02AC,0x02AD,0x02AE,0x02AF, /* 02A8 */ + 0x02B0,0x02B1,0x02B2,0x02B3,0x02B4,0x02B5,0x02B6,0x02B7, /* 02B0 */ + 0x02B8,0x02B9,0x02BA,0x02BB,0x02BC,0x02BD,0x02BE,0x02BF, /* 02B8 */ + 0x02C0,0x02C1,0x02C2,0x02C3,0x02C4,0x02C5,0x02C6,0x02C7, /* 02C0 */ + 0x02C8,0x02C9,0x02CA,0x02CB,0x02CC,0x02CD,0x02CE,0x02CF, /* 02C8 */ + 0x02D0,0x02D1,0x02D2,0x02D3,0x02D4,0x02D5,0x02D6,0x02D7, /* 02D0 */ + 0x02D8,0x02D9,0x02DA,0x02DB,0x02DC,0x02DD,0x02DE,0x02DF, /* 02D8 */ + 0x02E0,0x02E1,0x02E2,0x02E3,0x02E4,0x02E5,0x02E6,0x02E7, /* 02E0 */ + 0x02E8,0x02E9,0x02EA,0x02EB,0x02EC,0x02ED,0x02EE,0x02EF, /* 02E8 */ + 0x02F0,0x02F1,0x02F2,0x02F3,0x02F4,0x02F5,0x02F6,0x02F7, /* 02F0 */ + 0x02F8,0x02F9,0x02FA,0x02FB,0x02FC,0x02FD,0x02FE,0x02FF /* 02F8 */ +}; + +static const uint16 weight_general_ci_page03[256]={ + 0x0300,0x0301,0x0302,0x0303,0x0304,0x0305,0x0306,0x0307, /* 0300 */ + 0x0308,0x0309,0x030A,0x030B,0x030C,0x030D,0x030E,0x030F, /* 0308 */ + 0x0310,0x0311,0x0312,0x0313,0x0314,0x0315,0x0316,0x0317, /* 0310 */ + 0x0318,0x0319,0x031A,0x031B,0x031C,0x031D,0x031E,0x031F, /* 0318 */ + 0x0320,0x0321,0x0322,0x0323,0x0324,0x0325,0x0326,0x0327, /* 0320 */ + 0x0328,0x0329,0x032A,0x032B,0x032C,0x032D,0x032E,0x032F, /* 0328 */ + 0x0330,0x0331,0x0332,0x0333,0x0334,0x0335,0x0336,0x0337, /* 0330 */ + 0x0338,0x0339,0x033A,0x033B,0x033C,0x033D,0x033E,0x033F, /* 0338 */ + 0x0340,0x0341,0x0342,0x0343,0x0344,0x0399,0x0346,0x0347, /* 0340 */ + 0x0348,0x0349,0x034A,0x034B,0x034C,0x034D,0x034E,0x034F, /* 0348 */ + 0x0350,0x0351,0x0352,0x0353,0x0354,0x0355,0x0356,0x0357, /* 0350 */ + 0x0358,0x0359,0x035A,0x035B,0x035C,0x035D,0x035E,0x035F, /* 0358 */ + 0x0360,0x0361,0x0362,0x0363,0x0364,0x0365,0x0366,0x0367, /* 0360 */ + 0x0368,0x0369,0x036A,0x036B,0x036C,0x036D,0x036E,0x036F, /* 0368 */ + 0x0370,0x0371,0x0372,0x0373,0x0374,0x0375,0x0376,0x0377, /* 0370 */ + 0x0378,0x0379,0x037A,0x037B,0x037C,0x037D,0x037E,0x037F, /* 0378 */ + 0x0380,0x0381,0x0382,0x0383,0x0384,0x0385,0x0391,0x0387, /* 0380 */ + 0x0395,0x0397,0x0399,0x038B,0x039F,0x038D,0x03A5,0x03A9, /* 0388 */ + 0x0399,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, /* 0390 */ + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, /* 0398 */ + 0x03A0,0x03A1,0x03A2,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7, /* 03A0 */ + 0x03A8,0x03A9,0x0399,0x03A5,0x0391,0x0395,0x0397,0x0399, /* 03A8 */ + 0x03A5,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, /* 03B0 */ + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, /* 03B8 */ + 0x03A0,0x03A1,0x03A3,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7, /* 03C0 */ + 0x03A8,0x03A9,0x0399,0x03A5,0x039F,0x03A5,0x03A9,0x03CF, /* 03C8 */ + 0x0392,0x0398,0x03D2,0x03D2,0x03D2,0x03A6,0x03A0,0x03D7, /* 03D0 */ + 0x03D8,0x03D9,0x03DA,0x03DA,0x03DC,0x03DC,0x03DE,0x03DE, /* 03D8 */ + 0x03E0,0x03E0,0x03E2,0x03E2,0x03E4,0x03E4,0x03E6,0x03E6, /* 03E0 */ + 0x03E8,0x03E8,0x03EA,0x03EA,0x03EC,0x03EC,0x03EE,0x03EE, /* 03E8 */ + 0x039A,0x03A1,0x03A3,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7, /* 03F0 */ + 0x03F8,0x03F9,0x03FA,0x03FB,0x03FC,0x03FD,0x03FE,0x03FF /* 03F8 */ +}; + +static const uint16 weight_general_ci_page04[256]={ + 0x0415,0x0415,0x0402,0x0413,0x0404,0x0405,0x0406,0x0406, /* 0400 */ + 0x0408,0x0409,0x040A,0x040B,0x041A,0x0418,0x0423,0x040F, /* 0408 */ + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, /* 0410 */ + 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, /* 0418 */ + 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, /* 0420 */ + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, /* 0428 */ + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, /* 0430 */ + 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, /* 0438 */ + 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, /* 0440 */ + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, /* 0448 */ + 0x0415,0x0415,0x0402,0x0413,0x0404,0x0405,0x0406,0x0406, /* 0450 */ + 0x0408,0x0409,0x040A,0x040B,0x041A,0x0418,0x0423,0x040F, /* 0458 */ + 0x0460,0x0460,0x0462,0x0462,0x0464,0x0464,0x0466,0x0466, /* 0460 */ + 0x0468,0x0468,0x046A,0x046A,0x046C,0x046C,0x046E,0x046E, /* 0468 */ + 0x0470,0x0470,0x0472,0x0472,0x0474,0x0474,0x0474,0x0474, /* 0470 */ + 0x0478,0x0478,0x047A,0x047A,0x047C,0x047C,0x047E,0x047E, /* 0478 */ + 0x0480,0x0480,0x0482,0x0483,0x0484,0x0485,0x0486,0x0487, /* 0480 */ + 0x0488,0x0489,0x048A,0x048B,0x048C,0x048C,0x048E,0x048E, /* 0488 */ + 0x0490,0x0490,0x0492,0x0492,0x0494,0x0494,0x0496,0x0496, /* 0490 */ + 0x0498,0x0498,0x049A,0x049A,0x049C,0x049C,0x049E,0x049E, /* 0498 */ + 0x04A0,0x04A0,0x04A2,0x04A2,0x04A4,0x04A4,0x04A6,0x04A6, /* 04A0 */ + 0x04A8,0x04A8,0x04AA,0x04AA,0x04AC,0x04AC,0x04AE,0x04AE, /* 04A8 */ + 0x04B0,0x04B0,0x04B2,0x04B2,0x04B4,0x04B4,0x04B6,0x04B6, /* 04B0 */ + 0x04B8,0x04B8,0x04BA,0x04BA,0x04BC,0x04BC,0x04BE,0x04BE, /* 04B8 */ + 0x04C0,0x0416,0x0416,0x04C3,0x04C3,0x04C5,0x04C6,0x04C7, /* 04C0 */ + 0x04C7,0x04C9,0x04CA,0x04CB,0x04CB,0x04CD,0x04CE,0x04CF, /* 04C8 */ + 0x0410,0x0410,0x0410,0x0410,0x04D4,0x04D4,0x0415,0x0415, /* 04D0 */ + 0x04D8,0x04D8,0x04D8,0x04D8,0x0416,0x0416,0x0417,0x0417, /* 04D8 */ + 0x04E0,0x04E0,0x0418,0x0418,0x0418,0x0418,0x041E,0x041E, /* 04E0 */ + 0x04E8,0x04E8,0x04E8,0x04E8,0x042D,0x042D,0x0423,0x0423, /* 04E8 */ + 0x0423,0x0423,0x0423,0x0423,0x0427,0x0427,0x04F6,0x04F7, /* 04F0 */ + 0x042B,0x042B,0x04FA,0x04FB,0x04FC,0x04FD,0x04FE,0x04FF /* 04F8 */ +}; + +static const uint16 weight_general_ci_page05[256]={ + 0x0500,0x0501,0x0502,0x0503,0x0504,0x0505,0x0506,0x0507, /* 0500 */ + 0x0508,0x0509,0x050A,0x050B,0x050C,0x050D,0x050E,0x050F, /* 0508 */ + 0x0510,0x0511,0x0512,0x0513,0x0514,0x0515,0x0516,0x0517, /* 0510 */ + 0x0518,0x0519,0x051A,0x051B,0x051C,0x051D,0x051E,0x051F, /* 0518 */ + 0x0520,0x0521,0x0522,0x0523,0x0524,0x0525,0x0526,0x0527, /* 0520 */ + 0x0528,0x0529,0x052A,0x052B,0x052C,0x052D,0x052E,0x052F, /* 0528 */ + 0x0530,0x0531,0x0532,0x0533,0x0534,0x0535,0x0536,0x0537, /* 0530 */ + 0x0538,0x0539,0x053A,0x053B,0x053C,0x053D,0x053E,0x053F, /* 0538 */ + 0x0540,0x0541,0x0542,0x0543,0x0544,0x0545,0x0546,0x0547, /* 0540 */ + 0x0548,0x0549,0x054A,0x054B,0x054C,0x054D,0x054E,0x054F, /* 0548 */ + 0x0550,0x0551,0x0552,0x0553,0x0554,0x0555,0x0556,0x0557, /* 0550 */ + 0x0558,0x0559,0x055A,0x055B,0x055C,0x055D,0x055E,0x055F, /* 0558 */ + 0x0560,0x0531,0x0532,0x0533,0x0534,0x0535,0x0536,0x0537, /* 0560 */ + 0x0538,0x0539,0x053A,0x053B,0x053C,0x053D,0x053E,0x053F, /* 0568 */ + 0x0540,0x0541,0x0542,0x0543,0x0544,0x0545,0x0546,0x0547, /* 0570 */ + 0x0548,0x0549,0x054A,0x054B,0x054C,0x054D,0x054E,0x054F, /* 0578 */ + 0x0550,0x0551,0x0552,0x0553,0x0554,0x0555,0x0556,0x0587, /* 0580 */ + 0x0588,0x0589,0x058A,0x058B,0x058C,0x058D,0x058E,0x058F, /* 0588 */ + 0x0590,0x0591,0x0592,0x0593,0x0594,0x0595,0x0596,0x0597, /* 0590 */ + 0x0598,0x0599,0x059A,0x059B,0x059C,0x059D,0x059E,0x059F, /* 0598 */ + 0x05A0,0x05A1,0x05A2,0x05A3,0x05A4,0x05A5,0x05A6,0x05A7, /* 05A0 */ + 0x05A8,0x05A9,0x05AA,0x05AB,0x05AC,0x05AD,0x05AE,0x05AF, /* 05A8 */ + 0x05B0,0x05B1,0x05B2,0x05B3,0x05B4,0x05B5,0x05B6,0x05B7, /* 05B0 */ + 0x05B8,0x05B9,0x05BA,0x05BB,0x05BC,0x05BD,0x05BE,0x05BF, /* 05B8 */ + 0x05C0,0x05C1,0x05C2,0x05C3,0x05C4,0x05C5,0x05C6,0x05C7, /* 05C0 */ + 0x05C8,0x05C9,0x05CA,0x05CB,0x05CC,0x05CD,0x05CE,0x05CF, /* 05C8 */ + 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7, /* 05D0 */ + 0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF, /* 05D8 */ + 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7, /* 05E0 */ + 0x05E8,0x05E9,0x05EA,0x05EB,0x05EC,0x05ED,0x05EE,0x05EF, /* 05E8 */ + 0x05F0,0x05F1,0x05F2,0x05F3,0x05F4,0x05F5,0x05F6,0x05F7, /* 05F0 */ + 0x05F8,0x05F9,0x05FA,0x05FB,0x05FC,0x05FD,0x05FE,0x05FF /* 05F8 */ +}; + +static const uint16 weight_general_ci_page06[256]={ /* This page is dummy */ + 0x0600,0x0601,0x0602,0x0603,0x0604,0x0605,0x0606,0x0607, /* 0600 */ + 0x0608,0x0609,0x060A,0x060B,0x060C,0x060D,0x060E,0x060F, /* 0608 */ + 0x0610,0x0611,0x0612,0x0613,0x0614,0x0615,0x0616,0x0617, /* 0610 */ + 0x0618,0x0619,0x061A,0x061B,0x061C,0x061D,0x061E,0x061F, /* 0618 */ + 0x0620,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627, /* 0620 */ + 0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F, /* 0628 */ + 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x0637, /* 0630 */ + 0x0638,0x0639,0x063A,0x063B,0x063C,0x063D,0x063E,0x063F, /* 0638 */ + 0x0640,0x0641,0x0642,0x0643,0x0644,0x0645,0x0646,0x0647, /* 0640 */ + 0x0648,0x0649,0x064A,0x064B,0x064C,0x064D,0x064E,0x064F, /* 0648 */ + 0x0650,0x0651,0x0652,0x0653,0x0654,0x0655,0x0656,0x0657, /* 0650 */ + 0x0658,0x0659,0x065A,0x065B,0x065C,0x065D,0x065E,0x065F, /* 0658 */ + 0x0660,0x0661,0x0662,0x0663,0x0664,0x0665,0x0666,0x0667, /* 0660 */ + 0x0668,0x0669,0x066A,0x066B,0x066C,0x066D,0x066E,0x066F, /* 0668 */ + 0x0670,0x0671,0x0672,0x0673,0x0674,0x0675,0x0676,0x0677, /* 0670 */ + 0x0678,0x0679,0x067A,0x067B,0x067C,0x067D,0x067E,0x067F, /* 0678 */ + 0x0680,0x0681,0x0682,0x0683,0x0684,0x0685,0x0686,0x0687, /* 0680 */ + 0x0688,0x0689,0x068A,0x068B,0x068C,0x068D,0x068E,0x068F, /* 0688 */ + 0x0690,0x0691,0x0692,0x0693,0x0694,0x0695,0x0696,0x0697, /* 0690 */ + 0x0698,0x0699,0x069A,0x069B,0x069C,0x069D,0x069E,0x069F, /* 0698 */ + 0x06A0,0x06A1,0x06A2,0x06A3,0x06A4,0x06A5,0x06A6,0x06A7, /* 06A0 */ + 0x06A8,0x06A9,0x06AA,0x06AB,0x06AC,0x06AD,0x06AE,0x06AF, /* 06A8 */ + 0x06B0,0x06B1,0x06B2,0x06B3,0x06B4,0x06B5,0x06B6,0x06B7, /* 06B0 */ + 0x06B8,0x06B9,0x06BA,0x06BB,0x06BC,0x06BD,0x06BE,0x06BF, /* 06B8 */ + 0x06C0,0x06C1,0x06C2,0x06C3,0x06C4,0x06C5,0x06C6,0x06C7, /* 06C0 */ + 0x06C8,0x06C9,0x06CA,0x06CB,0x06CC,0x06CD,0x06CE,0x06CF, /* 06C8 */ + 0x06D0,0x06D1,0x06D2,0x06D3,0x06D4,0x06D5,0x06D6,0x06D7, /* 06D0 */ + 0x06D8,0x06D9,0x06DA,0x06DB,0x06DC,0x06DD,0x06DE,0x06DF, /* 06D8 */ + 0x06E0,0x06E1,0x06E2,0x06E3,0x06E4,0x06E5,0x06E6,0x06E7, /* 06E0 */ + 0x06E8,0x06E9,0x06EA,0x06EB,0x06EC,0x06ED,0x06EE,0x06EF, /* 06E8 */ + 0x06F0,0x06F1,0x06F2,0x06F3,0x06F4,0x06F5,0x06F6,0x06F7, /* 06F0 */ + 0x06F8,0x06F9,0x06FA,0x06FB,0x06FC,0x06FD,0x06FE,0x06FF /* 06F8 */ +}; + +static const uint16 weight_general_ci_page07[256]={ /* This page is dummy */ + 0x0700,0x0701,0x0702,0x0703,0x0704,0x0705,0x0706,0x0707, /* 0700 */ + 0x0708,0x0709,0x070A,0x070B,0x070C,0x070D,0x070E,0x070F, /* 0708 */ + 0x0710,0x0711,0x0712,0x0713,0x0714,0x0715,0x0716,0x0717, /* 0710 */ + 0x0718,0x0719,0x071A,0x071B,0x071C,0x071D,0x071E,0x071F, /* 0718 */ + 0x0720,0x0721,0x0722,0x0723,0x0724,0x0725,0x0726,0x0727, /* 0720 */ + 0x0728,0x0729,0x072A,0x072B,0x072C,0x072D,0x072E,0x072F, /* 0728 */ + 0x0730,0x0731,0x0732,0x0733,0x0734,0x0735,0x0736,0x0737, /* 0730 */ + 0x0738,0x0739,0x073A,0x073B,0x073C,0x073D,0x073E,0x073F, /* 0738 */ + 0x0740,0x0741,0x0742,0x0743,0x0744,0x0745,0x0746,0x0747, /* 0740 */ + 0x0748,0x0749,0x074A,0x074B,0x074C,0x074D,0x074E,0x074F, /* 0748 */ + 0x0750,0x0751,0x0752,0x0753,0x0754,0x0755,0x0756,0x0757, /* 0750 */ + 0x0758,0x0759,0x075A,0x075B,0x075C,0x075D,0x075E,0x075F, /* 0758 */ + 0x0760,0x0761,0x0762,0x0763,0x0764,0x0765,0x0766,0x0767, /* 0760 */ + 0x0768,0x0769,0x076A,0x076B,0x076C,0x076D,0x076E,0x076F, /* 0768 */ + 0x0770,0x0771,0x0772,0x0773,0x0774,0x0775,0x0776,0x0777, /* 0770 */ + 0x0778,0x0779,0x077A,0x077B,0x077C,0x077D,0x077E,0x077F, /* 0778 */ + 0x0780,0x0781,0x0782,0x0783,0x0784,0x0785,0x0786,0x0787, /* 0780 */ + 0x0788,0x0789,0x078A,0x078B,0x078C,0x078D,0x078E,0x078F, /* 0788 */ + 0x0790,0x0791,0x0792,0x0793,0x0794,0x0795,0x0796,0x0797, /* 0790 */ + 0x0798,0x0799,0x079A,0x079B,0x079C,0x079D,0x079E,0x079F, /* 0798 */ + 0x07A0,0x07A1,0x07A2,0x07A3,0x07A4,0x07A5,0x07A6,0x07A7, /* 07A0 */ + 0x07A8,0x07A9,0x07AA,0x07AB,0x07AC,0x07AD,0x07AE,0x07AF, /* 07A8 */ + 0x07B0,0x07B1,0x07B2,0x07B3,0x07B4,0x07B5,0x07B6,0x07B7, /* 07B0 */ + 0x07B8,0x07B9,0x07BA,0x07BB,0x07BC,0x07BD,0x07BE,0x07BF, /* 07B8 */ + 0x07C0,0x07C1,0x07C2,0x07C3,0x07C4,0x07C5,0x07C6,0x07C7, /* 07C0 */ + 0x07C8,0x07C9,0x07CA,0x07CB,0x07CC,0x07CD,0x07CE,0x07CF, /* 07C8 */ + 0x07D0,0x07D1,0x07D2,0x07D3,0x07D4,0x07D5,0x07D6,0x07D7, /* 07D0 */ + 0x07D8,0x07D9,0x07DA,0x07DB,0x07DC,0x07DD,0x07DE,0x07DF, /* 07D8 */ + 0x07E0,0x07E1,0x07E2,0x07E3,0x07E4,0x07E5,0x07E6,0x07E7, /* 07E0 */ + 0x07E8,0x07E9,0x07EA,0x07EB,0x07EC,0x07ED,0x07EE,0x07EF, /* 07E8 */ + 0x07F0,0x07F1,0x07F2,0x07F3,0x07F4,0x07F5,0x07F6,0x07F7, /* 07F0 */ + 0x07F8,0x07F9,0x07FA,0x07FB,0x07FC,0x07FD,0x07FE,0x07FF /* 07F8 */ +}; + +static const uint16 weight_general_ci_page1E[256]={ + 0x0041,0x0041,0x0042,0x0042,0x0042,0x0042,0x0042,0x0042, /* 1E00 */ + 0x0043,0x0043,0x0044,0x0044,0x0044,0x0044,0x0044,0x0044, /* 1E08 */ + 0x0044,0x0044,0x0044,0x0044,0x0045,0x0045,0x0045,0x0045, /* 1E10 */ + 0x0045,0x0045,0x0045,0x0045,0x0045,0x0045,0x0046,0x0046, /* 1E18 */ + 0x0047,0x0047,0x0048,0x0048,0x0048,0x0048,0x0048,0x0048, /* 1E20 */ + 0x0048,0x0048,0x0048,0x0048,0x0049,0x0049,0x0049,0x0049, /* 1E28 */ + 0x004B,0x004B,0x004B,0x004B,0x004B,0x004B,0x004C,0x004C, /* 1E30 */ + 0x004C,0x004C,0x004C,0x004C,0x004C,0x004C,0x004D,0x004D, /* 1E38 */ + 0x004D,0x004D,0x004D,0x004D,0x004E,0x004E,0x004E,0x004E, /* 1E40 */ + 0x004E,0x004E,0x004E,0x004E,0x004F,0x004F,0x004F,0x004F, /* 1E48 */ + 0x004F,0x004F,0x004F,0x004F,0x0050,0x0050,0x0050,0x0050, /* 1E50 */ + 0x0052,0x0052,0x0052,0x0052,0x0052,0x0052,0x0052,0x0052, /* 1E58 */ + 0x0053,0x0053,0x0053,0x0053,0x0053,0x0053,0x0053,0x0053, /* 1E60 */ + 0x0053,0x0053,0x0054,0x0054,0x0054,0x0054,0x0054,0x0054, /* 1E68 */ + 0x0054,0x0054,0x0055,0x0055,0x0055,0x0055,0x0055,0x0055, /* 1E70 */ + 0x0055,0x0055,0x0055,0x0055,0x0056,0x0056,0x0056,0x0056, /* 1E78 */ + 0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057, /* 1E80 */ + 0x0057,0x0057,0x0058,0x0058,0x0058,0x0058,0x0059,0x0059, /* 1E88 */ + 0x005A,0x005A,0x005A,0x005A,0x005A,0x005A,0x0048,0x0054, /* 1E90 */ + 0x0057,0x0059,0x1E9A,0x0053,0x1E9C,0x1E9D,0x1E9E,0x1E9F, /* 1E98 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041, /* 1EA0 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041, /* 1EA8 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041, /* 1EB0 */ + 0x0045,0x0045,0x0045,0x0045,0x0045,0x0045,0x0045,0x0045, /* 1EB8 */ + 0x0045,0x0045,0x0045,0x0045,0x0045,0x0045,0x0045,0x0045, /* 1EC0 */ + 0x0049,0x0049,0x0049,0x0049,0x004F,0x004F,0x004F,0x004F, /* 1EC8 */ + 0x004F,0x004F,0x004F,0x004F,0x004F,0x004F,0x004F,0x004F, /* 1ED0 */ + 0x004F,0x004F,0x004F,0x004F,0x004F,0x004F,0x004F,0x004F, /* 1ED8 */ + 0x004F,0x004F,0x004F,0x004F,0x0055,0x0055,0x0055,0x0055, /* 1EE0 */ + 0x0055,0x0055,0x0055,0x0055,0x0055,0x0055,0x0055,0x0055, /* 1EE8 */ + 0x0055,0x0055,0x0059,0x0059,0x0059,0x0059,0x0059,0x0059, /* 1EF0 */ + 0x0059,0x0059,0x1EFA,0x1EFB,0x1EFC,0x1EFD,0x1EFE,0x1EFF /* 1EF8 */ +}; + +static const uint16 weight_general_ci_page1F[256]={ + 0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391, /* 1F00 */ + 0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391, /* 1F08 */ + 0x0395,0x0395,0x0395,0x0395,0x0395,0x0395,0x1F16,0x1F17, /* 1F10 */ + 0x0395,0x0395,0x0395,0x0395,0x0395,0x0395,0x1F1E,0x1F1F, /* 1F18 */ + 0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397, /* 1F20 */ + 0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397, /* 1F28 */ + 0x0399,0x0399,0x0399,0x0399,0x0399,0x0399,0x0399,0x0399, /* 1F30 */ + 0x0399,0x0399,0x0399,0x0399,0x0399,0x0399,0x0399,0x0399, /* 1F38 */ + 0x039F,0x039F,0x039F,0x039F,0x039F,0x039F,0x1F46,0x1F47, /* 1F40 */ + 0x039F,0x039F,0x039F,0x039F,0x039F,0x039F,0x1F4E,0x1F4F, /* 1F48 */ + 0x03A5,0x03A5,0x03A5,0x03A5,0x03A5,0x03A5,0x03A5,0x03A5, /* 1F50 */ + 0x1F58,0x03A5,0x1F5A,0x03A5,0x1F5C,0x03A5,0x1F5E,0x03A5, /* 1F58 */ + 0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9, /* 1F60 */ + 0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9, /* 1F68 */ + 0x0391,0x1FBB,0x0395,0x1FC9,0x0397,0x1FCB,0x0399,0x1FDB, /* 1F70 */ + 0x039F,0x1FF9,0x03A5,0x1FEB,0x03A9,0x1FFB,0x1F7E,0x1F7F, /* 1F78 */ + 0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391, /* 1F80 */ + 0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391,0x0391, /* 1F88 */ + 0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397, /* 1F90 */ + 0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397,0x0397, /* 1F98 */ + 0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9, /* 1FA0 */ + 0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9,0x03A9, /* 1FA8 */ + 0x0391,0x0391,0x0391,0x0391,0x0391,0x1FB5,0x0391,0x0391, /* 1FB0 */ + 0x0391,0x0391,0x0391,0x1FBB,0x0391,0x1FBD,0x0399,0x1FBF, /* 1FB8 */ + 0x1FC0,0x1FC1,0x0397,0x0397,0x0397,0x1FC5,0x0397,0x0397, /* 1FC0 */ + 0x0395,0x1FC9,0x0397,0x1FCB,0x0397,0x1FCD,0x1FCE,0x1FCF, /* 1FC8 */ + 0x0399,0x0399,0x0399,0x1FD3,0x1FD4,0x1FD5,0x0399,0x0399, /* 1FD0 */ + 0x0399,0x0399,0x0399,0x1FDB,0x1FDC,0x1FDD,0x1FDE,0x1FDF, /* 1FD8 */ + 0x03A5,0x03A5,0x03A5,0x1FE3,0x03A1,0x03A1,0x03A5,0x03A5, /* 1FE0 */ + 0x03A5,0x03A5,0x03A5,0x1FEB,0x03A1,0x1FED,0x1FEE,0x1FEF, /* 1FE8 */ + 0x1FF0,0x1FF1,0x03A9,0x03A9,0x03A9,0x1FF5,0x03A9,0x03A9, /* 1FF0 */ + 0x039F,0x1FF9,0x03A9,0x1FFB,0x03A9,0x1FFD,0x1FFE,0x1FFF /* 1FF8 */ +}; + +static const uint16 weight_general_ci_page21[256]={ + 0x2100,0x2101,0x2102,0x2103,0x2104,0x2105,0x2106,0x2107, /* 2100 */ + 0x2108,0x2109,0x210A,0x210B,0x210C,0x210D,0x210E,0x210F, /* 2108 */ + 0x2110,0x2111,0x2112,0x2113,0x2114,0x2115,0x2116,0x2117, /* 2110 */ + 0x2118,0x2119,0x211A,0x211B,0x211C,0x211D,0x211E,0x211F, /* 2118 */ + 0x2120,0x2121,0x2122,0x2123,0x2124,0x2125,0x2126,0x2127, /* 2120 */ + 0x2128,0x2129,0x212A,0x212B,0x212C,0x212D,0x212E,0x212F, /* 2128 */ + 0x2130,0x2131,0x2132,0x2133,0x2134,0x2135,0x2136,0x2137, /* 2130 */ + 0x2138,0x2139,0x213A,0x213B,0x213C,0x213D,0x213E,0x213F, /* 2138 */ + 0x2140,0x2141,0x2142,0x2143,0x2144,0x2145,0x2146,0x2147, /* 2140 */ + 0x2148,0x2149,0x214A,0x214B,0x214C,0x214D,0x214E,0x214F, /* 2148 */ + 0x2150,0x2151,0x2152,0x2153,0x2154,0x2155,0x2156,0x2157, /* 2150 */ + 0x2158,0x2159,0x215A,0x215B,0x215C,0x215D,0x215E,0x215F, /* 2158 */ + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, /* 2160 */ + 0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, /* 2168 */ + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, /* 2170 */ + 0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, /* 2178 */ + 0x2180,0x2181,0x2182,0x2183,0x2184,0x2185,0x2186,0x2187, /* 2180 */ + 0x2188,0x2189,0x218A,0x218B,0x218C,0x218D,0x218E,0x218F, /* 2188 */ + 0x2190,0x2191,0x2192,0x2193,0x2194,0x2195,0x2196,0x2197, /* 2190 */ + 0x2198,0x2199,0x219A,0x219B,0x219C,0x219D,0x219E,0x219F, /* 2198 */ + 0x21A0,0x21A1,0x21A2,0x21A3,0x21A4,0x21A5,0x21A6,0x21A7, /* 21A0 */ + 0x21A8,0x21A9,0x21AA,0x21AB,0x21AC,0x21AD,0x21AE,0x21AF, /* 21A8 */ + 0x21B0,0x21B1,0x21B2,0x21B3,0x21B4,0x21B5,0x21B6,0x21B7, /* 21B0 */ + 0x21B8,0x21B9,0x21BA,0x21BB,0x21BC,0x21BD,0x21BE,0x21BF, /* 21B8 */ + 0x21C0,0x21C1,0x21C2,0x21C3,0x21C4,0x21C5,0x21C6,0x21C7, /* 21C0 */ + 0x21C8,0x21C9,0x21CA,0x21CB,0x21CC,0x21CD,0x21CE,0x21CF, /* 21C8 */ + 0x21D0,0x21D1,0x21D2,0x21D3,0x21D4,0x21D5,0x21D6,0x21D7, /* 21D0 */ + 0x21D8,0x21D9,0x21DA,0x21DB,0x21DC,0x21DD,0x21DE,0x21DF, /* 21D8 */ + 0x21E0,0x21E1,0x21E2,0x21E3,0x21E4,0x21E5,0x21E6,0x21E7, /* 21E0 */ + 0x21E8,0x21E9,0x21EA,0x21EB,0x21EC,0x21ED,0x21EE,0x21EF, /* 21E8 */ + 0x21F0,0x21F1,0x21F2,0x21F3,0x21F4,0x21F5,0x21F6,0x21F7, /* 21F0 */ + 0x21F8,0x21F9,0x21FA,0x21FB,0x21FC,0x21FD,0x21FE,0x21FF /* 21F8 */ +}; + +static const uint16 weight_general_ci_page24[256]={ + 0x2400,0x2401,0x2402,0x2403,0x2404,0x2405,0x2406,0x2407, /* 2400 */ + 0x2408,0x2409,0x240A,0x240B,0x240C,0x240D,0x240E,0x240F, /* 2408 */ + 0x2410,0x2411,0x2412,0x2413,0x2414,0x2415,0x2416,0x2417, /* 2410 */ + 0x2418,0x2419,0x241A,0x241B,0x241C,0x241D,0x241E,0x241F, /* 2418 */ + 0x2420,0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427, /* 2420 */ + 0x2428,0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F, /* 2428 */ + 0x2430,0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437, /* 2430 */ + 0x2438,0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F, /* 2438 */ + 0x2440,0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447, /* 2440 */ + 0x2448,0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F, /* 2448 */ + 0x2450,0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457, /* 2450 */ + 0x2458,0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F, /* 2458 */ + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, /* 2460 */ + 0x2468,0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F, /* 2468 */ + 0x2470,0x2471,0x2472,0x2473,0x2474,0x2475,0x2476,0x2477, /* 2470 */ + 0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E,0x247F, /* 2478 */ + 0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487, /* 2480 */ + 0x2488,0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F, /* 2488 */ + 0x2490,0x2491,0x2492,0x2493,0x2494,0x2495,0x2496,0x2497, /* 2490 */ + 0x2498,0x2499,0x249A,0x249B,0x249C,0x249D,0x249E,0x249F, /* 2498 */ + 0x24A0,0x24A1,0x24A2,0x24A3,0x24A4,0x24A5,0x24A6,0x24A7, /* 24A0 */ + 0x24A8,0x24A9,0x24AA,0x24AB,0x24AC,0x24AD,0x24AE,0x24AF, /* 24A8 */ + 0x24B0,0x24B1,0x24B2,0x24B3,0x24B4,0x24B5,0x24B6,0x24B7, /* 24B0 */ + 0x24B8,0x24B9,0x24BA,0x24BB,0x24BC,0x24BD,0x24BE,0x24BF, /* 24B8 */ + 0x24C0,0x24C1,0x24C2,0x24C3,0x24C4,0x24C5,0x24C6,0x24C7, /* 24C0 */ + 0x24C8,0x24C9,0x24CA,0x24CB,0x24CC,0x24CD,0x24CE,0x24CF, /* 24C8 */ + 0x24B6,0x24B7,0x24B8,0x24B9,0x24BA,0x24BB,0x24BC,0x24BD, /* 24D0 */ + 0x24BE,0x24BF,0x24C0,0x24C1,0x24C2,0x24C3,0x24C4,0x24C5, /* 24D8 */ + 0x24C6,0x24C7,0x24C8,0x24C9,0x24CA,0x24CB,0x24CC,0x24CD, /* 24E0 */ + 0x24CE,0x24CF,0x24EA,0x24EB,0x24EC,0x24ED,0x24EE,0x24EF, /* 24E8 */ + 0x24F0,0x24F1,0x24F2,0x24F3,0x24F4,0x24F5,0x24F6,0x24F7, /* 24F0 */ + 0x24F8,0x24F9,0x24FA,0x24FB,0x24FC,0x24FD,0x24FE,0x24FF /* 24F8 */ +}; + +static const uint16 weight_general_ci_pageFF[256]={ + 0xFF00,0xFF01,0xFF02,0xFF03,0xFF04,0xFF05,0xFF06,0xFF07, /* FF00 */ + 0xFF08,0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F, /* FF08 */ + 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, /* FF10 */ + 0xFF18,0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F, /* FF18 */ + 0xFF20,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, /* FF20 */ + 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, /* FF28 */ + 0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, /* FF30 */ + 0xFF38,0xFF39,0xFF3A,0xFF3B,0xFF3C,0xFF3D,0xFF3E,0xFF3F, /* FF38 */ + 0xFF40,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, /* FF40 */ + 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, /* FF48 */ + 0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, /* FF50 */ + 0xFF38,0xFF39,0xFF3A,0xFF5B,0xFF5C,0xFF5D,0xFF5E,0xFF5F, /* FF58 */ + 0xFF60,0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67, /* FF60 */ + 0xFF68,0xFF69,0xFF6A,0xFF6B,0xFF6C,0xFF6D,0xFF6E,0xFF6F, /* FF68 */ + 0xFF70,0xFF71,0xFF72,0xFF73,0xFF74,0xFF75,0xFF76,0xFF77, /* FF70 */ + 0xFF78,0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F, /* FF78 */ + 0xFF80,0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87, /* FF80 */ + 0xFF88,0xFF89,0xFF8A,0xFF8B,0xFF8C,0xFF8D,0xFF8E,0xFF8F, /* FF88 */ + 0xFF90,0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97, /* FF90 */ + 0xFF98,0xFF99,0xFF9A,0xFF9B,0xFF9C,0xFF9D,0xFF9E,0xFF9F, /* FF98 */ + 0xFFA0,0xFFA1,0xFFA2,0xFFA3,0xFFA4,0xFFA5,0xFFA6,0xFFA7, /* FFA0 */ + 0xFFA8,0xFFA9,0xFFAA,0xFFAB,0xFFAC,0xFFAD,0xFFAE,0xFFAF, /* FFA8 */ + 0xFFB0,0xFFB1,0xFFB2,0xFFB3,0xFFB4,0xFFB5,0xFFB6,0xFFB7, /* FFB0 */ + 0xFFB8,0xFFB9,0xFFBA,0xFFBB,0xFFBC,0xFFBD,0xFFBE,0xFFBF, /* FFB8 */ + 0xFFC0,0xFFC1,0xFFC2,0xFFC3,0xFFC4,0xFFC5,0xFFC6,0xFFC7, /* FFC0 */ + 0xFFC8,0xFFC9,0xFFCA,0xFFCB,0xFFCC,0xFFCD,0xFFCE,0xFFCF, /* FFC8 */ + 0xFFD0,0xFFD1,0xFFD2,0xFFD3,0xFFD4,0xFFD5,0xFFD6,0xFFD7, /* FFD0 */ + 0xFFD8,0xFFD9,0xFFDA,0xFFDB,0xFFDC,0xFFDD,0xFFDE,0xFFDF, /* FFD8 */ + 0xFFE0,0xFFE1,0xFFE2,0xFFE3,0xFFE4,0xFFE5,0xFFE6,0xFFE7, /* FFE0 */ + 0xFFE8,0xFFE9,0xFFEA,0xFFEB,0xFFEC,0xFFED,0xFFEE,0xFFEF, /* FFE8 */ + 0xFFF0,0xFFF1,0xFFF2,0xFFF3,0xFFF4,0xFFF5,0xFFF6,0xFFF7, /* FFF0 */ + 0xFFF8,0xFFF9,0xFFFA,0xFFFB,0xFFFC,0xFFFD,0xFFFE,0xFFFF /* FFF8 */ +}; + +const uint16 * weight_general_ci_index[256]={ + weight_general_ci_page00, weight_general_ci_page01, + weight_general_ci_page02, weight_general_ci_page03, + weight_general_ci_page04, weight_general_ci_page05, + weight_general_ci_page06, weight_general_ci_page07, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + weight_general_ci_page1E, weight_general_ci_page1F, + NULL, weight_general_ci_page21, + NULL, NULL, + weight_general_ci_page24, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, weight_general_ci_pageFF +}; diff --git a/strings/ctype-unicode300-general_mysql500_ci.h b/strings/ctype-unicode300-general_mysql500_ci.h new file mode 100644 index 0000000000000..3366c3913809e --- /dev/null +++ b/strings/ctype-unicode300-general_mysql500_ci.h @@ -0,0 +1,190 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=weight_general_mysql500_ci \ + --max-char=0xFFFF \ + UnicodeData-3.0.0.txt + +*/ +const uint16 weight_general_mysql500_ci_page00[256]={ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, /* 0000 */ + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, /* 0008 */ + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, /* 0010 */ + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, /* 0018 */ + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, /* 0020 */ + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, /* 0028 */ + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, /* 0030 */ + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, /* 0038 */ + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, /* 0040 */ + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, /* 0048 */ + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, /* 0050 */ + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, /* 0058 */ + 0x0060,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, /* 0060 */ + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, /* 0068 */ + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, /* 0070 */ + 0x0058,0x0059,0x005A,0x007B,0x007C,0x007D,0x007E,0x007F, /* 0078 */ + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, /* 0080 */ + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, /* 0088 */ + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, /* 0090 */ + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, /* 0098 */ + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, /* 00A0 */ + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, /* 00A8 */ + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x039C,0x00B6,0x00B7, /* 00B0 */ + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, /* 00B8 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x00C6,0x0043, /* 00C0 */ + 0x0045,0x0045,0x0045,0x0045,0x0049,0x0049,0x0049,0x0049, /* 00C8 */ + 0x00D0,0x004E,0x004F,0x004F,0x004F,0x004F,0x004F,0x00D7, /* 00D0 */ + 0x00D8,0x0055,0x0055,0x0055,0x0055,0x0059,0x00DE,0x00DF, /* 00D8 */ + 0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x00C6,0x0043, /* 00E0 */ + 0x0045,0x0045,0x0045,0x0045,0x0049,0x0049,0x0049,0x0049, /* 00E8 */ + 0x00D0,0x004E,0x004F,0x004F,0x004F,0x004F,0x004F,0x00F7, /* 00F0 */ + 0x00D8,0x0055,0x0055,0x0055,0x0055,0x0059,0x00DE,0x0059 /* 00F8 */ +}; + +const uint16 * weight_general_mysql500_ci_index[256]={ + weight_general_mysql500_ci_page00, weight_general_ci_page01, + weight_general_ci_page02, weight_general_ci_page03, + weight_general_ci_page04, weight_general_ci_page05, + weight_general_ci_page06, weight_general_ci_page07, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + weight_general_ci_page1E, weight_general_ci_page1F, + NULL, weight_general_ci_page21, + NULL, NULL, + weight_general_ci_page24, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, weight_general_ci_pageFF +}; diff --git a/strings/ctype-unicode520-casefold.h b/strings/ctype-unicode520-casefold.h new file mode 100644 index 0000000000000..bcd0ff355be69 --- /dev/null +++ b/strings/ctype-unicode520-casefold.h @@ -0,0 +1,3192 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=casefold \ + --page-name=u520_casefold_page \ + --index-name=my_u520_casefold_index \ + UnicodeData-5.2.0.txt + +*/ +const MY_CASEFOLD_CHARACTER u520_casefold_page00[256]={ + {0x0000,0x0000},{0x0001,0x0001}, /* 0000 */ + {0x0002,0x0002},{0x0003,0x0003}, /* 0002 */ + {0x0004,0x0004},{0x0005,0x0005}, /* 0004 */ + {0x0006,0x0006},{0x0007,0x0007}, /* 0006 */ + {0x0008,0x0008},{0x0009,0x0009}, /* 0008 */ + {0x000A,0x000A},{0x000B,0x000B}, /* 000A */ + {0x000C,0x000C},{0x000D,0x000D}, /* 000C */ + {0x000E,0x000E},{0x000F,0x000F}, /* 000E */ + {0x0010,0x0010},{0x0011,0x0011}, /* 0010 */ + {0x0012,0x0012},{0x0013,0x0013}, /* 0012 */ + {0x0014,0x0014},{0x0015,0x0015}, /* 0014 */ + {0x0016,0x0016},{0x0017,0x0017}, /* 0016 */ + {0x0018,0x0018},{0x0019,0x0019}, /* 0018 */ + {0x001A,0x001A},{0x001B,0x001B}, /* 001A */ + {0x001C,0x001C},{0x001D,0x001D}, /* 001C */ + {0x001E,0x001E},{0x001F,0x001F}, /* 001E */ + {0x0020,0x0020},{0x0021,0x0021}, /* 0020 */ + {0x0022,0x0022},{0x0023,0x0023}, /* 0022 */ + {0x0024,0x0024},{0x0025,0x0025}, /* 0024 */ + {0x0026,0x0026},{0x0027,0x0027}, /* 0026 */ + {0x0028,0x0028},{0x0029,0x0029}, /* 0028 */ + {0x002A,0x002A},{0x002B,0x002B}, /* 002A */ + {0x002C,0x002C},{0x002D,0x002D}, /* 002C */ + {0x002E,0x002E},{0x002F,0x002F}, /* 002E */ + {0x0030,0x0030},{0x0031,0x0031}, /* 0030 */ + {0x0032,0x0032},{0x0033,0x0033}, /* 0032 */ + {0x0034,0x0034},{0x0035,0x0035}, /* 0034 */ + {0x0036,0x0036},{0x0037,0x0037}, /* 0036 */ + {0x0038,0x0038},{0x0039,0x0039}, /* 0038 */ + {0x003A,0x003A},{0x003B,0x003B}, /* 003A */ + {0x003C,0x003C},{0x003D,0x003D}, /* 003C */ + {0x003E,0x003E},{0x003F,0x003F}, /* 003E */ + {0x0040,0x0040},{0x0041,0x0061}, /* 0040 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0042 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0044 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0046 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0048 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 004A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 004C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 004E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0050 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0052 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0054 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0056 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0058 */ + {0x005A,0x007A},{0x005B,0x005B}, /* 005A */ + {0x005C,0x005C},{0x005D,0x005D}, /* 005C */ + {0x005E,0x005E},{0x005F,0x005F}, /* 005E */ + {0x0060,0x0060},{0x0041,0x0061}, /* 0060 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0062 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0064 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0066 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0068 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 006A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 006C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 006E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0070 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0072 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0074 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0076 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0078 */ + {0x005A,0x007A},{0x007B,0x007B}, /* 007A */ + {0x007C,0x007C},{0x007D,0x007D}, /* 007C */ + {0x007E,0x007E},{0x007F,0x007F}, /* 007E */ + {0x0080,0x0080},{0x0081,0x0081}, /* 0080 */ + {0x0082,0x0082},{0x0083,0x0083}, /* 0082 */ + {0x0084,0x0084},{0x0085,0x0085}, /* 0084 */ + {0x0086,0x0086},{0x0087,0x0087}, /* 0086 */ + {0x0088,0x0088},{0x0089,0x0089}, /* 0088 */ + {0x008A,0x008A},{0x008B,0x008B}, /* 008A */ + {0x008C,0x008C},{0x008D,0x008D}, /* 008C */ + {0x008E,0x008E},{0x008F,0x008F}, /* 008E */ + {0x0090,0x0090},{0x0091,0x0091}, /* 0090 */ + {0x0092,0x0092},{0x0093,0x0093}, /* 0092 */ + {0x0094,0x0094},{0x0095,0x0095}, /* 0094 */ + {0x0096,0x0096},{0x0097,0x0097}, /* 0096 */ + {0x0098,0x0098},{0x0099,0x0099}, /* 0098 */ + {0x009A,0x009A},{0x009B,0x009B}, /* 009A */ + {0x009C,0x009C},{0x009D,0x009D}, /* 009C */ + {0x009E,0x009E},{0x009F,0x009F}, /* 009E */ + {0x00A0,0x00A0},{0x00A1,0x00A1}, /* 00A0 */ + {0x00A2,0x00A2},{0x00A3,0x00A3}, /* 00A2 */ + {0x00A4,0x00A4},{0x00A5,0x00A5}, /* 00A4 */ + {0x00A6,0x00A6},{0x00A7,0x00A7}, /* 00A6 */ + {0x00A8,0x00A8},{0x00A9,0x00A9}, /* 00A8 */ + {0x00AA,0x00AA},{0x00AB,0x00AB}, /* 00AA */ + {0x00AC,0x00AC},{0x00AD,0x00AD}, /* 00AC */ + {0x00AE,0x00AE},{0x00AF,0x00AF}, /* 00AE */ + {0x00B0,0x00B0},{0x00B1,0x00B1}, /* 00B0 */ + {0x00B2,0x00B2},{0x00B3,0x00B3}, /* 00B2 */ + {0x00B4,0x00B4},{0x039C,0x00B5}, /* 00B4 */ + {0x00B6,0x00B6},{0x00B7,0x00B7}, /* 00B6 */ + {0x00B8,0x00B8},{0x00B9,0x00B9}, /* 00B8 */ + {0x00BA,0x00BA},{0x00BB,0x00BB}, /* 00BA */ + {0x00BC,0x00BC},{0x00BD,0x00BD}, /* 00BC */ + {0x00BE,0x00BE},{0x00BF,0x00BF}, /* 00BE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00C0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00C2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00C4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00C6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00C8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00CA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00CC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00CE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00D0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00D2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00D4 */ + {0x00D6,0x00F6},{0x00D7,0x00D7}, /* 00D6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00D8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00DA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00DC */ + {0x00DE,0x00FE},{0x00DF,0x00DF}, /* 00DE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00E0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00E2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00E4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00E6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00E8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00EA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00EC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00EE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00F0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00F2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00F4 */ + {0x00D6,0x00F6},{0x00F7,0x00F7}, /* 00F6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00F8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00FA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00FC */ + {0x00DE,0x00FE},{0x0178,0x00FF} /* 00FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page01[256]={ + {0x0100,0x0101},{0x0100,0x0101}, /* 0100 */ + {0x0102,0x0103},{0x0102,0x0103}, /* 0102 */ + {0x0104,0x0105},{0x0104,0x0105}, /* 0104 */ + {0x0106,0x0107},{0x0106,0x0107}, /* 0106 */ + {0x0108,0x0109},{0x0108,0x0109}, /* 0108 */ + {0x010A,0x010B},{0x010A,0x010B}, /* 010A */ + {0x010C,0x010D},{0x010C,0x010D}, /* 010C */ + {0x010E,0x010F},{0x010E,0x010F}, /* 010E */ + {0x0110,0x0111},{0x0110,0x0111}, /* 0110 */ + {0x0112,0x0113},{0x0112,0x0113}, /* 0112 */ + {0x0114,0x0115},{0x0114,0x0115}, /* 0114 */ + {0x0116,0x0117},{0x0116,0x0117}, /* 0116 */ + {0x0118,0x0119},{0x0118,0x0119}, /* 0118 */ + {0x011A,0x011B},{0x011A,0x011B}, /* 011A */ + {0x011C,0x011D},{0x011C,0x011D}, /* 011C */ + {0x011E,0x011F},{0x011E,0x011F}, /* 011E */ + {0x0120,0x0121},{0x0120,0x0121}, /* 0120 */ + {0x0122,0x0123},{0x0122,0x0123}, /* 0122 */ + {0x0124,0x0125},{0x0124,0x0125}, /* 0124 */ + {0x0126,0x0127},{0x0126,0x0127}, /* 0126 */ + {0x0128,0x0129},{0x0128,0x0129}, /* 0128 */ + {0x012A,0x012B},{0x012A,0x012B}, /* 012A */ + {0x012C,0x012D},{0x012C,0x012D}, /* 012C */ + {0x012E,0x012F},{0x012E,0x012F}, /* 012E */ + {0x0130,0x0069},{0x0049,0x0131}, /* 0130 */ + {0x0132,0x0133},{0x0132,0x0133}, /* 0132 */ + {0x0134,0x0135},{0x0134,0x0135}, /* 0134 */ + {0x0136,0x0137},{0x0136,0x0137}, /* 0136 */ + {0x0138,0x0138},{0x0139,0x013A}, /* 0138 */ + {0x0139,0x013A},{0x013B,0x013C}, /* 013A */ + {0x013B,0x013C},{0x013D,0x013E}, /* 013C */ + {0x013D,0x013E},{0x013F,0x0140}, /* 013E */ + {0x013F,0x0140},{0x0141,0x0142}, /* 0140 */ + {0x0141,0x0142},{0x0143,0x0144}, /* 0142 */ + {0x0143,0x0144},{0x0145,0x0146}, /* 0144 */ + {0x0145,0x0146},{0x0147,0x0148}, /* 0146 */ + {0x0147,0x0148},{0x0149,0x0149}, /* 0148 */ + {0x014A,0x014B},{0x014A,0x014B}, /* 014A */ + {0x014C,0x014D},{0x014C,0x014D}, /* 014C */ + {0x014E,0x014F},{0x014E,0x014F}, /* 014E */ + {0x0150,0x0151},{0x0150,0x0151}, /* 0150 */ + {0x0152,0x0153},{0x0152,0x0153}, /* 0152 */ + {0x0154,0x0155},{0x0154,0x0155}, /* 0154 */ + {0x0156,0x0157},{0x0156,0x0157}, /* 0156 */ + {0x0158,0x0159},{0x0158,0x0159}, /* 0158 */ + {0x015A,0x015B},{0x015A,0x015B}, /* 015A */ + {0x015C,0x015D},{0x015C,0x015D}, /* 015C */ + {0x015E,0x015F},{0x015E,0x015F}, /* 015E */ + {0x0160,0x0161},{0x0160,0x0161}, /* 0160 */ + {0x0162,0x0163},{0x0162,0x0163}, /* 0162 */ + {0x0164,0x0165},{0x0164,0x0165}, /* 0164 */ + {0x0166,0x0167},{0x0166,0x0167}, /* 0166 */ + {0x0168,0x0169},{0x0168,0x0169}, /* 0168 */ + {0x016A,0x016B},{0x016A,0x016B}, /* 016A */ + {0x016C,0x016D},{0x016C,0x016D}, /* 016C */ + {0x016E,0x016F},{0x016E,0x016F}, /* 016E */ + {0x0170,0x0171},{0x0170,0x0171}, /* 0170 */ + {0x0172,0x0173},{0x0172,0x0173}, /* 0172 */ + {0x0174,0x0175},{0x0174,0x0175}, /* 0174 */ + {0x0176,0x0177},{0x0176,0x0177}, /* 0176 */ + {0x0178,0x00FF},{0x0179,0x017A}, /* 0178 */ + {0x0179,0x017A},{0x017B,0x017C}, /* 017A */ + {0x017B,0x017C},{0x017D,0x017E}, /* 017C */ + {0x017D,0x017E},{0x0053,0x017F}, /* 017E */ + {0x0243,0x0180},{0x0181,0x0253}, /* 0180 */ + {0x0182,0x0183},{0x0182,0x0183}, /* 0182 */ + {0x0184,0x0185},{0x0184,0x0185}, /* 0184 */ + {0x0186,0x0254},{0x0187,0x0188}, /* 0186 */ + {0x0187,0x0188},{0x0189,0x0256}, /* 0188 */ + {0x018A,0x0257},{0x018B,0x018C}, /* 018A */ + {0x018B,0x018C},{0x018D,0x018D}, /* 018C */ + {0x018E,0x01DD},{0x018F,0x0259}, /* 018E */ + {0x0190,0x025B},{0x0191,0x0192}, /* 0190 */ + {0x0191,0x0192},{0x0193,0x0260}, /* 0192 */ + {0x0194,0x0263},{0x01F6,0x0195}, /* 0194 */ + {0x0196,0x0269},{0x0197,0x0268}, /* 0196 */ + {0x0198,0x0199},{0x0198,0x0199}, /* 0198 */ + {0x023D,0x019A},{0x019B,0x019B}, /* 019A */ + {0x019C,0x026F},{0x019D,0x0272}, /* 019C */ + {0x0220,0x019E},{0x019F,0x0275}, /* 019E */ + {0x01A0,0x01A1},{0x01A0,0x01A1}, /* 01A0 */ + {0x01A2,0x01A3},{0x01A2,0x01A3}, /* 01A2 */ + {0x01A4,0x01A5},{0x01A4,0x01A5}, /* 01A4 */ + {0x01A6,0x0280},{0x01A7,0x01A8}, /* 01A6 */ + {0x01A7,0x01A8},{0x01A9,0x0283}, /* 01A8 */ + {0x01AA,0x01AA},{0x01AB,0x01AB}, /* 01AA */ + {0x01AC,0x01AD},{0x01AC,0x01AD}, /* 01AC */ + {0x01AE,0x0288},{0x01AF,0x01B0}, /* 01AE */ + {0x01AF,0x01B0},{0x01B1,0x028A}, /* 01B0 */ + {0x01B2,0x028B},{0x01B3,0x01B4}, /* 01B2 */ + {0x01B3,0x01B4},{0x01B5,0x01B6}, /* 01B4 */ + {0x01B5,0x01B6},{0x01B7,0x0292}, /* 01B6 */ + {0x01B8,0x01B9},{0x01B8,0x01B9}, /* 01B8 */ + {0x01BA,0x01BA},{0x01BB,0x01BB}, /* 01BA */ + {0x01BC,0x01BD},{0x01BC,0x01BD}, /* 01BC */ + {0x01BE,0x01BE},{0x01F7,0x01BF}, /* 01BE */ + {0x01C0,0x01C0},{0x01C1,0x01C1}, /* 01C0 */ + {0x01C2,0x01C2},{0x01C3,0x01C3}, /* 01C2 */ + {0x01C4,0x01C6},{0x01C4,0x01C6}, /* 01C4 */ + {0x01C4,0x01C6},{0x01C7,0x01C9}, /* 01C6 */ + {0x01C7,0x01C9},{0x01C7,0x01C9}, /* 01C8 */ + {0x01CA,0x01CC},{0x01CA,0x01CC}, /* 01CA */ + {0x01CA,0x01CC},{0x01CD,0x01CE}, /* 01CC */ + {0x01CD,0x01CE},{0x01CF,0x01D0}, /* 01CE */ + {0x01CF,0x01D0},{0x01D1,0x01D2}, /* 01D0 */ + {0x01D1,0x01D2},{0x01D3,0x01D4}, /* 01D2 */ + {0x01D3,0x01D4},{0x01D5,0x01D6}, /* 01D4 */ + {0x01D5,0x01D6},{0x01D7,0x01D8}, /* 01D6 */ + {0x01D7,0x01D8},{0x01D9,0x01DA}, /* 01D8 */ + {0x01D9,0x01DA},{0x01DB,0x01DC}, /* 01DA */ + {0x01DB,0x01DC},{0x018E,0x01DD}, /* 01DC */ + {0x01DE,0x01DF},{0x01DE,0x01DF}, /* 01DE */ + {0x01E0,0x01E1},{0x01E0,0x01E1}, /* 01E0 */ + {0x01E2,0x01E3},{0x01E2,0x01E3}, /* 01E2 */ + {0x01E4,0x01E5},{0x01E4,0x01E5}, /* 01E4 */ + {0x01E6,0x01E7},{0x01E6,0x01E7}, /* 01E6 */ + {0x01E8,0x01E9},{0x01E8,0x01E9}, /* 01E8 */ + {0x01EA,0x01EB},{0x01EA,0x01EB}, /* 01EA */ + {0x01EC,0x01ED},{0x01EC,0x01ED}, /* 01EC */ + {0x01EE,0x01EF},{0x01EE,0x01EF}, /* 01EE */ + {0x01F0,0x01F0},{0x01F1,0x01F3}, /* 01F0 */ + {0x01F1,0x01F3},{0x01F1,0x01F3}, /* 01F2 */ + {0x01F4,0x01F5},{0x01F4,0x01F5}, /* 01F4 */ + {0x01F6,0x0195},{0x01F7,0x01BF}, /* 01F6 */ + {0x01F8,0x01F9},{0x01F8,0x01F9}, /* 01F8 */ + {0x01FA,0x01FB},{0x01FA,0x01FB}, /* 01FA */ + {0x01FC,0x01FD},{0x01FC,0x01FD}, /* 01FC */ + {0x01FE,0x01FF},{0x01FE,0x01FF} /* 01FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page02[256]={ + {0x0200,0x0201},{0x0200,0x0201}, /* 0200 */ + {0x0202,0x0203},{0x0202,0x0203}, /* 0202 */ + {0x0204,0x0205},{0x0204,0x0205}, /* 0204 */ + {0x0206,0x0207},{0x0206,0x0207}, /* 0206 */ + {0x0208,0x0209},{0x0208,0x0209}, /* 0208 */ + {0x020A,0x020B},{0x020A,0x020B}, /* 020A */ + {0x020C,0x020D},{0x020C,0x020D}, /* 020C */ + {0x020E,0x020F},{0x020E,0x020F}, /* 020E */ + {0x0210,0x0211},{0x0210,0x0211}, /* 0210 */ + {0x0212,0x0213},{0x0212,0x0213}, /* 0212 */ + {0x0214,0x0215},{0x0214,0x0215}, /* 0214 */ + {0x0216,0x0217},{0x0216,0x0217}, /* 0216 */ + {0x0218,0x0219},{0x0218,0x0219}, /* 0218 */ + {0x021A,0x021B},{0x021A,0x021B}, /* 021A */ + {0x021C,0x021D},{0x021C,0x021D}, /* 021C */ + {0x021E,0x021F},{0x021E,0x021F}, /* 021E */ + {0x0220,0x019E},{0x0221,0x0221}, /* 0220 */ + {0x0222,0x0223},{0x0222,0x0223}, /* 0222 */ + {0x0224,0x0225},{0x0224,0x0225}, /* 0224 */ + {0x0226,0x0227},{0x0226,0x0227}, /* 0226 */ + {0x0228,0x0229},{0x0228,0x0229}, /* 0228 */ + {0x022A,0x022B},{0x022A,0x022B}, /* 022A */ + {0x022C,0x022D},{0x022C,0x022D}, /* 022C */ + {0x022E,0x022F},{0x022E,0x022F}, /* 022E */ + {0x0230,0x0231},{0x0230,0x0231}, /* 0230 */ + {0x0232,0x0233},{0x0232,0x0233}, /* 0232 */ + {0x0234,0x0234},{0x0235,0x0235}, /* 0234 */ + {0x0236,0x0236},{0x0237,0x0237}, /* 0236 */ + {0x0238,0x0238},{0x0239,0x0239}, /* 0238 */ + {0x023A,0x2C65},{0x023B,0x023C}, /* 023A */ + {0x023B,0x023C},{0x023D,0x019A}, /* 023C */ + {0x023E,0x2C66},{0x2C7E,0x023F}, /* 023E */ + {0x2C7F,0x0240},{0x0241,0x0242}, /* 0240 */ + {0x0241,0x0242},{0x0243,0x0180}, /* 0242 */ + {0x0244,0x0289},{0x0245,0x028C}, /* 0244 */ + {0x0246,0x0247},{0x0246,0x0247}, /* 0246 */ + {0x0248,0x0249},{0x0248,0x0249}, /* 0248 */ + {0x024A,0x024B},{0x024A,0x024B}, /* 024A */ + {0x024C,0x024D},{0x024C,0x024D}, /* 024C */ + {0x024E,0x024F},{0x024E,0x024F}, /* 024E */ + {0x2C6F,0x0250},{0x2C6D,0x0251}, /* 0250 */ + {0x2C70,0x0252},{0x0181,0x0253}, /* 0252 */ + {0x0186,0x0254},{0x0255,0x0255}, /* 0254 */ + {0x0189,0x0256},{0x018A,0x0257}, /* 0256 */ + {0x0258,0x0258},{0x018F,0x0259}, /* 0258 */ + {0x025A,0x025A},{0x0190,0x025B}, /* 025A */ + {0x025C,0x025C},{0x025D,0x025D}, /* 025C */ + {0x025E,0x025E},{0x025F,0x025F}, /* 025E */ + {0x0193,0x0260},{0x0261,0x0261}, /* 0260 */ + {0x0262,0x0262},{0x0194,0x0263}, /* 0262 */ + {0x0264,0x0264},{0x0265,0x0265}, /* 0264 */ + {0x0266,0x0266},{0x0267,0x0267}, /* 0266 */ + {0x0197,0x0268},{0x0196,0x0269}, /* 0268 */ + {0x026A,0x026A},{0x2C62,0x026B}, /* 026A */ + {0x026C,0x026C},{0x026D,0x026D}, /* 026C */ + {0x026E,0x026E},{0x019C,0x026F}, /* 026E */ + {0x0270,0x0270},{0x2C6E,0x0271}, /* 0270 */ + {0x019D,0x0272},{0x0273,0x0273}, /* 0272 */ + {0x0274,0x0274},{0x019F,0x0275}, /* 0274 */ + {0x0276,0x0276},{0x0277,0x0277}, /* 0276 */ + {0x0278,0x0278},{0x0279,0x0279}, /* 0278 */ + {0x027A,0x027A},{0x027B,0x027B}, /* 027A */ + {0x027C,0x027C},{0x2C64,0x027D}, /* 027C */ + {0x027E,0x027E},{0x027F,0x027F}, /* 027E */ + {0x01A6,0x0280},{0x0281,0x0281}, /* 0280 */ + {0x0282,0x0282},{0x01A9,0x0283}, /* 0282 */ + {0x0284,0x0284},{0x0285,0x0285}, /* 0284 */ + {0x0286,0x0286},{0x0287,0x0287}, /* 0286 */ + {0x01AE,0x0288},{0x0244,0x0289}, /* 0288 */ + {0x01B1,0x028A},{0x01B2,0x028B}, /* 028A */ + {0x0245,0x028C},{0x028D,0x028D}, /* 028C */ + {0x028E,0x028E},{0x028F,0x028F}, /* 028E */ + {0x0290,0x0290},{0x0291,0x0291}, /* 0290 */ + {0x01B7,0x0292},{0x0293,0x0293}, /* 0292 */ + {0x0294,0x0294},{0x0295,0x0295}, /* 0294 */ + {0x0296,0x0296},{0x0297,0x0297}, /* 0296 */ + {0x0298,0x0298},{0x0299,0x0299}, /* 0298 */ + {0x029A,0x029A},{0x029B,0x029B}, /* 029A */ + {0x029C,0x029C},{0x029D,0x029D}, /* 029C */ + {0x029E,0x029E},{0x029F,0x029F}, /* 029E */ + {0x02A0,0x02A0},{0x02A1,0x02A1}, /* 02A0 */ + {0x02A2,0x02A2},{0x02A3,0x02A3}, /* 02A2 */ + {0x02A4,0x02A4},{0x02A5,0x02A5}, /* 02A4 */ + {0x02A6,0x02A6},{0x02A7,0x02A7}, /* 02A6 */ + {0x02A8,0x02A8},{0x02A9,0x02A9}, /* 02A8 */ + {0x02AA,0x02AA},{0x02AB,0x02AB}, /* 02AA */ + {0x02AC,0x02AC},{0x02AD,0x02AD}, /* 02AC */ + {0x02AE,0x02AE},{0x02AF,0x02AF}, /* 02AE */ + {0x02B0,0x02B0},{0x02B1,0x02B1}, /* 02B0 */ + {0x02B2,0x02B2},{0x02B3,0x02B3}, /* 02B2 */ + {0x02B4,0x02B4},{0x02B5,0x02B5}, /* 02B4 */ + {0x02B6,0x02B6},{0x02B7,0x02B7}, /* 02B6 */ + {0x02B8,0x02B8},{0x02B9,0x02B9}, /* 02B8 */ + {0x02BA,0x02BA},{0x02BB,0x02BB}, /* 02BA */ + {0x02BC,0x02BC},{0x02BD,0x02BD}, /* 02BC */ + {0x02BE,0x02BE},{0x02BF,0x02BF}, /* 02BE */ + {0x02C0,0x02C0},{0x02C1,0x02C1}, /* 02C0 */ + {0x02C2,0x02C2},{0x02C3,0x02C3}, /* 02C2 */ + {0x02C4,0x02C4},{0x02C5,0x02C5}, /* 02C4 */ + {0x02C6,0x02C6},{0x02C7,0x02C7}, /* 02C6 */ + {0x02C8,0x02C8},{0x02C9,0x02C9}, /* 02C8 */ + {0x02CA,0x02CA},{0x02CB,0x02CB}, /* 02CA */ + {0x02CC,0x02CC},{0x02CD,0x02CD}, /* 02CC */ + {0x02CE,0x02CE},{0x02CF,0x02CF}, /* 02CE */ + {0x02D0,0x02D0},{0x02D1,0x02D1}, /* 02D0 */ + {0x02D2,0x02D2},{0x02D3,0x02D3}, /* 02D2 */ + {0x02D4,0x02D4},{0x02D5,0x02D5}, /* 02D4 */ + {0x02D6,0x02D6},{0x02D7,0x02D7}, /* 02D6 */ + {0x02D8,0x02D8},{0x02D9,0x02D9}, /* 02D8 */ + {0x02DA,0x02DA},{0x02DB,0x02DB}, /* 02DA */ + {0x02DC,0x02DC},{0x02DD,0x02DD}, /* 02DC */ + {0x02DE,0x02DE},{0x02DF,0x02DF}, /* 02DE */ + {0x02E0,0x02E0},{0x02E1,0x02E1}, /* 02E0 */ + {0x02E2,0x02E2},{0x02E3,0x02E3}, /* 02E2 */ + {0x02E4,0x02E4},{0x02E5,0x02E5}, /* 02E4 */ + {0x02E6,0x02E6},{0x02E7,0x02E7}, /* 02E6 */ + {0x02E8,0x02E8},{0x02E9,0x02E9}, /* 02E8 */ + {0x02EA,0x02EA},{0x02EB,0x02EB}, /* 02EA */ + {0x02EC,0x02EC},{0x02ED,0x02ED}, /* 02EC */ + {0x02EE,0x02EE},{0x02EF,0x02EF}, /* 02EE */ + {0x02F0,0x02F0},{0x02F1,0x02F1}, /* 02F0 */ + {0x02F2,0x02F2},{0x02F3,0x02F3}, /* 02F2 */ + {0x02F4,0x02F4},{0x02F5,0x02F5}, /* 02F4 */ + {0x02F6,0x02F6},{0x02F7,0x02F7}, /* 02F6 */ + {0x02F8,0x02F8},{0x02F9,0x02F9}, /* 02F8 */ + {0x02FA,0x02FA},{0x02FB,0x02FB}, /* 02FA */ + {0x02FC,0x02FC},{0x02FD,0x02FD}, /* 02FC */ + {0x02FE,0x02FE},{0x02FF,0x02FF} /* 02FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page03[256]={ + {0x0300,0x0300},{0x0301,0x0301}, /* 0300 */ + {0x0302,0x0302},{0x0303,0x0303}, /* 0302 */ + {0x0304,0x0304},{0x0305,0x0305}, /* 0304 */ + {0x0306,0x0306},{0x0307,0x0307}, /* 0306 */ + {0x0308,0x0308},{0x0309,0x0309}, /* 0308 */ + {0x030A,0x030A},{0x030B,0x030B}, /* 030A */ + {0x030C,0x030C},{0x030D,0x030D}, /* 030C */ + {0x030E,0x030E},{0x030F,0x030F}, /* 030E */ + {0x0310,0x0310},{0x0311,0x0311}, /* 0310 */ + {0x0312,0x0312},{0x0313,0x0313}, /* 0312 */ + {0x0314,0x0314},{0x0315,0x0315}, /* 0314 */ + {0x0316,0x0316},{0x0317,0x0317}, /* 0316 */ + {0x0318,0x0318},{0x0319,0x0319}, /* 0318 */ + {0x031A,0x031A},{0x031B,0x031B}, /* 031A */ + {0x031C,0x031C},{0x031D,0x031D}, /* 031C */ + {0x031E,0x031E},{0x031F,0x031F}, /* 031E */ + {0x0320,0x0320},{0x0321,0x0321}, /* 0320 */ + {0x0322,0x0322},{0x0323,0x0323}, /* 0322 */ + {0x0324,0x0324},{0x0325,0x0325}, /* 0324 */ + {0x0326,0x0326},{0x0327,0x0327}, /* 0326 */ + {0x0328,0x0328},{0x0329,0x0329}, /* 0328 */ + {0x032A,0x032A},{0x032B,0x032B}, /* 032A */ + {0x032C,0x032C},{0x032D,0x032D}, /* 032C */ + {0x032E,0x032E},{0x032F,0x032F}, /* 032E */ + {0x0330,0x0330},{0x0331,0x0331}, /* 0330 */ + {0x0332,0x0332},{0x0333,0x0333}, /* 0332 */ + {0x0334,0x0334},{0x0335,0x0335}, /* 0334 */ + {0x0336,0x0336},{0x0337,0x0337}, /* 0336 */ + {0x0338,0x0338},{0x0339,0x0339}, /* 0338 */ + {0x033A,0x033A},{0x033B,0x033B}, /* 033A */ + {0x033C,0x033C},{0x033D,0x033D}, /* 033C */ + {0x033E,0x033E},{0x033F,0x033F}, /* 033E */ + {0x0340,0x0340},{0x0341,0x0341}, /* 0340 */ + {0x0342,0x0342},{0x0343,0x0343}, /* 0342 */ + {0x0344,0x0344},{0x0399,0x0345}, /* 0344 */ + {0x0346,0x0346},{0x0347,0x0347}, /* 0346 */ + {0x0348,0x0348},{0x0349,0x0349}, /* 0348 */ + {0x034A,0x034A},{0x034B,0x034B}, /* 034A */ + {0x034C,0x034C},{0x034D,0x034D}, /* 034C */ + {0x034E,0x034E},{0x034F,0x034F}, /* 034E */ + {0x0350,0x0350},{0x0351,0x0351}, /* 0350 */ + {0x0352,0x0352},{0x0353,0x0353}, /* 0352 */ + {0x0354,0x0354},{0x0355,0x0355}, /* 0354 */ + {0x0356,0x0356},{0x0357,0x0357}, /* 0356 */ + {0x0358,0x0358},{0x0359,0x0359}, /* 0358 */ + {0x035A,0x035A},{0x035B,0x035B}, /* 035A */ + {0x035C,0x035C},{0x035D,0x035D}, /* 035C */ + {0x035E,0x035E},{0x035F,0x035F}, /* 035E */ + {0x0360,0x0360},{0x0361,0x0361}, /* 0360 */ + {0x0362,0x0362},{0x0363,0x0363}, /* 0362 */ + {0x0364,0x0364},{0x0365,0x0365}, /* 0364 */ + {0x0366,0x0366},{0x0367,0x0367}, /* 0366 */ + {0x0368,0x0368},{0x0369,0x0369}, /* 0368 */ + {0x036A,0x036A},{0x036B,0x036B}, /* 036A */ + {0x036C,0x036C},{0x036D,0x036D}, /* 036C */ + {0x036E,0x036E},{0x036F,0x036F}, /* 036E */ + {0x0370,0x0371},{0x0370,0x0371}, /* 0370 */ + {0x0372,0x0373},{0x0372,0x0373}, /* 0372 */ + {0x0374,0x0374},{0x0375,0x0375}, /* 0374 */ + {0x0376,0x0377},{0x0376,0x0377}, /* 0376 */ + {0x0378,0x0378},{0x0379,0x0379}, /* 0378 */ + {0x037A,0x037A},{0x03FD,0x037B}, /* 037A */ + {0x03FE,0x037C},{0x03FF,0x037D}, /* 037C */ + {0x037E,0x037E},{0x037F,0x037F}, /* 037E */ + {0x0380,0x0380},{0x0381,0x0381}, /* 0380 */ + {0x0382,0x0382},{0x0383,0x0383}, /* 0382 */ + {0x0384,0x0384},{0x0385,0x0385}, /* 0384 */ + {0x0386,0x03AC},{0x0387,0x0387}, /* 0386 */ + {0x0388,0x03AD},{0x0389,0x03AE}, /* 0388 */ + {0x038A,0x03AF},{0x038B,0x038B}, /* 038A */ + {0x038C,0x03CC},{0x038D,0x038D}, /* 038C */ + {0x038E,0x03CD},{0x038F,0x03CE}, /* 038E */ + {0x0390,0x0390},{0x0391,0x03B1}, /* 0390 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 0392 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 0394 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 0396 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 0398 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 039A */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 039C */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 039E */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03A0 */ + {0x03A2,0x03A2},{0x03A3,0x03C3}, /* 03A2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03A4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03A6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03A8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03AA */ + {0x0386,0x03AC},{0x0388,0x03AD}, /* 03AC */ + {0x0389,0x03AE},{0x038A,0x03AF}, /* 03AE */ + {0x03B0,0x03B0},{0x0391,0x03B1}, /* 03B0 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 03B2 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 03B4 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 03B6 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 03B8 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 03BA */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 03BC */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 03BE */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03C0 */ + {0x03A3,0x03C2},{0x03A3,0x03C3}, /* 03C2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03C4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03C6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03C8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03CA */ + {0x038C,0x03CC},{0x038E,0x03CD}, /* 03CC */ + {0x038F,0x03CE},{0x03CF,0x03D7}, /* 03CE */ + {0x0392,0x03D0},{0x0398,0x03D1}, /* 03D0 */ + {0x03D2,0x03D2},{0x03D3,0x03D3}, /* 03D2 */ + {0x03D4,0x03D4},{0x03A6,0x03D5}, /* 03D4 */ + {0x03A0,0x03D6},{0x03CF,0x03D7}, /* 03D6 */ + {0x03D8,0x03D9},{0x03D8,0x03D9}, /* 03D8 */ + {0x03DA,0x03DB},{0x03DA,0x03DB}, /* 03DA */ + {0x03DC,0x03DD},{0x03DC,0x03DD}, /* 03DC */ + {0x03DE,0x03DF},{0x03DE,0x03DF}, /* 03DE */ + {0x03E0,0x03E1},{0x03E0,0x03E1}, /* 03E0 */ + {0x03E2,0x03E3},{0x03E2,0x03E3}, /* 03E2 */ + {0x03E4,0x03E5},{0x03E4,0x03E5}, /* 03E4 */ + {0x03E6,0x03E7},{0x03E6,0x03E7}, /* 03E6 */ + {0x03E8,0x03E9},{0x03E8,0x03E9}, /* 03E8 */ + {0x03EA,0x03EB},{0x03EA,0x03EB}, /* 03EA */ + {0x03EC,0x03ED},{0x03EC,0x03ED}, /* 03EC */ + {0x03EE,0x03EF},{0x03EE,0x03EF}, /* 03EE */ + {0x039A,0x03F0},{0x03A1,0x03F1}, /* 03F0 */ + {0x03F9,0x03F2},{0x03F3,0x03F3}, /* 03F2 */ + {0x03F4,0x03B8},{0x0395,0x03F5}, /* 03F4 */ + {0x03F6,0x03F6},{0x03F7,0x03F8}, /* 03F6 */ + {0x03F7,0x03F8},{0x03F9,0x03F2}, /* 03F8 */ + {0x03FA,0x03FB},{0x03FA,0x03FB}, /* 03FA */ + {0x03FC,0x03FC},{0x03FD,0x037B}, /* 03FC */ + {0x03FE,0x037C},{0x03FF,0x037D} /* 03FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page04[256]={ + {0x0400,0x0450},{0x0401,0x0451}, /* 0400 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0402 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0404 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0406 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0408 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 040A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 040C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 040E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0410 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0412 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0414 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0416 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0418 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 041A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 041C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 041E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0420 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0422 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0424 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0426 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0428 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 042A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 042C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 042E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0430 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0432 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0434 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0436 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0438 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 043A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 043C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 043E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0440 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0442 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0444 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0446 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0448 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 044A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 044C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 044E */ + {0x0400,0x0450},{0x0401,0x0451}, /* 0450 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0452 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0454 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0456 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0458 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 045A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 045C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 045E */ + {0x0460,0x0461},{0x0460,0x0461}, /* 0460 */ + {0x0462,0x0463},{0x0462,0x0463}, /* 0462 */ + {0x0464,0x0465},{0x0464,0x0465}, /* 0464 */ + {0x0466,0x0467},{0x0466,0x0467}, /* 0466 */ + {0x0468,0x0469},{0x0468,0x0469}, /* 0468 */ + {0x046A,0x046B},{0x046A,0x046B}, /* 046A */ + {0x046C,0x046D},{0x046C,0x046D}, /* 046C */ + {0x046E,0x046F},{0x046E,0x046F}, /* 046E */ + {0x0470,0x0471},{0x0470,0x0471}, /* 0470 */ + {0x0472,0x0473},{0x0472,0x0473}, /* 0472 */ + {0x0474,0x0475},{0x0474,0x0475}, /* 0474 */ + {0x0476,0x0477},{0x0476,0x0477}, /* 0476 */ + {0x0478,0x0479},{0x0478,0x0479}, /* 0478 */ + {0x047A,0x047B},{0x047A,0x047B}, /* 047A */ + {0x047C,0x047D},{0x047C,0x047D}, /* 047C */ + {0x047E,0x047F},{0x047E,0x047F}, /* 047E */ + {0x0480,0x0481},{0x0480,0x0481}, /* 0480 */ + {0x0482,0x0482},{0x0483,0x0483}, /* 0482 */ + {0x0484,0x0484},{0x0485,0x0485}, /* 0484 */ + {0x0486,0x0486},{0x0487,0x0487}, /* 0486 */ + {0x0488,0x0488},{0x0489,0x0489}, /* 0488 */ + {0x048A,0x048B},{0x048A,0x048B}, /* 048A */ + {0x048C,0x048D},{0x048C,0x048D}, /* 048C */ + {0x048E,0x048F},{0x048E,0x048F}, /* 048E */ + {0x0490,0x0491},{0x0490,0x0491}, /* 0490 */ + {0x0492,0x0493},{0x0492,0x0493}, /* 0492 */ + {0x0494,0x0495},{0x0494,0x0495}, /* 0494 */ + {0x0496,0x0497},{0x0496,0x0497}, /* 0496 */ + {0x0498,0x0499},{0x0498,0x0499}, /* 0498 */ + {0x049A,0x049B},{0x049A,0x049B}, /* 049A */ + {0x049C,0x049D},{0x049C,0x049D}, /* 049C */ + {0x049E,0x049F},{0x049E,0x049F}, /* 049E */ + {0x04A0,0x04A1},{0x04A0,0x04A1}, /* 04A0 */ + {0x04A2,0x04A3},{0x04A2,0x04A3}, /* 04A2 */ + {0x04A4,0x04A5},{0x04A4,0x04A5}, /* 04A4 */ + {0x04A6,0x04A7},{0x04A6,0x04A7}, /* 04A6 */ + {0x04A8,0x04A9},{0x04A8,0x04A9}, /* 04A8 */ + {0x04AA,0x04AB},{0x04AA,0x04AB}, /* 04AA */ + {0x04AC,0x04AD},{0x04AC,0x04AD}, /* 04AC */ + {0x04AE,0x04AF},{0x04AE,0x04AF}, /* 04AE */ + {0x04B0,0x04B1},{0x04B0,0x04B1}, /* 04B0 */ + {0x04B2,0x04B3},{0x04B2,0x04B3}, /* 04B2 */ + {0x04B4,0x04B5},{0x04B4,0x04B5}, /* 04B4 */ + {0x04B6,0x04B7},{0x04B6,0x04B7}, /* 04B6 */ + {0x04B8,0x04B9},{0x04B8,0x04B9}, /* 04B8 */ + {0x04BA,0x04BB},{0x04BA,0x04BB}, /* 04BA */ + {0x04BC,0x04BD},{0x04BC,0x04BD}, /* 04BC */ + {0x04BE,0x04BF},{0x04BE,0x04BF}, /* 04BE */ + {0x04C0,0x04CF},{0x04C1,0x04C2}, /* 04C0 */ + {0x04C1,0x04C2},{0x04C3,0x04C4}, /* 04C2 */ + {0x04C3,0x04C4},{0x04C5,0x04C6}, /* 04C4 */ + {0x04C5,0x04C6},{0x04C7,0x04C8}, /* 04C6 */ + {0x04C7,0x04C8},{0x04C9,0x04CA}, /* 04C8 */ + {0x04C9,0x04CA},{0x04CB,0x04CC}, /* 04CA */ + {0x04CB,0x04CC},{0x04CD,0x04CE}, /* 04CC */ + {0x04CD,0x04CE},{0x04C0,0x04CF}, /* 04CE */ + {0x04D0,0x04D1},{0x04D0,0x04D1}, /* 04D0 */ + {0x04D2,0x04D3},{0x04D2,0x04D3}, /* 04D2 */ + {0x04D4,0x04D5},{0x04D4,0x04D5}, /* 04D4 */ + {0x04D6,0x04D7},{0x04D6,0x04D7}, /* 04D6 */ + {0x04D8,0x04D9},{0x04D8,0x04D9}, /* 04D8 */ + {0x04DA,0x04DB},{0x04DA,0x04DB}, /* 04DA */ + {0x04DC,0x04DD},{0x04DC,0x04DD}, /* 04DC */ + {0x04DE,0x04DF},{0x04DE,0x04DF}, /* 04DE */ + {0x04E0,0x04E1},{0x04E0,0x04E1}, /* 04E0 */ + {0x04E2,0x04E3},{0x04E2,0x04E3}, /* 04E2 */ + {0x04E4,0x04E5},{0x04E4,0x04E5}, /* 04E4 */ + {0x04E6,0x04E7},{0x04E6,0x04E7}, /* 04E6 */ + {0x04E8,0x04E9},{0x04E8,0x04E9}, /* 04E8 */ + {0x04EA,0x04EB},{0x04EA,0x04EB}, /* 04EA */ + {0x04EC,0x04ED},{0x04EC,0x04ED}, /* 04EC */ + {0x04EE,0x04EF},{0x04EE,0x04EF}, /* 04EE */ + {0x04F0,0x04F1},{0x04F0,0x04F1}, /* 04F0 */ + {0x04F2,0x04F3},{0x04F2,0x04F3}, /* 04F2 */ + {0x04F4,0x04F5},{0x04F4,0x04F5}, /* 04F4 */ + {0x04F6,0x04F7},{0x04F6,0x04F7}, /* 04F6 */ + {0x04F8,0x04F9},{0x04F8,0x04F9}, /* 04F8 */ + {0x04FA,0x04FB},{0x04FA,0x04FB}, /* 04FA */ + {0x04FC,0x04FD},{0x04FC,0x04FD}, /* 04FC */ + {0x04FE,0x04FF},{0x04FE,0x04FF} /* 04FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page05[256]={ + {0x0500,0x0501},{0x0500,0x0501}, /* 0500 */ + {0x0502,0x0503},{0x0502,0x0503}, /* 0502 */ + {0x0504,0x0505},{0x0504,0x0505}, /* 0504 */ + {0x0506,0x0507},{0x0506,0x0507}, /* 0506 */ + {0x0508,0x0509},{0x0508,0x0509}, /* 0508 */ + {0x050A,0x050B},{0x050A,0x050B}, /* 050A */ + {0x050C,0x050D},{0x050C,0x050D}, /* 050C */ + {0x050E,0x050F},{0x050E,0x050F}, /* 050E */ + {0x0510,0x0511},{0x0510,0x0511}, /* 0510 */ + {0x0512,0x0513},{0x0512,0x0513}, /* 0512 */ + {0x0514,0x0515},{0x0514,0x0515}, /* 0514 */ + {0x0516,0x0517},{0x0516,0x0517}, /* 0516 */ + {0x0518,0x0519},{0x0518,0x0519}, /* 0518 */ + {0x051A,0x051B},{0x051A,0x051B}, /* 051A */ + {0x051C,0x051D},{0x051C,0x051D}, /* 051C */ + {0x051E,0x051F},{0x051E,0x051F}, /* 051E */ + {0x0520,0x0521},{0x0520,0x0521}, /* 0520 */ + {0x0522,0x0523},{0x0522,0x0523}, /* 0522 */ + {0x0524,0x0525},{0x0524,0x0525}, /* 0524 */ + {0x0526,0x0526},{0x0527,0x0527}, /* 0526 */ + {0x0528,0x0528},{0x0529,0x0529}, /* 0528 */ + {0x052A,0x052A},{0x052B,0x052B}, /* 052A */ + {0x052C,0x052C},{0x052D,0x052D}, /* 052C */ + {0x052E,0x052E},{0x052F,0x052F}, /* 052E */ + {0x0530,0x0530},{0x0531,0x0561}, /* 0530 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0532 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0534 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0536 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0538 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 053A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 053C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 053E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0540 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0542 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0544 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0546 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0548 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 054A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 054C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 054E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0550 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0552 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0554 */ + {0x0556,0x0586},{0x0557,0x0557}, /* 0556 */ + {0x0558,0x0558},{0x0559,0x0559}, /* 0558 */ + {0x055A,0x055A},{0x055B,0x055B}, /* 055A */ + {0x055C,0x055C},{0x055D,0x055D}, /* 055C */ + {0x055E,0x055E},{0x055F,0x055F}, /* 055E */ + {0x0560,0x0560},{0x0531,0x0561}, /* 0560 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0562 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0564 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0566 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0568 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 056A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 056C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 056E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0570 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0572 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0574 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0576 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0578 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 057A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 057C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 057E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0580 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0582 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0584 */ + {0x0556,0x0586},{0x0587,0x0587}, /* 0586 */ + {0x0588,0x0588},{0x0589,0x0589}, /* 0588 */ + {0x058A,0x058A},{0x058B,0x058B}, /* 058A */ + {0x058C,0x058C},{0x058D,0x058D}, /* 058C */ + {0x058E,0x058E},{0x058F,0x058F}, /* 058E */ + {0x0590,0x0590},{0x0591,0x0591}, /* 0590 */ + {0x0592,0x0592},{0x0593,0x0593}, /* 0592 */ + {0x0594,0x0594},{0x0595,0x0595}, /* 0594 */ + {0x0596,0x0596},{0x0597,0x0597}, /* 0596 */ + {0x0598,0x0598},{0x0599,0x0599}, /* 0598 */ + {0x059A,0x059A},{0x059B,0x059B}, /* 059A */ + {0x059C,0x059C},{0x059D,0x059D}, /* 059C */ + {0x059E,0x059E},{0x059F,0x059F}, /* 059E */ + {0x05A0,0x05A0},{0x05A1,0x05A1}, /* 05A0 */ + {0x05A2,0x05A2},{0x05A3,0x05A3}, /* 05A2 */ + {0x05A4,0x05A4},{0x05A5,0x05A5}, /* 05A4 */ + {0x05A6,0x05A6},{0x05A7,0x05A7}, /* 05A6 */ + {0x05A8,0x05A8},{0x05A9,0x05A9}, /* 05A8 */ + {0x05AA,0x05AA},{0x05AB,0x05AB}, /* 05AA */ + {0x05AC,0x05AC},{0x05AD,0x05AD}, /* 05AC */ + {0x05AE,0x05AE},{0x05AF,0x05AF}, /* 05AE */ + {0x05B0,0x05B0},{0x05B1,0x05B1}, /* 05B0 */ + {0x05B2,0x05B2},{0x05B3,0x05B3}, /* 05B2 */ + {0x05B4,0x05B4},{0x05B5,0x05B5}, /* 05B4 */ + {0x05B6,0x05B6},{0x05B7,0x05B7}, /* 05B6 */ + {0x05B8,0x05B8},{0x05B9,0x05B9}, /* 05B8 */ + {0x05BA,0x05BA},{0x05BB,0x05BB}, /* 05BA */ + {0x05BC,0x05BC},{0x05BD,0x05BD}, /* 05BC */ + {0x05BE,0x05BE},{0x05BF,0x05BF}, /* 05BE */ + {0x05C0,0x05C0},{0x05C1,0x05C1}, /* 05C0 */ + {0x05C2,0x05C2},{0x05C3,0x05C3}, /* 05C2 */ + {0x05C4,0x05C4},{0x05C5,0x05C5}, /* 05C4 */ + {0x05C6,0x05C6},{0x05C7,0x05C7}, /* 05C6 */ + {0x05C8,0x05C8},{0x05C9,0x05C9}, /* 05C8 */ + {0x05CA,0x05CA},{0x05CB,0x05CB}, /* 05CA */ + {0x05CC,0x05CC},{0x05CD,0x05CD}, /* 05CC */ + {0x05CE,0x05CE},{0x05CF,0x05CF}, /* 05CE */ + {0x05D0,0x05D0},{0x05D1,0x05D1}, /* 05D0 */ + {0x05D2,0x05D2},{0x05D3,0x05D3}, /* 05D2 */ + {0x05D4,0x05D4},{0x05D5,0x05D5}, /* 05D4 */ + {0x05D6,0x05D6},{0x05D7,0x05D7}, /* 05D6 */ + {0x05D8,0x05D8},{0x05D9,0x05D9}, /* 05D8 */ + {0x05DA,0x05DA},{0x05DB,0x05DB}, /* 05DA */ + {0x05DC,0x05DC},{0x05DD,0x05DD}, /* 05DC */ + {0x05DE,0x05DE},{0x05DF,0x05DF}, /* 05DE */ + {0x05E0,0x05E0},{0x05E1,0x05E1}, /* 05E0 */ + {0x05E2,0x05E2},{0x05E3,0x05E3}, /* 05E2 */ + {0x05E4,0x05E4},{0x05E5,0x05E5}, /* 05E4 */ + {0x05E6,0x05E6},{0x05E7,0x05E7}, /* 05E6 */ + {0x05E8,0x05E8},{0x05E9,0x05E9}, /* 05E8 */ + {0x05EA,0x05EA},{0x05EB,0x05EB}, /* 05EA */ + {0x05EC,0x05EC},{0x05ED,0x05ED}, /* 05EC */ + {0x05EE,0x05EE},{0x05EF,0x05EF}, /* 05EE */ + {0x05F0,0x05F0},{0x05F1,0x05F1}, /* 05F0 */ + {0x05F2,0x05F2},{0x05F3,0x05F3}, /* 05F2 */ + {0x05F4,0x05F4},{0x05F5,0x05F5}, /* 05F4 */ + {0x05F6,0x05F6},{0x05F7,0x05F7}, /* 05F6 */ + {0x05F8,0x05F8},{0x05F9,0x05F9}, /* 05F8 */ + {0x05FA,0x05FA},{0x05FB,0x05FB}, /* 05FA */ + {0x05FC,0x05FC},{0x05FD,0x05FD}, /* 05FC */ + {0x05FE,0x05FE},{0x05FF,0x05FF} /* 05FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page06[256]={ /* This page is dummy */ + {0x0600,0x0600},{0x0601,0x0601}, /* 0600 */ + {0x0602,0x0602},{0x0603,0x0603}, /* 0602 */ + {0x0604,0x0604},{0x0605,0x0605}, /* 0604 */ + {0x0606,0x0606},{0x0607,0x0607}, /* 0606 */ + {0x0608,0x0608},{0x0609,0x0609}, /* 0608 */ + {0x060A,0x060A},{0x060B,0x060B}, /* 060A */ + {0x060C,0x060C},{0x060D,0x060D}, /* 060C */ + {0x060E,0x060E},{0x060F,0x060F}, /* 060E */ + {0x0610,0x0610},{0x0611,0x0611}, /* 0610 */ + {0x0612,0x0612},{0x0613,0x0613}, /* 0612 */ + {0x0614,0x0614},{0x0615,0x0615}, /* 0614 */ + {0x0616,0x0616},{0x0617,0x0617}, /* 0616 */ + {0x0618,0x0618},{0x0619,0x0619}, /* 0618 */ + {0x061A,0x061A},{0x061B,0x061B}, /* 061A */ + {0x061C,0x061C},{0x061D,0x061D}, /* 061C */ + {0x061E,0x061E},{0x061F,0x061F}, /* 061E */ + {0x0620,0x0620},{0x0621,0x0621}, /* 0620 */ + {0x0622,0x0622},{0x0623,0x0623}, /* 0622 */ + {0x0624,0x0624},{0x0625,0x0625}, /* 0624 */ + {0x0626,0x0626},{0x0627,0x0627}, /* 0626 */ + {0x0628,0x0628},{0x0629,0x0629}, /* 0628 */ + {0x062A,0x062A},{0x062B,0x062B}, /* 062A */ + {0x062C,0x062C},{0x062D,0x062D}, /* 062C */ + {0x062E,0x062E},{0x062F,0x062F}, /* 062E */ + {0x0630,0x0630},{0x0631,0x0631}, /* 0630 */ + {0x0632,0x0632},{0x0633,0x0633}, /* 0632 */ + {0x0634,0x0634},{0x0635,0x0635}, /* 0634 */ + {0x0636,0x0636},{0x0637,0x0637}, /* 0636 */ + {0x0638,0x0638},{0x0639,0x0639}, /* 0638 */ + {0x063A,0x063A},{0x063B,0x063B}, /* 063A */ + {0x063C,0x063C},{0x063D,0x063D}, /* 063C */ + {0x063E,0x063E},{0x063F,0x063F}, /* 063E */ + {0x0640,0x0640},{0x0641,0x0641}, /* 0640 */ + {0x0642,0x0642},{0x0643,0x0643}, /* 0642 */ + {0x0644,0x0644},{0x0645,0x0645}, /* 0644 */ + {0x0646,0x0646},{0x0647,0x0647}, /* 0646 */ + {0x0648,0x0648},{0x0649,0x0649}, /* 0648 */ + {0x064A,0x064A},{0x064B,0x064B}, /* 064A */ + {0x064C,0x064C},{0x064D,0x064D}, /* 064C */ + {0x064E,0x064E},{0x064F,0x064F}, /* 064E */ + {0x0650,0x0650},{0x0651,0x0651}, /* 0650 */ + {0x0652,0x0652},{0x0653,0x0653}, /* 0652 */ + {0x0654,0x0654},{0x0655,0x0655}, /* 0654 */ + {0x0656,0x0656},{0x0657,0x0657}, /* 0656 */ + {0x0658,0x0658},{0x0659,0x0659}, /* 0658 */ + {0x065A,0x065A},{0x065B,0x065B}, /* 065A */ + {0x065C,0x065C},{0x065D,0x065D}, /* 065C */ + {0x065E,0x065E},{0x065F,0x065F}, /* 065E */ + {0x0660,0x0660},{0x0661,0x0661}, /* 0660 */ + {0x0662,0x0662},{0x0663,0x0663}, /* 0662 */ + {0x0664,0x0664},{0x0665,0x0665}, /* 0664 */ + {0x0666,0x0666},{0x0667,0x0667}, /* 0666 */ + {0x0668,0x0668},{0x0669,0x0669}, /* 0668 */ + {0x066A,0x066A},{0x066B,0x066B}, /* 066A */ + {0x066C,0x066C},{0x066D,0x066D}, /* 066C */ + {0x066E,0x066E},{0x066F,0x066F}, /* 066E */ + {0x0670,0x0670},{0x0671,0x0671}, /* 0670 */ + {0x0672,0x0672},{0x0673,0x0673}, /* 0672 */ + {0x0674,0x0674},{0x0675,0x0675}, /* 0674 */ + {0x0676,0x0676},{0x0677,0x0677}, /* 0676 */ + {0x0678,0x0678},{0x0679,0x0679}, /* 0678 */ + {0x067A,0x067A},{0x067B,0x067B}, /* 067A */ + {0x067C,0x067C},{0x067D,0x067D}, /* 067C */ + {0x067E,0x067E},{0x067F,0x067F}, /* 067E */ + {0x0680,0x0680},{0x0681,0x0681}, /* 0680 */ + {0x0682,0x0682},{0x0683,0x0683}, /* 0682 */ + {0x0684,0x0684},{0x0685,0x0685}, /* 0684 */ + {0x0686,0x0686},{0x0687,0x0687}, /* 0686 */ + {0x0688,0x0688},{0x0689,0x0689}, /* 0688 */ + {0x068A,0x068A},{0x068B,0x068B}, /* 068A */ + {0x068C,0x068C},{0x068D,0x068D}, /* 068C */ + {0x068E,0x068E},{0x068F,0x068F}, /* 068E */ + {0x0690,0x0690},{0x0691,0x0691}, /* 0690 */ + {0x0692,0x0692},{0x0693,0x0693}, /* 0692 */ + {0x0694,0x0694},{0x0695,0x0695}, /* 0694 */ + {0x0696,0x0696},{0x0697,0x0697}, /* 0696 */ + {0x0698,0x0698},{0x0699,0x0699}, /* 0698 */ + {0x069A,0x069A},{0x069B,0x069B}, /* 069A */ + {0x069C,0x069C},{0x069D,0x069D}, /* 069C */ + {0x069E,0x069E},{0x069F,0x069F}, /* 069E */ + {0x06A0,0x06A0},{0x06A1,0x06A1}, /* 06A0 */ + {0x06A2,0x06A2},{0x06A3,0x06A3}, /* 06A2 */ + {0x06A4,0x06A4},{0x06A5,0x06A5}, /* 06A4 */ + {0x06A6,0x06A6},{0x06A7,0x06A7}, /* 06A6 */ + {0x06A8,0x06A8},{0x06A9,0x06A9}, /* 06A8 */ + {0x06AA,0x06AA},{0x06AB,0x06AB}, /* 06AA */ + {0x06AC,0x06AC},{0x06AD,0x06AD}, /* 06AC */ + {0x06AE,0x06AE},{0x06AF,0x06AF}, /* 06AE */ + {0x06B0,0x06B0},{0x06B1,0x06B1}, /* 06B0 */ + {0x06B2,0x06B2},{0x06B3,0x06B3}, /* 06B2 */ + {0x06B4,0x06B4},{0x06B5,0x06B5}, /* 06B4 */ + {0x06B6,0x06B6},{0x06B7,0x06B7}, /* 06B6 */ + {0x06B8,0x06B8},{0x06B9,0x06B9}, /* 06B8 */ + {0x06BA,0x06BA},{0x06BB,0x06BB}, /* 06BA */ + {0x06BC,0x06BC},{0x06BD,0x06BD}, /* 06BC */ + {0x06BE,0x06BE},{0x06BF,0x06BF}, /* 06BE */ + {0x06C0,0x06C0},{0x06C1,0x06C1}, /* 06C0 */ + {0x06C2,0x06C2},{0x06C3,0x06C3}, /* 06C2 */ + {0x06C4,0x06C4},{0x06C5,0x06C5}, /* 06C4 */ + {0x06C6,0x06C6},{0x06C7,0x06C7}, /* 06C6 */ + {0x06C8,0x06C8},{0x06C9,0x06C9}, /* 06C8 */ + {0x06CA,0x06CA},{0x06CB,0x06CB}, /* 06CA */ + {0x06CC,0x06CC},{0x06CD,0x06CD}, /* 06CC */ + {0x06CE,0x06CE},{0x06CF,0x06CF}, /* 06CE */ + {0x06D0,0x06D0},{0x06D1,0x06D1}, /* 06D0 */ + {0x06D2,0x06D2},{0x06D3,0x06D3}, /* 06D2 */ + {0x06D4,0x06D4},{0x06D5,0x06D5}, /* 06D4 */ + {0x06D6,0x06D6},{0x06D7,0x06D7}, /* 06D6 */ + {0x06D8,0x06D8},{0x06D9,0x06D9}, /* 06D8 */ + {0x06DA,0x06DA},{0x06DB,0x06DB}, /* 06DA */ + {0x06DC,0x06DC},{0x06DD,0x06DD}, /* 06DC */ + {0x06DE,0x06DE},{0x06DF,0x06DF}, /* 06DE */ + {0x06E0,0x06E0},{0x06E1,0x06E1}, /* 06E0 */ + {0x06E2,0x06E2},{0x06E3,0x06E3}, /* 06E2 */ + {0x06E4,0x06E4},{0x06E5,0x06E5}, /* 06E4 */ + {0x06E6,0x06E6},{0x06E7,0x06E7}, /* 06E6 */ + {0x06E8,0x06E8},{0x06E9,0x06E9}, /* 06E8 */ + {0x06EA,0x06EA},{0x06EB,0x06EB}, /* 06EA */ + {0x06EC,0x06EC},{0x06ED,0x06ED}, /* 06EC */ + {0x06EE,0x06EE},{0x06EF,0x06EF}, /* 06EE */ + {0x06F0,0x06F0},{0x06F1,0x06F1}, /* 06F0 */ + {0x06F2,0x06F2},{0x06F3,0x06F3}, /* 06F2 */ + {0x06F4,0x06F4},{0x06F5,0x06F5}, /* 06F4 */ + {0x06F6,0x06F6},{0x06F7,0x06F7}, /* 06F6 */ + {0x06F8,0x06F8},{0x06F9,0x06F9}, /* 06F8 */ + {0x06FA,0x06FA},{0x06FB,0x06FB}, /* 06FA */ + {0x06FC,0x06FC},{0x06FD,0x06FD}, /* 06FC */ + {0x06FE,0x06FE},{0x06FF,0x06FF} /* 06FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page07[256]={ /* This page is dummy */ + {0x0700,0x0700},{0x0701,0x0701}, /* 0700 */ + {0x0702,0x0702},{0x0703,0x0703}, /* 0702 */ + {0x0704,0x0704},{0x0705,0x0705}, /* 0704 */ + {0x0706,0x0706},{0x0707,0x0707}, /* 0706 */ + {0x0708,0x0708},{0x0709,0x0709}, /* 0708 */ + {0x070A,0x070A},{0x070B,0x070B}, /* 070A */ + {0x070C,0x070C},{0x070D,0x070D}, /* 070C */ + {0x070E,0x070E},{0x070F,0x070F}, /* 070E */ + {0x0710,0x0710},{0x0711,0x0711}, /* 0710 */ + {0x0712,0x0712},{0x0713,0x0713}, /* 0712 */ + {0x0714,0x0714},{0x0715,0x0715}, /* 0714 */ + {0x0716,0x0716},{0x0717,0x0717}, /* 0716 */ + {0x0718,0x0718},{0x0719,0x0719}, /* 0718 */ + {0x071A,0x071A},{0x071B,0x071B}, /* 071A */ + {0x071C,0x071C},{0x071D,0x071D}, /* 071C */ + {0x071E,0x071E},{0x071F,0x071F}, /* 071E */ + {0x0720,0x0720},{0x0721,0x0721}, /* 0720 */ + {0x0722,0x0722},{0x0723,0x0723}, /* 0722 */ + {0x0724,0x0724},{0x0725,0x0725}, /* 0724 */ + {0x0726,0x0726},{0x0727,0x0727}, /* 0726 */ + {0x0728,0x0728},{0x0729,0x0729}, /* 0728 */ + {0x072A,0x072A},{0x072B,0x072B}, /* 072A */ + {0x072C,0x072C},{0x072D,0x072D}, /* 072C */ + {0x072E,0x072E},{0x072F,0x072F}, /* 072E */ + {0x0730,0x0730},{0x0731,0x0731}, /* 0730 */ + {0x0732,0x0732},{0x0733,0x0733}, /* 0732 */ + {0x0734,0x0734},{0x0735,0x0735}, /* 0734 */ + {0x0736,0x0736},{0x0737,0x0737}, /* 0736 */ + {0x0738,0x0738},{0x0739,0x0739}, /* 0738 */ + {0x073A,0x073A},{0x073B,0x073B}, /* 073A */ + {0x073C,0x073C},{0x073D,0x073D}, /* 073C */ + {0x073E,0x073E},{0x073F,0x073F}, /* 073E */ + {0x0740,0x0740},{0x0741,0x0741}, /* 0740 */ + {0x0742,0x0742},{0x0743,0x0743}, /* 0742 */ + {0x0744,0x0744},{0x0745,0x0745}, /* 0744 */ + {0x0746,0x0746},{0x0747,0x0747}, /* 0746 */ + {0x0748,0x0748},{0x0749,0x0749}, /* 0748 */ + {0x074A,0x074A},{0x074B,0x074B}, /* 074A */ + {0x074C,0x074C},{0x074D,0x074D}, /* 074C */ + {0x074E,0x074E},{0x074F,0x074F}, /* 074E */ + {0x0750,0x0750},{0x0751,0x0751}, /* 0750 */ + {0x0752,0x0752},{0x0753,0x0753}, /* 0752 */ + {0x0754,0x0754},{0x0755,0x0755}, /* 0754 */ + {0x0756,0x0756},{0x0757,0x0757}, /* 0756 */ + {0x0758,0x0758},{0x0759,0x0759}, /* 0758 */ + {0x075A,0x075A},{0x075B,0x075B}, /* 075A */ + {0x075C,0x075C},{0x075D,0x075D}, /* 075C */ + {0x075E,0x075E},{0x075F,0x075F}, /* 075E */ + {0x0760,0x0760},{0x0761,0x0761}, /* 0760 */ + {0x0762,0x0762},{0x0763,0x0763}, /* 0762 */ + {0x0764,0x0764},{0x0765,0x0765}, /* 0764 */ + {0x0766,0x0766},{0x0767,0x0767}, /* 0766 */ + {0x0768,0x0768},{0x0769,0x0769}, /* 0768 */ + {0x076A,0x076A},{0x076B,0x076B}, /* 076A */ + {0x076C,0x076C},{0x076D,0x076D}, /* 076C */ + {0x076E,0x076E},{0x076F,0x076F}, /* 076E */ + {0x0770,0x0770},{0x0771,0x0771}, /* 0770 */ + {0x0772,0x0772},{0x0773,0x0773}, /* 0772 */ + {0x0774,0x0774},{0x0775,0x0775}, /* 0774 */ + {0x0776,0x0776},{0x0777,0x0777}, /* 0776 */ + {0x0778,0x0778},{0x0779,0x0779}, /* 0778 */ + {0x077A,0x077A},{0x077B,0x077B}, /* 077A */ + {0x077C,0x077C},{0x077D,0x077D}, /* 077C */ + {0x077E,0x077E},{0x077F,0x077F}, /* 077E */ + {0x0780,0x0780},{0x0781,0x0781}, /* 0780 */ + {0x0782,0x0782},{0x0783,0x0783}, /* 0782 */ + {0x0784,0x0784},{0x0785,0x0785}, /* 0784 */ + {0x0786,0x0786},{0x0787,0x0787}, /* 0786 */ + {0x0788,0x0788},{0x0789,0x0789}, /* 0788 */ + {0x078A,0x078A},{0x078B,0x078B}, /* 078A */ + {0x078C,0x078C},{0x078D,0x078D}, /* 078C */ + {0x078E,0x078E},{0x078F,0x078F}, /* 078E */ + {0x0790,0x0790},{0x0791,0x0791}, /* 0790 */ + {0x0792,0x0792},{0x0793,0x0793}, /* 0792 */ + {0x0794,0x0794},{0x0795,0x0795}, /* 0794 */ + {0x0796,0x0796},{0x0797,0x0797}, /* 0796 */ + {0x0798,0x0798},{0x0799,0x0799}, /* 0798 */ + {0x079A,0x079A},{0x079B,0x079B}, /* 079A */ + {0x079C,0x079C},{0x079D,0x079D}, /* 079C */ + {0x079E,0x079E},{0x079F,0x079F}, /* 079E */ + {0x07A0,0x07A0},{0x07A1,0x07A1}, /* 07A0 */ + {0x07A2,0x07A2},{0x07A3,0x07A3}, /* 07A2 */ + {0x07A4,0x07A4},{0x07A5,0x07A5}, /* 07A4 */ + {0x07A6,0x07A6},{0x07A7,0x07A7}, /* 07A6 */ + {0x07A8,0x07A8},{0x07A9,0x07A9}, /* 07A8 */ + {0x07AA,0x07AA},{0x07AB,0x07AB}, /* 07AA */ + {0x07AC,0x07AC},{0x07AD,0x07AD}, /* 07AC */ + {0x07AE,0x07AE},{0x07AF,0x07AF}, /* 07AE */ + {0x07B0,0x07B0},{0x07B1,0x07B1}, /* 07B0 */ + {0x07B2,0x07B2},{0x07B3,0x07B3}, /* 07B2 */ + {0x07B4,0x07B4},{0x07B5,0x07B5}, /* 07B4 */ + {0x07B6,0x07B6},{0x07B7,0x07B7}, /* 07B6 */ + {0x07B8,0x07B8},{0x07B9,0x07B9}, /* 07B8 */ + {0x07BA,0x07BA},{0x07BB,0x07BB}, /* 07BA */ + {0x07BC,0x07BC},{0x07BD,0x07BD}, /* 07BC */ + {0x07BE,0x07BE},{0x07BF,0x07BF}, /* 07BE */ + {0x07C0,0x07C0},{0x07C1,0x07C1}, /* 07C0 */ + {0x07C2,0x07C2},{0x07C3,0x07C3}, /* 07C2 */ + {0x07C4,0x07C4},{0x07C5,0x07C5}, /* 07C4 */ + {0x07C6,0x07C6},{0x07C7,0x07C7}, /* 07C6 */ + {0x07C8,0x07C8},{0x07C9,0x07C9}, /* 07C8 */ + {0x07CA,0x07CA},{0x07CB,0x07CB}, /* 07CA */ + {0x07CC,0x07CC},{0x07CD,0x07CD}, /* 07CC */ + {0x07CE,0x07CE},{0x07CF,0x07CF}, /* 07CE */ + {0x07D0,0x07D0},{0x07D1,0x07D1}, /* 07D0 */ + {0x07D2,0x07D2},{0x07D3,0x07D3}, /* 07D2 */ + {0x07D4,0x07D4},{0x07D5,0x07D5}, /* 07D4 */ + {0x07D6,0x07D6},{0x07D7,0x07D7}, /* 07D6 */ + {0x07D8,0x07D8},{0x07D9,0x07D9}, /* 07D8 */ + {0x07DA,0x07DA},{0x07DB,0x07DB}, /* 07DA */ + {0x07DC,0x07DC},{0x07DD,0x07DD}, /* 07DC */ + {0x07DE,0x07DE},{0x07DF,0x07DF}, /* 07DE */ + {0x07E0,0x07E0},{0x07E1,0x07E1}, /* 07E0 */ + {0x07E2,0x07E2},{0x07E3,0x07E3}, /* 07E2 */ + {0x07E4,0x07E4},{0x07E5,0x07E5}, /* 07E4 */ + {0x07E6,0x07E6},{0x07E7,0x07E7}, /* 07E6 */ + {0x07E8,0x07E8},{0x07E9,0x07E9}, /* 07E8 */ + {0x07EA,0x07EA},{0x07EB,0x07EB}, /* 07EA */ + {0x07EC,0x07EC},{0x07ED,0x07ED}, /* 07EC */ + {0x07EE,0x07EE},{0x07EF,0x07EF}, /* 07EE */ + {0x07F0,0x07F0},{0x07F1,0x07F1}, /* 07F0 */ + {0x07F2,0x07F2},{0x07F3,0x07F3}, /* 07F2 */ + {0x07F4,0x07F4},{0x07F5,0x07F5}, /* 07F4 */ + {0x07F6,0x07F6},{0x07F7,0x07F7}, /* 07F6 */ + {0x07F8,0x07F8},{0x07F9,0x07F9}, /* 07F8 */ + {0x07FA,0x07FA},{0x07FB,0x07FB}, /* 07FA */ + {0x07FC,0x07FC},{0x07FD,0x07FD}, /* 07FC */ + {0x07FE,0x07FE},{0x07FF,0x07FF} /* 07FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page10[256]={ + {0x1000,0x1000},{0x1001,0x1001}, /* 1000 */ + {0x1002,0x1002},{0x1003,0x1003}, /* 1002 */ + {0x1004,0x1004},{0x1005,0x1005}, /* 1004 */ + {0x1006,0x1006},{0x1007,0x1007}, /* 1006 */ + {0x1008,0x1008},{0x1009,0x1009}, /* 1008 */ + {0x100A,0x100A},{0x100B,0x100B}, /* 100A */ + {0x100C,0x100C},{0x100D,0x100D}, /* 100C */ + {0x100E,0x100E},{0x100F,0x100F}, /* 100E */ + {0x1010,0x1010},{0x1011,0x1011}, /* 1010 */ + {0x1012,0x1012},{0x1013,0x1013}, /* 1012 */ + {0x1014,0x1014},{0x1015,0x1015}, /* 1014 */ + {0x1016,0x1016},{0x1017,0x1017}, /* 1016 */ + {0x1018,0x1018},{0x1019,0x1019}, /* 1018 */ + {0x101A,0x101A},{0x101B,0x101B}, /* 101A */ + {0x101C,0x101C},{0x101D,0x101D}, /* 101C */ + {0x101E,0x101E},{0x101F,0x101F}, /* 101E */ + {0x1020,0x1020},{0x1021,0x1021}, /* 1020 */ + {0x1022,0x1022},{0x1023,0x1023}, /* 1022 */ + {0x1024,0x1024},{0x1025,0x1025}, /* 1024 */ + {0x1026,0x1026},{0x1027,0x1027}, /* 1026 */ + {0x1028,0x1028},{0x1029,0x1029}, /* 1028 */ + {0x102A,0x102A},{0x102B,0x102B}, /* 102A */ + {0x102C,0x102C},{0x102D,0x102D}, /* 102C */ + {0x102E,0x102E},{0x102F,0x102F}, /* 102E */ + {0x1030,0x1030},{0x1031,0x1031}, /* 1030 */ + {0x1032,0x1032},{0x1033,0x1033}, /* 1032 */ + {0x1034,0x1034},{0x1035,0x1035}, /* 1034 */ + {0x1036,0x1036},{0x1037,0x1037}, /* 1036 */ + {0x1038,0x1038},{0x1039,0x1039}, /* 1038 */ + {0x103A,0x103A},{0x103B,0x103B}, /* 103A */ + {0x103C,0x103C},{0x103D,0x103D}, /* 103C */ + {0x103E,0x103E},{0x103F,0x103F}, /* 103E */ + {0x1040,0x1040},{0x1041,0x1041}, /* 1040 */ + {0x1042,0x1042},{0x1043,0x1043}, /* 1042 */ + {0x1044,0x1044},{0x1045,0x1045}, /* 1044 */ + {0x1046,0x1046},{0x1047,0x1047}, /* 1046 */ + {0x1048,0x1048},{0x1049,0x1049}, /* 1048 */ + {0x104A,0x104A},{0x104B,0x104B}, /* 104A */ + {0x104C,0x104C},{0x104D,0x104D}, /* 104C */ + {0x104E,0x104E},{0x104F,0x104F}, /* 104E */ + {0x1050,0x1050},{0x1051,0x1051}, /* 1050 */ + {0x1052,0x1052},{0x1053,0x1053}, /* 1052 */ + {0x1054,0x1054},{0x1055,0x1055}, /* 1054 */ + {0x1056,0x1056},{0x1057,0x1057}, /* 1056 */ + {0x1058,0x1058},{0x1059,0x1059}, /* 1058 */ + {0x105A,0x105A},{0x105B,0x105B}, /* 105A */ + {0x105C,0x105C},{0x105D,0x105D}, /* 105C */ + {0x105E,0x105E},{0x105F,0x105F}, /* 105E */ + {0x1060,0x1060},{0x1061,0x1061}, /* 1060 */ + {0x1062,0x1062},{0x1063,0x1063}, /* 1062 */ + {0x1064,0x1064},{0x1065,0x1065}, /* 1064 */ + {0x1066,0x1066},{0x1067,0x1067}, /* 1066 */ + {0x1068,0x1068},{0x1069,0x1069}, /* 1068 */ + {0x106A,0x106A},{0x106B,0x106B}, /* 106A */ + {0x106C,0x106C},{0x106D,0x106D}, /* 106C */ + {0x106E,0x106E},{0x106F,0x106F}, /* 106E */ + {0x1070,0x1070},{0x1071,0x1071}, /* 1070 */ + {0x1072,0x1072},{0x1073,0x1073}, /* 1072 */ + {0x1074,0x1074},{0x1075,0x1075}, /* 1074 */ + {0x1076,0x1076},{0x1077,0x1077}, /* 1076 */ + {0x1078,0x1078},{0x1079,0x1079}, /* 1078 */ + {0x107A,0x107A},{0x107B,0x107B}, /* 107A */ + {0x107C,0x107C},{0x107D,0x107D}, /* 107C */ + {0x107E,0x107E},{0x107F,0x107F}, /* 107E */ + {0x1080,0x1080},{0x1081,0x1081}, /* 1080 */ + {0x1082,0x1082},{0x1083,0x1083}, /* 1082 */ + {0x1084,0x1084},{0x1085,0x1085}, /* 1084 */ + {0x1086,0x1086},{0x1087,0x1087}, /* 1086 */ + {0x1088,0x1088},{0x1089,0x1089}, /* 1088 */ + {0x108A,0x108A},{0x108B,0x108B}, /* 108A */ + {0x108C,0x108C},{0x108D,0x108D}, /* 108C */ + {0x108E,0x108E},{0x108F,0x108F}, /* 108E */ + {0x1090,0x1090},{0x1091,0x1091}, /* 1090 */ + {0x1092,0x1092},{0x1093,0x1093}, /* 1092 */ + {0x1094,0x1094},{0x1095,0x1095}, /* 1094 */ + {0x1096,0x1096},{0x1097,0x1097}, /* 1096 */ + {0x1098,0x1098},{0x1099,0x1099}, /* 1098 */ + {0x109A,0x109A},{0x109B,0x109B}, /* 109A */ + {0x109C,0x109C},{0x109D,0x109D}, /* 109C */ + {0x109E,0x109E},{0x109F,0x109F}, /* 109E */ + {0x10A0,0x2D00},{0x10A1,0x2D01}, /* 10A0 */ + {0x10A2,0x2D02},{0x10A3,0x2D03}, /* 10A2 */ + {0x10A4,0x2D04},{0x10A5,0x2D05}, /* 10A4 */ + {0x10A6,0x2D06},{0x10A7,0x2D07}, /* 10A6 */ + {0x10A8,0x2D08},{0x10A9,0x2D09}, /* 10A8 */ + {0x10AA,0x2D0A},{0x10AB,0x2D0B}, /* 10AA */ + {0x10AC,0x2D0C},{0x10AD,0x2D0D}, /* 10AC */ + {0x10AE,0x2D0E},{0x10AF,0x2D0F}, /* 10AE */ + {0x10B0,0x2D10},{0x10B1,0x2D11}, /* 10B0 */ + {0x10B2,0x2D12},{0x10B3,0x2D13}, /* 10B2 */ + {0x10B4,0x2D14},{0x10B5,0x2D15}, /* 10B4 */ + {0x10B6,0x2D16},{0x10B7,0x2D17}, /* 10B6 */ + {0x10B8,0x2D18},{0x10B9,0x2D19}, /* 10B8 */ + {0x10BA,0x2D1A},{0x10BB,0x2D1B}, /* 10BA */ + {0x10BC,0x2D1C},{0x10BD,0x2D1D}, /* 10BC */ + {0x10BE,0x2D1E},{0x10BF,0x2D1F}, /* 10BE */ + {0x10C0,0x2D20},{0x10C1,0x2D21}, /* 10C0 */ + {0x10C2,0x2D22},{0x10C3,0x2D23}, /* 10C2 */ + {0x10C4,0x2D24},{0x10C5,0x2D25}, /* 10C4 */ + {0x10C6,0x10C6},{0x10C7,0x10C7}, /* 10C6 */ + {0x10C8,0x10C8},{0x10C9,0x10C9}, /* 10C8 */ + {0x10CA,0x10CA},{0x10CB,0x10CB}, /* 10CA */ + {0x10CC,0x10CC},{0x10CD,0x10CD}, /* 10CC */ + {0x10CE,0x10CE},{0x10CF,0x10CF}, /* 10CE */ + {0x10D0,0x10D0},{0x10D1,0x10D1}, /* 10D0 */ + {0x10D2,0x10D2},{0x10D3,0x10D3}, /* 10D2 */ + {0x10D4,0x10D4},{0x10D5,0x10D5}, /* 10D4 */ + {0x10D6,0x10D6},{0x10D7,0x10D7}, /* 10D6 */ + {0x10D8,0x10D8},{0x10D9,0x10D9}, /* 10D8 */ + {0x10DA,0x10DA},{0x10DB,0x10DB}, /* 10DA */ + {0x10DC,0x10DC},{0x10DD,0x10DD}, /* 10DC */ + {0x10DE,0x10DE},{0x10DF,0x10DF}, /* 10DE */ + {0x10E0,0x10E0},{0x10E1,0x10E1}, /* 10E0 */ + {0x10E2,0x10E2},{0x10E3,0x10E3}, /* 10E2 */ + {0x10E4,0x10E4},{0x10E5,0x10E5}, /* 10E4 */ + {0x10E6,0x10E6},{0x10E7,0x10E7}, /* 10E6 */ + {0x10E8,0x10E8},{0x10E9,0x10E9}, /* 10E8 */ + {0x10EA,0x10EA},{0x10EB,0x10EB}, /* 10EA */ + {0x10EC,0x10EC},{0x10ED,0x10ED}, /* 10EC */ + {0x10EE,0x10EE},{0x10EF,0x10EF}, /* 10EE */ + {0x10F0,0x10F0},{0x10F1,0x10F1}, /* 10F0 */ + {0x10F2,0x10F2},{0x10F3,0x10F3}, /* 10F2 */ + {0x10F4,0x10F4},{0x10F5,0x10F5}, /* 10F4 */ + {0x10F6,0x10F6},{0x10F7,0x10F7}, /* 10F6 */ + {0x10F8,0x10F8},{0x10F9,0x10F9}, /* 10F8 */ + {0x10FA,0x10FA},{0x10FB,0x10FB}, /* 10FA */ + {0x10FC,0x10FC},{0x10FD,0x10FD}, /* 10FC */ + {0x10FE,0x10FE},{0x10FF,0x10FF} /* 10FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page1D[256]={ + {0x1D00,0x1D00},{0x1D01,0x1D01}, /* 1D00 */ + {0x1D02,0x1D02},{0x1D03,0x1D03}, /* 1D02 */ + {0x1D04,0x1D04},{0x1D05,0x1D05}, /* 1D04 */ + {0x1D06,0x1D06},{0x1D07,0x1D07}, /* 1D06 */ + {0x1D08,0x1D08},{0x1D09,0x1D09}, /* 1D08 */ + {0x1D0A,0x1D0A},{0x1D0B,0x1D0B}, /* 1D0A */ + {0x1D0C,0x1D0C},{0x1D0D,0x1D0D}, /* 1D0C */ + {0x1D0E,0x1D0E},{0x1D0F,0x1D0F}, /* 1D0E */ + {0x1D10,0x1D10},{0x1D11,0x1D11}, /* 1D10 */ + {0x1D12,0x1D12},{0x1D13,0x1D13}, /* 1D12 */ + {0x1D14,0x1D14},{0x1D15,0x1D15}, /* 1D14 */ + {0x1D16,0x1D16},{0x1D17,0x1D17}, /* 1D16 */ + {0x1D18,0x1D18},{0x1D19,0x1D19}, /* 1D18 */ + {0x1D1A,0x1D1A},{0x1D1B,0x1D1B}, /* 1D1A */ + {0x1D1C,0x1D1C},{0x1D1D,0x1D1D}, /* 1D1C */ + {0x1D1E,0x1D1E},{0x1D1F,0x1D1F}, /* 1D1E */ + {0x1D20,0x1D20},{0x1D21,0x1D21}, /* 1D20 */ + {0x1D22,0x1D22},{0x1D23,0x1D23}, /* 1D22 */ + {0x1D24,0x1D24},{0x1D25,0x1D25}, /* 1D24 */ + {0x1D26,0x1D26},{0x1D27,0x1D27}, /* 1D26 */ + {0x1D28,0x1D28},{0x1D29,0x1D29}, /* 1D28 */ + {0x1D2A,0x1D2A},{0x1D2B,0x1D2B}, /* 1D2A */ + {0x1D2C,0x1D2C},{0x1D2D,0x1D2D}, /* 1D2C */ + {0x1D2E,0x1D2E},{0x1D2F,0x1D2F}, /* 1D2E */ + {0x1D30,0x1D30},{0x1D31,0x1D31}, /* 1D30 */ + {0x1D32,0x1D32},{0x1D33,0x1D33}, /* 1D32 */ + {0x1D34,0x1D34},{0x1D35,0x1D35}, /* 1D34 */ + {0x1D36,0x1D36},{0x1D37,0x1D37}, /* 1D36 */ + {0x1D38,0x1D38},{0x1D39,0x1D39}, /* 1D38 */ + {0x1D3A,0x1D3A},{0x1D3B,0x1D3B}, /* 1D3A */ + {0x1D3C,0x1D3C},{0x1D3D,0x1D3D}, /* 1D3C */ + {0x1D3E,0x1D3E},{0x1D3F,0x1D3F}, /* 1D3E */ + {0x1D40,0x1D40},{0x1D41,0x1D41}, /* 1D40 */ + {0x1D42,0x1D42},{0x1D43,0x1D43}, /* 1D42 */ + {0x1D44,0x1D44},{0x1D45,0x1D45}, /* 1D44 */ + {0x1D46,0x1D46},{0x1D47,0x1D47}, /* 1D46 */ + {0x1D48,0x1D48},{0x1D49,0x1D49}, /* 1D48 */ + {0x1D4A,0x1D4A},{0x1D4B,0x1D4B}, /* 1D4A */ + {0x1D4C,0x1D4C},{0x1D4D,0x1D4D}, /* 1D4C */ + {0x1D4E,0x1D4E},{0x1D4F,0x1D4F}, /* 1D4E */ + {0x1D50,0x1D50},{0x1D51,0x1D51}, /* 1D50 */ + {0x1D52,0x1D52},{0x1D53,0x1D53}, /* 1D52 */ + {0x1D54,0x1D54},{0x1D55,0x1D55}, /* 1D54 */ + {0x1D56,0x1D56},{0x1D57,0x1D57}, /* 1D56 */ + {0x1D58,0x1D58},{0x1D59,0x1D59}, /* 1D58 */ + {0x1D5A,0x1D5A},{0x1D5B,0x1D5B}, /* 1D5A */ + {0x1D5C,0x1D5C},{0x1D5D,0x1D5D}, /* 1D5C */ + {0x1D5E,0x1D5E},{0x1D5F,0x1D5F}, /* 1D5E */ + {0x1D60,0x1D60},{0x1D61,0x1D61}, /* 1D60 */ + {0x1D62,0x1D62},{0x1D63,0x1D63}, /* 1D62 */ + {0x1D64,0x1D64},{0x1D65,0x1D65}, /* 1D64 */ + {0x1D66,0x1D66},{0x1D67,0x1D67}, /* 1D66 */ + {0x1D68,0x1D68},{0x1D69,0x1D69}, /* 1D68 */ + {0x1D6A,0x1D6A},{0x1D6B,0x1D6B}, /* 1D6A */ + {0x1D6C,0x1D6C},{0x1D6D,0x1D6D}, /* 1D6C */ + {0x1D6E,0x1D6E},{0x1D6F,0x1D6F}, /* 1D6E */ + {0x1D70,0x1D70},{0x1D71,0x1D71}, /* 1D70 */ + {0x1D72,0x1D72},{0x1D73,0x1D73}, /* 1D72 */ + {0x1D74,0x1D74},{0x1D75,0x1D75}, /* 1D74 */ + {0x1D76,0x1D76},{0x1D77,0x1D77}, /* 1D76 */ + {0x1D78,0x1D78},{0xA77D,0x1D79}, /* 1D78 */ + {0x1D7A,0x1D7A},{0x1D7B,0x1D7B}, /* 1D7A */ + {0x1D7C,0x1D7C},{0x2C63,0x1D7D}, /* 1D7C */ + {0x1D7E,0x1D7E},{0x1D7F,0x1D7F}, /* 1D7E */ + {0x1D80,0x1D80},{0x1D81,0x1D81}, /* 1D80 */ + {0x1D82,0x1D82},{0x1D83,0x1D83}, /* 1D82 */ + {0x1D84,0x1D84},{0x1D85,0x1D85}, /* 1D84 */ + {0x1D86,0x1D86},{0x1D87,0x1D87}, /* 1D86 */ + {0x1D88,0x1D88},{0x1D89,0x1D89}, /* 1D88 */ + {0x1D8A,0x1D8A},{0x1D8B,0x1D8B}, /* 1D8A */ + {0x1D8C,0x1D8C},{0x1D8D,0x1D8D}, /* 1D8C */ + {0x1D8E,0x1D8E},{0x1D8F,0x1D8F}, /* 1D8E */ + {0x1D90,0x1D90},{0x1D91,0x1D91}, /* 1D90 */ + {0x1D92,0x1D92},{0x1D93,0x1D93}, /* 1D92 */ + {0x1D94,0x1D94},{0x1D95,0x1D95}, /* 1D94 */ + {0x1D96,0x1D96},{0x1D97,0x1D97}, /* 1D96 */ + {0x1D98,0x1D98},{0x1D99,0x1D99}, /* 1D98 */ + {0x1D9A,0x1D9A},{0x1D9B,0x1D9B}, /* 1D9A */ + {0x1D9C,0x1D9C},{0x1D9D,0x1D9D}, /* 1D9C */ + {0x1D9E,0x1D9E},{0x1D9F,0x1D9F}, /* 1D9E */ + {0x1DA0,0x1DA0},{0x1DA1,0x1DA1}, /* 1DA0 */ + {0x1DA2,0x1DA2},{0x1DA3,0x1DA3}, /* 1DA2 */ + {0x1DA4,0x1DA4},{0x1DA5,0x1DA5}, /* 1DA4 */ + {0x1DA6,0x1DA6},{0x1DA7,0x1DA7}, /* 1DA6 */ + {0x1DA8,0x1DA8},{0x1DA9,0x1DA9}, /* 1DA8 */ + {0x1DAA,0x1DAA},{0x1DAB,0x1DAB}, /* 1DAA */ + {0x1DAC,0x1DAC},{0x1DAD,0x1DAD}, /* 1DAC */ + {0x1DAE,0x1DAE},{0x1DAF,0x1DAF}, /* 1DAE */ + {0x1DB0,0x1DB0},{0x1DB1,0x1DB1}, /* 1DB0 */ + {0x1DB2,0x1DB2},{0x1DB3,0x1DB3}, /* 1DB2 */ + {0x1DB4,0x1DB4},{0x1DB5,0x1DB5}, /* 1DB4 */ + {0x1DB6,0x1DB6},{0x1DB7,0x1DB7}, /* 1DB6 */ + {0x1DB8,0x1DB8},{0x1DB9,0x1DB9}, /* 1DB8 */ + {0x1DBA,0x1DBA},{0x1DBB,0x1DBB}, /* 1DBA */ + {0x1DBC,0x1DBC},{0x1DBD,0x1DBD}, /* 1DBC */ + {0x1DBE,0x1DBE},{0x1DBF,0x1DBF}, /* 1DBE */ + {0x1DC0,0x1DC0},{0x1DC1,0x1DC1}, /* 1DC0 */ + {0x1DC2,0x1DC2},{0x1DC3,0x1DC3}, /* 1DC2 */ + {0x1DC4,0x1DC4},{0x1DC5,0x1DC5}, /* 1DC4 */ + {0x1DC6,0x1DC6},{0x1DC7,0x1DC7}, /* 1DC6 */ + {0x1DC8,0x1DC8},{0x1DC9,0x1DC9}, /* 1DC8 */ + {0x1DCA,0x1DCA},{0x1DCB,0x1DCB}, /* 1DCA */ + {0x1DCC,0x1DCC},{0x1DCD,0x1DCD}, /* 1DCC */ + {0x1DCE,0x1DCE},{0x1DCF,0x1DCF}, /* 1DCE */ + {0x1DD0,0x1DD0},{0x1DD1,0x1DD1}, /* 1DD0 */ + {0x1DD2,0x1DD2},{0x1DD3,0x1DD3}, /* 1DD2 */ + {0x1DD4,0x1DD4},{0x1DD5,0x1DD5}, /* 1DD4 */ + {0x1DD6,0x1DD6},{0x1DD7,0x1DD7}, /* 1DD6 */ + {0x1DD8,0x1DD8},{0x1DD9,0x1DD9}, /* 1DD8 */ + {0x1DDA,0x1DDA},{0x1DDB,0x1DDB}, /* 1DDA */ + {0x1DDC,0x1DDC},{0x1DDD,0x1DDD}, /* 1DDC */ + {0x1DDE,0x1DDE},{0x1DDF,0x1DDF}, /* 1DDE */ + {0x1DE0,0x1DE0},{0x1DE1,0x1DE1}, /* 1DE0 */ + {0x1DE2,0x1DE2},{0x1DE3,0x1DE3}, /* 1DE2 */ + {0x1DE4,0x1DE4},{0x1DE5,0x1DE5}, /* 1DE4 */ + {0x1DE6,0x1DE6},{0x1DE7,0x1DE7}, /* 1DE6 */ + {0x1DE8,0x1DE8},{0x1DE9,0x1DE9}, /* 1DE8 */ + {0x1DEA,0x1DEA},{0x1DEB,0x1DEB}, /* 1DEA */ + {0x1DEC,0x1DEC},{0x1DED,0x1DED}, /* 1DEC */ + {0x1DEE,0x1DEE},{0x1DEF,0x1DEF}, /* 1DEE */ + {0x1DF0,0x1DF0},{0x1DF1,0x1DF1}, /* 1DF0 */ + {0x1DF2,0x1DF2},{0x1DF3,0x1DF3}, /* 1DF2 */ + {0x1DF4,0x1DF4},{0x1DF5,0x1DF5}, /* 1DF4 */ + {0x1DF6,0x1DF6},{0x1DF7,0x1DF7}, /* 1DF6 */ + {0x1DF8,0x1DF8},{0x1DF9,0x1DF9}, /* 1DF8 */ + {0x1DFA,0x1DFA},{0x1DFB,0x1DFB}, /* 1DFA */ + {0x1DFC,0x1DFC},{0x1DFD,0x1DFD}, /* 1DFC */ + {0x1DFE,0x1DFE},{0x1DFF,0x1DFF} /* 1DFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page1E[256]={ + {0x1E00,0x1E01},{0x1E00,0x1E01}, /* 1E00 */ + {0x1E02,0x1E03},{0x1E02,0x1E03}, /* 1E02 */ + {0x1E04,0x1E05},{0x1E04,0x1E05}, /* 1E04 */ + {0x1E06,0x1E07},{0x1E06,0x1E07}, /* 1E06 */ + {0x1E08,0x1E09},{0x1E08,0x1E09}, /* 1E08 */ + {0x1E0A,0x1E0B},{0x1E0A,0x1E0B}, /* 1E0A */ + {0x1E0C,0x1E0D},{0x1E0C,0x1E0D}, /* 1E0C */ + {0x1E0E,0x1E0F},{0x1E0E,0x1E0F}, /* 1E0E */ + {0x1E10,0x1E11},{0x1E10,0x1E11}, /* 1E10 */ + {0x1E12,0x1E13},{0x1E12,0x1E13}, /* 1E12 */ + {0x1E14,0x1E15},{0x1E14,0x1E15}, /* 1E14 */ + {0x1E16,0x1E17},{0x1E16,0x1E17}, /* 1E16 */ + {0x1E18,0x1E19},{0x1E18,0x1E19}, /* 1E18 */ + {0x1E1A,0x1E1B},{0x1E1A,0x1E1B}, /* 1E1A */ + {0x1E1C,0x1E1D},{0x1E1C,0x1E1D}, /* 1E1C */ + {0x1E1E,0x1E1F},{0x1E1E,0x1E1F}, /* 1E1E */ + {0x1E20,0x1E21},{0x1E20,0x1E21}, /* 1E20 */ + {0x1E22,0x1E23},{0x1E22,0x1E23}, /* 1E22 */ + {0x1E24,0x1E25},{0x1E24,0x1E25}, /* 1E24 */ + {0x1E26,0x1E27},{0x1E26,0x1E27}, /* 1E26 */ + {0x1E28,0x1E29},{0x1E28,0x1E29}, /* 1E28 */ + {0x1E2A,0x1E2B},{0x1E2A,0x1E2B}, /* 1E2A */ + {0x1E2C,0x1E2D},{0x1E2C,0x1E2D}, /* 1E2C */ + {0x1E2E,0x1E2F},{0x1E2E,0x1E2F}, /* 1E2E */ + {0x1E30,0x1E31},{0x1E30,0x1E31}, /* 1E30 */ + {0x1E32,0x1E33},{0x1E32,0x1E33}, /* 1E32 */ + {0x1E34,0x1E35},{0x1E34,0x1E35}, /* 1E34 */ + {0x1E36,0x1E37},{0x1E36,0x1E37}, /* 1E36 */ + {0x1E38,0x1E39},{0x1E38,0x1E39}, /* 1E38 */ + {0x1E3A,0x1E3B},{0x1E3A,0x1E3B}, /* 1E3A */ + {0x1E3C,0x1E3D},{0x1E3C,0x1E3D}, /* 1E3C */ + {0x1E3E,0x1E3F},{0x1E3E,0x1E3F}, /* 1E3E */ + {0x1E40,0x1E41},{0x1E40,0x1E41}, /* 1E40 */ + {0x1E42,0x1E43},{0x1E42,0x1E43}, /* 1E42 */ + {0x1E44,0x1E45},{0x1E44,0x1E45}, /* 1E44 */ + {0x1E46,0x1E47},{0x1E46,0x1E47}, /* 1E46 */ + {0x1E48,0x1E49},{0x1E48,0x1E49}, /* 1E48 */ + {0x1E4A,0x1E4B},{0x1E4A,0x1E4B}, /* 1E4A */ + {0x1E4C,0x1E4D},{0x1E4C,0x1E4D}, /* 1E4C */ + {0x1E4E,0x1E4F},{0x1E4E,0x1E4F}, /* 1E4E */ + {0x1E50,0x1E51},{0x1E50,0x1E51}, /* 1E50 */ + {0x1E52,0x1E53},{0x1E52,0x1E53}, /* 1E52 */ + {0x1E54,0x1E55},{0x1E54,0x1E55}, /* 1E54 */ + {0x1E56,0x1E57},{0x1E56,0x1E57}, /* 1E56 */ + {0x1E58,0x1E59},{0x1E58,0x1E59}, /* 1E58 */ + {0x1E5A,0x1E5B},{0x1E5A,0x1E5B}, /* 1E5A */ + {0x1E5C,0x1E5D},{0x1E5C,0x1E5D}, /* 1E5C */ + {0x1E5E,0x1E5F},{0x1E5E,0x1E5F}, /* 1E5E */ + {0x1E60,0x1E61},{0x1E60,0x1E61}, /* 1E60 */ + {0x1E62,0x1E63},{0x1E62,0x1E63}, /* 1E62 */ + {0x1E64,0x1E65},{0x1E64,0x1E65}, /* 1E64 */ + {0x1E66,0x1E67},{0x1E66,0x1E67}, /* 1E66 */ + {0x1E68,0x1E69},{0x1E68,0x1E69}, /* 1E68 */ + {0x1E6A,0x1E6B},{0x1E6A,0x1E6B}, /* 1E6A */ + {0x1E6C,0x1E6D},{0x1E6C,0x1E6D}, /* 1E6C */ + {0x1E6E,0x1E6F},{0x1E6E,0x1E6F}, /* 1E6E */ + {0x1E70,0x1E71},{0x1E70,0x1E71}, /* 1E70 */ + {0x1E72,0x1E73},{0x1E72,0x1E73}, /* 1E72 */ + {0x1E74,0x1E75},{0x1E74,0x1E75}, /* 1E74 */ + {0x1E76,0x1E77},{0x1E76,0x1E77}, /* 1E76 */ + {0x1E78,0x1E79},{0x1E78,0x1E79}, /* 1E78 */ + {0x1E7A,0x1E7B},{0x1E7A,0x1E7B}, /* 1E7A */ + {0x1E7C,0x1E7D},{0x1E7C,0x1E7D}, /* 1E7C */ + {0x1E7E,0x1E7F},{0x1E7E,0x1E7F}, /* 1E7E */ + {0x1E80,0x1E81},{0x1E80,0x1E81}, /* 1E80 */ + {0x1E82,0x1E83},{0x1E82,0x1E83}, /* 1E82 */ + {0x1E84,0x1E85},{0x1E84,0x1E85}, /* 1E84 */ + {0x1E86,0x1E87},{0x1E86,0x1E87}, /* 1E86 */ + {0x1E88,0x1E89},{0x1E88,0x1E89}, /* 1E88 */ + {0x1E8A,0x1E8B},{0x1E8A,0x1E8B}, /* 1E8A */ + {0x1E8C,0x1E8D},{0x1E8C,0x1E8D}, /* 1E8C */ + {0x1E8E,0x1E8F},{0x1E8E,0x1E8F}, /* 1E8E */ + {0x1E90,0x1E91},{0x1E90,0x1E91}, /* 1E90 */ + {0x1E92,0x1E93},{0x1E92,0x1E93}, /* 1E92 */ + {0x1E94,0x1E95},{0x1E94,0x1E95}, /* 1E94 */ + {0x1E96,0x1E96},{0x1E97,0x1E97}, /* 1E96 */ + {0x1E98,0x1E98},{0x1E99,0x1E99}, /* 1E98 */ + {0x1E9A,0x1E9A},{0x1E60,0x1E9B}, /* 1E9A */ + {0x1E9C,0x1E9C},{0x1E9D,0x1E9D}, /* 1E9C */ + {0x1E9E,0x00DF},{0x1E9F,0x1E9F}, /* 1E9E */ + {0x1EA0,0x1EA1},{0x1EA0,0x1EA1}, /* 1EA0 */ + {0x1EA2,0x1EA3},{0x1EA2,0x1EA3}, /* 1EA2 */ + {0x1EA4,0x1EA5},{0x1EA4,0x1EA5}, /* 1EA4 */ + {0x1EA6,0x1EA7},{0x1EA6,0x1EA7}, /* 1EA6 */ + {0x1EA8,0x1EA9},{0x1EA8,0x1EA9}, /* 1EA8 */ + {0x1EAA,0x1EAB},{0x1EAA,0x1EAB}, /* 1EAA */ + {0x1EAC,0x1EAD},{0x1EAC,0x1EAD}, /* 1EAC */ + {0x1EAE,0x1EAF},{0x1EAE,0x1EAF}, /* 1EAE */ + {0x1EB0,0x1EB1},{0x1EB0,0x1EB1}, /* 1EB0 */ + {0x1EB2,0x1EB3},{0x1EB2,0x1EB3}, /* 1EB2 */ + {0x1EB4,0x1EB5},{0x1EB4,0x1EB5}, /* 1EB4 */ + {0x1EB6,0x1EB7},{0x1EB6,0x1EB7}, /* 1EB6 */ + {0x1EB8,0x1EB9},{0x1EB8,0x1EB9}, /* 1EB8 */ + {0x1EBA,0x1EBB},{0x1EBA,0x1EBB}, /* 1EBA */ + {0x1EBC,0x1EBD},{0x1EBC,0x1EBD}, /* 1EBC */ + {0x1EBE,0x1EBF},{0x1EBE,0x1EBF}, /* 1EBE */ + {0x1EC0,0x1EC1},{0x1EC0,0x1EC1}, /* 1EC0 */ + {0x1EC2,0x1EC3},{0x1EC2,0x1EC3}, /* 1EC2 */ + {0x1EC4,0x1EC5},{0x1EC4,0x1EC5}, /* 1EC4 */ + {0x1EC6,0x1EC7},{0x1EC6,0x1EC7}, /* 1EC6 */ + {0x1EC8,0x1EC9},{0x1EC8,0x1EC9}, /* 1EC8 */ + {0x1ECA,0x1ECB},{0x1ECA,0x1ECB}, /* 1ECA */ + {0x1ECC,0x1ECD},{0x1ECC,0x1ECD}, /* 1ECC */ + {0x1ECE,0x1ECF},{0x1ECE,0x1ECF}, /* 1ECE */ + {0x1ED0,0x1ED1},{0x1ED0,0x1ED1}, /* 1ED0 */ + {0x1ED2,0x1ED3},{0x1ED2,0x1ED3}, /* 1ED2 */ + {0x1ED4,0x1ED5},{0x1ED4,0x1ED5}, /* 1ED4 */ + {0x1ED6,0x1ED7},{0x1ED6,0x1ED7}, /* 1ED6 */ + {0x1ED8,0x1ED9},{0x1ED8,0x1ED9}, /* 1ED8 */ + {0x1EDA,0x1EDB},{0x1EDA,0x1EDB}, /* 1EDA */ + {0x1EDC,0x1EDD},{0x1EDC,0x1EDD}, /* 1EDC */ + {0x1EDE,0x1EDF},{0x1EDE,0x1EDF}, /* 1EDE */ + {0x1EE0,0x1EE1},{0x1EE0,0x1EE1}, /* 1EE0 */ + {0x1EE2,0x1EE3},{0x1EE2,0x1EE3}, /* 1EE2 */ + {0x1EE4,0x1EE5},{0x1EE4,0x1EE5}, /* 1EE4 */ + {0x1EE6,0x1EE7},{0x1EE6,0x1EE7}, /* 1EE6 */ + {0x1EE8,0x1EE9},{0x1EE8,0x1EE9}, /* 1EE8 */ + {0x1EEA,0x1EEB},{0x1EEA,0x1EEB}, /* 1EEA */ + {0x1EEC,0x1EED},{0x1EEC,0x1EED}, /* 1EEC */ + {0x1EEE,0x1EEF},{0x1EEE,0x1EEF}, /* 1EEE */ + {0x1EF0,0x1EF1},{0x1EF0,0x1EF1}, /* 1EF0 */ + {0x1EF2,0x1EF3},{0x1EF2,0x1EF3}, /* 1EF2 */ + {0x1EF4,0x1EF5},{0x1EF4,0x1EF5}, /* 1EF4 */ + {0x1EF6,0x1EF7},{0x1EF6,0x1EF7}, /* 1EF6 */ + {0x1EF8,0x1EF9},{0x1EF8,0x1EF9}, /* 1EF8 */ + {0x1EFA,0x1EFB},{0x1EFA,0x1EFB}, /* 1EFA */ + {0x1EFC,0x1EFD},{0x1EFC,0x1EFD}, /* 1EFC */ + {0x1EFE,0x1EFF},{0x1EFE,0x1EFF} /* 1EFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page1F[256]={ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F00 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F02 */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F04 */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F06 */ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F08 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F0A */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F0C */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F0E */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F10 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F12 */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F14 */ + {0x1F16,0x1F16},{0x1F17,0x1F17}, /* 1F16 */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F18 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F1A */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F1C */ + {0x1F1E,0x1F1E},{0x1F1F,0x1F1F}, /* 1F1E */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F20 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F22 */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F24 */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F26 */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F28 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F2A */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F2C */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F2E */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F30 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F32 */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F34 */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F36 */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F38 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F3A */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F3C */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F3E */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F40 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F42 */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F44 */ + {0x1F46,0x1F46},{0x1F47,0x1F47}, /* 1F46 */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F48 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F4A */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F4C */ + {0x1F4E,0x1F4E},{0x1F4F,0x1F4F}, /* 1F4E */ + {0x1F50,0x1F50},{0x1F59,0x1F51}, /* 1F50 */ + {0x1F52,0x1F52},{0x1F5B,0x1F53}, /* 1F52 */ + {0x1F54,0x1F54},{0x1F5D,0x1F55}, /* 1F54 */ + {0x1F56,0x1F56},{0x1F5F,0x1F57}, /* 1F56 */ + {0x1F58,0x1F58},{0x1F59,0x1F51}, /* 1F58 */ + {0x1F5A,0x1F5A},{0x1F5B,0x1F53}, /* 1F5A */ + {0x1F5C,0x1F5C},{0x1F5D,0x1F55}, /* 1F5C */ + {0x1F5E,0x1F5E},{0x1F5F,0x1F57}, /* 1F5E */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F60 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F62 */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F64 */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F66 */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F68 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F6A */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F6C */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F6E */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1F70 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1F72 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1F74 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1F76 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1F78 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1F7A */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1F7C */ + {0x1F7E,0x1F7E},{0x1F7F,0x1F7F}, /* 1F7E */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F80 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F82 */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F84 */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F86 */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F88 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F8A */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F8C */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F8E */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F90 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F92 */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F94 */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F96 */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F98 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F9A */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F9C */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F9E */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA0 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FA2 */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FA4 */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FA6 */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA8 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FAA */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FAC */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FAE */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB0 */ + {0x1FB2,0x1FB2},{0x1FBC,0x1FB3}, /* 1FB2 */ + {0x1FB4,0x1FB4},{0x1FB5,0x1FB5}, /* 1FB4 */ + {0x1FB6,0x1FB6},{0x1FB7,0x1FB7}, /* 1FB6 */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB8 */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1FBA */ + {0x1FBC,0x1FB3},{0x1FBD,0x1FBD}, /* 1FBC */ + {0x0399,0x1FBE},{0x1FBF,0x1FBF}, /* 1FBE */ + {0x1FC0,0x1FC0},{0x1FC1,0x1FC1}, /* 1FC0 */ + {0x1FC2,0x1FC2},{0x1FCC,0x1FC3}, /* 1FC2 */ + {0x1FC4,0x1FC4},{0x1FC5,0x1FC5}, /* 1FC4 */ + {0x1FC6,0x1FC6},{0x1FC7,0x1FC7}, /* 1FC6 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1FC8 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1FCA */ + {0x1FCC,0x1FC3},{0x1FCD,0x1FCD}, /* 1FCC */ + {0x1FCE,0x1FCE},{0x1FCF,0x1FCF}, /* 1FCE */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD0 */ + {0x1FD2,0x1FD2},{0x1FD3,0x1FD3}, /* 1FD2 */ + {0x1FD4,0x1FD4},{0x1FD5,0x1FD5}, /* 1FD4 */ + {0x1FD6,0x1FD6},{0x1FD7,0x1FD7}, /* 1FD6 */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD8 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1FDA */ + {0x1FDC,0x1FDC},{0x1FDD,0x1FDD}, /* 1FDC */ + {0x1FDE,0x1FDE},{0x1FDF,0x1FDF}, /* 1FDE */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE0 */ + {0x1FE2,0x1FE2},{0x1FE3,0x1FE3}, /* 1FE2 */ + {0x1FE4,0x1FE4},{0x1FEC,0x1FE5}, /* 1FE4 */ + {0x1FE6,0x1FE6},{0x1FE7,0x1FE7}, /* 1FE6 */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE8 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1FEA */ + {0x1FEC,0x1FE5},{0x1FED,0x1FED}, /* 1FEC */ + {0x1FEE,0x1FEE},{0x1FEF,0x1FEF}, /* 1FEE */ + {0x1FF0,0x1FF0},{0x1FF1,0x1FF1}, /* 1FF0 */ + {0x1FF2,0x1FF2},{0x1FFC,0x1FF3}, /* 1FF2 */ + {0x1FF4,0x1FF4},{0x1FF5,0x1FF5}, /* 1FF4 */ + {0x1FF6,0x1FF6},{0x1FF7,0x1FF7}, /* 1FF6 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1FF8 */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1FFA */ + {0x1FFC,0x1FF3},{0x1FFD,0x1FFD}, /* 1FFC */ + {0x1FFE,0x1FFE},{0x1FFF,0x1FFF} /* 1FFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page21[256]={ + {0x2100,0x2100},{0x2101,0x2101}, /* 2100 */ + {0x2102,0x2102},{0x2103,0x2103}, /* 2102 */ + {0x2104,0x2104},{0x2105,0x2105}, /* 2104 */ + {0x2106,0x2106},{0x2107,0x2107}, /* 2106 */ + {0x2108,0x2108},{0x2109,0x2109}, /* 2108 */ + {0x210A,0x210A},{0x210B,0x210B}, /* 210A */ + {0x210C,0x210C},{0x210D,0x210D}, /* 210C */ + {0x210E,0x210E},{0x210F,0x210F}, /* 210E */ + {0x2110,0x2110},{0x2111,0x2111}, /* 2110 */ + {0x2112,0x2112},{0x2113,0x2113}, /* 2112 */ + {0x2114,0x2114},{0x2115,0x2115}, /* 2114 */ + {0x2116,0x2116},{0x2117,0x2117}, /* 2116 */ + {0x2118,0x2118},{0x2119,0x2119}, /* 2118 */ + {0x211A,0x211A},{0x211B,0x211B}, /* 211A */ + {0x211C,0x211C},{0x211D,0x211D}, /* 211C */ + {0x211E,0x211E},{0x211F,0x211F}, /* 211E */ + {0x2120,0x2120},{0x2121,0x2121}, /* 2120 */ + {0x2122,0x2122},{0x2123,0x2123}, /* 2122 */ + {0x2124,0x2124},{0x2125,0x2125}, /* 2124 */ + {0x2126,0x03C9},{0x2127,0x2127}, /* 2126 */ + {0x2128,0x2128},{0x2129,0x2129}, /* 2128 */ + {0x212A,0x006B},{0x212B,0x00E5}, /* 212A */ + {0x212C,0x212C},{0x212D,0x212D}, /* 212C */ + {0x212E,0x212E},{0x212F,0x212F}, /* 212E */ + {0x2130,0x2130},{0x2131,0x2131}, /* 2130 */ + {0x2132,0x214E},{0x2133,0x2133}, /* 2132 */ + {0x2134,0x2134},{0x2135,0x2135}, /* 2134 */ + {0x2136,0x2136},{0x2137,0x2137}, /* 2136 */ + {0x2138,0x2138},{0x2139,0x2139}, /* 2138 */ + {0x213A,0x213A},{0x213B,0x213B}, /* 213A */ + {0x213C,0x213C},{0x213D,0x213D}, /* 213C */ + {0x213E,0x213E},{0x213F,0x213F}, /* 213E */ + {0x2140,0x2140},{0x2141,0x2141}, /* 2140 */ + {0x2142,0x2142},{0x2143,0x2143}, /* 2142 */ + {0x2144,0x2144},{0x2145,0x2145}, /* 2144 */ + {0x2146,0x2146},{0x2147,0x2147}, /* 2146 */ + {0x2148,0x2148},{0x2149,0x2149}, /* 2148 */ + {0x214A,0x214A},{0x214B,0x214B}, /* 214A */ + {0x214C,0x214C},{0x214D,0x214D}, /* 214C */ + {0x2132,0x214E},{0x214F,0x214F}, /* 214E */ + {0x2150,0x2150},{0x2151,0x2151}, /* 2150 */ + {0x2152,0x2152},{0x2153,0x2153}, /* 2152 */ + {0x2154,0x2154},{0x2155,0x2155}, /* 2154 */ + {0x2156,0x2156},{0x2157,0x2157}, /* 2156 */ + {0x2158,0x2158},{0x2159,0x2159}, /* 2158 */ + {0x215A,0x215A},{0x215B,0x215B}, /* 215A */ + {0x215C,0x215C},{0x215D,0x215D}, /* 215C */ + {0x215E,0x215E},{0x215F,0x215F}, /* 215E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2160 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2162 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2164 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2166 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2168 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 216A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 216C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 216E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2170 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2172 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2174 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2176 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2178 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 217A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 217C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 217E */ + {0x2180,0x2180},{0x2181,0x2181}, /* 2180 */ + {0x2182,0x2182},{0x2183,0x2184}, /* 2182 */ + {0x2183,0x2184},{0x2185,0x2185}, /* 2184 */ + {0x2186,0x2186},{0x2187,0x2187}, /* 2186 */ + {0x2188,0x2188},{0x2189,0x2189}, /* 2188 */ + {0x218A,0x218A},{0x218B,0x218B}, /* 218A */ + {0x218C,0x218C},{0x218D,0x218D}, /* 218C */ + {0x218E,0x218E},{0x218F,0x218F}, /* 218E */ + {0x2190,0x2190},{0x2191,0x2191}, /* 2190 */ + {0x2192,0x2192},{0x2193,0x2193}, /* 2192 */ + {0x2194,0x2194},{0x2195,0x2195}, /* 2194 */ + {0x2196,0x2196},{0x2197,0x2197}, /* 2196 */ + {0x2198,0x2198},{0x2199,0x2199}, /* 2198 */ + {0x219A,0x219A},{0x219B,0x219B}, /* 219A */ + {0x219C,0x219C},{0x219D,0x219D}, /* 219C */ + {0x219E,0x219E},{0x219F,0x219F}, /* 219E */ + {0x21A0,0x21A0},{0x21A1,0x21A1}, /* 21A0 */ + {0x21A2,0x21A2},{0x21A3,0x21A3}, /* 21A2 */ + {0x21A4,0x21A4},{0x21A5,0x21A5}, /* 21A4 */ + {0x21A6,0x21A6},{0x21A7,0x21A7}, /* 21A6 */ + {0x21A8,0x21A8},{0x21A9,0x21A9}, /* 21A8 */ + {0x21AA,0x21AA},{0x21AB,0x21AB}, /* 21AA */ + {0x21AC,0x21AC},{0x21AD,0x21AD}, /* 21AC */ + {0x21AE,0x21AE},{0x21AF,0x21AF}, /* 21AE */ + {0x21B0,0x21B0},{0x21B1,0x21B1}, /* 21B0 */ + {0x21B2,0x21B2},{0x21B3,0x21B3}, /* 21B2 */ + {0x21B4,0x21B4},{0x21B5,0x21B5}, /* 21B4 */ + {0x21B6,0x21B6},{0x21B7,0x21B7}, /* 21B6 */ + {0x21B8,0x21B8},{0x21B9,0x21B9}, /* 21B8 */ + {0x21BA,0x21BA},{0x21BB,0x21BB}, /* 21BA */ + {0x21BC,0x21BC},{0x21BD,0x21BD}, /* 21BC */ + {0x21BE,0x21BE},{0x21BF,0x21BF}, /* 21BE */ + {0x21C0,0x21C0},{0x21C1,0x21C1}, /* 21C0 */ + {0x21C2,0x21C2},{0x21C3,0x21C3}, /* 21C2 */ + {0x21C4,0x21C4},{0x21C5,0x21C5}, /* 21C4 */ + {0x21C6,0x21C6},{0x21C7,0x21C7}, /* 21C6 */ + {0x21C8,0x21C8},{0x21C9,0x21C9}, /* 21C8 */ + {0x21CA,0x21CA},{0x21CB,0x21CB}, /* 21CA */ + {0x21CC,0x21CC},{0x21CD,0x21CD}, /* 21CC */ + {0x21CE,0x21CE},{0x21CF,0x21CF}, /* 21CE */ + {0x21D0,0x21D0},{0x21D1,0x21D1}, /* 21D0 */ + {0x21D2,0x21D2},{0x21D3,0x21D3}, /* 21D2 */ + {0x21D4,0x21D4},{0x21D5,0x21D5}, /* 21D4 */ + {0x21D6,0x21D6},{0x21D7,0x21D7}, /* 21D6 */ + {0x21D8,0x21D8},{0x21D9,0x21D9}, /* 21D8 */ + {0x21DA,0x21DA},{0x21DB,0x21DB}, /* 21DA */ + {0x21DC,0x21DC},{0x21DD,0x21DD}, /* 21DC */ + {0x21DE,0x21DE},{0x21DF,0x21DF}, /* 21DE */ + {0x21E0,0x21E0},{0x21E1,0x21E1}, /* 21E0 */ + {0x21E2,0x21E2},{0x21E3,0x21E3}, /* 21E2 */ + {0x21E4,0x21E4},{0x21E5,0x21E5}, /* 21E4 */ + {0x21E6,0x21E6},{0x21E7,0x21E7}, /* 21E6 */ + {0x21E8,0x21E8},{0x21E9,0x21E9}, /* 21E8 */ + {0x21EA,0x21EA},{0x21EB,0x21EB}, /* 21EA */ + {0x21EC,0x21EC},{0x21ED,0x21ED}, /* 21EC */ + {0x21EE,0x21EE},{0x21EF,0x21EF}, /* 21EE */ + {0x21F0,0x21F0},{0x21F1,0x21F1}, /* 21F0 */ + {0x21F2,0x21F2},{0x21F3,0x21F3}, /* 21F2 */ + {0x21F4,0x21F4},{0x21F5,0x21F5}, /* 21F4 */ + {0x21F6,0x21F6},{0x21F7,0x21F7}, /* 21F6 */ + {0x21F8,0x21F8},{0x21F9,0x21F9}, /* 21F8 */ + {0x21FA,0x21FA},{0x21FB,0x21FB}, /* 21FA */ + {0x21FC,0x21FC},{0x21FD,0x21FD}, /* 21FC */ + {0x21FE,0x21FE},{0x21FF,0x21FF} /* 21FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page24[256]={ + {0x2400,0x2400},{0x2401,0x2401}, /* 2400 */ + {0x2402,0x2402},{0x2403,0x2403}, /* 2402 */ + {0x2404,0x2404},{0x2405,0x2405}, /* 2404 */ + {0x2406,0x2406},{0x2407,0x2407}, /* 2406 */ + {0x2408,0x2408},{0x2409,0x2409}, /* 2408 */ + {0x240A,0x240A},{0x240B,0x240B}, /* 240A */ + {0x240C,0x240C},{0x240D,0x240D}, /* 240C */ + {0x240E,0x240E},{0x240F,0x240F}, /* 240E */ + {0x2410,0x2410},{0x2411,0x2411}, /* 2410 */ + {0x2412,0x2412},{0x2413,0x2413}, /* 2412 */ + {0x2414,0x2414},{0x2415,0x2415}, /* 2414 */ + {0x2416,0x2416},{0x2417,0x2417}, /* 2416 */ + {0x2418,0x2418},{0x2419,0x2419}, /* 2418 */ + {0x241A,0x241A},{0x241B,0x241B}, /* 241A */ + {0x241C,0x241C},{0x241D,0x241D}, /* 241C */ + {0x241E,0x241E},{0x241F,0x241F}, /* 241E */ + {0x2420,0x2420},{0x2421,0x2421}, /* 2420 */ + {0x2422,0x2422},{0x2423,0x2423}, /* 2422 */ + {0x2424,0x2424},{0x2425,0x2425}, /* 2424 */ + {0x2426,0x2426},{0x2427,0x2427}, /* 2426 */ + {0x2428,0x2428},{0x2429,0x2429}, /* 2428 */ + {0x242A,0x242A},{0x242B,0x242B}, /* 242A */ + {0x242C,0x242C},{0x242D,0x242D}, /* 242C */ + {0x242E,0x242E},{0x242F,0x242F}, /* 242E */ + {0x2430,0x2430},{0x2431,0x2431}, /* 2430 */ + {0x2432,0x2432},{0x2433,0x2433}, /* 2432 */ + {0x2434,0x2434},{0x2435,0x2435}, /* 2434 */ + {0x2436,0x2436},{0x2437,0x2437}, /* 2436 */ + {0x2438,0x2438},{0x2439,0x2439}, /* 2438 */ + {0x243A,0x243A},{0x243B,0x243B}, /* 243A */ + {0x243C,0x243C},{0x243D,0x243D}, /* 243C */ + {0x243E,0x243E},{0x243F,0x243F}, /* 243E */ + {0x2440,0x2440},{0x2441,0x2441}, /* 2440 */ + {0x2442,0x2442},{0x2443,0x2443}, /* 2442 */ + {0x2444,0x2444},{0x2445,0x2445}, /* 2444 */ + {0x2446,0x2446},{0x2447,0x2447}, /* 2446 */ + {0x2448,0x2448},{0x2449,0x2449}, /* 2448 */ + {0x244A,0x244A},{0x244B,0x244B}, /* 244A */ + {0x244C,0x244C},{0x244D,0x244D}, /* 244C */ + {0x244E,0x244E},{0x244F,0x244F}, /* 244E */ + {0x2450,0x2450},{0x2451,0x2451}, /* 2450 */ + {0x2452,0x2452},{0x2453,0x2453}, /* 2452 */ + {0x2454,0x2454},{0x2455,0x2455}, /* 2454 */ + {0x2456,0x2456},{0x2457,0x2457}, /* 2456 */ + {0x2458,0x2458},{0x2459,0x2459}, /* 2458 */ + {0x245A,0x245A},{0x245B,0x245B}, /* 245A */ + {0x245C,0x245C},{0x245D,0x245D}, /* 245C */ + {0x245E,0x245E},{0x245F,0x245F}, /* 245E */ + {0x2460,0x2460},{0x2461,0x2461}, /* 2460 */ + {0x2462,0x2462},{0x2463,0x2463}, /* 2462 */ + {0x2464,0x2464},{0x2465,0x2465}, /* 2464 */ + {0x2466,0x2466},{0x2467,0x2467}, /* 2466 */ + {0x2468,0x2468},{0x2469,0x2469}, /* 2468 */ + {0x246A,0x246A},{0x246B,0x246B}, /* 246A */ + {0x246C,0x246C},{0x246D,0x246D}, /* 246C */ + {0x246E,0x246E},{0x246F,0x246F}, /* 246E */ + {0x2470,0x2470},{0x2471,0x2471}, /* 2470 */ + {0x2472,0x2472},{0x2473,0x2473}, /* 2472 */ + {0x2474,0x2474},{0x2475,0x2475}, /* 2474 */ + {0x2476,0x2476},{0x2477,0x2477}, /* 2476 */ + {0x2478,0x2478},{0x2479,0x2479}, /* 2478 */ + {0x247A,0x247A},{0x247B,0x247B}, /* 247A */ + {0x247C,0x247C},{0x247D,0x247D}, /* 247C */ + {0x247E,0x247E},{0x247F,0x247F}, /* 247E */ + {0x2480,0x2480},{0x2481,0x2481}, /* 2480 */ + {0x2482,0x2482},{0x2483,0x2483}, /* 2482 */ + {0x2484,0x2484},{0x2485,0x2485}, /* 2484 */ + {0x2486,0x2486},{0x2487,0x2487}, /* 2486 */ + {0x2488,0x2488},{0x2489,0x2489}, /* 2488 */ + {0x248A,0x248A},{0x248B,0x248B}, /* 248A */ + {0x248C,0x248C},{0x248D,0x248D}, /* 248C */ + {0x248E,0x248E},{0x248F,0x248F}, /* 248E */ + {0x2490,0x2490},{0x2491,0x2491}, /* 2490 */ + {0x2492,0x2492},{0x2493,0x2493}, /* 2492 */ + {0x2494,0x2494},{0x2495,0x2495}, /* 2494 */ + {0x2496,0x2496},{0x2497,0x2497}, /* 2496 */ + {0x2498,0x2498},{0x2499,0x2499}, /* 2498 */ + {0x249A,0x249A},{0x249B,0x249B}, /* 249A */ + {0x249C,0x249C},{0x249D,0x249D}, /* 249C */ + {0x249E,0x249E},{0x249F,0x249F}, /* 249E */ + {0x24A0,0x24A0},{0x24A1,0x24A1}, /* 24A0 */ + {0x24A2,0x24A2},{0x24A3,0x24A3}, /* 24A2 */ + {0x24A4,0x24A4},{0x24A5,0x24A5}, /* 24A4 */ + {0x24A6,0x24A6},{0x24A7,0x24A7}, /* 24A6 */ + {0x24A8,0x24A8},{0x24A9,0x24A9}, /* 24A8 */ + {0x24AA,0x24AA},{0x24AB,0x24AB}, /* 24AA */ + {0x24AC,0x24AC},{0x24AD,0x24AD}, /* 24AC */ + {0x24AE,0x24AE},{0x24AF,0x24AF}, /* 24AE */ + {0x24B0,0x24B0},{0x24B1,0x24B1}, /* 24B0 */ + {0x24B2,0x24B2},{0x24B3,0x24B3}, /* 24B2 */ + {0x24B4,0x24B4},{0x24B5,0x24B5}, /* 24B4 */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24B6 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24B8 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24BA */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24BC */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24BE */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24C0 */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24C2 */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24C4 */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24C6 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24C8 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24CA */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24CC */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24CE */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24D0 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24D2 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24D4 */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24D6 */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24D8 */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24DA */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24DC */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24DE */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24E0 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24E2 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24E4 */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24E6 */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24E8 */ + {0x24EA,0x24EA},{0x24EB,0x24EB}, /* 24EA */ + {0x24EC,0x24EC},{0x24ED,0x24ED}, /* 24EC */ + {0x24EE,0x24EE},{0x24EF,0x24EF}, /* 24EE */ + {0x24F0,0x24F0},{0x24F1,0x24F1}, /* 24F0 */ + {0x24F2,0x24F2},{0x24F3,0x24F3}, /* 24F2 */ + {0x24F4,0x24F4},{0x24F5,0x24F5}, /* 24F4 */ + {0x24F6,0x24F6},{0x24F7,0x24F7}, /* 24F6 */ + {0x24F8,0x24F8},{0x24F9,0x24F9}, /* 24F8 */ + {0x24FA,0x24FA},{0x24FB,0x24FB}, /* 24FA */ + {0x24FC,0x24FC},{0x24FD,0x24FD}, /* 24FC */ + {0x24FE,0x24FE},{0x24FF,0x24FF} /* 24FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page2C[256]={ + {0x2C00,0x2C30},{0x2C01,0x2C31}, /* 2C00 */ + {0x2C02,0x2C32},{0x2C03,0x2C33}, /* 2C02 */ + {0x2C04,0x2C34},{0x2C05,0x2C35}, /* 2C04 */ + {0x2C06,0x2C36},{0x2C07,0x2C37}, /* 2C06 */ + {0x2C08,0x2C38},{0x2C09,0x2C39}, /* 2C08 */ + {0x2C0A,0x2C3A},{0x2C0B,0x2C3B}, /* 2C0A */ + {0x2C0C,0x2C3C},{0x2C0D,0x2C3D}, /* 2C0C */ + {0x2C0E,0x2C3E},{0x2C0F,0x2C3F}, /* 2C0E */ + {0x2C10,0x2C40},{0x2C11,0x2C41}, /* 2C10 */ + {0x2C12,0x2C42},{0x2C13,0x2C43}, /* 2C12 */ + {0x2C14,0x2C44},{0x2C15,0x2C45}, /* 2C14 */ + {0x2C16,0x2C46},{0x2C17,0x2C47}, /* 2C16 */ + {0x2C18,0x2C48},{0x2C19,0x2C49}, /* 2C18 */ + {0x2C1A,0x2C4A},{0x2C1B,0x2C4B}, /* 2C1A */ + {0x2C1C,0x2C4C},{0x2C1D,0x2C4D}, /* 2C1C */ + {0x2C1E,0x2C4E},{0x2C1F,0x2C4F}, /* 2C1E */ + {0x2C20,0x2C50},{0x2C21,0x2C51}, /* 2C20 */ + {0x2C22,0x2C52},{0x2C23,0x2C53}, /* 2C22 */ + {0x2C24,0x2C54},{0x2C25,0x2C55}, /* 2C24 */ + {0x2C26,0x2C56},{0x2C27,0x2C57}, /* 2C26 */ + {0x2C28,0x2C58},{0x2C29,0x2C59}, /* 2C28 */ + {0x2C2A,0x2C5A},{0x2C2B,0x2C5B}, /* 2C2A */ + {0x2C2C,0x2C5C},{0x2C2D,0x2C5D}, /* 2C2C */ + {0x2C2E,0x2C5E},{0x2C2F,0x2C2F}, /* 2C2E */ + {0x2C00,0x2C30},{0x2C01,0x2C31}, /* 2C30 */ + {0x2C02,0x2C32},{0x2C03,0x2C33}, /* 2C32 */ + {0x2C04,0x2C34},{0x2C05,0x2C35}, /* 2C34 */ + {0x2C06,0x2C36},{0x2C07,0x2C37}, /* 2C36 */ + {0x2C08,0x2C38},{0x2C09,0x2C39}, /* 2C38 */ + {0x2C0A,0x2C3A},{0x2C0B,0x2C3B}, /* 2C3A */ + {0x2C0C,0x2C3C},{0x2C0D,0x2C3D}, /* 2C3C */ + {0x2C0E,0x2C3E},{0x2C0F,0x2C3F}, /* 2C3E */ + {0x2C10,0x2C40},{0x2C11,0x2C41}, /* 2C40 */ + {0x2C12,0x2C42},{0x2C13,0x2C43}, /* 2C42 */ + {0x2C14,0x2C44},{0x2C15,0x2C45}, /* 2C44 */ + {0x2C16,0x2C46},{0x2C17,0x2C47}, /* 2C46 */ + {0x2C18,0x2C48},{0x2C19,0x2C49}, /* 2C48 */ + {0x2C1A,0x2C4A},{0x2C1B,0x2C4B}, /* 2C4A */ + {0x2C1C,0x2C4C},{0x2C1D,0x2C4D}, /* 2C4C */ + {0x2C1E,0x2C4E},{0x2C1F,0x2C4F}, /* 2C4E */ + {0x2C20,0x2C50},{0x2C21,0x2C51}, /* 2C50 */ + {0x2C22,0x2C52},{0x2C23,0x2C53}, /* 2C52 */ + {0x2C24,0x2C54},{0x2C25,0x2C55}, /* 2C54 */ + {0x2C26,0x2C56},{0x2C27,0x2C57}, /* 2C56 */ + {0x2C28,0x2C58},{0x2C29,0x2C59}, /* 2C58 */ + {0x2C2A,0x2C5A},{0x2C2B,0x2C5B}, /* 2C5A */ + {0x2C2C,0x2C5C},{0x2C2D,0x2C5D}, /* 2C5C */ + {0x2C2E,0x2C5E},{0x2C5F,0x2C5F}, /* 2C5E */ + {0x2C60,0x2C61},{0x2C60,0x2C61}, /* 2C60 */ + {0x2C62,0x026B},{0x2C63,0x1D7D}, /* 2C62 */ + {0x2C64,0x027D},{0x023A,0x2C65}, /* 2C64 */ + {0x023E,0x2C66},{0x2C67,0x2C68}, /* 2C66 */ + {0x2C67,0x2C68},{0x2C69,0x2C6A}, /* 2C68 */ + {0x2C69,0x2C6A},{0x2C6B,0x2C6C}, /* 2C6A */ + {0x2C6B,0x2C6C},{0x2C6D,0x0251}, /* 2C6C */ + {0x2C6E,0x0271},{0x2C6F,0x0250}, /* 2C6E */ + {0x2C70,0x0252},{0x2C71,0x2C71}, /* 2C70 */ + {0x2C72,0x2C73},{0x2C72,0x2C73}, /* 2C72 */ + {0x2C74,0x2C74},{0x2C75,0x2C76}, /* 2C74 */ + {0x2C75,0x2C76},{0x2C77,0x2C77}, /* 2C76 */ + {0x2C78,0x2C78},{0x2C79,0x2C79}, /* 2C78 */ + {0x2C7A,0x2C7A},{0x2C7B,0x2C7B}, /* 2C7A */ + {0x2C7C,0x2C7C},{0x2C7D,0x2C7D}, /* 2C7C */ + {0x2C7E,0x023F},{0x2C7F,0x0240}, /* 2C7E */ + {0x2C80,0x2C81},{0x2C80,0x2C81}, /* 2C80 */ + {0x2C82,0x2C83},{0x2C82,0x2C83}, /* 2C82 */ + {0x2C84,0x2C85},{0x2C84,0x2C85}, /* 2C84 */ + {0x2C86,0x2C87},{0x2C86,0x2C87}, /* 2C86 */ + {0x2C88,0x2C89},{0x2C88,0x2C89}, /* 2C88 */ + {0x2C8A,0x2C8B},{0x2C8A,0x2C8B}, /* 2C8A */ + {0x2C8C,0x2C8D},{0x2C8C,0x2C8D}, /* 2C8C */ + {0x2C8E,0x2C8F},{0x2C8E,0x2C8F}, /* 2C8E */ + {0x2C90,0x2C91},{0x2C90,0x2C91}, /* 2C90 */ + {0x2C92,0x2C93},{0x2C92,0x2C93}, /* 2C92 */ + {0x2C94,0x2C95},{0x2C94,0x2C95}, /* 2C94 */ + {0x2C96,0x2C97},{0x2C96,0x2C97}, /* 2C96 */ + {0x2C98,0x2C99},{0x2C98,0x2C99}, /* 2C98 */ + {0x2C9A,0x2C9B},{0x2C9A,0x2C9B}, /* 2C9A */ + {0x2C9C,0x2C9D},{0x2C9C,0x2C9D}, /* 2C9C */ + {0x2C9E,0x2C9F},{0x2C9E,0x2C9F}, /* 2C9E */ + {0x2CA0,0x2CA1},{0x2CA0,0x2CA1}, /* 2CA0 */ + {0x2CA2,0x2CA3},{0x2CA2,0x2CA3}, /* 2CA2 */ + {0x2CA4,0x2CA5},{0x2CA4,0x2CA5}, /* 2CA4 */ + {0x2CA6,0x2CA7},{0x2CA6,0x2CA7}, /* 2CA6 */ + {0x2CA8,0x2CA9},{0x2CA8,0x2CA9}, /* 2CA8 */ + {0x2CAA,0x2CAB},{0x2CAA,0x2CAB}, /* 2CAA */ + {0x2CAC,0x2CAD},{0x2CAC,0x2CAD}, /* 2CAC */ + {0x2CAE,0x2CAF},{0x2CAE,0x2CAF}, /* 2CAE */ + {0x2CB0,0x2CB1},{0x2CB0,0x2CB1}, /* 2CB0 */ + {0x2CB2,0x2CB3},{0x2CB2,0x2CB3}, /* 2CB2 */ + {0x2CB4,0x2CB5},{0x2CB4,0x2CB5}, /* 2CB4 */ + {0x2CB6,0x2CB7},{0x2CB6,0x2CB7}, /* 2CB6 */ + {0x2CB8,0x2CB9},{0x2CB8,0x2CB9}, /* 2CB8 */ + {0x2CBA,0x2CBB},{0x2CBA,0x2CBB}, /* 2CBA */ + {0x2CBC,0x2CBD},{0x2CBC,0x2CBD}, /* 2CBC */ + {0x2CBE,0x2CBF},{0x2CBE,0x2CBF}, /* 2CBE */ + {0x2CC0,0x2CC1},{0x2CC0,0x2CC1}, /* 2CC0 */ + {0x2CC2,0x2CC3},{0x2CC2,0x2CC3}, /* 2CC2 */ + {0x2CC4,0x2CC5},{0x2CC4,0x2CC5}, /* 2CC4 */ + {0x2CC6,0x2CC7},{0x2CC6,0x2CC7}, /* 2CC6 */ + {0x2CC8,0x2CC9},{0x2CC8,0x2CC9}, /* 2CC8 */ + {0x2CCA,0x2CCB},{0x2CCA,0x2CCB}, /* 2CCA */ + {0x2CCC,0x2CCD},{0x2CCC,0x2CCD}, /* 2CCC */ + {0x2CCE,0x2CCF},{0x2CCE,0x2CCF}, /* 2CCE */ + {0x2CD0,0x2CD1},{0x2CD0,0x2CD1}, /* 2CD0 */ + {0x2CD2,0x2CD3},{0x2CD2,0x2CD3}, /* 2CD2 */ + {0x2CD4,0x2CD5},{0x2CD4,0x2CD5}, /* 2CD4 */ + {0x2CD6,0x2CD7},{0x2CD6,0x2CD7}, /* 2CD6 */ + {0x2CD8,0x2CD9},{0x2CD8,0x2CD9}, /* 2CD8 */ + {0x2CDA,0x2CDB},{0x2CDA,0x2CDB}, /* 2CDA */ + {0x2CDC,0x2CDD},{0x2CDC,0x2CDD}, /* 2CDC */ + {0x2CDE,0x2CDF},{0x2CDE,0x2CDF}, /* 2CDE */ + {0x2CE0,0x2CE1},{0x2CE0,0x2CE1}, /* 2CE0 */ + {0x2CE2,0x2CE3},{0x2CE2,0x2CE3}, /* 2CE2 */ + {0x2CE4,0x2CE4},{0x2CE5,0x2CE5}, /* 2CE4 */ + {0x2CE6,0x2CE6},{0x2CE7,0x2CE7}, /* 2CE6 */ + {0x2CE8,0x2CE8},{0x2CE9,0x2CE9}, /* 2CE8 */ + {0x2CEA,0x2CEA},{0x2CEB,0x2CEC}, /* 2CEA */ + {0x2CEB,0x2CEC},{0x2CED,0x2CEE}, /* 2CEC */ + {0x2CED,0x2CEE},{0x2CEF,0x2CEF}, /* 2CEE */ + {0x2CF0,0x2CF0},{0x2CF1,0x2CF1}, /* 2CF0 */ + {0x2CF2,0x2CF2},{0x2CF3,0x2CF3}, /* 2CF2 */ + {0x2CF4,0x2CF4},{0x2CF5,0x2CF5}, /* 2CF4 */ + {0x2CF6,0x2CF6},{0x2CF7,0x2CF7}, /* 2CF6 */ + {0x2CF8,0x2CF8},{0x2CF9,0x2CF9}, /* 2CF8 */ + {0x2CFA,0x2CFA},{0x2CFB,0x2CFB}, /* 2CFA */ + {0x2CFC,0x2CFC},{0x2CFD,0x2CFD}, /* 2CFC */ + {0x2CFE,0x2CFE},{0x2CFF,0x2CFF} /* 2CFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page2D[256]={ + {0x10A0,0x2D00},{0x10A1,0x2D01}, /* 2D00 */ + {0x10A2,0x2D02},{0x10A3,0x2D03}, /* 2D02 */ + {0x10A4,0x2D04},{0x10A5,0x2D05}, /* 2D04 */ + {0x10A6,0x2D06},{0x10A7,0x2D07}, /* 2D06 */ + {0x10A8,0x2D08},{0x10A9,0x2D09}, /* 2D08 */ + {0x10AA,0x2D0A},{0x10AB,0x2D0B}, /* 2D0A */ + {0x10AC,0x2D0C},{0x10AD,0x2D0D}, /* 2D0C */ + {0x10AE,0x2D0E},{0x10AF,0x2D0F}, /* 2D0E */ + {0x10B0,0x2D10},{0x10B1,0x2D11}, /* 2D10 */ + {0x10B2,0x2D12},{0x10B3,0x2D13}, /* 2D12 */ + {0x10B4,0x2D14},{0x10B5,0x2D15}, /* 2D14 */ + {0x10B6,0x2D16},{0x10B7,0x2D17}, /* 2D16 */ + {0x10B8,0x2D18},{0x10B9,0x2D19}, /* 2D18 */ + {0x10BA,0x2D1A},{0x10BB,0x2D1B}, /* 2D1A */ + {0x10BC,0x2D1C},{0x10BD,0x2D1D}, /* 2D1C */ + {0x10BE,0x2D1E},{0x10BF,0x2D1F}, /* 2D1E */ + {0x10C0,0x2D20},{0x10C1,0x2D21}, /* 2D20 */ + {0x10C2,0x2D22},{0x10C3,0x2D23}, /* 2D22 */ + {0x10C4,0x2D24},{0x10C5,0x2D25}, /* 2D24 */ + {0x2D26,0x2D26},{0x2D27,0x2D27}, /* 2D26 */ + {0x2D28,0x2D28},{0x2D29,0x2D29}, /* 2D28 */ + {0x2D2A,0x2D2A},{0x2D2B,0x2D2B}, /* 2D2A */ + {0x2D2C,0x2D2C},{0x2D2D,0x2D2D}, /* 2D2C */ + {0x2D2E,0x2D2E},{0x2D2F,0x2D2F}, /* 2D2E */ + {0x2D30,0x2D30},{0x2D31,0x2D31}, /* 2D30 */ + {0x2D32,0x2D32},{0x2D33,0x2D33}, /* 2D32 */ + {0x2D34,0x2D34},{0x2D35,0x2D35}, /* 2D34 */ + {0x2D36,0x2D36},{0x2D37,0x2D37}, /* 2D36 */ + {0x2D38,0x2D38},{0x2D39,0x2D39}, /* 2D38 */ + {0x2D3A,0x2D3A},{0x2D3B,0x2D3B}, /* 2D3A */ + {0x2D3C,0x2D3C},{0x2D3D,0x2D3D}, /* 2D3C */ + {0x2D3E,0x2D3E},{0x2D3F,0x2D3F}, /* 2D3E */ + {0x2D40,0x2D40},{0x2D41,0x2D41}, /* 2D40 */ + {0x2D42,0x2D42},{0x2D43,0x2D43}, /* 2D42 */ + {0x2D44,0x2D44},{0x2D45,0x2D45}, /* 2D44 */ + {0x2D46,0x2D46},{0x2D47,0x2D47}, /* 2D46 */ + {0x2D48,0x2D48},{0x2D49,0x2D49}, /* 2D48 */ + {0x2D4A,0x2D4A},{0x2D4B,0x2D4B}, /* 2D4A */ + {0x2D4C,0x2D4C},{0x2D4D,0x2D4D}, /* 2D4C */ + {0x2D4E,0x2D4E},{0x2D4F,0x2D4F}, /* 2D4E */ + {0x2D50,0x2D50},{0x2D51,0x2D51}, /* 2D50 */ + {0x2D52,0x2D52},{0x2D53,0x2D53}, /* 2D52 */ + {0x2D54,0x2D54},{0x2D55,0x2D55}, /* 2D54 */ + {0x2D56,0x2D56},{0x2D57,0x2D57}, /* 2D56 */ + {0x2D58,0x2D58},{0x2D59,0x2D59}, /* 2D58 */ + {0x2D5A,0x2D5A},{0x2D5B,0x2D5B}, /* 2D5A */ + {0x2D5C,0x2D5C},{0x2D5D,0x2D5D}, /* 2D5C */ + {0x2D5E,0x2D5E},{0x2D5F,0x2D5F}, /* 2D5E */ + {0x2D60,0x2D60},{0x2D61,0x2D61}, /* 2D60 */ + {0x2D62,0x2D62},{0x2D63,0x2D63}, /* 2D62 */ + {0x2D64,0x2D64},{0x2D65,0x2D65}, /* 2D64 */ + {0x2D66,0x2D66},{0x2D67,0x2D67}, /* 2D66 */ + {0x2D68,0x2D68},{0x2D69,0x2D69}, /* 2D68 */ + {0x2D6A,0x2D6A},{0x2D6B,0x2D6B}, /* 2D6A */ + {0x2D6C,0x2D6C},{0x2D6D,0x2D6D}, /* 2D6C */ + {0x2D6E,0x2D6E},{0x2D6F,0x2D6F}, /* 2D6E */ + {0x2D70,0x2D70},{0x2D71,0x2D71}, /* 2D70 */ + {0x2D72,0x2D72},{0x2D73,0x2D73}, /* 2D72 */ + {0x2D74,0x2D74},{0x2D75,0x2D75}, /* 2D74 */ + {0x2D76,0x2D76},{0x2D77,0x2D77}, /* 2D76 */ + {0x2D78,0x2D78},{0x2D79,0x2D79}, /* 2D78 */ + {0x2D7A,0x2D7A},{0x2D7B,0x2D7B}, /* 2D7A */ + {0x2D7C,0x2D7C},{0x2D7D,0x2D7D}, /* 2D7C */ + {0x2D7E,0x2D7E},{0x2D7F,0x2D7F}, /* 2D7E */ + {0x2D80,0x2D80},{0x2D81,0x2D81}, /* 2D80 */ + {0x2D82,0x2D82},{0x2D83,0x2D83}, /* 2D82 */ + {0x2D84,0x2D84},{0x2D85,0x2D85}, /* 2D84 */ + {0x2D86,0x2D86},{0x2D87,0x2D87}, /* 2D86 */ + {0x2D88,0x2D88},{0x2D89,0x2D89}, /* 2D88 */ + {0x2D8A,0x2D8A},{0x2D8B,0x2D8B}, /* 2D8A */ + {0x2D8C,0x2D8C},{0x2D8D,0x2D8D}, /* 2D8C */ + {0x2D8E,0x2D8E},{0x2D8F,0x2D8F}, /* 2D8E */ + {0x2D90,0x2D90},{0x2D91,0x2D91}, /* 2D90 */ + {0x2D92,0x2D92},{0x2D93,0x2D93}, /* 2D92 */ + {0x2D94,0x2D94},{0x2D95,0x2D95}, /* 2D94 */ + {0x2D96,0x2D96},{0x2D97,0x2D97}, /* 2D96 */ + {0x2D98,0x2D98},{0x2D99,0x2D99}, /* 2D98 */ + {0x2D9A,0x2D9A},{0x2D9B,0x2D9B}, /* 2D9A */ + {0x2D9C,0x2D9C},{0x2D9D,0x2D9D}, /* 2D9C */ + {0x2D9E,0x2D9E},{0x2D9F,0x2D9F}, /* 2D9E */ + {0x2DA0,0x2DA0},{0x2DA1,0x2DA1}, /* 2DA0 */ + {0x2DA2,0x2DA2},{0x2DA3,0x2DA3}, /* 2DA2 */ + {0x2DA4,0x2DA4},{0x2DA5,0x2DA5}, /* 2DA4 */ + {0x2DA6,0x2DA6},{0x2DA7,0x2DA7}, /* 2DA6 */ + {0x2DA8,0x2DA8},{0x2DA9,0x2DA9}, /* 2DA8 */ + {0x2DAA,0x2DAA},{0x2DAB,0x2DAB}, /* 2DAA */ + {0x2DAC,0x2DAC},{0x2DAD,0x2DAD}, /* 2DAC */ + {0x2DAE,0x2DAE},{0x2DAF,0x2DAF}, /* 2DAE */ + {0x2DB0,0x2DB0},{0x2DB1,0x2DB1}, /* 2DB0 */ + {0x2DB2,0x2DB2},{0x2DB3,0x2DB3}, /* 2DB2 */ + {0x2DB4,0x2DB4},{0x2DB5,0x2DB5}, /* 2DB4 */ + {0x2DB6,0x2DB6},{0x2DB7,0x2DB7}, /* 2DB6 */ + {0x2DB8,0x2DB8},{0x2DB9,0x2DB9}, /* 2DB8 */ + {0x2DBA,0x2DBA},{0x2DBB,0x2DBB}, /* 2DBA */ + {0x2DBC,0x2DBC},{0x2DBD,0x2DBD}, /* 2DBC */ + {0x2DBE,0x2DBE},{0x2DBF,0x2DBF}, /* 2DBE */ + {0x2DC0,0x2DC0},{0x2DC1,0x2DC1}, /* 2DC0 */ + {0x2DC2,0x2DC2},{0x2DC3,0x2DC3}, /* 2DC2 */ + {0x2DC4,0x2DC4},{0x2DC5,0x2DC5}, /* 2DC4 */ + {0x2DC6,0x2DC6},{0x2DC7,0x2DC7}, /* 2DC6 */ + {0x2DC8,0x2DC8},{0x2DC9,0x2DC9}, /* 2DC8 */ + {0x2DCA,0x2DCA},{0x2DCB,0x2DCB}, /* 2DCA */ + {0x2DCC,0x2DCC},{0x2DCD,0x2DCD}, /* 2DCC */ + {0x2DCE,0x2DCE},{0x2DCF,0x2DCF}, /* 2DCE */ + {0x2DD0,0x2DD0},{0x2DD1,0x2DD1}, /* 2DD0 */ + {0x2DD2,0x2DD2},{0x2DD3,0x2DD3}, /* 2DD2 */ + {0x2DD4,0x2DD4},{0x2DD5,0x2DD5}, /* 2DD4 */ + {0x2DD6,0x2DD6},{0x2DD7,0x2DD7}, /* 2DD6 */ + {0x2DD8,0x2DD8},{0x2DD9,0x2DD9}, /* 2DD8 */ + {0x2DDA,0x2DDA},{0x2DDB,0x2DDB}, /* 2DDA */ + {0x2DDC,0x2DDC},{0x2DDD,0x2DDD}, /* 2DDC */ + {0x2DDE,0x2DDE},{0x2DDF,0x2DDF}, /* 2DDE */ + {0x2DE0,0x2DE0},{0x2DE1,0x2DE1}, /* 2DE0 */ + {0x2DE2,0x2DE2},{0x2DE3,0x2DE3}, /* 2DE2 */ + {0x2DE4,0x2DE4},{0x2DE5,0x2DE5}, /* 2DE4 */ + {0x2DE6,0x2DE6},{0x2DE7,0x2DE7}, /* 2DE6 */ + {0x2DE8,0x2DE8},{0x2DE9,0x2DE9}, /* 2DE8 */ + {0x2DEA,0x2DEA},{0x2DEB,0x2DEB}, /* 2DEA */ + {0x2DEC,0x2DEC},{0x2DED,0x2DED}, /* 2DEC */ + {0x2DEE,0x2DEE},{0x2DEF,0x2DEF}, /* 2DEE */ + {0x2DF0,0x2DF0},{0x2DF1,0x2DF1}, /* 2DF0 */ + {0x2DF2,0x2DF2},{0x2DF3,0x2DF3}, /* 2DF2 */ + {0x2DF4,0x2DF4},{0x2DF5,0x2DF5}, /* 2DF4 */ + {0x2DF6,0x2DF6},{0x2DF7,0x2DF7}, /* 2DF6 */ + {0x2DF8,0x2DF8},{0x2DF9,0x2DF9}, /* 2DF8 */ + {0x2DFA,0x2DFA},{0x2DFB,0x2DFB}, /* 2DFA */ + {0x2DFC,0x2DFC},{0x2DFD,0x2DFD}, /* 2DFC */ + {0x2DFE,0x2DFE},{0x2DFF,0x2DFF} /* 2DFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_pageA6[256]={ + {0xA600,0xA600},{0xA601,0xA601}, /* A600 */ + {0xA602,0xA602},{0xA603,0xA603}, /* A602 */ + {0xA604,0xA604},{0xA605,0xA605}, /* A604 */ + {0xA606,0xA606},{0xA607,0xA607}, /* A606 */ + {0xA608,0xA608},{0xA609,0xA609}, /* A608 */ + {0xA60A,0xA60A},{0xA60B,0xA60B}, /* A60A */ + {0xA60C,0xA60C},{0xA60D,0xA60D}, /* A60C */ + {0xA60E,0xA60E},{0xA60F,0xA60F}, /* A60E */ + {0xA610,0xA610},{0xA611,0xA611}, /* A610 */ + {0xA612,0xA612},{0xA613,0xA613}, /* A612 */ + {0xA614,0xA614},{0xA615,0xA615}, /* A614 */ + {0xA616,0xA616},{0xA617,0xA617}, /* A616 */ + {0xA618,0xA618},{0xA619,0xA619}, /* A618 */ + {0xA61A,0xA61A},{0xA61B,0xA61B}, /* A61A */ + {0xA61C,0xA61C},{0xA61D,0xA61D}, /* A61C */ + {0xA61E,0xA61E},{0xA61F,0xA61F}, /* A61E */ + {0xA620,0xA620},{0xA621,0xA621}, /* A620 */ + {0xA622,0xA622},{0xA623,0xA623}, /* A622 */ + {0xA624,0xA624},{0xA625,0xA625}, /* A624 */ + {0xA626,0xA626},{0xA627,0xA627}, /* A626 */ + {0xA628,0xA628},{0xA629,0xA629}, /* A628 */ + {0xA62A,0xA62A},{0xA62B,0xA62B}, /* A62A */ + {0xA62C,0xA62C},{0xA62D,0xA62D}, /* A62C */ + {0xA62E,0xA62E},{0xA62F,0xA62F}, /* A62E */ + {0xA630,0xA630},{0xA631,0xA631}, /* A630 */ + {0xA632,0xA632},{0xA633,0xA633}, /* A632 */ + {0xA634,0xA634},{0xA635,0xA635}, /* A634 */ + {0xA636,0xA636},{0xA637,0xA637}, /* A636 */ + {0xA638,0xA638},{0xA639,0xA639}, /* A638 */ + {0xA63A,0xA63A},{0xA63B,0xA63B}, /* A63A */ + {0xA63C,0xA63C},{0xA63D,0xA63D}, /* A63C */ + {0xA63E,0xA63E},{0xA63F,0xA63F}, /* A63E */ + {0xA640,0xA641},{0xA640,0xA641}, /* A640 */ + {0xA642,0xA643},{0xA642,0xA643}, /* A642 */ + {0xA644,0xA645},{0xA644,0xA645}, /* A644 */ + {0xA646,0xA647},{0xA646,0xA647}, /* A646 */ + {0xA648,0xA649},{0xA648,0xA649}, /* A648 */ + {0xA64A,0xA64B},{0xA64A,0xA64B}, /* A64A */ + {0xA64C,0xA64D},{0xA64C,0xA64D}, /* A64C */ + {0xA64E,0xA64F},{0xA64E,0xA64F}, /* A64E */ + {0xA650,0xA651},{0xA650,0xA651}, /* A650 */ + {0xA652,0xA653},{0xA652,0xA653}, /* A652 */ + {0xA654,0xA655},{0xA654,0xA655}, /* A654 */ + {0xA656,0xA657},{0xA656,0xA657}, /* A656 */ + {0xA658,0xA659},{0xA658,0xA659}, /* A658 */ + {0xA65A,0xA65B},{0xA65A,0xA65B}, /* A65A */ + {0xA65C,0xA65D},{0xA65C,0xA65D}, /* A65C */ + {0xA65E,0xA65F},{0xA65E,0xA65F}, /* A65E */ + {0xA660,0xA660},{0xA661,0xA661}, /* A660 */ + {0xA662,0xA663},{0xA662,0xA663}, /* A662 */ + {0xA664,0xA665},{0xA664,0xA665}, /* A664 */ + {0xA666,0xA667},{0xA666,0xA667}, /* A666 */ + {0xA668,0xA669},{0xA668,0xA669}, /* A668 */ + {0xA66A,0xA66B},{0xA66A,0xA66B}, /* A66A */ + {0xA66C,0xA66D},{0xA66C,0xA66D}, /* A66C */ + {0xA66E,0xA66E},{0xA66F,0xA66F}, /* A66E */ + {0xA670,0xA670},{0xA671,0xA671}, /* A670 */ + {0xA672,0xA672},{0xA673,0xA673}, /* A672 */ + {0xA674,0xA674},{0xA675,0xA675}, /* A674 */ + {0xA676,0xA676},{0xA677,0xA677}, /* A676 */ + {0xA678,0xA678},{0xA679,0xA679}, /* A678 */ + {0xA67A,0xA67A},{0xA67B,0xA67B}, /* A67A */ + {0xA67C,0xA67C},{0xA67D,0xA67D}, /* A67C */ + {0xA67E,0xA67E},{0xA67F,0xA67F}, /* A67E */ + {0xA680,0xA681},{0xA680,0xA681}, /* A680 */ + {0xA682,0xA683},{0xA682,0xA683}, /* A682 */ + {0xA684,0xA685},{0xA684,0xA685}, /* A684 */ + {0xA686,0xA687},{0xA686,0xA687}, /* A686 */ + {0xA688,0xA689},{0xA688,0xA689}, /* A688 */ + {0xA68A,0xA68B},{0xA68A,0xA68B}, /* A68A */ + {0xA68C,0xA68D},{0xA68C,0xA68D}, /* A68C */ + {0xA68E,0xA68F},{0xA68E,0xA68F}, /* A68E */ + {0xA690,0xA691},{0xA690,0xA691}, /* A690 */ + {0xA692,0xA693},{0xA692,0xA693}, /* A692 */ + {0xA694,0xA695},{0xA694,0xA695}, /* A694 */ + {0xA696,0xA697},{0xA696,0xA697}, /* A696 */ + {0xA698,0xA698},{0xA699,0xA699}, /* A698 */ + {0xA69A,0xA69A},{0xA69B,0xA69B}, /* A69A */ + {0xA69C,0xA69C},{0xA69D,0xA69D}, /* A69C */ + {0xA69E,0xA69E},{0xA69F,0xA69F}, /* A69E */ + {0xA6A0,0xA6A0},{0xA6A1,0xA6A1}, /* A6A0 */ + {0xA6A2,0xA6A2},{0xA6A3,0xA6A3}, /* A6A2 */ + {0xA6A4,0xA6A4},{0xA6A5,0xA6A5}, /* A6A4 */ + {0xA6A6,0xA6A6},{0xA6A7,0xA6A7}, /* A6A6 */ + {0xA6A8,0xA6A8},{0xA6A9,0xA6A9}, /* A6A8 */ + {0xA6AA,0xA6AA},{0xA6AB,0xA6AB}, /* A6AA */ + {0xA6AC,0xA6AC},{0xA6AD,0xA6AD}, /* A6AC */ + {0xA6AE,0xA6AE},{0xA6AF,0xA6AF}, /* A6AE */ + {0xA6B0,0xA6B0},{0xA6B1,0xA6B1}, /* A6B0 */ + {0xA6B2,0xA6B2},{0xA6B3,0xA6B3}, /* A6B2 */ + {0xA6B4,0xA6B4},{0xA6B5,0xA6B5}, /* A6B4 */ + {0xA6B6,0xA6B6},{0xA6B7,0xA6B7}, /* A6B6 */ + {0xA6B8,0xA6B8},{0xA6B9,0xA6B9}, /* A6B8 */ + {0xA6BA,0xA6BA},{0xA6BB,0xA6BB}, /* A6BA */ + {0xA6BC,0xA6BC},{0xA6BD,0xA6BD}, /* A6BC */ + {0xA6BE,0xA6BE},{0xA6BF,0xA6BF}, /* A6BE */ + {0xA6C0,0xA6C0},{0xA6C1,0xA6C1}, /* A6C0 */ + {0xA6C2,0xA6C2},{0xA6C3,0xA6C3}, /* A6C2 */ + {0xA6C4,0xA6C4},{0xA6C5,0xA6C5}, /* A6C4 */ + {0xA6C6,0xA6C6},{0xA6C7,0xA6C7}, /* A6C6 */ + {0xA6C8,0xA6C8},{0xA6C9,0xA6C9}, /* A6C8 */ + {0xA6CA,0xA6CA},{0xA6CB,0xA6CB}, /* A6CA */ + {0xA6CC,0xA6CC},{0xA6CD,0xA6CD}, /* A6CC */ + {0xA6CE,0xA6CE},{0xA6CF,0xA6CF}, /* A6CE */ + {0xA6D0,0xA6D0},{0xA6D1,0xA6D1}, /* A6D0 */ + {0xA6D2,0xA6D2},{0xA6D3,0xA6D3}, /* A6D2 */ + {0xA6D4,0xA6D4},{0xA6D5,0xA6D5}, /* A6D4 */ + {0xA6D6,0xA6D6},{0xA6D7,0xA6D7}, /* A6D6 */ + {0xA6D8,0xA6D8},{0xA6D9,0xA6D9}, /* A6D8 */ + {0xA6DA,0xA6DA},{0xA6DB,0xA6DB}, /* A6DA */ + {0xA6DC,0xA6DC},{0xA6DD,0xA6DD}, /* A6DC */ + {0xA6DE,0xA6DE},{0xA6DF,0xA6DF}, /* A6DE */ + {0xA6E0,0xA6E0},{0xA6E1,0xA6E1}, /* A6E0 */ + {0xA6E2,0xA6E2},{0xA6E3,0xA6E3}, /* A6E2 */ + {0xA6E4,0xA6E4},{0xA6E5,0xA6E5}, /* A6E4 */ + {0xA6E6,0xA6E6},{0xA6E7,0xA6E7}, /* A6E6 */ + {0xA6E8,0xA6E8},{0xA6E9,0xA6E9}, /* A6E8 */ + {0xA6EA,0xA6EA},{0xA6EB,0xA6EB}, /* A6EA */ + {0xA6EC,0xA6EC},{0xA6ED,0xA6ED}, /* A6EC */ + {0xA6EE,0xA6EE},{0xA6EF,0xA6EF}, /* A6EE */ + {0xA6F0,0xA6F0},{0xA6F1,0xA6F1}, /* A6F0 */ + {0xA6F2,0xA6F2},{0xA6F3,0xA6F3}, /* A6F2 */ + {0xA6F4,0xA6F4},{0xA6F5,0xA6F5}, /* A6F4 */ + {0xA6F6,0xA6F6},{0xA6F7,0xA6F7}, /* A6F6 */ + {0xA6F8,0xA6F8},{0xA6F9,0xA6F9}, /* A6F8 */ + {0xA6FA,0xA6FA},{0xA6FB,0xA6FB}, /* A6FA */ + {0xA6FC,0xA6FC},{0xA6FD,0xA6FD}, /* A6FC */ + {0xA6FE,0xA6FE},{0xA6FF,0xA6FF} /* A6FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_pageA7[256]={ + {0xA700,0xA700},{0xA701,0xA701}, /* A700 */ + {0xA702,0xA702},{0xA703,0xA703}, /* A702 */ + {0xA704,0xA704},{0xA705,0xA705}, /* A704 */ + {0xA706,0xA706},{0xA707,0xA707}, /* A706 */ + {0xA708,0xA708},{0xA709,0xA709}, /* A708 */ + {0xA70A,0xA70A},{0xA70B,0xA70B}, /* A70A */ + {0xA70C,0xA70C},{0xA70D,0xA70D}, /* A70C */ + {0xA70E,0xA70E},{0xA70F,0xA70F}, /* A70E */ + {0xA710,0xA710},{0xA711,0xA711}, /* A710 */ + {0xA712,0xA712},{0xA713,0xA713}, /* A712 */ + {0xA714,0xA714},{0xA715,0xA715}, /* A714 */ + {0xA716,0xA716},{0xA717,0xA717}, /* A716 */ + {0xA718,0xA718},{0xA719,0xA719}, /* A718 */ + {0xA71A,0xA71A},{0xA71B,0xA71B}, /* A71A */ + {0xA71C,0xA71C},{0xA71D,0xA71D}, /* A71C */ + {0xA71E,0xA71E},{0xA71F,0xA71F}, /* A71E */ + {0xA720,0xA720},{0xA721,0xA721}, /* A720 */ + {0xA722,0xA723},{0xA722,0xA723}, /* A722 */ + {0xA724,0xA725},{0xA724,0xA725}, /* A724 */ + {0xA726,0xA727},{0xA726,0xA727}, /* A726 */ + {0xA728,0xA729},{0xA728,0xA729}, /* A728 */ + {0xA72A,0xA72B},{0xA72A,0xA72B}, /* A72A */ + {0xA72C,0xA72D},{0xA72C,0xA72D}, /* A72C */ + {0xA72E,0xA72F},{0xA72E,0xA72F}, /* A72E */ + {0xA730,0xA730},{0xA731,0xA731}, /* A730 */ + {0xA732,0xA733},{0xA732,0xA733}, /* A732 */ + {0xA734,0xA735},{0xA734,0xA735}, /* A734 */ + {0xA736,0xA737},{0xA736,0xA737}, /* A736 */ + {0xA738,0xA739},{0xA738,0xA739}, /* A738 */ + {0xA73A,0xA73B},{0xA73A,0xA73B}, /* A73A */ + {0xA73C,0xA73D},{0xA73C,0xA73D}, /* A73C */ + {0xA73E,0xA73F},{0xA73E,0xA73F}, /* A73E */ + {0xA740,0xA741},{0xA740,0xA741}, /* A740 */ + {0xA742,0xA743},{0xA742,0xA743}, /* A742 */ + {0xA744,0xA745},{0xA744,0xA745}, /* A744 */ + {0xA746,0xA747},{0xA746,0xA747}, /* A746 */ + {0xA748,0xA749},{0xA748,0xA749}, /* A748 */ + {0xA74A,0xA74B},{0xA74A,0xA74B}, /* A74A */ + {0xA74C,0xA74D},{0xA74C,0xA74D}, /* A74C */ + {0xA74E,0xA74F},{0xA74E,0xA74F}, /* A74E */ + {0xA750,0xA751},{0xA750,0xA751}, /* A750 */ + {0xA752,0xA753},{0xA752,0xA753}, /* A752 */ + {0xA754,0xA755},{0xA754,0xA755}, /* A754 */ + {0xA756,0xA757},{0xA756,0xA757}, /* A756 */ + {0xA758,0xA759},{0xA758,0xA759}, /* A758 */ + {0xA75A,0xA75B},{0xA75A,0xA75B}, /* A75A */ + {0xA75C,0xA75D},{0xA75C,0xA75D}, /* A75C */ + {0xA75E,0xA75F},{0xA75E,0xA75F}, /* A75E */ + {0xA760,0xA761},{0xA760,0xA761}, /* A760 */ + {0xA762,0xA763},{0xA762,0xA763}, /* A762 */ + {0xA764,0xA765},{0xA764,0xA765}, /* A764 */ + {0xA766,0xA767},{0xA766,0xA767}, /* A766 */ + {0xA768,0xA769},{0xA768,0xA769}, /* A768 */ + {0xA76A,0xA76B},{0xA76A,0xA76B}, /* A76A */ + {0xA76C,0xA76D},{0xA76C,0xA76D}, /* A76C */ + {0xA76E,0xA76F},{0xA76E,0xA76F}, /* A76E */ + {0xA770,0xA770},{0xA771,0xA771}, /* A770 */ + {0xA772,0xA772},{0xA773,0xA773}, /* A772 */ + {0xA774,0xA774},{0xA775,0xA775}, /* A774 */ + {0xA776,0xA776},{0xA777,0xA777}, /* A776 */ + {0xA778,0xA778},{0xA779,0xA77A}, /* A778 */ + {0xA779,0xA77A},{0xA77B,0xA77C}, /* A77A */ + {0xA77B,0xA77C},{0xA77D,0x1D79}, /* A77C */ + {0xA77E,0xA77F},{0xA77E,0xA77F}, /* A77E */ + {0xA780,0xA781},{0xA780,0xA781}, /* A780 */ + {0xA782,0xA783},{0xA782,0xA783}, /* A782 */ + {0xA784,0xA785},{0xA784,0xA785}, /* A784 */ + {0xA786,0xA787},{0xA786,0xA787}, /* A786 */ + {0xA788,0xA788},{0xA789,0xA789}, /* A788 */ + {0xA78A,0xA78A},{0xA78B,0xA78C}, /* A78A */ + {0xA78B,0xA78C},{0xA78D,0xA78D}, /* A78C */ + {0xA78E,0xA78E},{0xA78F,0xA78F}, /* A78E */ + {0xA790,0xA790},{0xA791,0xA791}, /* A790 */ + {0xA792,0xA792},{0xA793,0xA793}, /* A792 */ + {0xA794,0xA794},{0xA795,0xA795}, /* A794 */ + {0xA796,0xA796},{0xA797,0xA797}, /* A796 */ + {0xA798,0xA798},{0xA799,0xA799}, /* A798 */ + {0xA79A,0xA79A},{0xA79B,0xA79B}, /* A79A */ + {0xA79C,0xA79C},{0xA79D,0xA79D}, /* A79C */ + {0xA79E,0xA79E},{0xA79F,0xA79F}, /* A79E */ + {0xA7A0,0xA7A0},{0xA7A1,0xA7A1}, /* A7A0 */ + {0xA7A2,0xA7A2},{0xA7A3,0xA7A3}, /* A7A2 */ + {0xA7A4,0xA7A4},{0xA7A5,0xA7A5}, /* A7A4 */ + {0xA7A6,0xA7A6},{0xA7A7,0xA7A7}, /* A7A6 */ + {0xA7A8,0xA7A8},{0xA7A9,0xA7A9}, /* A7A8 */ + {0xA7AA,0xA7AA},{0xA7AB,0xA7AB}, /* A7AA */ + {0xA7AC,0xA7AC},{0xA7AD,0xA7AD}, /* A7AC */ + {0xA7AE,0xA7AE},{0xA7AF,0xA7AF}, /* A7AE */ + {0xA7B0,0xA7B0},{0xA7B1,0xA7B1}, /* A7B0 */ + {0xA7B2,0xA7B2},{0xA7B3,0xA7B3}, /* A7B2 */ + {0xA7B4,0xA7B4},{0xA7B5,0xA7B5}, /* A7B4 */ + {0xA7B6,0xA7B6},{0xA7B7,0xA7B7}, /* A7B6 */ + {0xA7B8,0xA7B8},{0xA7B9,0xA7B9}, /* A7B8 */ + {0xA7BA,0xA7BA},{0xA7BB,0xA7BB}, /* A7BA */ + {0xA7BC,0xA7BC},{0xA7BD,0xA7BD}, /* A7BC */ + {0xA7BE,0xA7BE},{0xA7BF,0xA7BF}, /* A7BE */ + {0xA7C0,0xA7C0},{0xA7C1,0xA7C1}, /* A7C0 */ + {0xA7C2,0xA7C2},{0xA7C3,0xA7C3}, /* A7C2 */ + {0xA7C4,0xA7C4},{0xA7C5,0xA7C5}, /* A7C4 */ + {0xA7C6,0xA7C6},{0xA7C7,0xA7C7}, /* A7C6 */ + {0xA7C8,0xA7C8},{0xA7C9,0xA7C9}, /* A7C8 */ + {0xA7CA,0xA7CA},{0xA7CB,0xA7CB}, /* A7CA */ + {0xA7CC,0xA7CC},{0xA7CD,0xA7CD}, /* A7CC */ + {0xA7CE,0xA7CE},{0xA7CF,0xA7CF}, /* A7CE */ + {0xA7D0,0xA7D0},{0xA7D1,0xA7D1}, /* A7D0 */ + {0xA7D2,0xA7D2},{0xA7D3,0xA7D3}, /* A7D2 */ + {0xA7D4,0xA7D4},{0xA7D5,0xA7D5}, /* A7D4 */ + {0xA7D6,0xA7D6},{0xA7D7,0xA7D7}, /* A7D6 */ + {0xA7D8,0xA7D8},{0xA7D9,0xA7D9}, /* A7D8 */ + {0xA7DA,0xA7DA},{0xA7DB,0xA7DB}, /* A7DA */ + {0xA7DC,0xA7DC},{0xA7DD,0xA7DD}, /* A7DC */ + {0xA7DE,0xA7DE},{0xA7DF,0xA7DF}, /* A7DE */ + {0xA7E0,0xA7E0},{0xA7E1,0xA7E1}, /* A7E0 */ + {0xA7E2,0xA7E2},{0xA7E3,0xA7E3}, /* A7E2 */ + {0xA7E4,0xA7E4},{0xA7E5,0xA7E5}, /* A7E4 */ + {0xA7E6,0xA7E6},{0xA7E7,0xA7E7}, /* A7E6 */ + {0xA7E8,0xA7E8},{0xA7E9,0xA7E9}, /* A7E8 */ + {0xA7EA,0xA7EA},{0xA7EB,0xA7EB}, /* A7EA */ + {0xA7EC,0xA7EC},{0xA7ED,0xA7ED}, /* A7EC */ + {0xA7EE,0xA7EE},{0xA7EF,0xA7EF}, /* A7EE */ + {0xA7F0,0xA7F0},{0xA7F1,0xA7F1}, /* A7F0 */ + {0xA7F2,0xA7F2},{0xA7F3,0xA7F3}, /* A7F2 */ + {0xA7F4,0xA7F4},{0xA7F5,0xA7F5}, /* A7F4 */ + {0xA7F6,0xA7F6},{0xA7F7,0xA7F7}, /* A7F6 */ + {0xA7F8,0xA7F8},{0xA7F9,0xA7F9}, /* A7F8 */ + {0xA7FA,0xA7FA},{0xA7FB,0xA7FB}, /* A7FA */ + {0xA7FC,0xA7FC},{0xA7FD,0xA7FD}, /* A7FC */ + {0xA7FE,0xA7FE},{0xA7FF,0xA7FF} /* A7FE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_pageFF[256]={ + {0xFF00,0xFF00},{0xFF01,0xFF01}, /* FF00 */ + {0xFF02,0xFF02},{0xFF03,0xFF03}, /* FF02 */ + {0xFF04,0xFF04},{0xFF05,0xFF05}, /* FF04 */ + {0xFF06,0xFF06},{0xFF07,0xFF07}, /* FF06 */ + {0xFF08,0xFF08},{0xFF09,0xFF09}, /* FF08 */ + {0xFF0A,0xFF0A},{0xFF0B,0xFF0B}, /* FF0A */ + {0xFF0C,0xFF0C},{0xFF0D,0xFF0D}, /* FF0C */ + {0xFF0E,0xFF0E},{0xFF0F,0xFF0F}, /* FF0E */ + {0xFF10,0xFF10},{0xFF11,0xFF11}, /* FF10 */ + {0xFF12,0xFF12},{0xFF13,0xFF13}, /* FF12 */ + {0xFF14,0xFF14},{0xFF15,0xFF15}, /* FF14 */ + {0xFF16,0xFF16},{0xFF17,0xFF17}, /* FF16 */ + {0xFF18,0xFF18},{0xFF19,0xFF19}, /* FF18 */ + {0xFF1A,0xFF1A},{0xFF1B,0xFF1B}, /* FF1A */ + {0xFF1C,0xFF1C},{0xFF1D,0xFF1D}, /* FF1C */ + {0xFF1E,0xFF1E},{0xFF1F,0xFF1F}, /* FF1E */ + {0xFF20,0xFF20},{0xFF21,0xFF41}, /* FF20 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF22 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF24 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF26 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF28 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF2A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF2C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF2E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF30 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF32 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF34 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF36 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF38 */ + {0xFF3A,0xFF5A},{0xFF3B,0xFF3B}, /* FF3A */ + {0xFF3C,0xFF3C},{0xFF3D,0xFF3D}, /* FF3C */ + {0xFF3E,0xFF3E},{0xFF3F,0xFF3F}, /* FF3E */ + {0xFF40,0xFF40},{0xFF21,0xFF41}, /* FF40 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF42 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF44 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF46 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF48 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF4A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF4C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF4E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF50 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF52 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF54 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF56 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF58 */ + {0xFF3A,0xFF5A},{0xFF5B,0xFF5B}, /* FF5A */ + {0xFF5C,0xFF5C},{0xFF5D,0xFF5D}, /* FF5C */ + {0xFF5E,0xFF5E},{0xFF5F,0xFF5F}, /* FF5E */ + {0xFF60,0xFF60},{0xFF61,0xFF61}, /* FF60 */ + {0xFF62,0xFF62},{0xFF63,0xFF63}, /* FF62 */ + {0xFF64,0xFF64},{0xFF65,0xFF65}, /* FF64 */ + {0xFF66,0xFF66},{0xFF67,0xFF67}, /* FF66 */ + {0xFF68,0xFF68},{0xFF69,0xFF69}, /* FF68 */ + {0xFF6A,0xFF6A},{0xFF6B,0xFF6B}, /* FF6A */ + {0xFF6C,0xFF6C},{0xFF6D,0xFF6D}, /* FF6C */ + {0xFF6E,0xFF6E},{0xFF6F,0xFF6F}, /* FF6E */ + {0xFF70,0xFF70},{0xFF71,0xFF71}, /* FF70 */ + {0xFF72,0xFF72},{0xFF73,0xFF73}, /* FF72 */ + {0xFF74,0xFF74},{0xFF75,0xFF75}, /* FF74 */ + {0xFF76,0xFF76},{0xFF77,0xFF77}, /* FF76 */ + {0xFF78,0xFF78},{0xFF79,0xFF79}, /* FF78 */ + {0xFF7A,0xFF7A},{0xFF7B,0xFF7B}, /* FF7A */ + {0xFF7C,0xFF7C},{0xFF7D,0xFF7D}, /* FF7C */ + {0xFF7E,0xFF7E},{0xFF7F,0xFF7F}, /* FF7E */ + {0xFF80,0xFF80},{0xFF81,0xFF81}, /* FF80 */ + {0xFF82,0xFF82},{0xFF83,0xFF83}, /* FF82 */ + {0xFF84,0xFF84},{0xFF85,0xFF85}, /* FF84 */ + {0xFF86,0xFF86},{0xFF87,0xFF87}, /* FF86 */ + {0xFF88,0xFF88},{0xFF89,0xFF89}, /* FF88 */ + {0xFF8A,0xFF8A},{0xFF8B,0xFF8B}, /* FF8A */ + {0xFF8C,0xFF8C},{0xFF8D,0xFF8D}, /* FF8C */ + {0xFF8E,0xFF8E},{0xFF8F,0xFF8F}, /* FF8E */ + {0xFF90,0xFF90},{0xFF91,0xFF91}, /* FF90 */ + {0xFF92,0xFF92},{0xFF93,0xFF93}, /* FF92 */ + {0xFF94,0xFF94},{0xFF95,0xFF95}, /* FF94 */ + {0xFF96,0xFF96},{0xFF97,0xFF97}, /* FF96 */ + {0xFF98,0xFF98},{0xFF99,0xFF99}, /* FF98 */ + {0xFF9A,0xFF9A},{0xFF9B,0xFF9B}, /* FF9A */ + {0xFF9C,0xFF9C},{0xFF9D,0xFF9D}, /* FF9C */ + {0xFF9E,0xFF9E},{0xFF9F,0xFF9F}, /* FF9E */ + {0xFFA0,0xFFA0},{0xFFA1,0xFFA1}, /* FFA0 */ + {0xFFA2,0xFFA2},{0xFFA3,0xFFA3}, /* FFA2 */ + {0xFFA4,0xFFA4},{0xFFA5,0xFFA5}, /* FFA4 */ + {0xFFA6,0xFFA6},{0xFFA7,0xFFA7}, /* FFA6 */ + {0xFFA8,0xFFA8},{0xFFA9,0xFFA9}, /* FFA8 */ + {0xFFAA,0xFFAA},{0xFFAB,0xFFAB}, /* FFAA */ + {0xFFAC,0xFFAC},{0xFFAD,0xFFAD}, /* FFAC */ + {0xFFAE,0xFFAE},{0xFFAF,0xFFAF}, /* FFAE */ + {0xFFB0,0xFFB0},{0xFFB1,0xFFB1}, /* FFB0 */ + {0xFFB2,0xFFB2},{0xFFB3,0xFFB3}, /* FFB2 */ + {0xFFB4,0xFFB4},{0xFFB5,0xFFB5}, /* FFB4 */ + {0xFFB6,0xFFB6},{0xFFB7,0xFFB7}, /* FFB6 */ + {0xFFB8,0xFFB8},{0xFFB9,0xFFB9}, /* FFB8 */ + {0xFFBA,0xFFBA},{0xFFBB,0xFFBB}, /* FFBA */ + {0xFFBC,0xFFBC},{0xFFBD,0xFFBD}, /* FFBC */ + {0xFFBE,0xFFBE},{0xFFBF,0xFFBF}, /* FFBE */ + {0xFFC0,0xFFC0},{0xFFC1,0xFFC1}, /* FFC0 */ + {0xFFC2,0xFFC2},{0xFFC3,0xFFC3}, /* FFC2 */ + {0xFFC4,0xFFC4},{0xFFC5,0xFFC5}, /* FFC4 */ + {0xFFC6,0xFFC6},{0xFFC7,0xFFC7}, /* FFC6 */ + {0xFFC8,0xFFC8},{0xFFC9,0xFFC9}, /* FFC8 */ + {0xFFCA,0xFFCA},{0xFFCB,0xFFCB}, /* FFCA */ + {0xFFCC,0xFFCC},{0xFFCD,0xFFCD}, /* FFCC */ + {0xFFCE,0xFFCE},{0xFFCF,0xFFCF}, /* FFCE */ + {0xFFD0,0xFFD0},{0xFFD1,0xFFD1}, /* FFD0 */ + {0xFFD2,0xFFD2},{0xFFD3,0xFFD3}, /* FFD2 */ + {0xFFD4,0xFFD4},{0xFFD5,0xFFD5}, /* FFD4 */ + {0xFFD6,0xFFD6},{0xFFD7,0xFFD7}, /* FFD6 */ + {0xFFD8,0xFFD8},{0xFFD9,0xFFD9}, /* FFD8 */ + {0xFFDA,0xFFDA},{0xFFDB,0xFFDB}, /* FFDA */ + {0xFFDC,0xFFDC},{0xFFDD,0xFFDD}, /* FFDC */ + {0xFFDE,0xFFDE},{0xFFDF,0xFFDF}, /* FFDE */ + {0xFFE0,0xFFE0},{0xFFE1,0xFFE1}, /* FFE0 */ + {0xFFE2,0xFFE2},{0xFFE3,0xFFE3}, /* FFE2 */ + {0xFFE4,0xFFE4},{0xFFE5,0xFFE5}, /* FFE4 */ + {0xFFE6,0xFFE6},{0xFFE7,0xFFE7}, /* FFE6 */ + {0xFFE8,0xFFE8},{0xFFE9,0xFFE9}, /* FFE8 */ + {0xFFEA,0xFFEA},{0xFFEB,0xFFEB}, /* FFEA */ + {0xFFEC,0xFFEC},{0xFFED,0xFFED}, /* FFEC */ + {0xFFEE,0xFFEE},{0xFFEF,0xFFEF}, /* FFEE */ + {0xFFF0,0xFFF0},{0xFFF1,0xFFF1}, /* FFF0 */ + {0xFFF2,0xFFF2},{0xFFF3,0xFFF3}, /* FFF2 */ + {0xFFF4,0xFFF4},{0xFFF5,0xFFF5}, /* FFF4 */ + {0xFFF6,0xFFF6},{0xFFF7,0xFFF7}, /* FFF6 */ + {0xFFF8,0xFFF8},{0xFFF9,0xFFF9}, /* FFF8 */ + {0xFFFA,0xFFFA},{0xFFFB,0xFFFB}, /* FFFA */ + {0xFFFC,0xFFFC},{0xFFFD,0xFFFD}, /* FFFC */ + {0xFFFE,0xFFFE},{0xFFFF,0xFFFF} /* FFFE */ +}; + +static const MY_CASEFOLD_CHARACTER u520_casefold_page104[256]={ + {0x10400,0x10428},{0x10401,0x10429}, /* 10400 */ + {0x10402,0x1042A},{0x10403,0x1042B}, /* 10402 */ + {0x10404,0x1042C},{0x10405,0x1042D}, /* 10404 */ + {0x10406,0x1042E},{0x10407,0x1042F}, /* 10406 */ + {0x10408,0x10430},{0x10409,0x10431}, /* 10408 */ + {0x1040A,0x10432},{0x1040B,0x10433}, /* 1040A */ + {0x1040C,0x10434},{0x1040D,0x10435}, /* 1040C */ + {0x1040E,0x10436},{0x1040F,0x10437}, /* 1040E */ + {0x10410,0x10438},{0x10411,0x10439}, /* 10410 */ + {0x10412,0x1043A},{0x10413,0x1043B}, /* 10412 */ + {0x10414,0x1043C},{0x10415,0x1043D}, /* 10414 */ + {0x10416,0x1043E},{0x10417,0x1043F}, /* 10416 */ + {0x10418,0x10440},{0x10419,0x10441}, /* 10418 */ + {0x1041A,0x10442},{0x1041B,0x10443}, /* 1041A */ + {0x1041C,0x10444},{0x1041D,0x10445}, /* 1041C */ + {0x1041E,0x10446},{0x1041F,0x10447}, /* 1041E */ + {0x10420,0x10448},{0x10421,0x10449}, /* 10420 */ + {0x10422,0x1044A},{0x10423,0x1044B}, /* 10422 */ + {0x10424,0x1044C},{0x10425,0x1044D}, /* 10424 */ + {0x10426,0x1044E},{0x10427,0x1044F}, /* 10426 */ + {0x10400,0x10428},{0x10401,0x10429}, /* 10428 */ + {0x10402,0x1042A},{0x10403,0x1042B}, /* 1042A */ + {0x10404,0x1042C},{0x10405,0x1042D}, /* 1042C */ + {0x10406,0x1042E},{0x10407,0x1042F}, /* 1042E */ + {0x10408,0x10430},{0x10409,0x10431}, /* 10430 */ + {0x1040A,0x10432},{0x1040B,0x10433}, /* 10432 */ + {0x1040C,0x10434},{0x1040D,0x10435}, /* 10434 */ + {0x1040E,0x10436},{0x1040F,0x10437}, /* 10436 */ + {0x10410,0x10438},{0x10411,0x10439}, /* 10438 */ + {0x10412,0x1043A},{0x10413,0x1043B}, /* 1043A */ + {0x10414,0x1043C},{0x10415,0x1043D}, /* 1043C */ + {0x10416,0x1043E},{0x10417,0x1043F}, /* 1043E */ + {0x10418,0x10440},{0x10419,0x10441}, /* 10440 */ + {0x1041A,0x10442},{0x1041B,0x10443}, /* 10442 */ + {0x1041C,0x10444},{0x1041D,0x10445}, /* 10444 */ + {0x1041E,0x10446},{0x1041F,0x10447}, /* 10446 */ + {0x10420,0x10448},{0x10421,0x10449}, /* 10448 */ + {0x10422,0x1044A},{0x10423,0x1044B}, /* 1044A */ + {0x10424,0x1044C},{0x10425,0x1044D}, /* 1044C */ + {0x10426,0x1044E},{0x10427,0x1044F}, /* 1044E */ + {0x10450,0x10450},{0x10451,0x10451}, /* 10450 */ + {0x10452,0x10452},{0x10453,0x10453}, /* 10452 */ + {0x10454,0x10454},{0x10455,0x10455}, /* 10454 */ + {0x10456,0x10456},{0x10457,0x10457}, /* 10456 */ + {0x10458,0x10458},{0x10459,0x10459}, /* 10458 */ + {0x1045A,0x1045A},{0x1045B,0x1045B}, /* 1045A */ + {0x1045C,0x1045C},{0x1045D,0x1045D}, /* 1045C */ + {0x1045E,0x1045E},{0x1045F,0x1045F}, /* 1045E */ + {0x10460,0x10460},{0x10461,0x10461}, /* 10460 */ + {0x10462,0x10462},{0x10463,0x10463}, /* 10462 */ + {0x10464,0x10464},{0x10465,0x10465}, /* 10464 */ + {0x10466,0x10466},{0x10467,0x10467}, /* 10466 */ + {0x10468,0x10468},{0x10469,0x10469}, /* 10468 */ + {0x1046A,0x1046A},{0x1046B,0x1046B}, /* 1046A */ + {0x1046C,0x1046C},{0x1046D,0x1046D}, /* 1046C */ + {0x1046E,0x1046E},{0x1046F,0x1046F}, /* 1046E */ + {0x10470,0x10470},{0x10471,0x10471}, /* 10470 */ + {0x10472,0x10472},{0x10473,0x10473}, /* 10472 */ + {0x10474,0x10474},{0x10475,0x10475}, /* 10474 */ + {0x10476,0x10476},{0x10477,0x10477}, /* 10476 */ + {0x10478,0x10478},{0x10479,0x10479}, /* 10478 */ + {0x1047A,0x1047A},{0x1047B,0x1047B}, /* 1047A */ + {0x1047C,0x1047C},{0x1047D,0x1047D}, /* 1047C */ + {0x1047E,0x1047E},{0x1047F,0x1047F}, /* 1047E */ + {0x10480,0x10480},{0x10481,0x10481}, /* 10480 */ + {0x10482,0x10482},{0x10483,0x10483}, /* 10482 */ + {0x10484,0x10484},{0x10485,0x10485}, /* 10484 */ + {0x10486,0x10486},{0x10487,0x10487}, /* 10486 */ + {0x10488,0x10488},{0x10489,0x10489}, /* 10488 */ + {0x1048A,0x1048A},{0x1048B,0x1048B}, /* 1048A */ + {0x1048C,0x1048C},{0x1048D,0x1048D}, /* 1048C */ + {0x1048E,0x1048E},{0x1048F,0x1048F}, /* 1048E */ + {0x10490,0x10490},{0x10491,0x10491}, /* 10490 */ + {0x10492,0x10492},{0x10493,0x10493}, /* 10492 */ + {0x10494,0x10494},{0x10495,0x10495}, /* 10494 */ + {0x10496,0x10496},{0x10497,0x10497}, /* 10496 */ + {0x10498,0x10498},{0x10499,0x10499}, /* 10498 */ + {0x1049A,0x1049A},{0x1049B,0x1049B}, /* 1049A */ + {0x1049C,0x1049C},{0x1049D,0x1049D}, /* 1049C */ + {0x1049E,0x1049E},{0x1049F,0x1049F}, /* 1049E */ + {0x104A0,0x104A0},{0x104A1,0x104A1}, /* 104A0 */ + {0x104A2,0x104A2},{0x104A3,0x104A3}, /* 104A2 */ + {0x104A4,0x104A4},{0x104A5,0x104A5}, /* 104A4 */ + {0x104A6,0x104A6},{0x104A7,0x104A7}, /* 104A6 */ + {0x104A8,0x104A8},{0x104A9,0x104A9}, /* 104A8 */ + {0x104AA,0x104AA},{0x104AB,0x104AB}, /* 104AA */ + {0x104AC,0x104AC},{0x104AD,0x104AD}, /* 104AC */ + {0x104AE,0x104AE},{0x104AF,0x104AF}, /* 104AE */ + {0x104B0,0x104B0},{0x104B1,0x104B1}, /* 104B0 */ + {0x104B2,0x104B2},{0x104B3,0x104B3}, /* 104B2 */ + {0x104B4,0x104B4},{0x104B5,0x104B5}, /* 104B4 */ + {0x104B6,0x104B6},{0x104B7,0x104B7}, /* 104B6 */ + {0x104B8,0x104B8},{0x104B9,0x104B9}, /* 104B8 */ + {0x104BA,0x104BA},{0x104BB,0x104BB}, /* 104BA */ + {0x104BC,0x104BC},{0x104BD,0x104BD}, /* 104BC */ + {0x104BE,0x104BE},{0x104BF,0x104BF}, /* 104BE */ + {0x104C0,0x104C0},{0x104C1,0x104C1}, /* 104C0 */ + {0x104C2,0x104C2},{0x104C3,0x104C3}, /* 104C2 */ + {0x104C4,0x104C4},{0x104C5,0x104C5}, /* 104C4 */ + {0x104C6,0x104C6},{0x104C7,0x104C7}, /* 104C6 */ + {0x104C8,0x104C8},{0x104C9,0x104C9}, /* 104C8 */ + {0x104CA,0x104CA},{0x104CB,0x104CB}, /* 104CA */ + {0x104CC,0x104CC},{0x104CD,0x104CD}, /* 104CC */ + {0x104CE,0x104CE},{0x104CF,0x104CF}, /* 104CE */ + {0x104D0,0x104D0},{0x104D1,0x104D1}, /* 104D0 */ + {0x104D2,0x104D2},{0x104D3,0x104D3}, /* 104D2 */ + {0x104D4,0x104D4},{0x104D5,0x104D5}, /* 104D4 */ + {0x104D6,0x104D6},{0x104D7,0x104D7}, /* 104D6 */ + {0x104D8,0x104D8},{0x104D9,0x104D9}, /* 104D8 */ + {0x104DA,0x104DA},{0x104DB,0x104DB}, /* 104DA */ + {0x104DC,0x104DC},{0x104DD,0x104DD}, /* 104DC */ + {0x104DE,0x104DE},{0x104DF,0x104DF}, /* 104DE */ + {0x104E0,0x104E0},{0x104E1,0x104E1}, /* 104E0 */ + {0x104E2,0x104E2},{0x104E3,0x104E3}, /* 104E2 */ + {0x104E4,0x104E4},{0x104E5,0x104E5}, /* 104E4 */ + {0x104E6,0x104E6},{0x104E7,0x104E7}, /* 104E6 */ + {0x104E8,0x104E8},{0x104E9,0x104E9}, /* 104E8 */ + {0x104EA,0x104EA},{0x104EB,0x104EB}, /* 104EA */ + {0x104EC,0x104EC},{0x104ED,0x104ED}, /* 104EC */ + {0x104EE,0x104EE},{0x104EF,0x104EF}, /* 104EE */ + {0x104F0,0x104F0},{0x104F1,0x104F1}, /* 104F0 */ + {0x104F2,0x104F2},{0x104F3,0x104F3}, /* 104F2 */ + {0x104F4,0x104F4},{0x104F5,0x104F5}, /* 104F4 */ + {0x104F6,0x104F6},{0x104F7,0x104F7}, /* 104F6 */ + {0x104F8,0x104F8},{0x104F9,0x104F9}, /* 104F8 */ + {0x104FA,0x104FA},{0x104FB,0x104FB}, /* 104FA */ + {0x104FC,0x104FC},{0x104FD,0x104FD}, /* 104FC */ + {0x104FE,0x104FE},{0x104FF,0x104FF} /* 104FE */ +}; + +const MY_CASEFOLD_CHARACTER * my_u520_casefold_index[4352]={ + u520_casefold_page00, u520_casefold_page01, u520_casefold_page02, u520_casefold_page03, u520_casefold_page04, u520_casefold_page05, u520_casefold_page06, u520_casefold_page07, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u520_casefold_page10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, u520_casefold_page1D, u520_casefold_page1E, u520_casefold_page1F, + NULL, u520_casefold_page21, NULL, NULL, u520_casefold_page24, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u520_casefold_page2C, u520_casefold_page2D, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u520_casefold_pageA6, u520_casefold_pageA7, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, u520_casefold_pageFF, + NULL, NULL, NULL, NULL, u520_casefold_page104, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; diff --git a/strings/ctype-unidata.c b/strings/ctype-unidata.c new file mode 100644 index 0000000000000..58a823d69704a --- /dev/null +++ b/strings/ctype-unidata.c @@ -0,0 +1,79 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2020, MariaDB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; version 2 + of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1335 USA */ + +#include "strings_def.h" +#include +#include "ctype-mb.h" + +#ifndef EILSEQ +#define EILSEQ ENOENT +#endif + + +#include "ctype-unidata.h" +#include "ctype-unicode300-general_ci.h" +#include "ctype-unicode300-general_mysql500_ci.h" +#include "ctype-unicode300-casefold.h" +#include "ctype-unicode300-casefold-tr.h" +#include "ctype-unicode520-casefold.h" + + + +MY_CASEFOLD_INFO my_casefold_default= +{ + 0xFFFF, + my_u300_casefold_index, + weight_general_ci_index +}; + + +/* + Turkish lower/upper mapping: + 1. LOWER(0x0049 LATIN CAPITAL LETTER I) -> + 0x0131 LATIN SMALL LETTER DOTLESS I + 2. UPPER(0x0069 LATIN SMALL LETTER I) -> + 0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +*/ + +MY_CASEFOLD_INFO my_casefold_turkish= +{ + 0xFFFF, + my_u300tr_casefold_index, + weight_general_ci_index +}; + + +/* + general_mysql500_ci is very similar to general_ci, but maps sorting order + for U+00DF to 0x00DF instead of 0x0053. +*/ +MY_CASEFOLD_INFO my_casefold_mysql500= +{ + 0xFFFF, + my_u300_casefold_index, + weight_general_mysql500_ci_index +}; + + + +MY_CASEFOLD_INFO my_casefold_unicode520= +{ + 0x10FFFF, + my_u520_casefold_index, + NULL +}; diff --git a/strings/ctype-unidata.h b/strings/ctype-unidata.h index 24cf3e3ea05e9..ba3235e47e592 100644 --- a/strings/ctype-unidata.h +++ b/strings/ctype-unidata.h @@ -1,7 +1,7 @@ #ifndef CTYPE_UNIDATA_H_INCLUDED #define CTYPE_UNIDATA_H_INCLUDED /* - Copyright (c) 2018 MariaDB Corporation + Copyright (c) 2018, 2023 MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,43 +17,69 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#define MY_UNICASE_INFO_DEFAULT_MAXCHAR 0xFFFF -extern MY_UNICASE_CHARACTER my_unicase_default_page00[256]; -extern MY_UNICASE_CHARACTER *my_unicase_default_pages[256]; -extern MY_UNICASE_CHARACTER my_unicase_mysql500_page00[256]; -extern MY_UNICASE_CHARACTER *my_unicase_mysql500_pages[256]; +extern const uint16 weight_general_ci_page00[256]; +extern const uint16 *weight_general_ci_index[256]; +extern const uint16 weight_general_mysql500_ci_page00[256]; +extern const uint16 *weight_general_mysql500_ci_index[256]; +extern const MY_CASEFOLD_CHARACTER u300_casefold_page00[256]; static inline my_wc_t my_u300_tolower_7bit(uchar ch) { - return my_unicase_default_page00[ch].tolower; + return u300_casefold_page00[ch].tolower; } static inline my_wc_t my_u300_toupper_7bit(uchar ch) { - return my_unicase_default_page00[ch].toupper; + return u300_casefold_page00[ch].toupper; } -static inline void my_tosort_unicode_bmp(MY_UNICASE_INFO *uni_plane, +static inline my_wc_t my_general_ci_bmp_char_to_weight(my_wc_t wc) +{ + const uint16 *page; + DBUG_ASSERT((wc >> 8) < array_elements(weight_general_ci_index)); + page= weight_general_ci_index[wc >> 8]; + return page ? page[wc & 0xFF] : wc; +} + + +static inline my_wc_t my_general_ci_char_to_weight(my_wc_t wc) +{ + if ((wc >> 8) < array_elements(weight_general_ci_index)) + return my_general_ci_bmp_char_to_weight(wc); + return MY_CS_REPLACEMENT_CHARACTER; +} + + +static inline my_wc_t my_general_mysql500_ci_bmp_char_to_weight(my_wc_t wc) +{ + const uint16 *page; + DBUG_ASSERT((wc >> 8) < array_elements(weight_general_mysql500_ci_index)); + page= weight_general_mysql500_ci_index[wc >> 8]; + return page ? page[wc & 0xFF] : wc; +} + + +static inline void my_tosort_unicode_bmp(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { - const MY_UNICASE_CHARACTER *page; + const uint16 *page; DBUG_ASSERT(*wc <= uni_plane->maxchar); - if ((page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].sort; + if ((page= uni_plane->simple_weight[*wc >> 8])) + *wc= page[*wc & 0xFF]; } -static inline void my_tosort_unicode(MY_UNICASE_INFO *uni_plane, +static inline void my_tosort_unicode(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { if (*wc <= uni_plane->maxchar) { - const MY_UNICASE_CHARACTER *page; - if ((page= uni_plane->page[*wc >> 8])) - *wc= page[*wc & 0xFF].sort; + const uint16 *page; + if ((page= uni_plane->simple_weight[*wc >> 8])) + *wc= page[*wc & 0xFF]; } else { @@ -63,9 +89,9 @@ static inline void my_tosort_unicode(MY_UNICASE_INFO *uni_plane, static inline void -my_tolower_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +my_tolower_unicode_bmp(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { - const MY_UNICASE_CHARACTER *page; + const MY_CASEFOLD_CHARACTER *page; DBUG_ASSERT(*wc <= uni_plane->maxchar); if ((page= uni_plane->page[*wc >> 8])) *wc= page[*wc & 0xFF].tolower; @@ -73,9 +99,9 @@ my_tolower_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) static inline void -my_toupper_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +my_toupper_unicode_bmp(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { - const MY_UNICASE_CHARACTER *page; + const MY_CASEFOLD_CHARACTER *page; DBUG_ASSERT(*wc <= uni_plane->maxchar); if ((page= uni_plane->page[*wc >> 8])) *wc= page[*wc & 0xFF].toupper; @@ -83,11 +109,11 @@ my_toupper_unicode_bmp(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) static inline void -my_tolower_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +my_tolower_unicode(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { if (*wc <= uni_plane->maxchar) { - const MY_UNICASE_CHARACTER *page; + const MY_CASEFOLD_CHARACTER *page; if ((page= uni_plane->page[(*wc >> 8)])) *wc= page[*wc & 0xFF].tolower; } @@ -95,17 +121,23 @@ my_tolower_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) static inline void -my_toupper_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) +my_toupper_unicode(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc) { if (*wc <= uni_plane->maxchar) { - const MY_UNICASE_CHARACTER *page; + const MY_CASEFOLD_CHARACTER *page; if ((page= uni_plane->page[(*wc >> 8)])) *wc= page[*wc & 0xFF].toupper; } } +extern MY_CASEFOLD_INFO my_casefold_default; +extern MY_CASEFOLD_INFO my_casefold_turkish; +extern MY_CASEFOLD_INFO my_casefold_mysql500; +extern MY_CASEFOLD_INFO my_casefold_unicode520; + + size_t my_strxfrm_pad_nweights_unicode(uchar *str, uchar *strend, size_t nweights); size_t my_strxfrm_pad_unicode(uchar *str, uchar *strend); diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 01beb8c9f198e..8656f1f059369 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -113,4543 +113,18 @@ int my_valid_mbcharlen_utf8mb3(const uchar *s, const uchar *e) #include "my_uctype.h" -MY_UNICASE_CHARACTER my_unicase_default_page00[]={ - {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001}, - {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003}, - {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005}, - {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007}, - {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009}, - {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B}, - {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D}, - {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F}, - {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011}, - {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013}, - {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015}, - {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017}, - {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019}, - {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B}, - {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D}, - {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F}, - {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021}, - {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023}, - {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025}, - {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027}, - {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029}, - {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B}, - {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D}, - {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F}, - {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031}, - {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033}, - {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035}, - {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037}, - {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039}, - {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B}, - {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D}, - {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F}, - {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B}, - {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D}, - {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F}, - {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B}, - {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D}, - {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F}, - {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081}, - {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083}, - {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085}, - {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087}, - {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089}, - {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B}, - {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D}, - {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F}, - {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091}, - {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093}, - {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095}, - {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097}, - {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099}, - {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B}, - {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D}, - {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F}, - {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1}, - {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3}, - {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5}, - {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7}, - {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9}, - {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB}, - {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD}, - {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF}, - {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1}, - {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3}, - {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C}, - {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7}, - {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9}, - {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB}, - {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD}, - {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x0053}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059} -}; - - -/* - Almost similar to my_unicase_default_page00, but maps sorting order - for U+00DF to 0x00DF instead of 0x0053. -*/ -MY_UNICASE_CHARACTER my_unicase_mysql500_page00[]={ - {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001}, - {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003}, - {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005}, - {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007}, - {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009}, - {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B}, - {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D}, - {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F}, - {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011}, - {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013}, - {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015}, - {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017}, - {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019}, - {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B}, - {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D}, - {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F}, - {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021}, - {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023}, - {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025}, - {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027}, - {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029}, - {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B}, - {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D}, - {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F}, - {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031}, - {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033}, - {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035}, - {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037}, - {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039}, - {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B}, - {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D}, - {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F}, - {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B}, - {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D}, - {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F}, - {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B}, - {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D}, - {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F}, - {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081}, - {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083}, - {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085}, - {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087}, - {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089}, - {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B}, - {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D}, - {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F}, - {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091}, - {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093}, - {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095}, - {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097}, - {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099}, - {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B}, - {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D}, - {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F}, - {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1}, - {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3}, - {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5}, - {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7}, - {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9}, - {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB}, - {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD}, - {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF}, - {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1}, - {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3}, - {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C}, - {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7}, - {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9}, - {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB}, - {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD}, - {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x00DF}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059} -}; - - -static MY_UNICASE_CHARACTER plane01[]={ - {0x0100,0x0101,0x0041}, {0x0100,0x0101,0x0041}, - {0x0102,0x0103,0x0041}, {0x0102,0x0103,0x0041}, - {0x0104,0x0105,0x0041}, {0x0104,0x0105,0x0041}, - {0x0106,0x0107,0x0043}, {0x0106,0x0107,0x0043}, - {0x0108,0x0109,0x0043}, {0x0108,0x0109,0x0043}, - {0x010A,0x010B,0x0043}, {0x010A,0x010B,0x0043}, - {0x010C,0x010D,0x0043}, {0x010C,0x010D,0x0043}, - {0x010E,0x010F,0x0044}, {0x010E,0x010F,0x0044}, - {0x0110,0x0111,0x0110}, {0x0110,0x0111,0x0110}, - {0x0112,0x0113,0x0045}, {0x0112,0x0113,0x0045}, - {0x0114,0x0115,0x0045}, {0x0114,0x0115,0x0045}, - {0x0116,0x0117,0x0045}, {0x0116,0x0117,0x0045}, - {0x0118,0x0119,0x0045}, {0x0118,0x0119,0x0045}, - {0x011A,0x011B,0x0045}, {0x011A,0x011B,0x0045}, - {0x011C,0x011D,0x0047}, {0x011C,0x011D,0x0047}, - {0x011E,0x011F,0x0047}, {0x011E,0x011F,0x0047}, - {0x0120,0x0121,0x0047}, {0x0120,0x0121,0x0047}, - {0x0122,0x0123,0x0047}, {0x0122,0x0123,0x0047}, - {0x0124,0x0125,0x0048}, {0x0124,0x0125,0x0048}, - {0x0126,0x0127,0x0126}, {0x0126,0x0127,0x0126}, - {0x0128,0x0129,0x0049}, {0x0128,0x0129,0x0049}, - {0x012A,0x012B,0x0049}, {0x012A,0x012B,0x0049}, - {0x012C,0x012D,0x0049}, {0x012C,0x012D,0x0049}, - {0x012E,0x012F,0x0049}, {0x012E,0x012F,0x0049}, - {0x0130,0x0069,0x0049}, {0x0049,0x0131,0x0049}, - {0x0132,0x0133,0x0132}, {0x0132,0x0133,0x0132}, - {0x0134,0x0135,0x004A}, {0x0134,0x0135,0x004A}, - {0x0136,0x0137,0x004B}, {0x0136,0x0137,0x004B}, - {0x0138,0x0138,0x0138}, {0x0139,0x013A,0x004C}, - {0x0139,0x013A,0x004C}, {0x013B,0x013C,0x004C}, - {0x013B,0x013C,0x004C}, {0x013D,0x013E,0x004C}, - {0x013D,0x013E,0x004C}, {0x013F,0x0140,0x013F}, - {0x013F,0x0140,0x013F}, {0x0141,0x0142,0x0141}, - {0x0141,0x0142,0x0141}, {0x0143,0x0144,0x004E}, - {0x0143,0x0144,0x004E}, {0x0145,0x0146,0x004E}, - {0x0145,0x0146,0x004E}, {0x0147,0x0148,0x004E}, - {0x0147,0x0148,0x004E}, {0x0149,0x0149,0x0149}, - {0x014A,0x014B,0x014A}, {0x014A,0x014B,0x014A}, - {0x014C,0x014D,0x004F}, {0x014C,0x014D,0x004F}, - {0x014E,0x014F,0x004F}, {0x014E,0x014F,0x004F}, - {0x0150,0x0151,0x004F}, {0x0150,0x0151,0x004F}, - {0x0152,0x0153,0x0152}, {0x0152,0x0153,0x0152}, - {0x0154,0x0155,0x0052}, {0x0154,0x0155,0x0052}, - {0x0156,0x0157,0x0052}, {0x0156,0x0157,0x0052}, - {0x0158,0x0159,0x0052}, {0x0158,0x0159,0x0052}, - {0x015A,0x015B,0x0053}, {0x015A,0x015B,0x0053}, - {0x015C,0x015D,0x0053}, {0x015C,0x015D,0x0053}, - {0x015E,0x015F,0x0053}, {0x015E,0x015F,0x0053}, - {0x0160,0x0161,0x0053}, {0x0160,0x0161,0x0053}, - {0x0162,0x0163,0x0054}, {0x0162,0x0163,0x0054}, - {0x0164,0x0165,0x0054}, {0x0164,0x0165,0x0054}, - {0x0166,0x0167,0x0166}, {0x0166,0x0167,0x0166}, - {0x0168,0x0169,0x0055}, {0x0168,0x0169,0x0055}, - {0x016A,0x016B,0x0055}, {0x016A,0x016B,0x0055}, - {0x016C,0x016D,0x0055}, {0x016C,0x016D,0x0055}, - {0x016E,0x016F,0x0055}, {0x016E,0x016F,0x0055}, - {0x0170,0x0171,0x0055}, {0x0170,0x0171,0x0055}, - {0x0172,0x0173,0x0055}, {0x0172,0x0173,0x0055}, - {0x0174,0x0175,0x0057}, {0x0174,0x0175,0x0057}, - {0x0176,0x0177,0x0059}, {0x0176,0x0177,0x0059}, - {0x0178,0x00FF,0x0059}, {0x0179,0x017A,0x005A}, - {0x0179,0x017A,0x005A}, {0x017B,0x017C,0x005A}, - {0x017B,0x017C,0x005A}, {0x017D,0x017E,0x005A}, - {0x017D,0x017E,0x005A}, {0x0053,0x017F,0x0053}, - {0x0180,0x0180,0x0180}, {0x0181,0x0253,0x0181}, - {0x0182,0x0183,0x0182}, {0x0182,0x0183,0x0182}, - {0x0184,0x0185,0x0184}, {0x0184,0x0185,0x0184}, - {0x0186,0x0254,0x0186}, {0x0187,0x0188,0x0187}, - {0x0187,0x0188,0x0187}, {0x0189,0x0256,0x0189}, - {0x018A,0x0257,0x018A}, {0x018B,0x018C,0x018B}, - {0x018B,0x018C,0x018B}, {0x018D,0x018D,0x018D}, - {0x018E,0x01DD,0x018E}, {0x018F,0x0259,0x018F}, - {0x0190,0x025B,0x0190}, {0x0191,0x0192,0x0191}, - {0x0191,0x0192,0x0191}, {0x0193,0x0260,0x0193}, - {0x0194,0x0263,0x0194}, {0x01F6,0x0195,0x01F6}, - {0x0196,0x0269,0x0196}, {0x0197,0x0268,0x0197}, - {0x0198,0x0199,0x0198}, {0x0198,0x0199,0x0198}, - {0x019A,0x019A,0x019A}, {0x019B,0x019B,0x019B}, - {0x019C,0x026F,0x019C}, {0x019D,0x0272,0x019D}, - {0x019E,0x019E,0x019E}, {0x019F,0x0275,0x019F}, - {0x01A0,0x01A1,0x004F}, {0x01A0,0x01A1,0x004F}, - {0x01A2,0x01A3,0x01A2}, {0x01A2,0x01A3,0x01A2}, - {0x01A4,0x01A5,0x01A4}, {0x01A4,0x01A5,0x01A4}, - {0x01A6,0x0280,0x01A6}, {0x01A7,0x01A8,0x01A7}, - {0x01A7,0x01A8,0x01A7}, {0x01A9,0x0283,0x01A9}, - {0x01AA,0x01AA,0x01AA}, {0x01AB,0x01AB,0x01AB}, - {0x01AC,0x01AD,0x01AC}, {0x01AC,0x01AD,0x01AC}, - {0x01AE,0x0288,0x01AE}, {0x01AF,0x01B0,0x0055}, - {0x01AF,0x01B0,0x0055}, {0x01B1,0x028A,0x01B1}, - {0x01B2,0x028B,0x01B2}, {0x01B3,0x01B4,0x01B3}, - {0x01B3,0x01B4,0x01B3}, {0x01B5,0x01B6,0x01B5}, - {0x01B5,0x01B6,0x01B5}, {0x01B7,0x0292,0x01B7}, - {0x01B8,0x01B9,0x01B8}, {0x01B8,0x01B9,0x01B8}, - {0x01BA,0x01BA,0x01BA}, {0x01BB,0x01BB,0x01BB}, - {0x01BC,0x01BD,0x01BC}, {0x01BC,0x01BD,0x01BC}, - {0x01BE,0x01BE,0x01BE}, {0x01F7,0x01BF,0x01F7}, - {0x01C0,0x01C0,0x01C0}, {0x01C1,0x01C1,0x01C1}, - {0x01C2,0x01C2,0x01C2}, {0x01C3,0x01C3,0x01C3}, - {0x01C4,0x01C6,0x01C4}, {0x01C4,0x01C6,0x01C4}, - {0x01C4,0x01C6,0x01C4}, {0x01C7,0x01C9,0x01C7}, - {0x01C7,0x01C9,0x01C7}, {0x01C7,0x01C9,0x01C7}, - {0x01CA,0x01CC,0x01CA}, {0x01CA,0x01CC,0x01CA}, - {0x01CA,0x01CC,0x01CA}, {0x01CD,0x01CE,0x0041}, - {0x01CD,0x01CE,0x0041}, {0x01CF,0x01D0,0x0049}, - {0x01CF,0x01D0,0x0049}, {0x01D1,0x01D2,0x004F}, - {0x01D1,0x01D2,0x004F}, {0x01D3,0x01D4,0x0055}, - {0x01D3,0x01D4,0x0055}, {0x01D5,0x01D6,0x0055}, - {0x01D5,0x01D6,0x0055}, {0x01D7,0x01D8,0x0055}, - {0x01D7,0x01D8,0x0055}, {0x01D9,0x01DA,0x0055}, - {0x01D9,0x01DA,0x0055}, {0x01DB,0x01DC,0x0055}, - {0x01DB,0x01DC,0x0055}, {0x018E,0x01DD,0x018E}, - {0x01DE,0x01DF,0x0041}, {0x01DE,0x01DF,0x0041}, - {0x01E0,0x01E1,0x0041}, {0x01E0,0x01E1,0x0041}, - {0x01E2,0x01E3,0x00C6}, {0x01E2,0x01E3,0x00C6}, - {0x01E4,0x01E5,0x01E4}, {0x01E4,0x01E5,0x01E4}, - {0x01E6,0x01E7,0x0047}, {0x01E6,0x01E7,0x0047}, - {0x01E8,0x01E9,0x004B}, {0x01E8,0x01E9,0x004B}, - {0x01EA,0x01EB,0x004F}, {0x01EA,0x01EB,0x004F}, - {0x01EC,0x01ED,0x004F}, {0x01EC,0x01ED,0x004F}, - {0x01EE,0x01EF,0x01B7}, {0x01EE,0x01EF,0x01B7}, - {0x01F0,0x01F0,0x004A}, {0x01F1,0x01F3,0x01F1}, - {0x01F1,0x01F3,0x01F1}, {0x01F1,0x01F3,0x01F1}, - {0x01F4,0x01F5,0x0047}, {0x01F4,0x01F5,0x0047}, - {0x01F6,0x0195,0x01F6}, {0x01F7,0x01BF,0x01F7}, - {0x01F8,0x01F9,0x004E}, {0x01F8,0x01F9,0x004E}, - {0x01FA,0x01FB,0x0041}, {0x01FA,0x01FB,0x0041}, - {0x01FC,0x01FD,0x00C6}, {0x01FC,0x01FD,0x00C6}, - {0x01FE,0x01FF,0x00D8}, {0x01FE,0x01FF,0x00D8} -}; - -static MY_UNICASE_CHARACTER plane02[]={ - {0x0200,0x0201,0x0041}, {0x0200,0x0201,0x0041}, - {0x0202,0x0203,0x0041}, {0x0202,0x0203,0x0041}, - {0x0204,0x0205,0x0045}, {0x0204,0x0205,0x0045}, - {0x0206,0x0207,0x0045}, {0x0206,0x0207,0x0045}, - {0x0208,0x0209,0x0049}, {0x0208,0x0209,0x0049}, - {0x020A,0x020B,0x0049}, {0x020A,0x020B,0x0049}, - {0x020C,0x020D,0x004F}, {0x020C,0x020D,0x004F}, - {0x020E,0x020F,0x004F}, {0x020E,0x020F,0x004F}, - {0x0210,0x0211,0x0052}, {0x0210,0x0211,0x0052}, - {0x0212,0x0213,0x0052}, {0x0212,0x0213,0x0052}, - {0x0214,0x0215,0x0055}, {0x0214,0x0215,0x0055}, - {0x0216,0x0217,0x0055}, {0x0216,0x0217,0x0055}, - {0x0218,0x0219,0x0053}, {0x0218,0x0219,0x0053}, - {0x021A,0x021B,0x0054}, {0x021A,0x021B,0x0054}, - {0x021C,0x021D,0x021C}, {0x021C,0x021D,0x021C}, - {0x021E,0x021F,0x0048}, {0x021E,0x021F,0x0048}, - {0x0220,0x0220,0x0220}, {0x0221,0x0221,0x0221}, - {0x0222,0x0223,0x0222}, {0x0222,0x0223,0x0222}, - {0x0224,0x0225,0x0224}, {0x0224,0x0225,0x0224}, - {0x0226,0x0227,0x0041}, {0x0226,0x0227,0x0041}, - {0x0228,0x0229,0x0045}, {0x0228,0x0229,0x0045}, - {0x022A,0x022B,0x004F}, {0x022A,0x022B,0x004F}, - {0x022C,0x022D,0x004F}, {0x022C,0x022D,0x004F}, - {0x022E,0x022F,0x004F}, {0x022E,0x022F,0x004F}, - {0x0230,0x0231,0x004F}, {0x0230,0x0231,0x004F}, - {0x0232,0x0233,0x0059}, {0x0232,0x0233,0x0059}, - {0x0234,0x0234,0x0234}, {0x0235,0x0235,0x0235}, - {0x0236,0x0236,0x0236}, {0x0237,0x0237,0x0237}, - {0x0238,0x0238,0x0238}, {0x0239,0x0239,0x0239}, - {0x023A,0x023A,0x023A}, {0x023B,0x023B,0x023B}, - {0x023C,0x023C,0x023C}, {0x023D,0x023D,0x023D}, - {0x023E,0x023E,0x023E}, {0x023F,0x023F,0x023F}, - {0x0240,0x0240,0x0240}, {0x0241,0x0241,0x0241}, - {0x0242,0x0242,0x0242}, {0x0243,0x0243,0x0243}, - {0x0244,0x0244,0x0244}, {0x0245,0x0245,0x0245}, - {0x0246,0x0246,0x0246}, {0x0247,0x0247,0x0247}, - {0x0248,0x0248,0x0248}, {0x0249,0x0249,0x0249}, - {0x024A,0x024A,0x024A}, {0x024B,0x024B,0x024B}, - {0x024C,0x024C,0x024C}, {0x024D,0x024D,0x024D}, - {0x024E,0x024E,0x024E}, {0x024F,0x024F,0x024F}, - {0x0250,0x0250,0x0250}, {0x0251,0x0251,0x0251}, - {0x0252,0x0252,0x0252}, {0x0181,0x0253,0x0181}, - {0x0186,0x0254,0x0186}, {0x0255,0x0255,0x0255}, - {0x0189,0x0256,0x0189}, {0x018A,0x0257,0x018A}, - {0x0258,0x0258,0x0258}, {0x018F,0x0259,0x018F}, - {0x025A,0x025A,0x025A}, {0x0190,0x025B,0x0190}, - {0x025C,0x025C,0x025C}, {0x025D,0x025D,0x025D}, - {0x025E,0x025E,0x025E}, {0x025F,0x025F,0x025F}, - {0x0193,0x0260,0x0193}, {0x0261,0x0261,0x0261}, - {0x0262,0x0262,0x0262}, {0x0194,0x0263,0x0194}, - {0x0264,0x0264,0x0264}, {0x0265,0x0265,0x0265}, - {0x0266,0x0266,0x0266}, {0x0267,0x0267,0x0267}, - {0x0197,0x0268,0x0197}, {0x0196,0x0269,0x0196}, - {0x026A,0x026A,0x026A}, {0x026B,0x026B,0x026B}, - {0x026C,0x026C,0x026C}, {0x026D,0x026D,0x026D}, - {0x026E,0x026E,0x026E}, {0x019C,0x026F,0x019C}, - {0x0270,0x0270,0x0270}, {0x0271,0x0271,0x0271}, - {0x019D,0x0272,0x019D}, {0x0273,0x0273,0x0273}, - {0x0274,0x0274,0x0274}, {0x019F,0x0275,0x019F}, - {0x0276,0x0276,0x0276}, {0x0277,0x0277,0x0277}, - {0x0278,0x0278,0x0278}, {0x0279,0x0279,0x0279}, - {0x027A,0x027A,0x027A}, {0x027B,0x027B,0x027B}, - {0x027C,0x027C,0x027C}, {0x027D,0x027D,0x027D}, - {0x027E,0x027E,0x027E}, {0x027F,0x027F,0x027F}, - {0x01A6,0x0280,0x01A6}, {0x0281,0x0281,0x0281}, - {0x0282,0x0282,0x0282}, {0x01A9,0x0283,0x01A9}, - {0x0284,0x0284,0x0284}, {0x0285,0x0285,0x0285}, - {0x0286,0x0286,0x0286}, {0x0287,0x0287,0x0287}, - {0x01AE,0x0288,0x01AE}, {0x0289,0x0289,0x0289}, - {0x01B1,0x028A,0x01B1}, {0x01B2,0x028B,0x01B2}, - {0x028C,0x028C,0x028C}, {0x028D,0x028D,0x028D}, - {0x028E,0x028E,0x028E}, {0x028F,0x028F,0x028F}, - {0x0290,0x0290,0x0290}, {0x0291,0x0291,0x0291}, - {0x01B7,0x0292,0x01B7}, {0x0293,0x0293,0x0293}, - {0x0294,0x0294,0x0294}, {0x0295,0x0295,0x0295}, - {0x0296,0x0296,0x0296}, {0x0297,0x0297,0x0297}, - {0x0298,0x0298,0x0298}, {0x0299,0x0299,0x0299}, - {0x029A,0x029A,0x029A}, {0x029B,0x029B,0x029B}, - {0x029C,0x029C,0x029C}, {0x029D,0x029D,0x029D}, - {0x029E,0x029E,0x029E}, {0x029F,0x029F,0x029F}, - {0x02A0,0x02A0,0x02A0}, {0x02A1,0x02A1,0x02A1}, - {0x02A2,0x02A2,0x02A2}, {0x02A3,0x02A3,0x02A3}, - {0x02A4,0x02A4,0x02A4}, {0x02A5,0x02A5,0x02A5}, - {0x02A6,0x02A6,0x02A6}, {0x02A7,0x02A7,0x02A7}, - {0x02A8,0x02A8,0x02A8}, {0x02A9,0x02A9,0x02A9}, - {0x02AA,0x02AA,0x02AA}, {0x02AB,0x02AB,0x02AB}, - {0x02AC,0x02AC,0x02AC}, {0x02AD,0x02AD,0x02AD}, - {0x02AE,0x02AE,0x02AE}, {0x02AF,0x02AF,0x02AF}, - {0x02B0,0x02B0,0x02B0}, {0x02B1,0x02B1,0x02B1}, - {0x02B2,0x02B2,0x02B2}, {0x02B3,0x02B3,0x02B3}, - {0x02B4,0x02B4,0x02B4}, {0x02B5,0x02B5,0x02B5}, - {0x02B6,0x02B6,0x02B6}, {0x02B7,0x02B7,0x02B7}, - {0x02B8,0x02B8,0x02B8}, {0x02B9,0x02B9,0x02B9}, - {0x02BA,0x02BA,0x02BA}, {0x02BB,0x02BB,0x02BB}, - {0x02BC,0x02BC,0x02BC}, {0x02BD,0x02BD,0x02BD}, - {0x02BE,0x02BE,0x02BE}, {0x02BF,0x02BF,0x02BF}, - {0x02C0,0x02C0,0x02C0}, {0x02C1,0x02C1,0x02C1}, - {0x02C2,0x02C2,0x02C2}, {0x02C3,0x02C3,0x02C3}, - {0x02C4,0x02C4,0x02C4}, {0x02C5,0x02C5,0x02C5}, - {0x02C6,0x02C6,0x02C6}, {0x02C7,0x02C7,0x02C7}, - {0x02C8,0x02C8,0x02C8}, {0x02C9,0x02C9,0x02C9}, - {0x02CA,0x02CA,0x02CA}, {0x02CB,0x02CB,0x02CB}, - {0x02CC,0x02CC,0x02CC}, {0x02CD,0x02CD,0x02CD}, - {0x02CE,0x02CE,0x02CE}, {0x02CF,0x02CF,0x02CF}, - {0x02D0,0x02D0,0x02D0}, {0x02D1,0x02D1,0x02D1}, - {0x02D2,0x02D2,0x02D2}, {0x02D3,0x02D3,0x02D3}, - {0x02D4,0x02D4,0x02D4}, {0x02D5,0x02D5,0x02D5}, - {0x02D6,0x02D6,0x02D6}, {0x02D7,0x02D7,0x02D7}, - {0x02D8,0x02D8,0x02D8}, {0x02D9,0x02D9,0x02D9}, - {0x02DA,0x02DA,0x02DA}, {0x02DB,0x02DB,0x02DB}, - {0x02DC,0x02DC,0x02DC}, {0x02DD,0x02DD,0x02DD}, - {0x02DE,0x02DE,0x02DE}, {0x02DF,0x02DF,0x02DF}, - {0x02E0,0x02E0,0x02E0}, {0x02E1,0x02E1,0x02E1}, - {0x02E2,0x02E2,0x02E2}, {0x02E3,0x02E3,0x02E3}, - {0x02E4,0x02E4,0x02E4}, {0x02E5,0x02E5,0x02E5}, - {0x02E6,0x02E6,0x02E6}, {0x02E7,0x02E7,0x02E7}, - {0x02E8,0x02E8,0x02E8}, {0x02E9,0x02E9,0x02E9}, - {0x02EA,0x02EA,0x02EA}, {0x02EB,0x02EB,0x02EB}, - {0x02EC,0x02EC,0x02EC}, {0x02ED,0x02ED,0x02ED}, - {0x02EE,0x02EE,0x02EE}, {0x02EF,0x02EF,0x02EF}, - {0x02F0,0x02F0,0x02F0}, {0x02F1,0x02F1,0x02F1}, - {0x02F2,0x02F2,0x02F2}, {0x02F3,0x02F3,0x02F3}, - {0x02F4,0x02F4,0x02F4}, {0x02F5,0x02F5,0x02F5}, - {0x02F6,0x02F6,0x02F6}, {0x02F7,0x02F7,0x02F7}, - {0x02F8,0x02F8,0x02F8}, {0x02F9,0x02F9,0x02F9}, - {0x02FA,0x02FA,0x02FA}, {0x02FB,0x02FB,0x02FB}, - {0x02FC,0x02FC,0x02FC}, {0x02FD,0x02FD,0x02FD}, - {0x02FE,0x02FE,0x02FE}, {0x02FF,0x02FF,0x02FF} -}; - -static MY_UNICASE_CHARACTER plane03[]={ - {0x0300,0x0300,0x0300}, {0x0301,0x0301,0x0301}, - {0x0302,0x0302,0x0302}, {0x0303,0x0303,0x0303}, - {0x0304,0x0304,0x0304}, {0x0305,0x0305,0x0305}, - {0x0306,0x0306,0x0306}, {0x0307,0x0307,0x0307}, - {0x0308,0x0308,0x0308}, {0x0309,0x0309,0x0309}, - {0x030A,0x030A,0x030A}, {0x030B,0x030B,0x030B}, - {0x030C,0x030C,0x030C}, {0x030D,0x030D,0x030D}, - {0x030E,0x030E,0x030E}, {0x030F,0x030F,0x030F}, - {0x0310,0x0310,0x0310}, {0x0311,0x0311,0x0311}, - {0x0312,0x0312,0x0312}, {0x0313,0x0313,0x0313}, - {0x0314,0x0314,0x0314}, {0x0315,0x0315,0x0315}, - {0x0316,0x0316,0x0316}, {0x0317,0x0317,0x0317}, - {0x0318,0x0318,0x0318}, {0x0319,0x0319,0x0319}, - {0x031A,0x031A,0x031A}, {0x031B,0x031B,0x031B}, - {0x031C,0x031C,0x031C}, {0x031D,0x031D,0x031D}, - {0x031E,0x031E,0x031E}, {0x031F,0x031F,0x031F}, - {0x0320,0x0320,0x0320}, {0x0321,0x0321,0x0321}, - {0x0322,0x0322,0x0322}, {0x0323,0x0323,0x0323}, - {0x0324,0x0324,0x0324}, {0x0325,0x0325,0x0325}, - {0x0326,0x0326,0x0326}, {0x0327,0x0327,0x0327}, - {0x0328,0x0328,0x0328}, {0x0329,0x0329,0x0329}, - {0x032A,0x032A,0x032A}, {0x032B,0x032B,0x032B}, - {0x032C,0x032C,0x032C}, {0x032D,0x032D,0x032D}, - {0x032E,0x032E,0x032E}, {0x032F,0x032F,0x032F}, - {0x0330,0x0330,0x0330}, {0x0331,0x0331,0x0331}, - {0x0332,0x0332,0x0332}, {0x0333,0x0333,0x0333}, - {0x0334,0x0334,0x0334}, {0x0335,0x0335,0x0335}, - {0x0336,0x0336,0x0336}, {0x0337,0x0337,0x0337}, - {0x0338,0x0338,0x0338}, {0x0339,0x0339,0x0339}, - {0x033A,0x033A,0x033A}, {0x033B,0x033B,0x033B}, - {0x033C,0x033C,0x033C}, {0x033D,0x033D,0x033D}, - {0x033E,0x033E,0x033E}, {0x033F,0x033F,0x033F}, - {0x0340,0x0340,0x0340}, {0x0341,0x0341,0x0341}, - {0x0342,0x0342,0x0342}, {0x0343,0x0343,0x0343}, - {0x0344,0x0344,0x0344}, {0x0399,0x0345,0x0399}, - {0x0346,0x0346,0x0346}, {0x0347,0x0347,0x0347}, - {0x0348,0x0348,0x0348}, {0x0349,0x0349,0x0349}, - {0x034A,0x034A,0x034A}, {0x034B,0x034B,0x034B}, - {0x034C,0x034C,0x034C}, {0x034D,0x034D,0x034D}, - {0x034E,0x034E,0x034E}, {0x034F,0x034F,0x034F}, - {0x0350,0x0350,0x0350}, {0x0351,0x0351,0x0351}, - {0x0352,0x0352,0x0352}, {0x0353,0x0353,0x0353}, - {0x0354,0x0354,0x0354}, {0x0355,0x0355,0x0355}, - {0x0356,0x0356,0x0356}, {0x0357,0x0357,0x0357}, - {0x0358,0x0358,0x0358}, {0x0359,0x0359,0x0359}, - {0x035A,0x035A,0x035A}, {0x035B,0x035B,0x035B}, - {0x035C,0x035C,0x035C}, {0x035D,0x035D,0x035D}, - {0x035E,0x035E,0x035E}, {0x035F,0x035F,0x035F}, - {0x0360,0x0360,0x0360}, {0x0361,0x0361,0x0361}, - {0x0362,0x0362,0x0362}, {0x0363,0x0363,0x0363}, - {0x0364,0x0364,0x0364}, {0x0365,0x0365,0x0365}, - {0x0366,0x0366,0x0366}, {0x0367,0x0367,0x0367}, - {0x0368,0x0368,0x0368}, {0x0369,0x0369,0x0369}, - {0x036A,0x036A,0x036A}, {0x036B,0x036B,0x036B}, - {0x036C,0x036C,0x036C}, {0x036D,0x036D,0x036D}, - {0x036E,0x036E,0x036E}, {0x036F,0x036F,0x036F}, - {0x0370,0x0370,0x0370}, {0x0371,0x0371,0x0371}, - {0x0372,0x0372,0x0372}, {0x0373,0x0373,0x0373}, - {0x0374,0x0374,0x0374}, {0x0375,0x0375,0x0375}, - {0x0376,0x0376,0x0376}, {0x0377,0x0377,0x0377}, - {0x0378,0x0378,0x0378}, {0x0379,0x0379,0x0379}, - {0x037A,0x037A,0x037A}, {0x037B,0x037B,0x037B}, - {0x037C,0x037C,0x037C}, {0x037D,0x037D,0x037D}, - {0x037E,0x037E,0x037E}, {0x037F,0x037F,0x037F}, - {0x0380,0x0380,0x0380}, {0x0381,0x0381,0x0381}, - {0x0382,0x0382,0x0382}, {0x0383,0x0383,0x0383}, - {0x0384,0x0384,0x0384}, {0x0385,0x0385,0x0385}, - {0x0386,0x03AC,0x0391}, {0x0387,0x0387,0x0387}, - {0x0388,0x03AD,0x0395}, {0x0389,0x03AE,0x0397}, - {0x038A,0x03AF,0x0399}, {0x038B,0x038B,0x038B}, - {0x038C,0x03CC,0x039F}, {0x038D,0x038D,0x038D}, - {0x038E,0x03CD,0x03A5}, {0x038F,0x03CE,0x03A9}, - {0x0390,0x0390,0x0399}, {0x0391,0x03B1,0x0391}, - {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393}, - {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395}, - {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397}, - {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399}, - {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B}, - {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D}, - {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F}, - {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1}, - {0x03A2,0x03A2,0x03A2}, {0x03A3,0x03C3,0x03A3}, - {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5}, - {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7}, - {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9}, - {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5}, - {0x0386,0x03AC,0x0391}, {0x0388,0x03AD,0x0395}, - {0x0389,0x03AE,0x0397}, {0x038A,0x03AF,0x0399}, - {0x03B0,0x03B0,0x03A5}, {0x0391,0x03B1,0x0391}, - {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393}, - {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395}, - {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397}, - {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399}, - {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B}, - {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D}, - {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F}, - {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1}, - {0x03A3,0x03C2,0x03A3}, {0x03A3,0x03C3,0x03A3}, - {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5}, - {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7}, - {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9}, - {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5}, - {0x038C,0x03CC,0x039F}, {0x038E,0x03CD,0x03A5}, - {0x038F,0x03CE,0x03A9}, {0x03CF,0x03CF,0x03CF}, - {0x0392,0x03D0,0x0392}, {0x0398,0x03D1,0x0398}, - {0x03D2,0x03D2,0x03D2}, {0x03D3,0x03D3,0x03D2}, - {0x03D4,0x03D4,0x03D2}, {0x03A6,0x03D5,0x03A6}, - {0x03A0,0x03D6,0x03A0}, {0x03D7,0x03D7,0x03D7}, - {0x03D8,0x03D8,0x03D8}, {0x03D9,0x03D9,0x03D9}, - {0x03DA,0x03DB,0x03DA}, {0x03DA,0x03DB,0x03DA}, - {0x03DC,0x03DD,0x03DC}, {0x03DC,0x03DD,0x03DC}, - {0x03DE,0x03DF,0x03DE}, {0x03DE,0x03DF,0x03DE}, - {0x03E0,0x03E1,0x03E0}, {0x03E0,0x03E1,0x03E0}, - {0x03E2,0x03E3,0x03E2}, {0x03E2,0x03E3,0x03E2}, - {0x03E4,0x03E5,0x03E4}, {0x03E4,0x03E5,0x03E4}, - {0x03E6,0x03E7,0x03E6}, {0x03E6,0x03E7,0x03E6}, - {0x03E8,0x03E9,0x03E8}, {0x03E8,0x03E9,0x03E8}, - {0x03EA,0x03EB,0x03EA}, {0x03EA,0x03EB,0x03EA}, - {0x03EC,0x03ED,0x03EC}, {0x03EC,0x03ED,0x03EC}, - {0x03EE,0x03EF,0x03EE}, {0x03EE,0x03EF,0x03EE}, - {0x039A,0x03F0,0x039A}, {0x03A1,0x03F1,0x03A1}, - {0x03A3,0x03F2,0x03A3}, {0x03F3,0x03F3,0x03F3}, - {0x03F4,0x03F4,0x03F4}, {0x03F5,0x03F5,0x03F5}, - {0x03F6,0x03F6,0x03F6}, {0x03F7,0x03F7,0x03F7}, - {0x03F8,0x03F8,0x03F8}, {0x03F9,0x03F9,0x03F9}, - {0x03FA,0x03FA,0x03FA}, {0x03FB,0x03FB,0x03FB}, - {0x03FC,0x03FC,0x03FC}, {0x03FD,0x03FD,0x03FD}, - {0x03FE,0x03FE,0x03FE}, {0x03FF,0x03FF,0x03FF} -}; - -static MY_UNICASE_CHARACTER plane04[]={ - {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415}, - {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413}, - {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405}, - {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406}, - {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409}, - {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B}, - {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418}, - {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F}, - {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411}, - {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413}, - {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415}, - {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417}, - {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419}, - {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B}, - {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D}, - {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F}, - {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421}, - {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423}, - {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425}, - {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427}, - {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429}, - {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B}, - {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D}, - {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F}, - {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411}, - {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413}, - {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415}, - {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417}, - {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419}, - {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B}, - {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D}, - {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F}, - {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421}, - {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423}, - {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425}, - {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427}, - {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429}, - {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B}, - {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D}, - {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F}, - {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415}, - {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413}, - {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405}, - {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406}, - {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409}, - {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B}, - {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418}, - {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F}, - {0x0460,0x0461,0x0460}, {0x0460,0x0461,0x0460}, - {0x0462,0x0463,0x0462}, {0x0462,0x0463,0x0462}, - {0x0464,0x0465,0x0464}, {0x0464,0x0465,0x0464}, - {0x0466,0x0467,0x0466}, {0x0466,0x0467,0x0466}, - {0x0468,0x0469,0x0468}, {0x0468,0x0469,0x0468}, - {0x046A,0x046B,0x046A}, {0x046A,0x046B,0x046A}, - {0x046C,0x046D,0x046C}, {0x046C,0x046D,0x046C}, - {0x046E,0x046F,0x046E}, {0x046E,0x046F,0x046E}, - {0x0470,0x0471,0x0470}, {0x0470,0x0471,0x0470}, - {0x0472,0x0473,0x0472}, {0x0472,0x0473,0x0472}, - {0x0474,0x0475,0x0474}, {0x0474,0x0475,0x0474}, - {0x0476,0x0477,0x0474}, {0x0476,0x0477,0x0474}, - {0x0478,0x0479,0x0478}, {0x0478,0x0479,0x0478}, - {0x047A,0x047B,0x047A}, {0x047A,0x047B,0x047A}, - {0x047C,0x047D,0x047C}, {0x047C,0x047D,0x047C}, - {0x047E,0x047F,0x047E}, {0x047E,0x047F,0x047E}, - {0x0480,0x0481,0x0480}, {0x0480,0x0481,0x0480}, - {0x0482,0x0482,0x0482}, {0x0483,0x0483,0x0483}, - {0x0484,0x0484,0x0484}, {0x0485,0x0485,0x0485}, - {0x0486,0x0486,0x0486}, {0x0487,0x0487,0x0487}, - {0x0488,0x0488,0x0488}, {0x0489,0x0489,0x0489}, - {0x048A,0x048A,0x048A}, {0x048B,0x048B,0x048B}, - {0x048C,0x048D,0x048C}, {0x048C,0x048D,0x048C}, - {0x048E,0x048F,0x048E}, {0x048E,0x048F,0x048E}, - {0x0490,0x0491,0x0490}, {0x0490,0x0491,0x0490}, - {0x0492,0x0493,0x0492}, {0x0492,0x0493,0x0492}, - {0x0494,0x0495,0x0494}, {0x0494,0x0495,0x0494}, - {0x0496,0x0497,0x0496}, {0x0496,0x0497,0x0496}, - {0x0498,0x0499,0x0498}, {0x0498,0x0499,0x0498}, - {0x049A,0x049B,0x049A}, {0x049A,0x049B,0x049A}, - {0x049C,0x049D,0x049C}, {0x049C,0x049D,0x049C}, - {0x049E,0x049F,0x049E}, {0x049E,0x049F,0x049E}, - {0x04A0,0x04A1,0x04A0}, {0x04A0,0x04A1,0x04A0}, - {0x04A2,0x04A3,0x04A2}, {0x04A2,0x04A3,0x04A2}, - {0x04A4,0x04A5,0x04A4}, {0x04A4,0x04A5,0x04A4}, - {0x04A6,0x04A7,0x04A6}, {0x04A6,0x04A7,0x04A6}, - {0x04A8,0x04A9,0x04A8}, {0x04A8,0x04A9,0x04A8}, - {0x04AA,0x04AB,0x04AA}, {0x04AA,0x04AB,0x04AA}, - {0x04AC,0x04AD,0x04AC}, {0x04AC,0x04AD,0x04AC}, - {0x04AE,0x04AF,0x04AE}, {0x04AE,0x04AF,0x04AE}, - {0x04B0,0x04B1,0x04B0}, {0x04B0,0x04B1,0x04B0}, - {0x04B2,0x04B3,0x04B2}, {0x04B2,0x04B3,0x04B2}, - {0x04B4,0x04B5,0x04B4}, {0x04B4,0x04B5,0x04B4}, - {0x04B6,0x04B7,0x04B6}, {0x04B6,0x04B7,0x04B6}, - {0x04B8,0x04B9,0x04B8}, {0x04B8,0x04B9,0x04B8}, - {0x04BA,0x04BB,0x04BA}, {0x04BA,0x04BB,0x04BA}, - {0x04BC,0x04BD,0x04BC}, {0x04BC,0x04BD,0x04BC}, - {0x04BE,0x04BF,0x04BE}, {0x04BE,0x04BF,0x04BE}, - {0x04C0,0x04C0,0x04C0}, {0x04C1,0x04C2,0x0416}, - {0x04C1,0x04C2,0x0416}, {0x04C3,0x04C4,0x04C3}, - {0x04C3,0x04C4,0x04C3}, {0x04C5,0x04C5,0x04C5}, - {0x04C6,0x04C6,0x04C6}, {0x04C7,0x04C8,0x04C7}, - {0x04C7,0x04C8,0x04C7}, {0x04C9,0x04C9,0x04C9}, - {0x04CA,0x04CA,0x04CA}, {0x04CB,0x04CC,0x04CB}, - {0x04CB,0x04CC,0x04CB}, {0x04CD,0x04CD,0x04CD}, - {0x04CE,0x04CE,0x04CE}, {0x04CF,0x04CF,0x04CF}, - {0x04D0,0x04D1,0x0410}, {0x04D0,0x04D1,0x0410}, - {0x04D2,0x04D3,0x0410}, {0x04D2,0x04D3,0x0410}, - {0x04D4,0x04D5,0x04D4}, {0x04D4,0x04D5,0x04D4}, - {0x04D6,0x04D7,0x0415}, {0x04D6,0x04D7,0x0415}, - {0x04D8,0x04D9,0x04D8}, {0x04D8,0x04D9,0x04D8}, - {0x04DA,0x04DB,0x04D8}, {0x04DA,0x04DB,0x04D8}, - {0x04DC,0x04DD,0x0416}, {0x04DC,0x04DD,0x0416}, - {0x04DE,0x04DF,0x0417}, {0x04DE,0x04DF,0x0417}, - {0x04E0,0x04E1,0x04E0}, {0x04E0,0x04E1,0x04E0}, - {0x04E2,0x04E3,0x0418}, {0x04E2,0x04E3,0x0418}, - {0x04E4,0x04E5,0x0418}, {0x04E4,0x04E5,0x0418}, - {0x04E6,0x04E7,0x041E}, {0x04E6,0x04E7,0x041E}, - {0x04E8,0x04E9,0x04E8}, {0x04E8,0x04E9,0x04E8}, - {0x04EA,0x04EB,0x04E8}, {0x04EA,0x04EB,0x04E8}, - {0x04EC,0x04ED,0x042D}, {0x04EC,0x04ED,0x042D}, - {0x04EE,0x04EF,0x0423}, {0x04EE,0x04EF,0x0423}, - {0x04F0,0x04F1,0x0423}, {0x04F0,0x04F1,0x0423}, - {0x04F2,0x04F3,0x0423}, {0x04F2,0x04F3,0x0423}, - {0x04F4,0x04F5,0x0427}, {0x04F4,0x04F5,0x0427}, - {0x04F6,0x04F6,0x04F6}, {0x04F7,0x04F7,0x04F7}, - {0x04F8,0x04F9,0x042B}, {0x04F8,0x04F9,0x042B}, - {0x04FA,0x04FA,0x04FA}, {0x04FB,0x04FB,0x04FB}, - {0x04FC,0x04FC,0x04FC}, {0x04FD,0x04FD,0x04FD}, - {0x04FE,0x04FE,0x04FE}, {0x04FF,0x04FF,0x04FF} -}; - -static MY_UNICASE_CHARACTER plane05[]={ - {0x0500,0x0500,0x0500}, {0x0501,0x0501,0x0501}, - {0x0502,0x0502,0x0502}, {0x0503,0x0503,0x0503}, - {0x0504,0x0504,0x0504}, {0x0505,0x0505,0x0505}, - {0x0506,0x0506,0x0506}, {0x0507,0x0507,0x0507}, - {0x0508,0x0508,0x0508}, {0x0509,0x0509,0x0509}, - {0x050A,0x050A,0x050A}, {0x050B,0x050B,0x050B}, - {0x050C,0x050C,0x050C}, {0x050D,0x050D,0x050D}, - {0x050E,0x050E,0x050E}, {0x050F,0x050F,0x050F}, - {0x0510,0x0510,0x0510}, {0x0511,0x0511,0x0511}, - {0x0512,0x0512,0x0512}, {0x0513,0x0513,0x0513}, - {0x0514,0x0514,0x0514}, {0x0515,0x0515,0x0515}, - {0x0516,0x0516,0x0516}, {0x0517,0x0517,0x0517}, - {0x0518,0x0518,0x0518}, {0x0519,0x0519,0x0519}, - {0x051A,0x051A,0x051A}, {0x051B,0x051B,0x051B}, - {0x051C,0x051C,0x051C}, {0x051D,0x051D,0x051D}, - {0x051E,0x051E,0x051E}, {0x051F,0x051F,0x051F}, - {0x0520,0x0520,0x0520}, {0x0521,0x0521,0x0521}, - {0x0522,0x0522,0x0522}, {0x0523,0x0523,0x0523}, - {0x0524,0x0524,0x0524}, {0x0525,0x0525,0x0525}, - {0x0526,0x0526,0x0526}, {0x0527,0x0527,0x0527}, - {0x0528,0x0528,0x0528}, {0x0529,0x0529,0x0529}, - {0x052A,0x052A,0x052A}, {0x052B,0x052B,0x052B}, - {0x052C,0x052C,0x052C}, {0x052D,0x052D,0x052D}, - {0x052E,0x052E,0x052E}, {0x052F,0x052F,0x052F}, - {0x0530,0x0530,0x0530}, {0x0531,0x0561,0x0531}, - {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533}, - {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535}, - {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537}, - {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539}, - {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B}, - {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D}, - {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F}, - {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541}, - {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543}, - {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545}, - {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547}, - {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549}, - {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B}, - {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D}, - {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F}, - {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551}, - {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553}, - {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555}, - {0x0556,0x0586,0x0556}, {0x0557,0x0557,0x0557}, - {0x0558,0x0558,0x0558}, {0x0559,0x0559,0x0559}, - {0x055A,0x055A,0x055A}, {0x055B,0x055B,0x055B}, - {0x055C,0x055C,0x055C}, {0x055D,0x055D,0x055D}, - {0x055E,0x055E,0x055E}, {0x055F,0x055F,0x055F}, - {0x0560,0x0560,0x0560}, {0x0531,0x0561,0x0531}, - {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533}, - {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535}, - {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537}, - {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539}, - {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B}, - {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D}, - {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F}, - {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541}, - {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543}, - {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545}, - {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547}, - {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549}, - {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B}, - {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D}, - {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F}, - {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551}, - {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553}, - {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555}, - {0x0556,0x0586,0x0556}, {0x0587,0x0587,0x0587}, - {0x0588,0x0588,0x0588}, {0x0589,0x0589,0x0589}, - {0x058A,0x058A,0x058A}, {0x058B,0x058B,0x058B}, - {0x058C,0x058C,0x058C}, {0x058D,0x058D,0x058D}, - {0x058E,0x058E,0x058E}, {0x058F,0x058F,0x058F}, - {0x0590,0x0590,0x0590}, {0x0591,0x0591,0x0591}, - {0x0592,0x0592,0x0592}, {0x0593,0x0593,0x0593}, - {0x0594,0x0594,0x0594}, {0x0595,0x0595,0x0595}, - {0x0596,0x0596,0x0596}, {0x0597,0x0597,0x0597}, - {0x0598,0x0598,0x0598}, {0x0599,0x0599,0x0599}, - {0x059A,0x059A,0x059A}, {0x059B,0x059B,0x059B}, - {0x059C,0x059C,0x059C}, {0x059D,0x059D,0x059D}, - {0x059E,0x059E,0x059E}, {0x059F,0x059F,0x059F}, - {0x05A0,0x05A0,0x05A0}, {0x05A1,0x05A1,0x05A1}, - {0x05A2,0x05A2,0x05A2}, {0x05A3,0x05A3,0x05A3}, - {0x05A4,0x05A4,0x05A4}, {0x05A5,0x05A5,0x05A5}, - {0x05A6,0x05A6,0x05A6}, {0x05A7,0x05A7,0x05A7}, - {0x05A8,0x05A8,0x05A8}, {0x05A9,0x05A9,0x05A9}, - {0x05AA,0x05AA,0x05AA}, {0x05AB,0x05AB,0x05AB}, - {0x05AC,0x05AC,0x05AC}, {0x05AD,0x05AD,0x05AD}, - {0x05AE,0x05AE,0x05AE}, {0x05AF,0x05AF,0x05AF}, - {0x05B0,0x05B0,0x05B0}, {0x05B1,0x05B1,0x05B1}, - {0x05B2,0x05B2,0x05B2}, {0x05B3,0x05B3,0x05B3}, - {0x05B4,0x05B4,0x05B4}, {0x05B5,0x05B5,0x05B5}, - {0x05B6,0x05B6,0x05B6}, {0x05B7,0x05B7,0x05B7}, - {0x05B8,0x05B8,0x05B8}, {0x05B9,0x05B9,0x05B9}, - {0x05BA,0x05BA,0x05BA}, {0x05BB,0x05BB,0x05BB}, - {0x05BC,0x05BC,0x05BC}, {0x05BD,0x05BD,0x05BD}, - {0x05BE,0x05BE,0x05BE}, {0x05BF,0x05BF,0x05BF}, - {0x05C0,0x05C0,0x05C0}, {0x05C1,0x05C1,0x05C1}, - {0x05C2,0x05C2,0x05C2}, {0x05C3,0x05C3,0x05C3}, - {0x05C4,0x05C4,0x05C4}, {0x05C5,0x05C5,0x05C5}, - {0x05C6,0x05C6,0x05C6}, {0x05C7,0x05C7,0x05C7}, - {0x05C8,0x05C8,0x05C8}, {0x05C9,0x05C9,0x05C9}, - {0x05CA,0x05CA,0x05CA}, {0x05CB,0x05CB,0x05CB}, - {0x05CC,0x05CC,0x05CC}, {0x05CD,0x05CD,0x05CD}, - {0x05CE,0x05CE,0x05CE}, {0x05CF,0x05CF,0x05CF}, - {0x05D0,0x05D0,0x05D0}, {0x05D1,0x05D1,0x05D1}, - {0x05D2,0x05D2,0x05D2}, {0x05D3,0x05D3,0x05D3}, - {0x05D4,0x05D4,0x05D4}, {0x05D5,0x05D5,0x05D5}, - {0x05D6,0x05D6,0x05D6}, {0x05D7,0x05D7,0x05D7}, - {0x05D8,0x05D8,0x05D8}, {0x05D9,0x05D9,0x05D9}, - {0x05DA,0x05DA,0x05DA}, {0x05DB,0x05DB,0x05DB}, - {0x05DC,0x05DC,0x05DC}, {0x05DD,0x05DD,0x05DD}, - {0x05DE,0x05DE,0x05DE}, {0x05DF,0x05DF,0x05DF}, - {0x05E0,0x05E0,0x05E0}, {0x05E1,0x05E1,0x05E1}, - {0x05E2,0x05E2,0x05E2}, {0x05E3,0x05E3,0x05E3}, - {0x05E4,0x05E4,0x05E4}, {0x05E5,0x05E5,0x05E5}, - {0x05E6,0x05E6,0x05E6}, {0x05E7,0x05E7,0x05E7}, - {0x05E8,0x05E8,0x05E8}, {0x05E9,0x05E9,0x05E9}, - {0x05EA,0x05EA,0x05EA}, {0x05EB,0x05EB,0x05EB}, - {0x05EC,0x05EC,0x05EC}, {0x05ED,0x05ED,0x05ED}, - {0x05EE,0x05EE,0x05EE}, {0x05EF,0x05EF,0x05EF}, - {0x05F0,0x05F0,0x05F0}, {0x05F1,0x05F1,0x05F1}, - {0x05F2,0x05F2,0x05F2}, {0x05F3,0x05F3,0x05F3}, - {0x05F4,0x05F4,0x05F4}, {0x05F5,0x05F5,0x05F5}, - {0x05F6,0x05F6,0x05F6}, {0x05F7,0x05F7,0x05F7}, - {0x05F8,0x05F8,0x05F8}, {0x05F9,0x05F9,0x05F9}, - {0x05FA,0x05FA,0x05FA}, {0x05FB,0x05FB,0x05FB}, - {0x05FC,0x05FC,0x05FC}, {0x05FD,0x05FD,0x05FD}, - {0x05FE,0x05FE,0x05FE}, {0x05FF,0x05FF,0x05FF} -}; - -static MY_UNICASE_CHARACTER plane06[]={ /* This page is dummy */ - {0x0600,0x0600,0x0600}, {0x0601,0x0601,0x0601}, /* 0600 */ - {0x0602,0x0602,0x0602}, {0x0603,0x0603,0x0603}, /* 0602 */ - {0x0604,0x0604,0x0604}, {0x0605,0x0605,0x0605}, /* 0604 */ - {0x0606,0x0606,0x0606}, {0x0607,0x0607,0x0607}, /* 0606 */ - {0x0608,0x0608,0x0608}, {0x0609,0x0609,0x0609}, /* 0608 */ - {0x060A,0x060A,0x060A}, {0x060B,0x060B,0x060B}, /* 060A */ - {0x060C,0x060C,0x060C}, {0x060D,0x060D,0x060D}, /* 060C */ - {0x060E,0x060E,0x060E}, {0x060F,0x060F,0x060F}, /* 060E */ - {0x0610,0x0610,0x0610}, {0x0611,0x0611,0x0611}, /* 0610 */ - {0x0612,0x0612,0x0612}, {0x0613,0x0613,0x0613}, /* 0612 */ - {0x0614,0x0614,0x0614}, {0x0615,0x0615,0x0615}, /* 0614 */ - {0x0616,0x0616,0x0616}, {0x0617,0x0617,0x0617}, /* 0616 */ - {0x0618,0x0618,0x0618}, {0x0619,0x0619,0x0619}, /* 0618 */ - {0x061A,0x061A,0x061A}, {0x061B,0x061B,0x061B}, /* 061A */ - {0x061C,0x061C,0x061C}, {0x061D,0x061D,0x061D}, /* 061C */ - {0x061E,0x061E,0x061E}, {0x061F,0x061F,0x061F}, /* 061E */ - {0x0620,0x0620,0x0620}, {0x0621,0x0621,0x0621}, /* 0620 */ - {0x0622,0x0622,0x0622}, {0x0623,0x0623,0x0623}, /* 0622 */ - {0x0624,0x0624,0x0624}, {0x0625,0x0625,0x0625}, /* 0624 */ - {0x0626,0x0626,0x0626}, {0x0627,0x0627,0x0627}, /* 0626 */ - {0x0628,0x0628,0x0628}, {0x0629,0x0629,0x0629}, /* 0628 */ - {0x062A,0x062A,0x062A}, {0x062B,0x062B,0x062B}, /* 062A */ - {0x062C,0x062C,0x062C}, {0x062D,0x062D,0x062D}, /* 062C */ - {0x062E,0x062E,0x062E}, {0x062F,0x062F,0x062F}, /* 062E */ - {0x0630,0x0630,0x0630}, {0x0631,0x0631,0x0631}, /* 0630 */ - {0x0632,0x0632,0x0632}, {0x0633,0x0633,0x0633}, /* 0632 */ - {0x0634,0x0634,0x0634}, {0x0635,0x0635,0x0635}, /* 0634 */ - {0x0636,0x0636,0x0636}, {0x0637,0x0637,0x0637}, /* 0636 */ - {0x0638,0x0638,0x0638}, {0x0639,0x0639,0x0639}, /* 0638 */ - {0x063A,0x063A,0x063A}, {0x063B,0x063B,0x063B}, /* 063A */ - {0x063C,0x063C,0x063C}, {0x063D,0x063D,0x063D}, /* 063C */ - {0x063E,0x063E,0x063E}, {0x063F,0x063F,0x063F}, /* 063E */ - {0x0640,0x0640,0x0640}, {0x0641,0x0641,0x0641}, /* 0640 */ - {0x0642,0x0642,0x0642}, {0x0643,0x0643,0x0643}, /* 0642 */ - {0x0644,0x0644,0x0644}, {0x0645,0x0645,0x0645}, /* 0644 */ - {0x0646,0x0646,0x0646}, {0x0647,0x0647,0x0647}, /* 0646 */ - {0x0648,0x0648,0x0648}, {0x0649,0x0649,0x0649}, /* 0648 */ - {0x064A,0x064A,0x064A}, {0x064B,0x064B,0x064B}, /* 064A */ - {0x064C,0x064C,0x064C}, {0x064D,0x064D,0x064D}, /* 064C */ - {0x064E,0x064E,0x064E}, {0x064F,0x064F,0x064F}, /* 064E */ - {0x0650,0x0650,0x0650}, {0x0651,0x0651,0x0651}, /* 0650 */ - {0x0652,0x0652,0x0652}, {0x0653,0x0653,0x0653}, /* 0652 */ - {0x0654,0x0654,0x0654}, {0x0655,0x0655,0x0655}, /* 0654 */ - {0x0656,0x0656,0x0656}, {0x0657,0x0657,0x0657}, /* 0656 */ - {0x0658,0x0658,0x0658}, {0x0659,0x0659,0x0659}, /* 0658 */ - {0x065A,0x065A,0x065A}, {0x065B,0x065B,0x065B}, /* 065A */ - {0x065C,0x065C,0x065C}, {0x065D,0x065D,0x065D}, /* 065C */ - {0x065E,0x065E,0x065E}, {0x065F,0x065F,0x065F}, /* 065E */ - {0x0660,0x0660,0x0660}, {0x0661,0x0661,0x0661}, /* 0660 */ - {0x0662,0x0662,0x0662}, {0x0663,0x0663,0x0663}, /* 0662 */ - {0x0664,0x0664,0x0664}, {0x0665,0x0665,0x0665}, /* 0664 */ - {0x0666,0x0666,0x0666}, {0x0667,0x0667,0x0667}, /* 0666 */ - {0x0668,0x0668,0x0668}, {0x0669,0x0669,0x0669}, /* 0668 */ - {0x066A,0x066A,0x066A}, {0x066B,0x066B,0x066B}, /* 066A */ - {0x066C,0x066C,0x066C}, {0x066D,0x066D,0x066D}, /* 066C */ - {0x066E,0x066E,0x066E}, {0x066F,0x066F,0x066F}, /* 066E */ - {0x0670,0x0670,0x0670}, {0x0671,0x0671,0x0671}, /* 0670 */ - {0x0672,0x0672,0x0672}, {0x0673,0x0673,0x0673}, /* 0672 */ - {0x0674,0x0674,0x0674}, {0x0675,0x0675,0x0675}, /* 0674 */ - {0x0676,0x0676,0x0676}, {0x0677,0x0677,0x0677}, /* 0676 */ - {0x0678,0x0678,0x0678}, {0x0679,0x0679,0x0679}, /* 0678 */ - {0x067A,0x067A,0x067A}, {0x067B,0x067B,0x067B}, /* 067A */ - {0x067C,0x067C,0x067C}, {0x067D,0x067D,0x067D}, /* 067C */ - {0x067E,0x067E,0x067E}, {0x067F,0x067F,0x067F}, /* 067E */ - {0x0680,0x0680,0x0680}, {0x0681,0x0681,0x0681}, /* 0680 */ - {0x0682,0x0682,0x0682}, {0x0683,0x0683,0x0683}, /* 0682 */ - {0x0684,0x0684,0x0684}, {0x0685,0x0685,0x0685}, /* 0684 */ - {0x0686,0x0686,0x0686}, {0x0687,0x0687,0x0687}, /* 0686 */ - {0x0688,0x0688,0x0688}, {0x0689,0x0689,0x0689}, /* 0688 */ - {0x068A,0x068A,0x068A}, {0x068B,0x068B,0x068B}, /* 068A */ - {0x068C,0x068C,0x068C}, {0x068D,0x068D,0x068D}, /* 068C */ - {0x068E,0x068E,0x068E}, {0x068F,0x068F,0x068F}, /* 068E */ - {0x0690,0x0690,0x0690}, {0x0691,0x0691,0x0691}, /* 0690 */ - {0x0692,0x0692,0x0692}, {0x0693,0x0693,0x0693}, /* 0692 */ - {0x0694,0x0694,0x0694}, {0x0695,0x0695,0x0695}, /* 0694 */ - {0x0696,0x0696,0x0696}, {0x0697,0x0697,0x0697}, /* 0696 */ - {0x0698,0x0698,0x0698}, {0x0699,0x0699,0x0699}, /* 0698 */ - {0x069A,0x069A,0x069A}, {0x069B,0x069B,0x069B}, /* 069A */ - {0x069C,0x069C,0x069C}, {0x069D,0x069D,0x069D}, /* 069C */ - {0x069E,0x069E,0x069E}, {0x069F,0x069F,0x069F}, /* 069E */ - {0x06A0,0x06A0,0x06A0}, {0x06A1,0x06A1,0x06A1}, /* 06A0 */ - {0x06A2,0x06A2,0x06A2}, {0x06A3,0x06A3,0x06A3}, /* 06A2 */ - {0x06A4,0x06A4,0x06A4}, {0x06A5,0x06A5,0x06A5}, /* 06A4 */ - {0x06A6,0x06A6,0x06A6}, {0x06A7,0x06A7,0x06A7}, /* 06A6 */ - {0x06A8,0x06A8,0x06A8}, {0x06A9,0x06A9,0x06A9}, /* 06A8 */ - {0x06AA,0x06AA,0x06AA}, {0x06AB,0x06AB,0x06AB}, /* 06AA */ - {0x06AC,0x06AC,0x06AC}, {0x06AD,0x06AD,0x06AD}, /* 06AC */ - {0x06AE,0x06AE,0x06AE}, {0x06AF,0x06AF,0x06AF}, /* 06AE */ - {0x06B0,0x06B0,0x06B0}, {0x06B1,0x06B1,0x06B1}, /* 06B0 */ - {0x06B2,0x06B2,0x06B2}, {0x06B3,0x06B3,0x06B3}, /* 06B2 */ - {0x06B4,0x06B4,0x06B4}, {0x06B5,0x06B5,0x06B5}, /* 06B4 */ - {0x06B6,0x06B6,0x06B6}, {0x06B7,0x06B7,0x06B7}, /* 06B6 */ - {0x06B8,0x06B8,0x06B8}, {0x06B9,0x06B9,0x06B9}, /* 06B8 */ - {0x06BA,0x06BA,0x06BA}, {0x06BB,0x06BB,0x06BB}, /* 06BA */ - {0x06BC,0x06BC,0x06BC}, {0x06BD,0x06BD,0x06BD}, /* 06BC */ - {0x06BE,0x06BE,0x06BE}, {0x06BF,0x06BF,0x06BF}, /* 06BE */ - {0x06C0,0x06C0,0x06C0}, {0x06C1,0x06C1,0x06C1}, /* 06C0 */ - {0x06C2,0x06C2,0x06C2}, {0x06C3,0x06C3,0x06C3}, /* 06C2 */ - {0x06C4,0x06C4,0x06C4}, {0x06C5,0x06C5,0x06C5}, /* 06C4 */ - {0x06C6,0x06C6,0x06C6}, {0x06C7,0x06C7,0x06C7}, /* 06C6 */ - {0x06C8,0x06C8,0x06C8}, {0x06C9,0x06C9,0x06C9}, /* 06C8 */ - {0x06CA,0x06CA,0x06CA}, {0x06CB,0x06CB,0x06CB}, /* 06CA */ - {0x06CC,0x06CC,0x06CC}, {0x06CD,0x06CD,0x06CD}, /* 06CC */ - {0x06CE,0x06CE,0x06CE}, {0x06CF,0x06CF,0x06CF}, /* 06CE */ - {0x06D0,0x06D0,0x06D0}, {0x06D1,0x06D1,0x06D1}, /* 06D0 */ - {0x06D2,0x06D2,0x06D2}, {0x06D3,0x06D3,0x06D3}, /* 06D2 */ - {0x06D4,0x06D4,0x06D4}, {0x06D5,0x06D5,0x06D5}, /* 06D4 */ - {0x06D6,0x06D6,0x06D6}, {0x06D7,0x06D7,0x06D7}, /* 06D6 */ - {0x06D8,0x06D8,0x06D8}, {0x06D9,0x06D9,0x06D9}, /* 06D8 */ - {0x06DA,0x06DA,0x06DA}, {0x06DB,0x06DB,0x06DB}, /* 06DA */ - {0x06DC,0x06DC,0x06DC}, {0x06DD,0x06DD,0x06DD}, /* 06DC */ - {0x06DE,0x06DE,0x06DE}, {0x06DF,0x06DF,0x06DF}, /* 06DE */ - {0x06E0,0x06E0,0x06E0}, {0x06E1,0x06E1,0x06E1}, /* 06E0 */ - {0x06E2,0x06E2,0x06E2}, {0x06E3,0x06E3,0x06E3}, /* 06E2 */ - {0x06E4,0x06E4,0x06E4}, {0x06E5,0x06E5,0x06E5}, /* 06E4 */ - {0x06E6,0x06E6,0x06E6}, {0x06E7,0x06E7,0x06E7}, /* 06E6 */ - {0x06E8,0x06E8,0x06E8}, {0x06E9,0x06E9,0x06E9}, /* 06E8 */ - {0x06EA,0x06EA,0x06EA}, {0x06EB,0x06EB,0x06EB}, /* 06EA */ - {0x06EC,0x06EC,0x06EC}, {0x06ED,0x06ED,0x06ED}, /* 06EC */ - {0x06EE,0x06EE,0x06EE}, {0x06EF,0x06EF,0x06EF}, /* 06EE */ - {0x06F0,0x06F0,0x06F0}, {0x06F1,0x06F1,0x06F1}, /* 06F0 */ - {0x06F2,0x06F2,0x06F2}, {0x06F3,0x06F3,0x06F3}, /* 06F2 */ - {0x06F4,0x06F4,0x06F4}, {0x06F5,0x06F5,0x06F5}, /* 06F4 */ - {0x06F6,0x06F6,0x06F6}, {0x06F7,0x06F7,0x06F7}, /* 06F6 */ - {0x06F8,0x06F8,0x06F8}, {0x06F9,0x06F9,0x06F9}, /* 06F8 */ - {0x06FA,0x06FA,0x06FA}, {0x06FB,0x06FB,0x06FB}, /* 06FA */ - {0x06FC,0x06FC,0x06FC}, {0x06FD,0x06FD,0x06FD}, /* 06FC */ - {0x06FE,0x06FE,0x06FE}, {0x06FF,0x06FF,0x06FF} /* 06FE */ -}; - -static MY_UNICASE_CHARACTER plane07[]={ /* This page is dummy */ - {0x0700,0x0700,0x0700}, {0x0701,0x0701,0x0701}, /* 0700 */ - {0x0702,0x0702,0x0702}, {0x0703,0x0703,0x0703}, /* 0702 */ - {0x0704,0x0704,0x0704}, {0x0705,0x0705,0x0705}, /* 0704 */ - {0x0706,0x0706,0x0706}, {0x0707,0x0707,0x0707}, /* 0706 */ - {0x0708,0x0708,0x0708}, {0x0709,0x0709,0x0709}, /* 0708 */ - {0x070A,0x070A,0x070A}, {0x070B,0x070B,0x070B}, /* 070A */ - {0x070C,0x070C,0x070C}, {0x070D,0x070D,0x070D}, /* 070C */ - {0x070E,0x070E,0x070E}, {0x070F,0x070F,0x070F}, /* 070E */ - {0x0710,0x0710,0x0710}, {0x0711,0x0711,0x0711}, /* 0710 */ - {0x0712,0x0712,0x0712}, {0x0713,0x0713,0x0713}, /* 0712 */ - {0x0714,0x0714,0x0714}, {0x0715,0x0715,0x0715}, /* 0714 */ - {0x0716,0x0716,0x0716}, {0x0717,0x0717,0x0717}, /* 0716 */ - {0x0718,0x0718,0x0718}, {0x0719,0x0719,0x0719}, /* 0718 */ - {0x071A,0x071A,0x071A}, {0x071B,0x071B,0x071B}, /* 071A */ - {0x071C,0x071C,0x071C}, {0x071D,0x071D,0x071D}, /* 071C */ - {0x071E,0x071E,0x071E}, {0x071F,0x071F,0x071F}, /* 071E */ - {0x0720,0x0720,0x0720}, {0x0721,0x0721,0x0721}, /* 0720 */ - {0x0722,0x0722,0x0722}, {0x0723,0x0723,0x0723}, /* 0722 */ - {0x0724,0x0724,0x0724}, {0x0725,0x0725,0x0725}, /* 0724 */ - {0x0726,0x0726,0x0726}, {0x0727,0x0727,0x0727}, /* 0726 */ - {0x0728,0x0728,0x0728}, {0x0729,0x0729,0x0729}, /* 0728 */ - {0x072A,0x072A,0x072A}, {0x072B,0x072B,0x072B}, /* 072A */ - {0x072C,0x072C,0x072C}, {0x072D,0x072D,0x072D}, /* 072C */ - {0x072E,0x072E,0x072E}, {0x072F,0x072F,0x072F}, /* 072E */ - {0x0730,0x0730,0x0730}, {0x0731,0x0731,0x0731}, /* 0730 */ - {0x0732,0x0732,0x0732}, {0x0733,0x0733,0x0733}, /* 0732 */ - {0x0734,0x0734,0x0734}, {0x0735,0x0735,0x0735}, /* 0734 */ - {0x0736,0x0736,0x0736}, {0x0737,0x0737,0x0737}, /* 0736 */ - {0x0738,0x0738,0x0738}, {0x0739,0x0739,0x0739}, /* 0738 */ - {0x073A,0x073A,0x073A}, {0x073B,0x073B,0x073B}, /* 073A */ - {0x073C,0x073C,0x073C}, {0x073D,0x073D,0x073D}, /* 073C */ - {0x073E,0x073E,0x073E}, {0x073F,0x073F,0x073F}, /* 073E */ - {0x0740,0x0740,0x0740}, {0x0741,0x0741,0x0741}, /* 0740 */ - {0x0742,0x0742,0x0742}, {0x0743,0x0743,0x0743}, /* 0742 */ - {0x0744,0x0744,0x0744}, {0x0745,0x0745,0x0745}, /* 0744 */ - {0x0746,0x0746,0x0746}, {0x0747,0x0747,0x0747}, /* 0746 */ - {0x0748,0x0748,0x0748}, {0x0749,0x0749,0x0749}, /* 0748 */ - {0x074A,0x074A,0x074A}, {0x074B,0x074B,0x074B}, /* 074A */ - {0x074C,0x074C,0x074C}, {0x074D,0x074D,0x074D}, /* 074C */ - {0x074E,0x074E,0x074E}, {0x074F,0x074F,0x074F}, /* 074E */ - {0x0750,0x0750,0x0750}, {0x0751,0x0751,0x0751}, /* 0750 */ - {0x0752,0x0752,0x0752}, {0x0753,0x0753,0x0753}, /* 0752 */ - {0x0754,0x0754,0x0754}, {0x0755,0x0755,0x0755}, /* 0754 */ - {0x0756,0x0756,0x0756}, {0x0757,0x0757,0x0757}, /* 0756 */ - {0x0758,0x0758,0x0758}, {0x0759,0x0759,0x0759}, /* 0758 */ - {0x075A,0x075A,0x075A}, {0x075B,0x075B,0x075B}, /* 075A */ - {0x075C,0x075C,0x075C}, {0x075D,0x075D,0x075D}, /* 075C */ - {0x075E,0x075E,0x075E}, {0x075F,0x075F,0x075F}, /* 075E */ - {0x0760,0x0760,0x0760}, {0x0761,0x0761,0x0761}, /* 0760 */ - {0x0762,0x0762,0x0762}, {0x0763,0x0763,0x0763}, /* 0762 */ - {0x0764,0x0764,0x0764}, {0x0765,0x0765,0x0765}, /* 0764 */ - {0x0766,0x0766,0x0766}, {0x0767,0x0767,0x0767}, /* 0766 */ - {0x0768,0x0768,0x0768}, {0x0769,0x0769,0x0769}, /* 0768 */ - {0x076A,0x076A,0x076A}, {0x076B,0x076B,0x076B}, /* 076A */ - {0x076C,0x076C,0x076C}, {0x076D,0x076D,0x076D}, /* 076C */ - {0x076E,0x076E,0x076E}, {0x076F,0x076F,0x076F}, /* 076E */ - {0x0770,0x0770,0x0770}, {0x0771,0x0771,0x0771}, /* 0770 */ - {0x0772,0x0772,0x0772}, {0x0773,0x0773,0x0773}, /* 0772 */ - {0x0774,0x0774,0x0774}, {0x0775,0x0775,0x0775}, /* 0774 */ - {0x0776,0x0776,0x0776}, {0x0777,0x0777,0x0777}, /* 0776 */ - {0x0778,0x0778,0x0778}, {0x0779,0x0779,0x0779}, /* 0778 */ - {0x077A,0x077A,0x077A}, {0x077B,0x077B,0x077B}, /* 077A */ - {0x077C,0x077C,0x077C}, {0x077D,0x077D,0x077D}, /* 077C */ - {0x077E,0x077E,0x077E}, {0x077F,0x077F,0x077F}, /* 077E */ - {0x0780,0x0780,0x0780}, {0x0781,0x0781,0x0781}, /* 0780 */ - {0x0782,0x0782,0x0782}, {0x0783,0x0783,0x0783}, /* 0782 */ - {0x0784,0x0784,0x0784}, {0x0785,0x0785,0x0785}, /* 0784 */ - {0x0786,0x0786,0x0786}, {0x0787,0x0787,0x0787}, /* 0786 */ - {0x0788,0x0788,0x0788}, {0x0789,0x0789,0x0789}, /* 0788 */ - {0x078A,0x078A,0x078A}, {0x078B,0x078B,0x078B}, /* 078A */ - {0x078C,0x078C,0x078C}, {0x078D,0x078D,0x078D}, /* 078C */ - {0x078E,0x078E,0x078E}, {0x078F,0x078F,0x078F}, /* 078E */ - {0x0790,0x0790,0x0790}, {0x0791,0x0791,0x0791}, /* 0790 */ - {0x0792,0x0792,0x0792}, {0x0793,0x0793,0x0793}, /* 0792 */ - {0x0794,0x0794,0x0794}, {0x0795,0x0795,0x0795}, /* 0794 */ - {0x0796,0x0796,0x0796}, {0x0797,0x0797,0x0797}, /* 0796 */ - {0x0798,0x0798,0x0798}, {0x0799,0x0799,0x0799}, /* 0798 */ - {0x079A,0x079A,0x079A}, {0x079B,0x079B,0x079B}, /* 079A */ - {0x079C,0x079C,0x079C}, {0x079D,0x079D,0x079D}, /* 079C */ - {0x079E,0x079E,0x079E}, {0x079F,0x079F,0x079F}, /* 079E */ - {0x07A0,0x07A0,0x07A0}, {0x07A1,0x07A1,0x07A1}, /* 07A0 */ - {0x07A2,0x07A2,0x07A2}, {0x07A3,0x07A3,0x07A3}, /* 07A2 */ - {0x07A4,0x07A4,0x07A4}, {0x07A5,0x07A5,0x07A5}, /* 07A4 */ - {0x07A6,0x07A6,0x07A6}, {0x07A7,0x07A7,0x07A7}, /* 07A6 */ - {0x07A8,0x07A8,0x07A8}, {0x07A9,0x07A9,0x07A9}, /* 07A8 */ - {0x07AA,0x07AA,0x07AA}, {0x07AB,0x07AB,0x07AB}, /* 07AA */ - {0x07AC,0x07AC,0x07AC}, {0x07AD,0x07AD,0x07AD}, /* 07AC */ - {0x07AE,0x07AE,0x07AE}, {0x07AF,0x07AF,0x07AF}, /* 07AE */ - {0x07B0,0x07B0,0x07B0}, {0x07B1,0x07B1,0x07B1}, /* 07B0 */ - {0x07B2,0x07B2,0x07B2}, {0x07B3,0x07B3,0x07B3}, /* 07B2 */ - {0x07B4,0x07B4,0x07B4}, {0x07B5,0x07B5,0x07B5}, /* 07B4 */ - {0x07B6,0x07B6,0x07B6}, {0x07B7,0x07B7,0x07B7}, /* 07B6 */ - {0x07B8,0x07B8,0x07B8}, {0x07B9,0x07B9,0x07B9}, /* 07B8 */ - {0x07BA,0x07BA,0x07BA}, {0x07BB,0x07BB,0x07BB}, /* 07BA */ - {0x07BC,0x07BC,0x07BC}, {0x07BD,0x07BD,0x07BD}, /* 07BC */ - {0x07BE,0x07BE,0x07BE}, {0x07BF,0x07BF,0x07BF}, /* 07BE */ - {0x07C0,0x07C0,0x07C0}, {0x07C1,0x07C1,0x07C1}, /* 07C0 */ - {0x07C2,0x07C2,0x07C2}, {0x07C3,0x07C3,0x07C3}, /* 07C2 */ - {0x07C4,0x07C4,0x07C4}, {0x07C5,0x07C5,0x07C5}, /* 07C4 */ - {0x07C6,0x07C6,0x07C6}, {0x07C7,0x07C7,0x07C7}, /* 07C6 */ - {0x07C8,0x07C8,0x07C8}, {0x07C9,0x07C9,0x07C9}, /* 07C8 */ - {0x07CA,0x07CA,0x07CA}, {0x07CB,0x07CB,0x07CB}, /* 07CA */ - {0x07CC,0x07CC,0x07CC}, {0x07CD,0x07CD,0x07CD}, /* 07CC */ - {0x07CE,0x07CE,0x07CE}, {0x07CF,0x07CF,0x07CF}, /* 07CE */ - {0x07D0,0x07D0,0x07D0}, {0x07D1,0x07D1,0x07D1}, /* 07D0 */ - {0x07D2,0x07D2,0x07D2}, {0x07D3,0x07D3,0x07D3}, /* 07D2 */ - {0x07D4,0x07D4,0x07D4}, {0x07D5,0x07D5,0x07D5}, /* 07D4 */ - {0x07D6,0x07D6,0x07D6}, {0x07D7,0x07D7,0x07D7}, /* 07D6 */ - {0x07D8,0x07D8,0x07D8}, {0x07D9,0x07D9,0x07D9}, /* 07D8 */ - {0x07DA,0x07DA,0x07DA}, {0x07DB,0x07DB,0x07DB}, /* 07DA */ - {0x07DC,0x07DC,0x07DC}, {0x07DD,0x07DD,0x07DD}, /* 07DC */ - {0x07DE,0x07DE,0x07DE}, {0x07DF,0x07DF,0x07DF}, /* 07DE */ - {0x07E0,0x07E0,0x07E0}, {0x07E1,0x07E1,0x07E1}, /* 07E0 */ - {0x07E2,0x07E2,0x07E2}, {0x07E3,0x07E3,0x07E3}, /* 07E2 */ - {0x07E4,0x07E4,0x07E4}, {0x07E5,0x07E5,0x07E5}, /* 07E4 */ - {0x07E6,0x07E6,0x07E6}, {0x07E7,0x07E7,0x07E7}, /* 07E6 */ - {0x07E8,0x07E8,0x07E8}, {0x07E9,0x07E9,0x07E9}, /* 07E8 */ - {0x07EA,0x07EA,0x07EA}, {0x07EB,0x07EB,0x07EB}, /* 07EA */ - {0x07EC,0x07EC,0x07EC}, {0x07ED,0x07ED,0x07ED}, /* 07EC */ - {0x07EE,0x07EE,0x07EE}, {0x07EF,0x07EF,0x07EF}, /* 07EE */ - {0x07F0,0x07F0,0x07F0}, {0x07F1,0x07F1,0x07F1}, /* 07F0 */ - {0x07F2,0x07F2,0x07F2}, {0x07F3,0x07F3,0x07F3}, /* 07F2 */ - {0x07F4,0x07F4,0x07F4}, {0x07F5,0x07F5,0x07F5}, /* 07F4 */ - {0x07F6,0x07F6,0x07F6}, {0x07F7,0x07F7,0x07F7}, /* 07F6 */ - {0x07F8,0x07F8,0x07F8}, {0x07F9,0x07F9,0x07F9}, /* 07F8 */ - {0x07FA,0x07FA,0x07FA}, {0x07FB,0x07FB,0x07FB}, /* 07FA */ - {0x07FC,0x07FC,0x07FC}, {0x07FD,0x07FD,0x07FD}, /* 07FC */ - {0x07FE,0x07FE,0x07FE}, {0x07FF,0x07FF,0x07FF} /* 07FE */ -}; - -static MY_UNICASE_CHARACTER plane1E[]={ - {0x1E00,0x1E01,0x0041}, {0x1E00,0x1E01,0x0041}, - {0x1E02,0x1E03,0x0042}, {0x1E02,0x1E03,0x0042}, - {0x1E04,0x1E05,0x0042}, {0x1E04,0x1E05,0x0042}, - {0x1E06,0x1E07,0x0042}, {0x1E06,0x1E07,0x0042}, - {0x1E08,0x1E09,0x0043}, {0x1E08,0x1E09,0x0043}, - {0x1E0A,0x1E0B,0x0044}, {0x1E0A,0x1E0B,0x0044}, - {0x1E0C,0x1E0D,0x0044}, {0x1E0C,0x1E0D,0x0044}, - {0x1E0E,0x1E0F,0x0044}, {0x1E0E,0x1E0F,0x0044}, - {0x1E10,0x1E11,0x0044}, {0x1E10,0x1E11,0x0044}, - {0x1E12,0x1E13,0x0044}, {0x1E12,0x1E13,0x0044}, - {0x1E14,0x1E15,0x0045}, {0x1E14,0x1E15,0x0045}, - {0x1E16,0x1E17,0x0045}, {0x1E16,0x1E17,0x0045}, - {0x1E18,0x1E19,0x0045}, {0x1E18,0x1E19,0x0045}, - {0x1E1A,0x1E1B,0x0045}, {0x1E1A,0x1E1B,0x0045}, - {0x1E1C,0x1E1D,0x0045}, {0x1E1C,0x1E1D,0x0045}, - {0x1E1E,0x1E1F,0x0046}, {0x1E1E,0x1E1F,0x0046}, - {0x1E20,0x1E21,0x0047}, {0x1E20,0x1E21,0x0047}, - {0x1E22,0x1E23,0x0048}, {0x1E22,0x1E23,0x0048}, - {0x1E24,0x1E25,0x0048}, {0x1E24,0x1E25,0x0048}, - {0x1E26,0x1E27,0x0048}, {0x1E26,0x1E27,0x0048}, - {0x1E28,0x1E29,0x0048}, {0x1E28,0x1E29,0x0048}, - {0x1E2A,0x1E2B,0x0048}, {0x1E2A,0x1E2B,0x0048}, - {0x1E2C,0x1E2D,0x0049}, {0x1E2C,0x1E2D,0x0049}, - {0x1E2E,0x1E2F,0x0049}, {0x1E2E,0x1E2F,0x0049}, - {0x1E30,0x1E31,0x004B}, {0x1E30,0x1E31,0x004B}, - {0x1E32,0x1E33,0x004B}, {0x1E32,0x1E33,0x004B}, - {0x1E34,0x1E35,0x004B}, {0x1E34,0x1E35,0x004B}, - {0x1E36,0x1E37,0x004C}, {0x1E36,0x1E37,0x004C}, - {0x1E38,0x1E39,0x004C}, {0x1E38,0x1E39,0x004C}, - {0x1E3A,0x1E3B,0x004C}, {0x1E3A,0x1E3B,0x004C}, - {0x1E3C,0x1E3D,0x004C}, {0x1E3C,0x1E3D,0x004C}, - {0x1E3E,0x1E3F,0x004D}, {0x1E3E,0x1E3F,0x004D}, - {0x1E40,0x1E41,0x004D}, {0x1E40,0x1E41,0x004D}, - {0x1E42,0x1E43,0x004D}, {0x1E42,0x1E43,0x004D}, - {0x1E44,0x1E45,0x004E}, {0x1E44,0x1E45,0x004E}, - {0x1E46,0x1E47,0x004E}, {0x1E46,0x1E47,0x004E}, - {0x1E48,0x1E49,0x004E}, {0x1E48,0x1E49,0x004E}, - {0x1E4A,0x1E4B,0x004E}, {0x1E4A,0x1E4B,0x004E}, - {0x1E4C,0x1E4D,0x004F}, {0x1E4C,0x1E4D,0x004F}, - {0x1E4E,0x1E4F,0x004F}, {0x1E4E,0x1E4F,0x004F}, - {0x1E50,0x1E51,0x004F}, {0x1E50,0x1E51,0x004F}, - {0x1E52,0x1E53,0x004F}, {0x1E52,0x1E53,0x004F}, - {0x1E54,0x1E55,0x0050}, {0x1E54,0x1E55,0x0050}, - {0x1E56,0x1E57,0x0050}, {0x1E56,0x1E57,0x0050}, - {0x1E58,0x1E59,0x0052}, {0x1E58,0x1E59,0x0052}, - {0x1E5A,0x1E5B,0x0052}, {0x1E5A,0x1E5B,0x0052}, - {0x1E5C,0x1E5D,0x0052}, {0x1E5C,0x1E5D,0x0052}, - {0x1E5E,0x1E5F,0x0052}, {0x1E5E,0x1E5F,0x0052}, - {0x1E60,0x1E61,0x0053}, {0x1E60,0x1E61,0x0053}, - {0x1E62,0x1E63,0x0053}, {0x1E62,0x1E63,0x0053}, - {0x1E64,0x1E65,0x0053}, {0x1E64,0x1E65,0x0053}, - {0x1E66,0x1E67,0x0053}, {0x1E66,0x1E67,0x0053}, - {0x1E68,0x1E69,0x0053}, {0x1E68,0x1E69,0x0053}, - {0x1E6A,0x1E6B,0x0054}, {0x1E6A,0x1E6B,0x0054}, - {0x1E6C,0x1E6D,0x0054}, {0x1E6C,0x1E6D,0x0054}, - {0x1E6E,0x1E6F,0x0054}, {0x1E6E,0x1E6F,0x0054}, - {0x1E70,0x1E71,0x0054}, {0x1E70,0x1E71,0x0054}, - {0x1E72,0x1E73,0x0055}, {0x1E72,0x1E73,0x0055}, - {0x1E74,0x1E75,0x0055}, {0x1E74,0x1E75,0x0055}, - {0x1E76,0x1E77,0x0055}, {0x1E76,0x1E77,0x0055}, - {0x1E78,0x1E79,0x0055}, {0x1E78,0x1E79,0x0055}, - {0x1E7A,0x1E7B,0x0055}, {0x1E7A,0x1E7B,0x0055}, - {0x1E7C,0x1E7D,0x0056}, {0x1E7C,0x1E7D,0x0056}, - {0x1E7E,0x1E7F,0x0056}, {0x1E7E,0x1E7F,0x0056}, - {0x1E80,0x1E81,0x0057}, {0x1E80,0x1E81,0x0057}, - {0x1E82,0x1E83,0x0057}, {0x1E82,0x1E83,0x0057}, - {0x1E84,0x1E85,0x0057}, {0x1E84,0x1E85,0x0057}, - {0x1E86,0x1E87,0x0057}, {0x1E86,0x1E87,0x0057}, - {0x1E88,0x1E89,0x0057}, {0x1E88,0x1E89,0x0057}, - {0x1E8A,0x1E8B,0x0058}, {0x1E8A,0x1E8B,0x0058}, - {0x1E8C,0x1E8D,0x0058}, {0x1E8C,0x1E8D,0x0058}, - {0x1E8E,0x1E8F,0x0059}, {0x1E8E,0x1E8F,0x0059}, - {0x1E90,0x1E91,0x005A}, {0x1E90,0x1E91,0x005A}, - {0x1E92,0x1E93,0x005A}, {0x1E92,0x1E93,0x005A}, - {0x1E94,0x1E95,0x005A}, {0x1E94,0x1E95,0x005A}, - {0x1E96,0x1E96,0x0048}, {0x1E97,0x1E97,0x0054}, - {0x1E98,0x1E98,0x0057}, {0x1E99,0x1E99,0x0059}, - {0x1E9A,0x1E9A,0x1E9A}, {0x1E60,0x1E9B,0x0053}, - {0x1E9C,0x1E9C,0x1E9C}, {0x1E9D,0x1E9D,0x1E9D}, - {0x1E9E,0x1E9E,0x1E9E}, {0x1E9F,0x1E9F,0x1E9F}, - {0x1EA0,0x1EA1,0x0041}, {0x1EA0,0x1EA1,0x0041}, - {0x1EA2,0x1EA3,0x0041}, {0x1EA2,0x1EA3,0x0041}, - {0x1EA4,0x1EA5,0x0041}, {0x1EA4,0x1EA5,0x0041}, - {0x1EA6,0x1EA7,0x0041}, {0x1EA6,0x1EA7,0x0041}, - {0x1EA8,0x1EA9,0x0041}, {0x1EA8,0x1EA9,0x0041}, - {0x1EAA,0x1EAB,0x0041}, {0x1EAA,0x1EAB,0x0041}, - {0x1EAC,0x1EAD,0x0041}, {0x1EAC,0x1EAD,0x0041}, - {0x1EAE,0x1EAF,0x0041}, {0x1EAE,0x1EAF,0x0041}, - {0x1EB0,0x1EB1,0x0041}, {0x1EB0,0x1EB1,0x0041}, - {0x1EB2,0x1EB3,0x0041}, {0x1EB2,0x1EB3,0x0041}, - {0x1EB4,0x1EB5,0x0041}, {0x1EB4,0x1EB5,0x0041}, - {0x1EB6,0x1EB7,0x0041}, {0x1EB6,0x1EB7,0x0041}, - {0x1EB8,0x1EB9,0x0045}, {0x1EB8,0x1EB9,0x0045}, - {0x1EBA,0x1EBB,0x0045}, {0x1EBA,0x1EBB,0x0045}, - {0x1EBC,0x1EBD,0x0045}, {0x1EBC,0x1EBD,0x0045}, - {0x1EBE,0x1EBF,0x0045}, {0x1EBE,0x1EBF,0x0045}, - {0x1EC0,0x1EC1,0x0045}, {0x1EC0,0x1EC1,0x0045}, - {0x1EC2,0x1EC3,0x0045}, {0x1EC2,0x1EC3,0x0045}, - {0x1EC4,0x1EC5,0x0045}, {0x1EC4,0x1EC5,0x0045}, - {0x1EC6,0x1EC7,0x0045}, {0x1EC6,0x1EC7,0x0045}, - {0x1EC8,0x1EC9,0x0049}, {0x1EC8,0x1EC9,0x0049}, - {0x1ECA,0x1ECB,0x0049}, {0x1ECA,0x1ECB,0x0049}, - {0x1ECC,0x1ECD,0x004F}, {0x1ECC,0x1ECD,0x004F}, - {0x1ECE,0x1ECF,0x004F}, {0x1ECE,0x1ECF,0x004F}, - {0x1ED0,0x1ED1,0x004F}, {0x1ED0,0x1ED1,0x004F}, - {0x1ED2,0x1ED3,0x004F}, {0x1ED2,0x1ED3,0x004F}, - {0x1ED4,0x1ED5,0x004F}, {0x1ED4,0x1ED5,0x004F}, - {0x1ED6,0x1ED7,0x004F}, {0x1ED6,0x1ED7,0x004F}, - {0x1ED8,0x1ED9,0x004F}, {0x1ED8,0x1ED9,0x004F}, - {0x1EDA,0x1EDB,0x004F}, {0x1EDA,0x1EDB,0x004F}, - {0x1EDC,0x1EDD,0x004F}, {0x1EDC,0x1EDD,0x004F}, - {0x1EDE,0x1EDF,0x004F}, {0x1EDE,0x1EDF,0x004F}, - {0x1EE0,0x1EE1,0x004F}, {0x1EE0,0x1EE1,0x004F}, - {0x1EE2,0x1EE3,0x004F}, {0x1EE2,0x1EE3,0x004F}, - {0x1EE4,0x1EE5,0x0055}, {0x1EE4,0x1EE5,0x0055}, - {0x1EE6,0x1EE7,0x0055}, {0x1EE6,0x1EE7,0x0055}, - {0x1EE8,0x1EE9,0x0055}, {0x1EE8,0x1EE9,0x0055}, - {0x1EEA,0x1EEB,0x0055}, {0x1EEA,0x1EEB,0x0055}, - {0x1EEC,0x1EED,0x0055}, {0x1EEC,0x1EED,0x0055}, - {0x1EEE,0x1EEF,0x0055}, {0x1EEE,0x1EEF,0x0055}, - {0x1EF0,0x1EF1,0x0055}, {0x1EF0,0x1EF1,0x0055}, - {0x1EF2,0x1EF3,0x0059}, {0x1EF2,0x1EF3,0x0059}, - {0x1EF4,0x1EF5,0x0059}, {0x1EF4,0x1EF5,0x0059}, - {0x1EF6,0x1EF7,0x0059}, {0x1EF6,0x1EF7,0x0059}, - {0x1EF8,0x1EF9,0x0059}, {0x1EF8,0x1EF9,0x0059}, - {0x1EFA,0x1EFA,0x1EFA}, {0x1EFB,0x1EFB,0x1EFB}, - {0x1EFC,0x1EFC,0x1EFC}, {0x1EFD,0x1EFD,0x1EFD}, - {0x1EFE,0x1EFE,0x1EFE}, {0x1EFF,0x1EFF,0x1EFF} -}; - -static MY_UNICASE_CHARACTER plane1F[]={ - {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391}, - {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391}, - {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391}, - {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391}, - {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391}, - {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391}, - {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391}, - {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391}, - {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395}, - {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395}, - {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395}, - {0x1F16,0x1F16,0x1F16}, {0x1F17,0x1F17,0x1F17}, - {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395}, - {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395}, - {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395}, - {0x1F1E,0x1F1E,0x1F1E}, {0x1F1F,0x1F1F,0x1F1F}, - {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397}, - {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397}, - {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397}, - {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397}, - {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397}, - {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397}, - {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397}, - {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397}, - {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399}, - {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399}, - {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399}, - {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399}, - {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399}, - {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399}, - {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399}, - {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399}, - {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F}, - {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F}, - {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F}, - {0x1F46,0x1F46,0x1F46}, {0x1F47,0x1F47,0x1F47}, - {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F}, - {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F}, - {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F}, - {0x1F4E,0x1F4E,0x1F4E}, {0x1F4F,0x1F4F,0x1F4F}, - {0x1F50,0x1F50,0x03A5}, {0x1F59,0x1F51,0x03A5}, - {0x1F52,0x1F52,0x03A5}, {0x1F5B,0x1F53,0x03A5}, - {0x1F54,0x1F54,0x03A5}, {0x1F5D,0x1F55,0x03A5}, - {0x1F56,0x1F56,0x03A5}, {0x1F5F,0x1F57,0x03A5}, - {0x1F58,0x1F58,0x1F58}, {0x1F59,0x1F51,0x03A5}, - {0x1F5A,0x1F5A,0x1F5A}, {0x1F5B,0x1F53,0x03A5}, - {0x1F5C,0x1F5C,0x1F5C}, {0x1F5D,0x1F55,0x03A5}, - {0x1F5E,0x1F5E,0x1F5E}, {0x1F5F,0x1F57,0x03A5}, - {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9}, - {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9}, - {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9}, - {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9}, - {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9}, - {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9}, - {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9}, - {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9}, - {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB}, - {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9}, - {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB}, - {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB}, - {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9}, - {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB}, - {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB}, - {0x1F7E,0x1F7E,0x1F7E}, {0x1F7F,0x1F7F,0x1F7F}, - {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391}, - {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391}, - {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391}, - {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391}, - {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391}, - {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391}, - {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391}, - {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391}, - {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397}, - {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397}, - {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397}, - {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397}, - {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397}, - {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397}, - {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397}, - {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397}, - {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9}, - {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9}, - {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9}, - {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9}, - {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9}, - {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9}, - {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9}, - {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9}, - {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391}, - {0x1FB2,0x1FB2,0x0391}, {0x1FBC,0x1FB3,0x0391}, - {0x1FB4,0x1FB4,0x0391}, {0x1FB5,0x1FB5,0x1FB5}, - {0x1FB6,0x1FB6,0x0391}, {0x1FB7,0x1FB7,0x0391}, - {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391}, - {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB}, - {0x1FBC,0x1FB3,0x0391}, {0x1FBD,0x1FBD,0x1FBD}, - {0x0399,0x1FBE,0x0399}, {0x1FBF,0x1FBF,0x1FBF}, - {0x1FC0,0x1FC0,0x1FC0}, {0x1FC1,0x1FC1,0x1FC1}, - {0x1FC2,0x1FC2,0x0397}, {0x1FCC,0x1FC3,0x0397}, - {0x1FC4,0x1FC4,0x0397}, {0x1FC5,0x1FC5,0x1FC5}, - {0x1FC6,0x1FC6,0x0397}, {0x1FC7,0x1FC7,0x0397}, - {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9}, - {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB}, - {0x1FCC,0x1FC3,0x0397}, {0x1FCD,0x1FCD,0x1FCD}, - {0x1FCE,0x1FCE,0x1FCE}, {0x1FCF,0x1FCF,0x1FCF}, - {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399}, - {0x1FD2,0x1FD2,0x0399}, {0x1FD3,0x1FD3,0x1FD3}, - {0x1FD4,0x1FD4,0x1FD4}, {0x1FD5,0x1FD5,0x1FD5}, - {0x1FD6,0x1FD6,0x0399}, {0x1FD7,0x1FD7,0x0399}, - {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399}, - {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB}, - {0x1FDC,0x1FDC,0x1FDC}, {0x1FDD,0x1FDD,0x1FDD}, - {0x1FDE,0x1FDE,0x1FDE}, {0x1FDF,0x1FDF,0x1FDF}, - {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5}, - {0x1FE2,0x1FE2,0x03A5}, {0x1FE3,0x1FE3,0x1FE3}, - {0x1FE4,0x1FE4,0x03A1}, {0x1FEC,0x1FE5,0x03A1}, - {0x1FE6,0x1FE6,0x03A5}, {0x1FE7,0x1FE7,0x03A5}, - {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5}, - {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB}, - {0x1FEC,0x1FE5,0x03A1}, {0x1FED,0x1FED,0x1FED}, - {0x1FEE,0x1FEE,0x1FEE}, {0x1FEF,0x1FEF,0x1FEF}, - {0x1FF0,0x1FF0,0x1FF0}, {0x1FF1,0x1FF1,0x1FF1}, - {0x1FF2,0x1FF2,0x03A9}, {0x1FFC,0x1FF3,0x03A9}, - {0x1FF4,0x1FF4,0x03A9}, {0x1FF5,0x1FF5,0x1FF5}, - {0x1FF6,0x1FF6,0x03A9}, {0x1FF7,0x1FF7,0x03A9}, - {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9}, - {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB}, - {0x1FFC,0x1FF3,0x03A9}, {0x1FFD,0x1FFD,0x1FFD}, - {0x1FFE,0x1FFE,0x1FFE}, {0x1FFF,0x1FFF,0x1FFF} -}; - -static MY_UNICASE_CHARACTER plane21[]={ - {0x2100,0x2100,0x2100}, {0x2101,0x2101,0x2101}, - {0x2102,0x2102,0x2102}, {0x2103,0x2103,0x2103}, - {0x2104,0x2104,0x2104}, {0x2105,0x2105,0x2105}, - {0x2106,0x2106,0x2106}, {0x2107,0x2107,0x2107}, - {0x2108,0x2108,0x2108}, {0x2109,0x2109,0x2109}, - {0x210A,0x210A,0x210A}, {0x210B,0x210B,0x210B}, - {0x210C,0x210C,0x210C}, {0x210D,0x210D,0x210D}, - {0x210E,0x210E,0x210E}, {0x210F,0x210F,0x210F}, - {0x2110,0x2110,0x2110}, {0x2111,0x2111,0x2111}, - {0x2112,0x2112,0x2112}, {0x2113,0x2113,0x2113}, - {0x2114,0x2114,0x2114}, {0x2115,0x2115,0x2115}, - {0x2116,0x2116,0x2116}, {0x2117,0x2117,0x2117}, - {0x2118,0x2118,0x2118}, {0x2119,0x2119,0x2119}, - {0x211A,0x211A,0x211A}, {0x211B,0x211B,0x211B}, - {0x211C,0x211C,0x211C}, {0x211D,0x211D,0x211D}, - {0x211E,0x211E,0x211E}, {0x211F,0x211F,0x211F}, - {0x2120,0x2120,0x2120}, {0x2121,0x2121,0x2121}, - {0x2122,0x2122,0x2122}, {0x2123,0x2123,0x2123}, - {0x2124,0x2124,0x2124}, {0x2125,0x2125,0x2125}, - {0x2126,0x03C9,0x2126}, {0x2127,0x2127,0x2127}, - {0x2128,0x2128,0x2128}, {0x2129,0x2129,0x2129}, - {0x212A,0x006B,0x212A}, {0x212B,0x00E5,0x212B}, - {0x212C,0x212C,0x212C}, {0x212D,0x212D,0x212D}, - {0x212E,0x212E,0x212E}, {0x212F,0x212F,0x212F}, - {0x2130,0x2130,0x2130}, {0x2131,0x2131,0x2131}, - {0x2132,0x2132,0x2132}, {0x2133,0x2133,0x2133}, - {0x2134,0x2134,0x2134}, {0x2135,0x2135,0x2135}, - {0x2136,0x2136,0x2136}, {0x2137,0x2137,0x2137}, - {0x2138,0x2138,0x2138}, {0x2139,0x2139,0x2139}, - {0x213A,0x213A,0x213A}, {0x213B,0x213B,0x213B}, - {0x213C,0x213C,0x213C}, {0x213D,0x213D,0x213D}, - {0x213E,0x213E,0x213E}, {0x213F,0x213F,0x213F}, - {0x2140,0x2140,0x2140}, {0x2141,0x2141,0x2141}, - {0x2142,0x2142,0x2142}, {0x2143,0x2143,0x2143}, - {0x2144,0x2144,0x2144}, {0x2145,0x2145,0x2145}, - {0x2146,0x2146,0x2146}, {0x2147,0x2147,0x2147}, - {0x2148,0x2148,0x2148}, {0x2149,0x2149,0x2149}, - {0x214A,0x214A,0x214A}, {0x214B,0x214B,0x214B}, - {0x214C,0x214C,0x214C}, {0x214D,0x214D,0x214D}, - {0x214E,0x214E,0x214E}, {0x214F,0x214F,0x214F}, - {0x2150,0x2150,0x2150}, {0x2151,0x2151,0x2151}, - {0x2152,0x2152,0x2152}, {0x2153,0x2153,0x2153}, - {0x2154,0x2154,0x2154}, {0x2155,0x2155,0x2155}, - {0x2156,0x2156,0x2156}, {0x2157,0x2157,0x2157}, - {0x2158,0x2158,0x2158}, {0x2159,0x2159,0x2159}, - {0x215A,0x215A,0x215A}, {0x215B,0x215B,0x215B}, - {0x215C,0x215C,0x215C}, {0x215D,0x215D,0x215D}, - {0x215E,0x215E,0x215E}, {0x215F,0x215F,0x215F}, - {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161}, - {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163}, - {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165}, - {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167}, - {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169}, - {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B}, - {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D}, - {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F}, - {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161}, - {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163}, - {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165}, - {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167}, - {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169}, - {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B}, - {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D}, - {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F}, - {0x2180,0x2180,0x2180}, {0x2181,0x2181,0x2181}, - {0x2182,0x2182,0x2182}, {0x2183,0x2183,0x2183}, - {0x2184,0x2184,0x2184}, {0x2185,0x2185,0x2185}, - {0x2186,0x2186,0x2186}, {0x2187,0x2187,0x2187}, - {0x2188,0x2188,0x2188}, {0x2189,0x2189,0x2189}, - {0x218A,0x218A,0x218A}, {0x218B,0x218B,0x218B}, - {0x218C,0x218C,0x218C}, {0x218D,0x218D,0x218D}, - {0x218E,0x218E,0x218E}, {0x218F,0x218F,0x218F}, - {0x2190,0x2190,0x2190}, {0x2191,0x2191,0x2191}, - {0x2192,0x2192,0x2192}, {0x2193,0x2193,0x2193}, - {0x2194,0x2194,0x2194}, {0x2195,0x2195,0x2195}, - {0x2196,0x2196,0x2196}, {0x2197,0x2197,0x2197}, - {0x2198,0x2198,0x2198}, {0x2199,0x2199,0x2199}, - {0x219A,0x219A,0x219A}, {0x219B,0x219B,0x219B}, - {0x219C,0x219C,0x219C}, {0x219D,0x219D,0x219D}, - {0x219E,0x219E,0x219E}, {0x219F,0x219F,0x219F}, - {0x21A0,0x21A0,0x21A0}, {0x21A1,0x21A1,0x21A1}, - {0x21A2,0x21A2,0x21A2}, {0x21A3,0x21A3,0x21A3}, - {0x21A4,0x21A4,0x21A4}, {0x21A5,0x21A5,0x21A5}, - {0x21A6,0x21A6,0x21A6}, {0x21A7,0x21A7,0x21A7}, - {0x21A8,0x21A8,0x21A8}, {0x21A9,0x21A9,0x21A9}, - {0x21AA,0x21AA,0x21AA}, {0x21AB,0x21AB,0x21AB}, - {0x21AC,0x21AC,0x21AC}, {0x21AD,0x21AD,0x21AD}, - {0x21AE,0x21AE,0x21AE}, {0x21AF,0x21AF,0x21AF}, - {0x21B0,0x21B0,0x21B0}, {0x21B1,0x21B1,0x21B1}, - {0x21B2,0x21B2,0x21B2}, {0x21B3,0x21B3,0x21B3}, - {0x21B4,0x21B4,0x21B4}, {0x21B5,0x21B5,0x21B5}, - {0x21B6,0x21B6,0x21B6}, {0x21B7,0x21B7,0x21B7}, - {0x21B8,0x21B8,0x21B8}, {0x21B9,0x21B9,0x21B9}, - {0x21BA,0x21BA,0x21BA}, {0x21BB,0x21BB,0x21BB}, - {0x21BC,0x21BC,0x21BC}, {0x21BD,0x21BD,0x21BD}, - {0x21BE,0x21BE,0x21BE}, {0x21BF,0x21BF,0x21BF}, - {0x21C0,0x21C0,0x21C0}, {0x21C1,0x21C1,0x21C1}, - {0x21C2,0x21C2,0x21C2}, {0x21C3,0x21C3,0x21C3}, - {0x21C4,0x21C4,0x21C4}, {0x21C5,0x21C5,0x21C5}, - {0x21C6,0x21C6,0x21C6}, {0x21C7,0x21C7,0x21C7}, - {0x21C8,0x21C8,0x21C8}, {0x21C9,0x21C9,0x21C9}, - {0x21CA,0x21CA,0x21CA}, {0x21CB,0x21CB,0x21CB}, - {0x21CC,0x21CC,0x21CC}, {0x21CD,0x21CD,0x21CD}, - {0x21CE,0x21CE,0x21CE}, {0x21CF,0x21CF,0x21CF}, - {0x21D0,0x21D0,0x21D0}, {0x21D1,0x21D1,0x21D1}, - {0x21D2,0x21D2,0x21D2}, {0x21D3,0x21D3,0x21D3}, - {0x21D4,0x21D4,0x21D4}, {0x21D5,0x21D5,0x21D5}, - {0x21D6,0x21D6,0x21D6}, {0x21D7,0x21D7,0x21D7}, - {0x21D8,0x21D8,0x21D8}, {0x21D9,0x21D9,0x21D9}, - {0x21DA,0x21DA,0x21DA}, {0x21DB,0x21DB,0x21DB}, - {0x21DC,0x21DC,0x21DC}, {0x21DD,0x21DD,0x21DD}, - {0x21DE,0x21DE,0x21DE}, {0x21DF,0x21DF,0x21DF}, - {0x21E0,0x21E0,0x21E0}, {0x21E1,0x21E1,0x21E1}, - {0x21E2,0x21E2,0x21E2}, {0x21E3,0x21E3,0x21E3}, - {0x21E4,0x21E4,0x21E4}, {0x21E5,0x21E5,0x21E5}, - {0x21E6,0x21E6,0x21E6}, {0x21E7,0x21E7,0x21E7}, - {0x21E8,0x21E8,0x21E8}, {0x21E9,0x21E9,0x21E9}, - {0x21EA,0x21EA,0x21EA}, {0x21EB,0x21EB,0x21EB}, - {0x21EC,0x21EC,0x21EC}, {0x21ED,0x21ED,0x21ED}, - {0x21EE,0x21EE,0x21EE}, {0x21EF,0x21EF,0x21EF}, - {0x21F0,0x21F0,0x21F0}, {0x21F1,0x21F1,0x21F1}, - {0x21F2,0x21F2,0x21F2}, {0x21F3,0x21F3,0x21F3}, - {0x21F4,0x21F4,0x21F4}, {0x21F5,0x21F5,0x21F5}, - {0x21F6,0x21F6,0x21F6}, {0x21F7,0x21F7,0x21F7}, - {0x21F8,0x21F8,0x21F8}, {0x21F9,0x21F9,0x21F9}, - {0x21FA,0x21FA,0x21FA}, {0x21FB,0x21FB,0x21FB}, - {0x21FC,0x21FC,0x21FC}, {0x21FD,0x21FD,0x21FD}, - {0x21FE,0x21FE,0x21FE}, {0x21FF,0x21FF,0x21FF} -}; - -static MY_UNICASE_CHARACTER plane24[]={ - {0x2400,0x2400,0x2400}, {0x2401,0x2401,0x2401}, - {0x2402,0x2402,0x2402}, {0x2403,0x2403,0x2403}, - {0x2404,0x2404,0x2404}, {0x2405,0x2405,0x2405}, - {0x2406,0x2406,0x2406}, {0x2407,0x2407,0x2407}, - {0x2408,0x2408,0x2408}, {0x2409,0x2409,0x2409}, - {0x240A,0x240A,0x240A}, {0x240B,0x240B,0x240B}, - {0x240C,0x240C,0x240C}, {0x240D,0x240D,0x240D}, - {0x240E,0x240E,0x240E}, {0x240F,0x240F,0x240F}, - {0x2410,0x2410,0x2410}, {0x2411,0x2411,0x2411}, - {0x2412,0x2412,0x2412}, {0x2413,0x2413,0x2413}, - {0x2414,0x2414,0x2414}, {0x2415,0x2415,0x2415}, - {0x2416,0x2416,0x2416}, {0x2417,0x2417,0x2417}, - {0x2418,0x2418,0x2418}, {0x2419,0x2419,0x2419}, - {0x241A,0x241A,0x241A}, {0x241B,0x241B,0x241B}, - {0x241C,0x241C,0x241C}, {0x241D,0x241D,0x241D}, - {0x241E,0x241E,0x241E}, {0x241F,0x241F,0x241F}, - {0x2420,0x2420,0x2420}, {0x2421,0x2421,0x2421}, - {0x2422,0x2422,0x2422}, {0x2423,0x2423,0x2423}, - {0x2424,0x2424,0x2424}, {0x2425,0x2425,0x2425}, - {0x2426,0x2426,0x2426}, {0x2427,0x2427,0x2427}, - {0x2428,0x2428,0x2428}, {0x2429,0x2429,0x2429}, - {0x242A,0x242A,0x242A}, {0x242B,0x242B,0x242B}, - {0x242C,0x242C,0x242C}, {0x242D,0x242D,0x242D}, - {0x242E,0x242E,0x242E}, {0x242F,0x242F,0x242F}, - {0x2430,0x2430,0x2430}, {0x2431,0x2431,0x2431}, - {0x2432,0x2432,0x2432}, {0x2433,0x2433,0x2433}, - {0x2434,0x2434,0x2434}, {0x2435,0x2435,0x2435}, - {0x2436,0x2436,0x2436}, {0x2437,0x2437,0x2437}, - {0x2438,0x2438,0x2438}, {0x2439,0x2439,0x2439}, - {0x243A,0x243A,0x243A}, {0x243B,0x243B,0x243B}, - {0x243C,0x243C,0x243C}, {0x243D,0x243D,0x243D}, - {0x243E,0x243E,0x243E}, {0x243F,0x243F,0x243F}, - {0x2440,0x2440,0x2440}, {0x2441,0x2441,0x2441}, - {0x2442,0x2442,0x2442}, {0x2443,0x2443,0x2443}, - {0x2444,0x2444,0x2444}, {0x2445,0x2445,0x2445}, - {0x2446,0x2446,0x2446}, {0x2447,0x2447,0x2447}, - {0x2448,0x2448,0x2448}, {0x2449,0x2449,0x2449}, - {0x244A,0x244A,0x244A}, {0x244B,0x244B,0x244B}, - {0x244C,0x244C,0x244C}, {0x244D,0x244D,0x244D}, - {0x244E,0x244E,0x244E}, {0x244F,0x244F,0x244F}, - {0x2450,0x2450,0x2450}, {0x2451,0x2451,0x2451}, - {0x2452,0x2452,0x2452}, {0x2453,0x2453,0x2453}, - {0x2454,0x2454,0x2454}, {0x2455,0x2455,0x2455}, - {0x2456,0x2456,0x2456}, {0x2457,0x2457,0x2457}, - {0x2458,0x2458,0x2458}, {0x2459,0x2459,0x2459}, - {0x245A,0x245A,0x245A}, {0x245B,0x245B,0x245B}, - {0x245C,0x245C,0x245C}, {0x245D,0x245D,0x245D}, - {0x245E,0x245E,0x245E}, {0x245F,0x245F,0x245F}, - {0x2460,0x2460,0x2460}, {0x2461,0x2461,0x2461}, - {0x2462,0x2462,0x2462}, {0x2463,0x2463,0x2463}, - {0x2464,0x2464,0x2464}, {0x2465,0x2465,0x2465}, - {0x2466,0x2466,0x2466}, {0x2467,0x2467,0x2467}, - {0x2468,0x2468,0x2468}, {0x2469,0x2469,0x2469}, - {0x246A,0x246A,0x246A}, {0x246B,0x246B,0x246B}, - {0x246C,0x246C,0x246C}, {0x246D,0x246D,0x246D}, - {0x246E,0x246E,0x246E}, {0x246F,0x246F,0x246F}, - {0x2470,0x2470,0x2470}, {0x2471,0x2471,0x2471}, - {0x2472,0x2472,0x2472}, {0x2473,0x2473,0x2473}, - {0x2474,0x2474,0x2474}, {0x2475,0x2475,0x2475}, - {0x2476,0x2476,0x2476}, {0x2477,0x2477,0x2477}, - {0x2478,0x2478,0x2478}, {0x2479,0x2479,0x2479}, - {0x247A,0x247A,0x247A}, {0x247B,0x247B,0x247B}, - {0x247C,0x247C,0x247C}, {0x247D,0x247D,0x247D}, - {0x247E,0x247E,0x247E}, {0x247F,0x247F,0x247F}, - {0x2480,0x2480,0x2480}, {0x2481,0x2481,0x2481}, - {0x2482,0x2482,0x2482}, {0x2483,0x2483,0x2483}, - {0x2484,0x2484,0x2484}, {0x2485,0x2485,0x2485}, - {0x2486,0x2486,0x2486}, {0x2487,0x2487,0x2487}, - {0x2488,0x2488,0x2488}, {0x2489,0x2489,0x2489}, - {0x248A,0x248A,0x248A}, {0x248B,0x248B,0x248B}, - {0x248C,0x248C,0x248C}, {0x248D,0x248D,0x248D}, - {0x248E,0x248E,0x248E}, {0x248F,0x248F,0x248F}, - {0x2490,0x2490,0x2490}, {0x2491,0x2491,0x2491}, - {0x2492,0x2492,0x2492}, {0x2493,0x2493,0x2493}, - {0x2494,0x2494,0x2494}, {0x2495,0x2495,0x2495}, - {0x2496,0x2496,0x2496}, {0x2497,0x2497,0x2497}, - {0x2498,0x2498,0x2498}, {0x2499,0x2499,0x2499}, - {0x249A,0x249A,0x249A}, {0x249B,0x249B,0x249B}, - {0x249C,0x249C,0x249C}, {0x249D,0x249D,0x249D}, - {0x249E,0x249E,0x249E}, {0x249F,0x249F,0x249F}, - {0x24A0,0x24A0,0x24A0}, {0x24A1,0x24A1,0x24A1}, - {0x24A2,0x24A2,0x24A2}, {0x24A3,0x24A3,0x24A3}, - {0x24A4,0x24A4,0x24A4}, {0x24A5,0x24A5,0x24A5}, - {0x24A6,0x24A6,0x24A6}, {0x24A7,0x24A7,0x24A7}, - {0x24A8,0x24A8,0x24A8}, {0x24A9,0x24A9,0x24A9}, - {0x24AA,0x24AA,0x24AA}, {0x24AB,0x24AB,0x24AB}, - {0x24AC,0x24AC,0x24AC}, {0x24AD,0x24AD,0x24AD}, - {0x24AE,0x24AE,0x24AE}, {0x24AF,0x24AF,0x24AF}, - {0x24B0,0x24B0,0x24B0}, {0x24B1,0x24B1,0x24B1}, - {0x24B2,0x24B2,0x24B2}, {0x24B3,0x24B3,0x24B3}, - {0x24B4,0x24B4,0x24B4}, {0x24B5,0x24B5,0x24B5}, - {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7}, - {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9}, - {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB}, - {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD}, - {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF}, - {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1}, - {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3}, - {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5}, - {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7}, - {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9}, - {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB}, - {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD}, - {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF}, - {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7}, - {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9}, - {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB}, - {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD}, - {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF}, - {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1}, - {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3}, - {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5}, - {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7}, - {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9}, - {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB}, - {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD}, - {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF}, - {0x24EA,0x24EA,0x24EA}, {0x24EB,0x24EB,0x24EB}, - {0x24EC,0x24EC,0x24EC}, {0x24ED,0x24ED,0x24ED}, - {0x24EE,0x24EE,0x24EE}, {0x24EF,0x24EF,0x24EF}, - {0x24F0,0x24F0,0x24F0}, {0x24F1,0x24F1,0x24F1}, - {0x24F2,0x24F2,0x24F2}, {0x24F3,0x24F3,0x24F3}, - {0x24F4,0x24F4,0x24F4}, {0x24F5,0x24F5,0x24F5}, - {0x24F6,0x24F6,0x24F6}, {0x24F7,0x24F7,0x24F7}, - {0x24F8,0x24F8,0x24F8}, {0x24F9,0x24F9,0x24F9}, - {0x24FA,0x24FA,0x24FA}, {0x24FB,0x24FB,0x24FB}, - {0x24FC,0x24FC,0x24FC}, {0x24FD,0x24FD,0x24FD}, - {0x24FE,0x24FE,0x24FE}, {0x24FF,0x24FF,0x24FF} -}; - -static MY_UNICASE_CHARACTER planeFF[]={ - {0xFF00,0xFF00,0xFF00}, {0xFF01,0xFF01,0xFF01}, - {0xFF02,0xFF02,0xFF02}, {0xFF03,0xFF03,0xFF03}, - {0xFF04,0xFF04,0xFF04}, {0xFF05,0xFF05,0xFF05}, - {0xFF06,0xFF06,0xFF06}, {0xFF07,0xFF07,0xFF07}, - {0xFF08,0xFF08,0xFF08}, {0xFF09,0xFF09,0xFF09}, - {0xFF0A,0xFF0A,0xFF0A}, {0xFF0B,0xFF0B,0xFF0B}, - {0xFF0C,0xFF0C,0xFF0C}, {0xFF0D,0xFF0D,0xFF0D}, - {0xFF0E,0xFF0E,0xFF0E}, {0xFF0F,0xFF0F,0xFF0F}, - {0xFF10,0xFF10,0xFF10}, {0xFF11,0xFF11,0xFF11}, - {0xFF12,0xFF12,0xFF12}, {0xFF13,0xFF13,0xFF13}, - {0xFF14,0xFF14,0xFF14}, {0xFF15,0xFF15,0xFF15}, - {0xFF16,0xFF16,0xFF16}, {0xFF17,0xFF17,0xFF17}, - {0xFF18,0xFF18,0xFF18}, {0xFF19,0xFF19,0xFF19}, - {0xFF1A,0xFF1A,0xFF1A}, {0xFF1B,0xFF1B,0xFF1B}, - {0xFF1C,0xFF1C,0xFF1C}, {0xFF1D,0xFF1D,0xFF1D}, - {0xFF1E,0xFF1E,0xFF1E}, {0xFF1F,0xFF1F,0xFF1F}, - {0xFF20,0xFF20,0xFF20}, {0xFF21,0xFF41,0xFF21}, - {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23}, - {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25}, - {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27}, - {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29}, - {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B}, - {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D}, - {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F}, - {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31}, - {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33}, - {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35}, - {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37}, - {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39}, - {0xFF3A,0xFF5A,0xFF3A}, {0xFF3B,0xFF3B,0xFF3B}, - {0xFF3C,0xFF3C,0xFF3C}, {0xFF3D,0xFF3D,0xFF3D}, - {0xFF3E,0xFF3E,0xFF3E}, {0xFF3F,0xFF3F,0xFF3F}, - {0xFF40,0xFF40,0xFF40}, {0xFF21,0xFF41,0xFF21}, - {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23}, - {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25}, - {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27}, - {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29}, - {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B}, - {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D}, - {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F}, - {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31}, - {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33}, - {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35}, - {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37}, - {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39}, - {0xFF3A,0xFF5A,0xFF3A}, {0xFF5B,0xFF5B,0xFF5B}, - {0xFF5C,0xFF5C,0xFF5C}, {0xFF5D,0xFF5D,0xFF5D}, - {0xFF5E,0xFF5E,0xFF5E}, {0xFF5F,0xFF5F,0xFF5F}, - {0xFF60,0xFF60,0xFF60}, {0xFF61,0xFF61,0xFF61}, - {0xFF62,0xFF62,0xFF62}, {0xFF63,0xFF63,0xFF63}, - {0xFF64,0xFF64,0xFF64}, {0xFF65,0xFF65,0xFF65}, - {0xFF66,0xFF66,0xFF66}, {0xFF67,0xFF67,0xFF67}, - {0xFF68,0xFF68,0xFF68}, {0xFF69,0xFF69,0xFF69}, - {0xFF6A,0xFF6A,0xFF6A}, {0xFF6B,0xFF6B,0xFF6B}, - {0xFF6C,0xFF6C,0xFF6C}, {0xFF6D,0xFF6D,0xFF6D}, - {0xFF6E,0xFF6E,0xFF6E}, {0xFF6F,0xFF6F,0xFF6F}, - {0xFF70,0xFF70,0xFF70}, {0xFF71,0xFF71,0xFF71}, - {0xFF72,0xFF72,0xFF72}, {0xFF73,0xFF73,0xFF73}, - {0xFF74,0xFF74,0xFF74}, {0xFF75,0xFF75,0xFF75}, - {0xFF76,0xFF76,0xFF76}, {0xFF77,0xFF77,0xFF77}, - {0xFF78,0xFF78,0xFF78}, {0xFF79,0xFF79,0xFF79}, - {0xFF7A,0xFF7A,0xFF7A}, {0xFF7B,0xFF7B,0xFF7B}, - {0xFF7C,0xFF7C,0xFF7C}, {0xFF7D,0xFF7D,0xFF7D}, - {0xFF7E,0xFF7E,0xFF7E}, {0xFF7F,0xFF7F,0xFF7F}, - {0xFF80,0xFF80,0xFF80}, {0xFF81,0xFF81,0xFF81}, - {0xFF82,0xFF82,0xFF82}, {0xFF83,0xFF83,0xFF83}, - {0xFF84,0xFF84,0xFF84}, {0xFF85,0xFF85,0xFF85}, - {0xFF86,0xFF86,0xFF86}, {0xFF87,0xFF87,0xFF87}, - {0xFF88,0xFF88,0xFF88}, {0xFF89,0xFF89,0xFF89}, - {0xFF8A,0xFF8A,0xFF8A}, {0xFF8B,0xFF8B,0xFF8B}, - {0xFF8C,0xFF8C,0xFF8C}, {0xFF8D,0xFF8D,0xFF8D}, - {0xFF8E,0xFF8E,0xFF8E}, {0xFF8F,0xFF8F,0xFF8F}, - {0xFF90,0xFF90,0xFF90}, {0xFF91,0xFF91,0xFF91}, - {0xFF92,0xFF92,0xFF92}, {0xFF93,0xFF93,0xFF93}, - {0xFF94,0xFF94,0xFF94}, {0xFF95,0xFF95,0xFF95}, - {0xFF96,0xFF96,0xFF96}, {0xFF97,0xFF97,0xFF97}, - {0xFF98,0xFF98,0xFF98}, {0xFF99,0xFF99,0xFF99}, - {0xFF9A,0xFF9A,0xFF9A}, {0xFF9B,0xFF9B,0xFF9B}, - {0xFF9C,0xFF9C,0xFF9C}, {0xFF9D,0xFF9D,0xFF9D}, - {0xFF9E,0xFF9E,0xFF9E}, {0xFF9F,0xFF9F,0xFF9F}, - {0xFFA0,0xFFA0,0xFFA0}, {0xFFA1,0xFFA1,0xFFA1}, - {0xFFA2,0xFFA2,0xFFA2}, {0xFFA3,0xFFA3,0xFFA3}, - {0xFFA4,0xFFA4,0xFFA4}, {0xFFA5,0xFFA5,0xFFA5}, - {0xFFA6,0xFFA6,0xFFA6}, {0xFFA7,0xFFA7,0xFFA7}, - {0xFFA8,0xFFA8,0xFFA8}, {0xFFA9,0xFFA9,0xFFA9}, - {0xFFAA,0xFFAA,0xFFAA}, {0xFFAB,0xFFAB,0xFFAB}, - {0xFFAC,0xFFAC,0xFFAC}, {0xFFAD,0xFFAD,0xFFAD}, - {0xFFAE,0xFFAE,0xFFAE}, {0xFFAF,0xFFAF,0xFFAF}, - {0xFFB0,0xFFB0,0xFFB0}, {0xFFB1,0xFFB1,0xFFB1}, - {0xFFB2,0xFFB2,0xFFB2}, {0xFFB3,0xFFB3,0xFFB3}, - {0xFFB4,0xFFB4,0xFFB4}, {0xFFB5,0xFFB5,0xFFB5}, - {0xFFB6,0xFFB6,0xFFB6}, {0xFFB7,0xFFB7,0xFFB7}, - {0xFFB8,0xFFB8,0xFFB8}, {0xFFB9,0xFFB9,0xFFB9}, - {0xFFBA,0xFFBA,0xFFBA}, {0xFFBB,0xFFBB,0xFFBB}, - {0xFFBC,0xFFBC,0xFFBC}, {0xFFBD,0xFFBD,0xFFBD}, - {0xFFBE,0xFFBE,0xFFBE}, {0xFFBF,0xFFBF,0xFFBF}, - {0xFFC0,0xFFC0,0xFFC0}, {0xFFC1,0xFFC1,0xFFC1}, - {0xFFC2,0xFFC2,0xFFC2}, {0xFFC3,0xFFC3,0xFFC3}, - {0xFFC4,0xFFC4,0xFFC4}, {0xFFC5,0xFFC5,0xFFC5}, - {0xFFC6,0xFFC6,0xFFC6}, {0xFFC7,0xFFC7,0xFFC7}, - {0xFFC8,0xFFC8,0xFFC8}, {0xFFC9,0xFFC9,0xFFC9}, - {0xFFCA,0xFFCA,0xFFCA}, {0xFFCB,0xFFCB,0xFFCB}, - {0xFFCC,0xFFCC,0xFFCC}, {0xFFCD,0xFFCD,0xFFCD}, - {0xFFCE,0xFFCE,0xFFCE}, {0xFFCF,0xFFCF,0xFFCF}, - {0xFFD0,0xFFD0,0xFFD0}, {0xFFD1,0xFFD1,0xFFD1}, - {0xFFD2,0xFFD2,0xFFD2}, {0xFFD3,0xFFD3,0xFFD3}, - {0xFFD4,0xFFD4,0xFFD4}, {0xFFD5,0xFFD5,0xFFD5}, - {0xFFD6,0xFFD6,0xFFD6}, {0xFFD7,0xFFD7,0xFFD7}, - {0xFFD8,0xFFD8,0xFFD8}, {0xFFD9,0xFFD9,0xFFD9}, - {0xFFDA,0xFFDA,0xFFDA}, {0xFFDB,0xFFDB,0xFFDB}, - {0xFFDC,0xFFDC,0xFFDC}, {0xFFDD,0xFFDD,0xFFDD}, - {0xFFDE,0xFFDE,0xFFDE}, {0xFFDF,0xFFDF,0xFFDF}, - {0xFFE0,0xFFE0,0xFFE0}, {0xFFE1,0xFFE1,0xFFE1}, - {0xFFE2,0xFFE2,0xFFE2}, {0xFFE3,0xFFE3,0xFFE3}, - {0xFFE4,0xFFE4,0xFFE4}, {0xFFE5,0xFFE5,0xFFE5}, - {0xFFE6,0xFFE6,0xFFE6}, {0xFFE7,0xFFE7,0xFFE7}, - {0xFFE8,0xFFE8,0xFFE8}, {0xFFE9,0xFFE9,0xFFE9}, - {0xFFEA,0xFFEA,0xFFEA}, {0xFFEB,0xFFEB,0xFFEB}, - {0xFFEC,0xFFEC,0xFFEC}, {0xFFED,0xFFED,0xFFED}, - {0xFFEE,0xFFEE,0xFFEE}, {0xFFEF,0xFFEF,0xFFEF}, - {0xFFF0,0xFFF0,0xFFF0}, {0xFFF1,0xFFF1,0xFFF1}, - {0xFFF2,0xFFF2,0xFFF2}, {0xFFF3,0xFFF3,0xFFF3}, - {0xFFF4,0xFFF4,0xFFF4}, {0xFFF5,0xFFF5,0xFFF5}, - {0xFFF6,0xFFF6,0xFFF6}, {0xFFF7,0xFFF7,0xFFF7}, - {0xFFF8,0xFFF8,0xFFF8}, {0xFFF9,0xFFF9,0xFFF9}, - {0xFFFA,0xFFFA,0xFFFA}, {0xFFFB,0xFFFB,0xFFFB}, - {0xFFFC,0xFFFC,0xFFFC}, {0xFFFD,0xFFFD,0xFFFD}, - {0xFFFE,0xFFFE,0xFFFE}, {0xFFFF,0xFFFF,0xFFFF} -}; - - -MY_UNICASE_CHARACTER *my_unicase_default_pages[256]= -{ - my_unicase_default_page00, - plane01, plane02, plane03, plane04, plane05, plane06, plane07, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F, - NULL, plane21, NULL, NULL, plane24, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF -}; - - -MY_UNICASE_INFO my_unicase_default= -{ - MY_UNICASE_INFO_DEFAULT_MAXCHAR, - my_unicase_default_pages -}; - - -/* - Reproduce old utf8mb3_general_ci behaviour before we fixed Bug#27877. -*/ -MY_UNICASE_CHARACTER *my_unicase_mysql500_pages[256]={ - my_unicase_mysql500_page00, - plane01, plane02, plane03, plane04, plane05, plane06, plane07, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F, - NULL, plane21, NULL, NULL, plane24, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF - -}; - - -MY_UNICASE_INFO my_unicase_mysql500= -{ - 0xFFFF, - my_unicase_mysql500_pages -}; - - -/* - Turkish lower/upper mapping: - 1. LOWER(0x0049 LATIN CAPITAL LETTER I) -> - 0x0131 LATIN SMALL LETTER DOTLESS I - 2. UPPER(0x0069 LATIN SMALL LETTER I) -> - 0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE -*/ - -static MY_UNICASE_CHARACTER turk00[]= -{ - {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001}, - {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003}, - {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005}, - {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007}, - {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009}, - {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B}, - {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D}, - {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F}, - {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011}, - {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013}, - {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015}, - {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017}, - {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019}, - {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B}, - {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D}, - {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F}, - {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021}, - {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023}, - {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025}, - {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027}, - {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029}, - {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B}, - {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D}, - {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F}, - {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031}, - {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033}, - {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035}, - {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037}, - {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039}, - {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B}, - {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D}, - {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F}, - {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0049,0x0131,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B}, - {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D}, - {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F}, - {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041}, - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, - {0x0048,0x0068,0x0048}, {0x0130,0x0069,0x0049}, - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, - {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B}, - {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D}, - {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F}, - {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081}, - {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083}, - {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085}, - {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087}, - {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089}, - {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B}, - {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D}, - {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F}, - {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091}, - {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093}, - {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095}, - {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097}, - {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099}, - {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B}, - {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D}, - {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F}, - {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1}, - {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3}, - {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5}, - {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7}, - {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9}, - {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB}, - {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD}, - {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF}, - {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1}, - {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3}, - {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C}, - {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7}, - {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9}, - {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB}, - {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD}, - {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x00DF}, - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, - {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7}, - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059} -}; - - - -static MY_UNICASE_CHARACTER *my_unicase_pages_turkish[256]= -{ - turk00, plane01, plane02, plane03, plane04, plane05, plane06, plane07, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F, - NULL, plane21, NULL, NULL, plane24, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF -}; - - -MY_UNICASE_INFO my_unicase_turkish= -{ - 0xFFFF, - my_unicase_pages_turkish -}; - - -/* Unicode-5.2.0 case folding information */ -static MY_UNICASE_CHARACTER u520p00[]={ - {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001}, /* 0000 */ - {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003}, /* 0002 */ - {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005}, /* 0004 */ - {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007}, /* 0006 */ - {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009}, /* 0008 */ - {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B}, /* 000A */ - {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D}, /* 000C */ - {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F}, /* 000E */ - {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011}, /* 0010 */ - {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013}, /* 0012 */ - {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015}, /* 0014 */ - {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017}, /* 0016 */ - {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019}, /* 0018 */ - {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B}, /* 001A */ - {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D}, /* 001C */ - {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F}, /* 001E */ - {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021}, /* 0020 */ - {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023}, /* 0022 */ - {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025}, /* 0024 */ - {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027}, /* 0026 */ - {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029}, /* 0028 */ - {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B}, /* 002A */ - {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D}, /* 002C */ - {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F}, /* 002E */ - {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031}, /* 0030 */ - {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033}, /* 0032 */ - {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035}, /* 0034 */ - {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037}, /* 0036 */ - {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039}, /* 0038 */ - {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B}, /* 003A */ - {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D}, /* 003C */ - {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F}, /* 003E */ - {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041}, /* 0040 */ - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, /* 0042 */ - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, /* 0044 */ - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, /* 0046 */ - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, /* 0048 */ - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, /* 004A */ - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, /* 004C */ - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, /* 004E */ - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, /* 0050 */ - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, /* 0052 */ - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, /* 0054 */ - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, /* 0056 */ - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, /* 0058 */ - {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B}, /* 005A */ - {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D}, /* 005C */ - {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F}, /* 005E */ - {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041}, /* 0060 */ - {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043}, /* 0062 */ - {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045}, /* 0064 */ - {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047}, /* 0066 */ - {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049}, /* 0068 */ - {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B}, /* 006A */ - {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D}, /* 006C */ - {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F}, /* 006E */ - {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051}, /* 0070 */ - {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053}, /* 0072 */ - {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055}, /* 0074 */ - {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057}, /* 0076 */ - {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059}, /* 0078 */ - {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B}, /* 007A */ - {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D}, /* 007C */ - {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F}, /* 007E */ - {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081}, /* 0080 */ - {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083}, /* 0082 */ - {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085}, /* 0084 */ - {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087}, /* 0086 */ - {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089}, /* 0088 */ - {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B}, /* 008A */ - {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D}, /* 008C */ - {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F}, /* 008E */ - {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091}, /* 0090 */ - {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093}, /* 0092 */ - {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095}, /* 0094 */ - {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097}, /* 0096 */ - {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099}, /* 0098 */ - {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B}, /* 009A */ - {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D}, /* 009C */ - {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F}, /* 009E */ - {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1}, /* 00A0 */ - {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3}, /* 00A2 */ - {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5}, /* 00A4 */ - {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7}, /* 00A6 */ - {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9}, /* 00A8 */ - {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB}, /* 00AA */ - {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD}, /* 00AC */ - {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF}, /* 00AE */ - {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1}, /* 00B0 */ - {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3}, /* 00B2 */ - {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C}, /* 00B4 */ - {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7}, /* 00B6 */ - {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9}, /* 00B8 */ - {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB}, /* 00BA */ - {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD}, /* 00BC */ - {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF}, /* 00BE */ - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, /* 00C0 */ - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, /* 00C2 */ - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, /* 00C4 */ - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, /* 00C6 */ - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, /* 00C8 */ - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, /* 00CA */ - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, /* 00CC */ - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, /* 00CE */ - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, /* 00D0 */ - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, /* 00D2 */ - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, /* 00D4 */ - {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7}, /* 00D6 */ - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, /* 00D8 */ - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, /* 00DA */ - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, /* 00DC */ - {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x0053}, /* 00DE */ - {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, /* 00E0 */ - {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, /* 00E2 */ - {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, /* 00E4 */ - {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043}, /* 00E6 */ - {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045}, /* 00E8 */ - {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045}, /* 00EA */ - {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049}, /* 00EC */ - {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049}, /* 00EE */ - {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E}, /* 00F0 */ - {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F}, /* 00F2 */ - {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F}, /* 00F4 */ - {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7}, /* 00F6 */ - {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, /* 00F8 */ - {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, /* 00FA */ - {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, /* 00FC */ - {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059} /* 00FE */ -}; - -static MY_UNICASE_CHARACTER u520p01[]={ - {0x0100,0x0101,0x0041}, {0x0100,0x0101,0x0041}, /* 0100 */ - {0x0102,0x0103,0x0041}, {0x0102,0x0103,0x0041}, /* 0102 */ - {0x0104,0x0105,0x0041}, {0x0104,0x0105,0x0041}, /* 0104 */ - {0x0106,0x0107,0x0043}, {0x0106,0x0107,0x0043}, /* 0106 */ - {0x0108,0x0109,0x0043}, {0x0108,0x0109,0x0043}, /* 0108 */ - {0x010A,0x010B,0x0043}, {0x010A,0x010B,0x0043}, /* 010A */ - {0x010C,0x010D,0x0043}, {0x010C,0x010D,0x0043}, /* 010C */ - {0x010E,0x010F,0x0044}, {0x010E,0x010F,0x0044}, /* 010E */ - {0x0110,0x0111,0x0110}, {0x0110,0x0111,0x0110}, /* 0110 */ - {0x0112,0x0113,0x0045}, {0x0112,0x0113,0x0045}, /* 0112 */ - {0x0114,0x0115,0x0045}, {0x0114,0x0115,0x0045}, /* 0114 */ - {0x0116,0x0117,0x0045}, {0x0116,0x0117,0x0045}, /* 0116 */ - {0x0118,0x0119,0x0045}, {0x0118,0x0119,0x0045}, /* 0118 */ - {0x011A,0x011B,0x0045}, {0x011A,0x011B,0x0045}, /* 011A */ - {0x011C,0x011D,0x0047}, {0x011C,0x011D,0x0047}, /* 011C */ - {0x011E,0x011F,0x0047}, {0x011E,0x011F,0x0047}, /* 011E */ - {0x0120,0x0121,0x0047}, {0x0120,0x0121,0x0047}, /* 0120 */ - {0x0122,0x0123,0x0047}, {0x0122,0x0123,0x0047}, /* 0122 */ - {0x0124,0x0125,0x0048}, {0x0124,0x0125,0x0048}, /* 0124 */ - {0x0126,0x0127,0x0126}, {0x0126,0x0127,0x0126}, /* 0126 */ - {0x0128,0x0129,0x0049}, {0x0128,0x0129,0x0049}, /* 0128 */ - {0x012A,0x012B,0x0049}, {0x012A,0x012B,0x0049}, /* 012A */ - {0x012C,0x012D,0x0049}, {0x012C,0x012D,0x0049}, /* 012C */ - {0x012E,0x012F,0x0049}, {0x012E,0x012F,0x0049}, /* 012E */ - {0x0130,0x0069,0x0049}, {0x0049,0x0131,0x0049}, /* 0130 */ - {0x0132,0x0133,0x0132}, {0x0132,0x0133,0x0132}, /* 0132 */ - {0x0134,0x0135,0x004A}, {0x0134,0x0135,0x004A}, /* 0134 */ - {0x0136,0x0137,0x004B}, {0x0136,0x0137,0x004B}, /* 0136 */ - {0x0138,0x0138,0x0138}, {0x0139,0x013A,0x004C}, /* 0138 */ - {0x0139,0x013A,0x004C}, {0x013B,0x013C,0x004C}, /* 013A */ - {0x013B,0x013C,0x004C}, {0x013D,0x013E,0x004C}, /* 013C */ - {0x013D,0x013E,0x004C}, {0x013F,0x0140,0x013F}, /* 013E */ - {0x013F,0x0140,0x013F}, {0x0141,0x0142,0x0141}, /* 0140 */ - {0x0141,0x0142,0x0141}, {0x0143,0x0144,0x004E}, /* 0142 */ - {0x0143,0x0144,0x004E}, {0x0145,0x0146,0x004E}, /* 0144 */ - {0x0145,0x0146,0x004E}, {0x0147,0x0148,0x004E}, /* 0146 */ - {0x0147,0x0148,0x004E}, {0x0149,0x0149,0x0149}, /* 0148 */ - {0x014A,0x014B,0x014A}, {0x014A,0x014B,0x014A}, /* 014A */ - {0x014C,0x014D,0x004F}, {0x014C,0x014D,0x004F}, /* 014C */ - {0x014E,0x014F,0x004F}, {0x014E,0x014F,0x004F}, /* 014E */ - {0x0150,0x0151,0x004F}, {0x0150,0x0151,0x004F}, /* 0150 */ - {0x0152,0x0153,0x0152}, {0x0152,0x0153,0x0152}, /* 0152 */ - {0x0154,0x0155,0x0052}, {0x0154,0x0155,0x0052}, /* 0154 */ - {0x0156,0x0157,0x0052}, {0x0156,0x0157,0x0052}, /* 0156 */ - {0x0158,0x0159,0x0052}, {0x0158,0x0159,0x0052}, /* 0158 */ - {0x015A,0x015B,0x0053}, {0x015A,0x015B,0x0053}, /* 015A */ - {0x015C,0x015D,0x0053}, {0x015C,0x015D,0x0053}, /* 015C */ - {0x015E,0x015F,0x0053}, {0x015E,0x015F,0x0053}, /* 015E */ - {0x0160,0x0161,0x0053}, {0x0160,0x0161,0x0053}, /* 0160 */ - {0x0162,0x0163,0x0054}, {0x0162,0x0163,0x0054}, /* 0162 */ - {0x0164,0x0165,0x0054}, {0x0164,0x0165,0x0054}, /* 0164 */ - {0x0166,0x0167,0x0166}, {0x0166,0x0167,0x0166}, /* 0166 */ - {0x0168,0x0169,0x0055}, {0x0168,0x0169,0x0055}, /* 0168 */ - {0x016A,0x016B,0x0055}, {0x016A,0x016B,0x0055}, /* 016A */ - {0x016C,0x016D,0x0055}, {0x016C,0x016D,0x0055}, /* 016C */ - {0x016E,0x016F,0x0055}, {0x016E,0x016F,0x0055}, /* 016E */ - {0x0170,0x0171,0x0055}, {0x0170,0x0171,0x0055}, /* 0170 */ - {0x0172,0x0173,0x0055}, {0x0172,0x0173,0x0055}, /* 0172 */ - {0x0174,0x0175,0x0057}, {0x0174,0x0175,0x0057}, /* 0174 */ - {0x0176,0x0177,0x0059}, {0x0176,0x0177,0x0059}, /* 0176 */ - {0x0178,0x00FF,0x0059}, {0x0179,0x017A,0x005A}, /* 0178 */ - {0x0179,0x017A,0x005A}, {0x017B,0x017C,0x005A}, /* 017A */ - {0x017B,0x017C,0x005A}, {0x017D,0x017E,0x005A}, /* 017C */ - {0x017D,0x017E,0x005A}, {0x0053,0x017F,0x0053}, /* 017E */ - {0x0243,0x0180,0x0243}, {0x0181,0x0253,0x0181}, /* 0180 */ - {0x0182,0x0183,0x0182}, {0x0182,0x0183,0x0182}, /* 0182 */ - {0x0184,0x0185,0x0184}, {0x0184,0x0185,0x0184}, /* 0184 */ - {0x0186,0x0254,0x0186}, {0x0187,0x0188,0x0187}, /* 0186 */ - {0x0187,0x0188,0x0187}, {0x0189,0x0256,0x0189}, /* 0188 */ - {0x018A,0x0257,0x018A}, {0x018B,0x018C,0x018B}, /* 018A */ - {0x018B,0x018C,0x018B}, {0x018D,0x018D,0x018D}, /* 018C */ - {0x018E,0x01DD,0x018E}, {0x018F,0x0259,0x018F}, /* 018E */ - {0x0190,0x025B,0x0190}, {0x0191,0x0192,0x0191}, /* 0190 */ - {0x0191,0x0192,0x0191}, {0x0193,0x0260,0x0193}, /* 0192 */ - {0x0194,0x0263,0x0194}, {0x01F6,0x0195,0x01F6}, /* 0194 */ - {0x0196,0x0269,0x0196}, {0x0197,0x0268,0x0197}, /* 0196 */ - {0x0198,0x0199,0x0198}, {0x0198,0x0199,0x0198}, /* 0198 */ - {0x023D,0x019A,0x023D}, {0x019B,0x019B,0x019B}, /* 019A */ - {0x019C,0x026F,0x019C}, {0x019D,0x0272,0x019D}, /* 019C */ - {0x0220,0x019E,0x0220}, {0x019F,0x0275,0x019F}, /* 019E */ - {0x01A0,0x01A1,0x004F}, {0x01A0,0x01A1,0x004F}, /* 01A0 */ - {0x01A2,0x01A3,0x01A2}, {0x01A2,0x01A3,0x01A2}, /* 01A2 */ - {0x01A4,0x01A5,0x01A4}, {0x01A4,0x01A5,0x01A4}, /* 01A4 */ - {0x01A6,0x0280,0x01A6}, {0x01A7,0x01A8,0x01A7}, /* 01A6 */ - {0x01A7,0x01A8,0x01A7}, {0x01A9,0x0283,0x01A9}, /* 01A8 */ - {0x01AA,0x01AA,0x01AA}, {0x01AB,0x01AB,0x01AB}, /* 01AA */ - {0x01AC,0x01AD,0x01AC}, {0x01AC,0x01AD,0x01AC}, /* 01AC */ - {0x01AE,0x0288,0x01AE}, {0x01AF,0x01B0,0x0055}, /* 01AE */ - {0x01AF,0x01B0,0x0055}, {0x01B1,0x028A,0x01B1}, /* 01B0 */ - {0x01B2,0x028B,0x01B2}, {0x01B3,0x01B4,0x01B3}, /* 01B2 */ - {0x01B3,0x01B4,0x01B3}, {0x01B5,0x01B6,0x01B5}, /* 01B4 */ - {0x01B5,0x01B6,0x01B5}, {0x01B7,0x0292,0x01B7}, /* 01B6 */ - {0x01B8,0x01B9,0x01B8}, {0x01B8,0x01B9,0x01B8}, /* 01B8 */ - {0x01BA,0x01BA,0x01BA}, {0x01BB,0x01BB,0x01BB}, /* 01BA */ - {0x01BC,0x01BD,0x01BC}, {0x01BC,0x01BD,0x01BC}, /* 01BC */ - {0x01BE,0x01BE,0x01BE}, {0x01F7,0x01BF,0x01F7}, /* 01BE */ - {0x01C0,0x01C0,0x01C0}, {0x01C1,0x01C1,0x01C1}, /* 01C0 */ - {0x01C2,0x01C2,0x01C2}, {0x01C3,0x01C3,0x01C3}, /* 01C2 */ - {0x01C4,0x01C6,0x01C4}, {0x01C4,0x01C6,0x01C4}, /* 01C4 */ - {0x01C4,0x01C6,0x01C4}, {0x01C7,0x01C9,0x01C7}, /* 01C6 */ - {0x01C7,0x01C9,0x01C7}, {0x01C7,0x01C9,0x01C7}, /* 01C8 */ - {0x01CA,0x01CC,0x01CA}, {0x01CA,0x01CC,0x01CA}, /* 01CA */ - {0x01CA,0x01CC,0x01CA}, {0x01CD,0x01CE,0x0041}, /* 01CC */ - {0x01CD,0x01CE,0x0041}, {0x01CF,0x01D0,0x0049}, /* 01CE */ - {0x01CF,0x01D0,0x0049}, {0x01D1,0x01D2,0x004F}, /* 01D0 */ - {0x01D1,0x01D2,0x004F}, {0x01D3,0x01D4,0x0055}, /* 01D2 */ - {0x01D3,0x01D4,0x0055}, {0x01D5,0x01D6,0x0055}, /* 01D4 */ - {0x01D5,0x01D6,0x0055}, {0x01D7,0x01D8,0x0055}, /* 01D6 */ - {0x01D7,0x01D8,0x0055}, {0x01D9,0x01DA,0x0055}, /* 01D8 */ - {0x01D9,0x01DA,0x0055}, {0x01DB,0x01DC,0x0055}, /* 01DA */ - {0x01DB,0x01DC,0x0055}, {0x018E,0x01DD,0x018E}, /* 01DC */ - {0x01DE,0x01DF,0x0041}, {0x01DE,0x01DF,0x0041}, /* 01DE */ - {0x01E0,0x01E1,0x0041}, {0x01E0,0x01E1,0x0041}, /* 01E0 */ - {0x01E2,0x01E3,0x00C6}, {0x01E2,0x01E3,0x00C6}, /* 01E2 */ - {0x01E4,0x01E5,0x01E4}, {0x01E4,0x01E5,0x01E4}, /* 01E4 */ - {0x01E6,0x01E7,0x0047}, {0x01E6,0x01E7,0x0047}, /* 01E6 */ - {0x01E8,0x01E9,0x004B}, {0x01E8,0x01E9,0x004B}, /* 01E8 */ - {0x01EA,0x01EB,0x004F}, {0x01EA,0x01EB,0x004F}, /* 01EA */ - {0x01EC,0x01ED,0x004F}, {0x01EC,0x01ED,0x004F}, /* 01EC */ - {0x01EE,0x01EF,0x01B7}, {0x01EE,0x01EF,0x01B7}, /* 01EE */ - {0x01F0,0x01F0,0x004A}, {0x01F1,0x01F3,0x01F1}, /* 01F0 */ - {0x01F1,0x01F3,0x01F1}, {0x01F1,0x01F3,0x01F1}, /* 01F2 */ - {0x01F4,0x01F5,0x0047}, {0x01F4,0x01F5,0x0047}, /* 01F4 */ - {0x01F6,0x0195,0x01F6}, {0x01F7,0x01BF,0x01F7}, /* 01F6 */ - {0x01F8,0x01F9,0x004E}, {0x01F8,0x01F9,0x004E}, /* 01F8 */ - {0x01FA,0x01FB,0x0041}, {0x01FA,0x01FB,0x0041}, /* 01FA */ - {0x01FC,0x01FD,0x00C6}, {0x01FC,0x01FD,0x00C6}, /* 01FC */ - {0x01FE,0x01FF,0x00D8}, {0x01FE,0x01FF,0x00D8} /* 01FE */ -}; - -static MY_UNICASE_CHARACTER u520p02[]={ - {0x0200,0x0201,0x0041}, {0x0200,0x0201,0x0041}, /* 0200 */ - {0x0202,0x0203,0x0041}, {0x0202,0x0203,0x0041}, /* 0202 */ - {0x0204,0x0205,0x0045}, {0x0204,0x0205,0x0045}, /* 0204 */ - {0x0206,0x0207,0x0045}, {0x0206,0x0207,0x0045}, /* 0206 */ - {0x0208,0x0209,0x0049}, {0x0208,0x0209,0x0049}, /* 0208 */ - {0x020A,0x020B,0x0049}, {0x020A,0x020B,0x0049}, /* 020A */ - {0x020C,0x020D,0x004F}, {0x020C,0x020D,0x004F}, /* 020C */ - {0x020E,0x020F,0x004F}, {0x020E,0x020F,0x004F}, /* 020E */ - {0x0210,0x0211,0x0052}, {0x0210,0x0211,0x0052}, /* 0210 */ - {0x0212,0x0213,0x0052}, {0x0212,0x0213,0x0052}, /* 0212 */ - {0x0214,0x0215,0x0055}, {0x0214,0x0215,0x0055}, /* 0214 */ - {0x0216,0x0217,0x0055}, {0x0216,0x0217,0x0055}, /* 0216 */ - {0x0218,0x0219,0x0053}, {0x0218,0x0219,0x0053}, /* 0218 */ - {0x021A,0x021B,0x0054}, {0x021A,0x021B,0x0054}, /* 021A */ - {0x021C,0x021D,0x021C}, {0x021C,0x021D,0x021C}, /* 021C */ - {0x021E,0x021F,0x0048}, {0x021E,0x021F,0x0048}, /* 021E */ - {0x0220,0x019E,0x0220}, {0x0221,0x0221,0x0221}, /* 0220 */ - {0x0222,0x0223,0x0222}, {0x0222,0x0223,0x0222}, /* 0222 */ - {0x0224,0x0225,0x0224}, {0x0224,0x0225,0x0224}, /* 0224 */ - {0x0226,0x0227,0x0041}, {0x0226,0x0227,0x0041}, /* 0226 */ - {0x0228,0x0229,0x0045}, {0x0228,0x0229,0x0045}, /* 0228 */ - {0x022A,0x022B,0x004F}, {0x022A,0x022B,0x004F}, /* 022A */ - {0x022C,0x022D,0x004F}, {0x022C,0x022D,0x004F}, /* 022C */ - {0x022E,0x022F,0x004F}, {0x022E,0x022F,0x004F}, /* 022E */ - {0x0230,0x0231,0x004F}, {0x0230,0x0231,0x004F}, /* 0230 */ - {0x0232,0x0233,0x0059}, {0x0232,0x0233,0x0059}, /* 0232 */ - {0x0234,0x0234,0x0234}, {0x0235,0x0235,0x0235}, /* 0234 */ - {0x0236,0x0236,0x0236}, {0x0237,0x0237,0x0237}, /* 0236 */ - {0x0238,0x0238,0x0238}, {0x0239,0x0239,0x0239}, /* 0238 */ - {0x023A,0x2C65,0x023A}, {0x023B,0x023C,0x023B}, /* 023A */ - {0x023B,0x023C,0x023B}, {0x023D,0x019A,0x023D}, /* 023C */ - {0x023E,0x2C66,0x023E}, {0x2C7E,0x023F,0x2C7E}, /* 023E */ - {0x2C7F,0x0240,0x2C7F}, {0x0241,0x0242,0x0241}, /* 0240 */ - {0x0241,0x0242,0x0241}, {0x0243,0x0180,0x0243}, /* 0242 */ - {0x0244,0x0289,0x0244}, {0x0245,0x028C,0x0245}, /* 0244 */ - {0x0246,0x0247,0x0246}, {0x0246,0x0247,0x0246}, /* 0246 */ - {0x0248,0x0249,0x0248}, {0x0248,0x0249,0x0248}, /* 0248 */ - {0x024A,0x024B,0x024A}, {0x024A,0x024B,0x024A}, /* 024A */ - {0x024C,0x024D,0x024C}, {0x024C,0x024D,0x024C}, /* 024C */ - {0x024E,0x024F,0x024E}, {0x024E,0x024F,0x024E}, /* 024E */ - {0x2C6F,0x0250,0x2C6F}, {0x2C6D,0x0251,0x2C6D}, /* 0250 */ - {0x2C70,0x0252,0x2C70}, {0x0181,0x0253,0x0181}, /* 0252 */ - {0x0186,0x0254,0x0186}, {0x0255,0x0255,0x0255}, /* 0254 */ - {0x0189,0x0256,0x0189}, {0x018A,0x0257,0x018A}, /* 0256 */ - {0x0258,0x0258,0x0258}, {0x018F,0x0259,0x018F}, /* 0258 */ - {0x025A,0x025A,0x025A}, {0x0190,0x025B,0x0190}, /* 025A */ - {0x025C,0x025C,0x025C}, {0x025D,0x025D,0x025D}, /* 025C */ - {0x025E,0x025E,0x025E}, {0x025F,0x025F,0x025F}, /* 025E */ - {0x0193,0x0260,0x0193}, {0x0261,0x0261,0x0261}, /* 0260 */ - {0x0262,0x0262,0x0262}, {0x0194,0x0263,0x0194}, /* 0262 */ - {0x0264,0x0264,0x0264}, {0x0265,0x0265,0x0265}, /* 0264 */ - {0x0266,0x0266,0x0266}, {0x0267,0x0267,0x0267}, /* 0266 */ - {0x0197,0x0268,0x0197}, {0x0196,0x0269,0x0196}, /* 0268 */ - {0x026A,0x026A,0x026A}, {0x2C62,0x026B,0x2C62}, /* 026A */ - {0x026C,0x026C,0x026C}, {0x026D,0x026D,0x026D}, /* 026C */ - {0x026E,0x026E,0x026E}, {0x019C,0x026F,0x019C}, /* 026E */ - {0x0270,0x0270,0x0270}, {0x2C6E,0x0271,0x2C6E}, /* 0270 */ - {0x019D,0x0272,0x019D}, {0x0273,0x0273,0x0273}, /* 0272 */ - {0x0274,0x0274,0x0274}, {0x019F,0x0275,0x019F}, /* 0274 */ - {0x0276,0x0276,0x0276}, {0x0277,0x0277,0x0277}, /* 0276 */ - {0x0278,0x0278,0x0278}, {0x0279,0x0279,0x0279}, /* 0278 */ - {0x027A,0x027A,0x027A}, {0x027B,0x027B,0x027B}, /* 027A */ - {0x027C,0x027C,0x027C}, {0x2C64,0x027D,0x2C64}, /* 027C */ - {0x027E,0x027E,0x027E}, {0x027F,0x027F,0x027F}, /* 027E */ - {0x01A6,0x0280,0x01A6}, {0x0281,0x0281,0x0281}, /* 0280 */ - {0x0282,0x0282,0x0282}, {0x01A9,0x0283,0x01A9}, /* 0282 */ - {0x0284,0x0284,0x0284}, {0x0285,0x0285,0x0285}, /* 0284 */ - {0x0286,0x0286,0x0286}, {0x0287,0x0287,0x0287}, /* 0286 */ - {0x01AE,0x0288,0x01AE}, {0x0244,0x0289,0x0244}, /* 0288 */ - {0x01B1,0x028A,0x01B1}, {0x01B2,0x028B,0x01B2}, /* 028A */ - {0x0245,0x028C,0x0245}, {0x028D,0x028D,0x028D}, /* 028C */ - {0x028E,0x028E,0x028E}, {0x028F,0x028F,0x028F}, /* 028E */ - {0x0290,0x0290,0x0290}, {0x0291,0x0291,0x0291}, /* 0290 */ - {0x01B7,0x0292,0x01B7}, {0x0293,0x0293,0x0293}, /* 0292 */ - {0x0294,0x0294,0x0294}, {0x0295,0x0295,0x0295}, /* 0294 */ - {0x0296,0x0296,0x0296}, {0x0297,0x0297,0x0297}, /* 0296 */ - {0x0298,0x0298,0x0298}, {0x0299,0x0299,0x0299}, /* 0298 */ - {0x029A,0x029A,0x029A}, {0x029B,0x029B,0x029B}, /* 029A */ - {0x029C,0x029C,0x029C}, {0x029D,0x029D,0x029D}, /* 029C */ - {0x029E,0x029E,0x029E}, {0x029F,0x029F,0x029F}, /* 029E */ - {0x02A0,0x02A0,0x02A0}, {0x02A1,0x02A1,0x02A1}, /* 02A0 */ - {0x02A2,0x02A2,0x02A2}, {0x02A3,0x02A3,0x02A3}, /* 02A2 */ - {0x02A4,0x02A4,0x02A4}, {0x02A5,0x02A5,0x02A5}, /* 02A4 */ - {0x02A6,0x02A6,0x02A6}, {0x02A7,0x02A7,0x02A7}, /* 02A6 */ - {0x02A8,0x02A8,0x02A8}, {0x02A9,0x02A9,0x02A9}, /* 02A8 */ - {0x02AA,0x02AA,0x02AA}, {0x02AB,0x02AB,0x02AB}, /* 02AA */ - {0x02AC,0x02AC,0x02AC}, {0x02AD,0x02AD,0x02AD}, /* 02AC */ - {0x02AE,0x02AE,0x02AE}, {0x02AF,0x02AF,0x02AF}, /* 02AE */ - {0x02B0,0x02B0,0x02B0}, {0x02B1,0x02B1,0x02B1}, /* 02B0 */ - {0x02B2,0x02B2,0x02B2}, {0x02B3,0x02B3,0x02B3}, /* 02B2 */ - {0x02B4,0x02B4,0x02B4}, {0x02B5,0x02B5,0x02B5}, /* 02B4 */ - {0x02B6,0x02B6,0x02B6}, {0x02B7,0x02B7,0x02B7}, /* 02B6 */ - {0x02B8,0x02B8,0x02B8}, {0x02B9,0x02B9,0x02B9}, /* 02B8 */ - {0x02BA,0x02BA,0x02BA}, {0x02BB,0x02BB,0x02BB}, /* 02BA */ - {0x02BC,0x02BC,0x02BC}, {0x02BD,0x02BD,0x02BD}, /* 02BC */ - {0x02BE,0x02BE,0x02BE}, {0x02BF,0x02BF,0x02BF}, /* 02BE */ - {0x02C0,0x02C0,0x02C0}, {0x02C1,0x02C1,0x02C1}, /* 02C0 */ - {0x02C2,0x02C2,0x02C2}, {0x02C3,0x02C3,0x02C3}, /* 02C2 */ - {0x02C4,0x02C4,0x02C4}, {0x02C5,0x02C5,0x02C5}, /* 02C4 */ - {0x02C6,0x02C6,0x02C6}, {0x02C7,0x02C7,0x02C7}, /* 02C6 */ - {0x02C8,0x02C8,0x02C8}, {0x02C9,0x02C9,0x02C9}, /* 02C8 */ - {0x02CA,0x02CA,0x02CA}, {0x02CB,0x02CB,0x02CB}, /* 02CA */ - {0x02CC,0x02CC,0x02CC}, {0x02CD,0x02CD,0x02CD}, /* 02CC */ - {0x02CE,0x02CE,0x02CE}, {0x02CF,0x02CF,0x02CF}, /* 02CE */ - {0x02D0,0x02D0,0x02D0}, {0x02D1,0x02D1,0x02D1}, /* 02D0 */ - {0x02D2,0x02D2,0x02D2}, {0x02D3,0x02D3,0x02D3}, /* 02D2 */ - {0x02D4,0x02D4,0x02D4}, {0x02D5,0x02D5,0x02D5}, /* 02D4 */ - {0x02D6,0x02D6,0x02D6}, {0x02D7,0x02D7,0x02D7}, /* 02D6 */ - {0x02D8,0x02D8,0x02D8}, {0x02D9,0x02D9,0x02D9}, /* 02D8 */ - {0x02DA,0x02DA,0x02DA}, {0x02DB,0x02DB,0x02DB}, /* 02DA */ - {0x02DC,0x02DC,0x02DC}, {0x02DD,0x02DD,0x02DD}, /* 02DC */ - {0x02DE,0x02DE,0x02DE}, {0x02DF,0x02DF,0x02DF}, /* 02DE */ - {0x02E0,0x02E0,0x02E0}, {0x02E1,0x02E1,0x02E1}, /* 02E0 */ - {0x02E2,0x02E2,0x02E2}, {0x02E3,0x02E3,0x02E3}, /* 02E2 */ - {0x02E4,0x02E4,0x02E4}, {0x02E5,0x02E5,0x02E5}, /* 02E4 */ - {0x02E6,0x02E6,0x02E6}, {0x02E7,0x02E7,0x02E7}, /* 02E6 */ - {0x02E8,0x02E8,0x02E8}, {0x02E9,0x02E9,0x02E9}, /* 02E8 */ - {0x02EA,0x02EA,0x02EA}, {0x02EB,0x02EB,0x02EB}, /* 02EA */ - {0x02EC,0x02EC,0x02EC}, {0x02ED,0x02ED,0x02ED}, /* 02EC */ - {0x02EE,0x02EE,0x02EE}, {0x02EF,0x02EF,0x02EF}, /* 02EE */ - {0x02F0,0x02F0,0x02F0}, {0x02F1,0x02F1,0x02F1}, /* 02F0 */ - {0x02F2,0x02F2,0x02F2}, {0x02F3,0x02F3,0x02F3}, /* 02F2 */ - {0x02F4,0x02F4,0x02F4}, {0x02F5,0x02F5,0x02F5}, /* 02F4 */ - {0x02F6,0x02F6,0x02F6}, {0x02F7,0x02F7,0x02F7}, /* 02F6 */ - {0x02F8,0x02F8,0x02F8}, {0x02F9,0x02F9,0x02F9}, /* 02F8 */ - {0x02FA,0x02FA,0x02FA}, {0x02FB,0x02FB,0x02FB}, /* 02FA */ - {0x02FC,0x02FC,0x02FC}, {0x02FD,0x02FD,0x02FD}, /* 02FC */ - {0x02FE,0x02FE,0x02FE}, {0x02FF,0x02FF,0x02FF} /* 02FE */ -}; - -static MY_UNICASE_CHARACTER u520p03[]={ - {0x0300,0x0300,0x0300}, {0x0301,0x0301,0x0301}, /* 0300 */ - {0x0302,0x0302,0x0302}, {0x0303,0x0303,0x0303}, /* 0302 */ - {0x0304,0x0304,0x0304}, {0x0305,0x0305,0x0305}, /* 0304 */ - {0x0306,0x0306,0x0306}, {0x0307,0x0307,0x0307}, /* 0306 */ - {0x0308,0x0308,0x0308}, {0x0309,0x0309,0x0309}, /* 0308 */ - {0x030A,0x030A,0x030A}, {0x030B,0x030B,0x030B}, /* 030A */ - {0x030C,0x030C,0x030C}, {0x030D,0x030D,0x030D}, /* 030C */ - {0x030E,0x030E,0x030E}, {0x030F,0x030F,0x030F}, /* 030E */ - {0x0310,0x0310,0x0310}, {0x0311,0x0311,0x0311}, /* 0310 */ - {0x0312,0x0312,0x0312}, {0x0313,0x0313,0x0313}, /* 0312 */ - {0x0314,0x0314,0x0314}, {0x0315,0x0315,0x0315}, /* 0314 */ - {0x0316,0x0316,0x0316}, {0x0317,0x0317,0x0317}, /* 0316 */ - {0x0318,0x0318,0x0318}, {0x0319,0x0319,0x0319}, /* 0318 */ - {0x031A,0x031A,0x031A}, {0x031B,0x031B,0x031B}, /* 031A */ - {0x031C,0x031C,0x031C}, {0x031D,0x031D,0x031D}, /* 031C */ - {0x031E,0x031E,0x031E}, {0x031F,0x031F,0x031F}, /* 031E */ - {0x0320,0x0320,0x0320}, {0x0321,0x0321,0x0321}, /* 0320 */ - {0x0322,0x0322,0x0322}, {0x0323,0x0323,0x0323}, /* 0322 */ - {0x0324,0x0324,0x0324}, {0x0325,0x0325,0x0325}, /* 0324 */ - {0x0326,0x0326,0x0326}, {0x0327,0x0327,0x0327}, /* 0326 */ - {0x0328,0x0328,0x0328}, {0x0329,0x0329,0x0329}, /* 0328 */ - {0x032A,0x032A,0x032A}, {0x032B,0x032B,0x032B}, /* 032A */ - {0x032C,0x032C,0x032C}, {0x032D,0x032D,0x032D}, /* 032C */ - {0x032E,0x032E,0x032E}, {0x032F,0x032F,0x032F}, /* 032E */ - {0x0330,0x0330,0x0330}, {0x0331,0x0331,0x0331}, /* 0330 */ - {0x0332,0x0332,0x0332}, {0x0333,0x0333,0x0333}, /* 0332 */ - {0x0334,0x0334,0x0334}, {0x0335,0x0335,0x0335}, /* 0334 */ - {0x0336,0x0336,0x0336}, {0x0337,0x0337,0x0337}, /* 0336 */ - {0x0338,0x0338,0x0338}, {0x0339,0x0339,0x0339}, /* 0338 */ - {0x033A,0x033A,0x033A}, {0x033B,0x033B,0x033B}, /* 033A */ - {0x033C,0x033C,0x033C}, {0x033D,0x033D,0x033D}, /* 033C */ - {0x033E,0x033E,0x033E}, {0x033F,0x033F,0x033F}, /* 033E */ - {0x0340,0x0340,0x0340}, {0x0341,0x0341,0x0341}, /* 0340 */ - {0x0342,0x0342,0x0342}, {0x0343,0x0343,0x0343}, /* 0342 */ - {0x0344,0x0344,0x0344}, {0x0399,0x0345,0x0399}, /* 0344 */ - {0x0346,0x0346,0x0346}, {0x0347,0x0347,0x0347}, /* 0346 */ - {0x0348,0x0348,0x0348}, {0x0349,0x0349,0x0349}, /* 0348 */ - {0x034A,0x034A,0x034A}, {0x034B,0x034B,0x034B}, /* 034A */ - {0x034C,0x034C,0x034C}, {0x034D,0x034D,0x034D}, /* 034C */ - {0x034E,0x034E,0x034E}, {0x034F,0x034F,0x034F}, /* 034E */ - {0x0350,0x0350,0x0350}, {0x0351,0x0351,0x0351}, /* 0350 */ - {0x0352,0x0352,0x0352}, {0x0353,0x0353,0x0353}, /* 0352 */ - {0x0354,0x0354,0x0354}, {0x0355,0x0355,0x0355}, /* 0354 */ - {0x0356,0x0356,0x0356}, {0x0357,0x0357,0x0357}, /* 0356 */ - {0x0358,0x0358,0x0358}, {0x0359,0x0359,0x0359}, /* 0358 */ - {0x035A,0x035A,0x035A}, {0x035B,0x035B,0x035B}, /* 035A */ - {0x035C,0x035C,0x035C}, {0x035D,0x035D,0x035D}, /* 035C */ - {0x035E,0x035E,0x035E}, {0x035F,0x035F,0x035F}, /* 035E */ - {0x0360,0x0360,0x0360}, {0x0361,0x0361,0x0361}, /* 0360 */ - {0x0362,0x0362,0x0362}, {0x0363,0x0363,0x0363}, /* 0362 */ - {0x0364,0x0364,0x0364}, {0x0365,0x0365,0x0365}, /* 0364 */ - {0x0366,0x0366,0x0366}, {0x0367,0x0367,0x0367}, /* 0366 */ - {0x0368,0x0368,0x0368}, {0x0369,0x0369,0x0369}, /* 0368 */ - {0x036A,0x036A,0x036A}, {0x036B,0x036B,0x036B}, /* 036A */ - {0x036C,0x036C,0x036C}, {0x036D,0x036D,0x036D}, /* 036C */ - {0x036E,0x036E,0x036E}, {0x036F,0x036F,0x036F}, /* 036E */ - {0x0370,0x0371,0x0370}, {0x0370,0x0371,0x0370}, /* 0370 */ - {0x0372,0x0373,0x0372}, {0x0372,0x0373,0x0372}, /* 0372 */ - {0x0374,0x0374,0x0374}, {0x0375,0x0375,0x0375}, /* 0374 */ - {0x0376,0x0377,0x0376}, {0x0376,0x0377,0x0376}, /* 0376 */ - {0x0378,0x0378,0x0378}, {0x0379,0x0379,0x0379}, /* 0378 */ - {0x037A,0x037A,0x037A}, {0x03FD,0x037B,0x03FD}, /* 037A */ - {0x03FE,0x037C,0x03FE}, {0x03FF,0x037D,0x03FF}, /* 037C */ - {0x037E,0x037E,0x037E}, {0x037F,0x037F,0x037F}, /* 037E */ - {0x0380,0x0380,0x0380}, {0x0381,0x0381,0x0381}, /* 0380 */ - {0x0382,0x0382,0x0382}, {0x0383,0x0383,0x0383}, /* 0382 */ - {0x0384,0x0384,0x0384}, {0x0385,0x0385,0x0385}, /* 0384 */ - {0x0386,0x03AC,0x0391}, {0x0387,0x0387,0x0387}, /* 0386 */ - {0x0388,0x03AD,0x0395}, {0x0389,0x03AE,0x0397}, /* 0388 */ - {0x038A,0x03AF,0x0399}, {0x038B,0x038B,0x038B}, /* 038A */ - {0x038C,0x03CC,0x039F}, {0x038D,0x038D,0x038D}, /* 038C */ - {0x038E,0x03CD,0x03A5}, {0x038F,0x03CE,0x03A9}, /* 038E */ - {0x0390,0x0390,0x0399}, {0x0391,0x03B1,0x0391}, /* 0390 */ - {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393}, /* 0392 */ - {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395}, /* 0394 */ - {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397}, /* 0396 */ - {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399}, /* 0398 */ - {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B}, /* 039A */ - {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D}, /* 039C */ - {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F}, /* 039E */ - {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1}, /* 03A0 */ - {0x03A2,0x03A2,0x03A2}, {0x03A3,0x03C3,0x03A3}, /* 03A2 */ - {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5}, /* 03A4 */ - {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7}, /* 03A6 */ - {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9}, /* 03A8 */ - {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5}, /* 03AA */ - {0x0386,0x03AC,0x0391}, {0x0388,0x03AD,0x0395}, /* 03AC */ - {0x0389,0x03AE,0x0397}, {0x038A,0x03AF,0x0399}, /* 03AE */ - {0x03B0,0x03B0,0x03A5}, {0x0391,0x03B1,0x0391}, /* 03B0 */ - {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393}, /* 03B2 */ - {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395}, /* 03B4 */ - {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397}, /* 03B6 */ - {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399}, /* 03B8 */ - {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B}, /* 03BA */ - {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D}, /* 03BC */ - {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F}, /* 03BE */ - {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1}, /* 03C0 */ - {0x03A3,0x03C2,0x03A3}, {0x03A3,0x03C3,0x03A3}, /* 03C2 */ - {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5}, /* 03C4 */ - {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7}, /* 03C6 */ - {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9}, /* 03C8 */ - {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5}, /* 03CA */ - {0x038C,0x03CC,0x039F}, {0x038E,0x03CD,0x03A5}, /* 03CC */ - {0x038F,0x03CE,0x03A9}, {0x03CF,0x03D7,0x03CF}, /* 03CE */ - {0x0392,0x03D0,0x0392}, {0x0398,0x03D1,0x0398}, /* 03D0 */ - {0x03D2,0x03D2,0x03D2}, {0x03D3,0x03D3,0x03D2}, /* 03D2 */ - {0x03D4,0x03D4,0x03D2}, {0x03A6,0x03D5,0x03A6}, /* 03D4 */ - {0x03A0,0x03D6,0x03A0}, {0x03CF,0x03D7,0x03CF}, /* 03D6 */ - {0x03D8,0x03D9,0x03D8}, {0x03D8,0x03D9,0x03D8}, /* 03D8 */ - {0x03DA,0x03DB,0x03DA}, {0x03DA,0x03DB,0x03DA}, /* 03DA */ - {0x03DC,0x03DD,0x03DC}, {0x03DC,0x03DD,0x03DC}, /* 03DC */ - {0x03DE,0x03DF,0x03DE}, {0x03DE,0x03DF,0x03DE}, /* 03DE */ - {0x03E0,0x03E1,0x03E0}, {0x03E0,0x03E1,0x03E0}, /* 03E0 */ - {0x03E2,0x03E3,0x03E2}, {0x03E2,0x03E3,0x03E2}, /* 03E2 */ - {0x03E4,0x03E5,0x03E4}, {0x03E4,0x03E5,0x03E4}, /* 03E4 */ - {0x03E6,0x03E7,0x03E6}, {0x03E6,0x03E7,0x03E6}, /* 03E6 */ - {0x03E8,0x03E9,0x03E8}, {0x03E8,0x03E9,0x03E8}, /* 03E8 */ - {0x03EA,0x03EB,0x03EA}, {0x03EA,0x03EB,0x03EA}, /* 03EA */ - {0x03EC,0x03ED,0x03EC}, {0x03EC,0x03ED,0x03EC}, /* 03EC */ - {0x03EE,0x03EF,0x03EE}, {0x03EE,0x03EF,0x03EE}, /* 03EE */ - {0x039A,0x03F0,0x039A}, {0x03A1,0x03F1,0x03A1}, /* 03F0 */ - {0x03F9,0x03F2,0x03F9}, {0x03F3,0x03F3,0x03F3}, /* 03F2 */ - {0x03F4,0x03B8,0x03F4}, {0x0395,0x03F5,0x0395}, /* 03F4 */ - {0x03F6,0x03F6,0x03F6}, {0x03F7,0x03F8,0x03F7}, /* 03F6 */ - {0x03F7,0x03F8,0x03F7}, {0x03F9,0x03F2,0x03F9}, /* 03F8 */ - {0x03FA,0x03FB,0x03FA}, {0x03FA,0x03FB,0x03FA}, /* 03FA */ - {0x03FC,0x03FC,0x03FC}, {0x03FD,0x037B,0x03FD}, /* 03FC */ - {0x03FE,0x037C,0x03FE}, {0x03FF,0x037D,0x03FF} /* 03FE */ -}; - -static MY_UNICASE_CHARACTER u520p04[]={ - {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415}, /* 0400 */ - {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413}, /* 0402 */ - {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405}, /* 0404 */ - {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406}, /* 0406 */ - {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409}, /* 0408 */ - {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B}, /* 040A */ - {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418}, /* 040C */ - {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F}, /* 040E */ - {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411}, /* 0410 */ - {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413}, /* 0412 */ - {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415}, /* 0414 */ - {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417}, /* 0416 */ - {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419}, /* 0418 */ - {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B}, /* 041A */ - {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D}, /* 041C */ - {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F}, /* 041E */ - {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421}, /* 0420 */ - {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423}, /* 0422 */ - {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425}, /* 0424 */ - {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427}, /* 0426 */ - {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429}, /* 0428 */ - {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B}, /* 042A */ - {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D}, /* 042C */ - {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F}, /* 042E */ - {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411}, /* 0430 */ - {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413}, /* 0432 */ - {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415}, /* 0434 */ - {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417}, /* 0436 */ - {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419}, /* 0438 */ - {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B}, /* 043A */ - {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D}, /* 043C */ - {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F}, /* 043E */ - {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421}, /* 0440 */ - {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423}, /* 0442 */ - {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425}, /* 0444 */ - {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427}, /* 0446 */ - {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429}, /* 0448 */ - {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B}, /* 044A */ - {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D}, /* 044C */ - {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F}, /* 044E */ - {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415}, /* 0450 */ - {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413}, /* 0452 */ - {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405}, /* 0454 */ - {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406}, /* 0456 */ - {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409}, /* 0458 */ - {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B}, /* 045A */ - {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418}, /* 045C */ - {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F}, /* 045E */ - {0x0460,0x0461,0x0460}, {0x0460,0x0461,0x0460}, /* 0460 */ - {0x0462,0x0463,0x0462}, {0x0462,0x0463,0x0462}, /* 0462 */ - {0x0464,0x0465,0x0464}, {0x0464,0x0465,0x0464}, /* 0464 */ - {0x0466,0x0467,0x0466}, {0x0466,0x0467,0x0466}, /* 0466 */ - {0x0468,0x0469,0x0468}, {0x0468,0x0469,0x0468}, /* 0468 */ - {0x046A,0x046B,0x046A}, {0x046A,0x046B,0x046A}, /* 046A */ - {0x046C,0x046D,0x046C}, {0x046C,0x046D,0x046C}, /* 046C */ - {0x046E,0x046F,0x046E}, {0x046E,0x046F,0x046E}, /* 046E */ - {0x0470,0x0471,0x0470}, {0x0470,0x0471,0x0470}, /* 0470 */ - {0x0472,0x0473,0x0472}, {0x0472,0x0473,0x0472}, /* 0472 */ - {0x0474,0x0475,0x0474}, {0x0474,0x0475,0x0474}, /* 0474 */ - {0x0476,0x0477,0x0474}, {0x0476,0x0477,0x0474}, /* 0476 */ - {0x0478,0x0479,0x0478}, {0x0478,0x0479,0x0478}, /* 0478 */ - {0x047A,0x047B,0x047A}, {0x047A,0x047B,0x047A}, /* 047A */ - {0x047C,0x047D,0x047C}, {0x047C,0x047D,0x047C}, /* 047C */ - {0x047E,0x047F,0x047E}, {0x047E,0x047F,0x047E}, /* 047E */ - {0x0480,0x0481,0x0480}, {0x0480,0x0481,0x0480}, /* 0480 */ - {0x0482,0x0482,0x0482}, {0x0483,0x0483,0x0483}, /* 0482 */ - {0x0484,0x0484,0x0484}, {0x0485,0x0485,0x0485}, /* 0484 */ - {0x0486,0x0486,0x0486}, {0x0487,0x0487,0x0487}, /* 0486 */ - {0x0488,0x0488,0x0488}, {0x0489,0x0489,0x0489}, /* 0488 */ - {0x048A,0x048B,0x048A}, {0x048A,0x048B,0x048A}, /* 048A */ - {0x048C,0x048D,0x048C}, {0x048C,0x048D,0x048C}, /* 048C */ - {0x048E,0x048F,0x048E}, {0x048E,0x048F,0x048E}, /* 048E */ - {0x0490,0x0491,0x0490}, {0x0490,0x0491,0x0490}, /* 0490 */ - {0x0492,0x0493,0x0492}, {0x0492,0x0493,0x0492}, /* 0492 */ - {0x0494,0x0495,0x0494}, {0x0494,0x0495,0x0494}, /* 0494 */ - {0x0496,0x0497,0x0496}, {0x0496,0x0497,0x0496}, /* 0496 */ - {0x0498,0x0499,0x0498}, {0x0498,0x0499,0x0498}, /* 0498 */ - {0x049A,0x049B,0x049A}, {0x049A,0x049B,0x049A}, /* 049A */ - {0x049C,0x049D,0x049C}, {0x049C,0x049D,0x049C}, /* 049C */ - {0x049E,0x049F,0x049E}, {0x049E,0x049F,0x049E}, /* 049E */ - {0x04A0,0x04A1,0x04A0}, {0x04A0,0x04A1,0x04A0}, /* 04A0 */ - {0x04A2,0x04A3,0x04A2}, {0x04A2,0x04A3,0x04A2}, /* 04A2 */ - {0x04A4,0x04A5,0x04A4}, {0x04A4,0x04A5,0x04A4}, /* 04A4 */ - {0x04A6,0x04A7,0x04A6}, {0x04A6,0x04A7,0x04A6}, /* 04A6 */ - {0x04A8,0x04A9,0x04A8}, {0x04A8,0x04A9,0x04A8}, /* 04A8 */ - {0x04AA,0x04AB,0x04AA}, {0x04AA,0x04AB,0x04AA}, /* 04AA */ - {0x04AC,0x04AD,0x04AC}, {0x04AC,0x04AD,0x04AC}, /* 04AC */ - {0x04AE,0x04AF,0x04AE}, {0x04AE,0x04AF,0x04AE}, /* 04AE */ - {0x04B0,0x04B1,0x04B0}, {0x04B0,0x04B1,0x04B0}, /* 04B0 */ - {0x04B2,0x04B3,0x04B2}, {0x04B2,0x04B3,0x04B2}, /* 04B2 */ - {0x04B4,0x04B5,0x04B4}, {0x04B4,0x04B5,0x04B4}, /* 04B4 */ - {0x04B6,0x04B7,0x04B6}, {0x04B6,0x04B7,0x04B6}, /* 04B6 */ - {0x04B8,0x04B9,0x04B8}, {0x04B8,0x04B9,0x04B8}, /* 04B8 */ - {0x04BA,0x04BB,0x04BA}, {0x04BA,0x04BB,0x04BA}, /* 04BA */ - {0x04BC,0x04BD,0x04BC}, {0x04BC,0x04BD,0x04BC}, /* 04BC */ - {0x04BE,0x04BF,0x04BE}, {0x04BE,0x04BF,0x04BE}, /* 04BE */ - {0x04C0,0x04CF,0x04C0}, {0x04C1,0x04C2,0x0416}, /* 04C0 */ - {0x04C1,0x04C2,0x0416}, {0x04C3,0x04C4,0x04C3}, /* 04C2 */ - {0x04C3,0x04C4,0x04C3}, {0x04C5,0x04C6,0x04C5}, /* 04C4 */ - {0x04C5,0x04C6,0x04C5}, {0x04C7,0x04C8,0x04C7}, /* 04C6 */ - {0x04C7,0x04C8,0x04C7}, {0x04C9,0x04CA,0x04C9}, /* 04C8 */ - {0x04C9,0x04CA,0x04C9}, {0x04CB,0x04CC,0x04CB}, /* 04CA */ - {0x04CB,0x04CC,0x04CB}, {0x04CD,0x04CE,0x04CD}, /* 04CC */ - {0x04CD,0x04CE,0x04CD}, {0x04C0,0x04CF,0x04C0}, /* 04CE */ - {0x04D0,0x04D1,0x0410}, {0x04D0,0x04D1,0x0410}, /* 04D0 */ - {0x04D2,0x04D3,0x0410}, {0x04D2,0x04D3,0x0410}, /* 04D2 */ - {0x04D4,0x04D5,0x04D4}, {0x04D4,0x04D5,0x04D4}, /* 04D4 */ - {0x04D6,0x04D7,0x0415}, {0x04D6,0x04D7,0x0415}, /* 04D6 */ - {0x04D8,0x04D9,0x04D8}, {0x04D8,0x04D9,0x04D8}, /* 04D8 */ - {0x04DA,0x04DB,0x04D8}, {0x04DA,0x04DB,0x04D8}, /* 04DA */ - {0x04DC,0x04DD,0x0416}, {0x04DC,0x04DD,0x0416}, /* 04DC */ - {0x04DE,0x04DF,0x0417}, {0x04DE,0x04DF,0x0417}, /* 04DE */ - {0x04E0,0x04E1,0x04E0}, {0x04E0,0x04E1,0x04E0}, /* 04E0 */ - {0x04E2,0x04E3,0x0418}, {0x04E2,0x04E3,0x0418}, /* 04E2 */ - {0x04E4,0x04E5,0x0418}, {0x04E4,0x04E5,0x0418}, /* 04E4 */ - {0x04E6,0x04E7,0x041E}, {0x04E6,0x04E7,0x041E}, /* 04E6 */ - {0x04E8,0x04E9,0x04E8}, {0x04E8,0x04E9,0x04E8}, /* 04E8 */ - {0x04EA,0x04EB,0x04E8}, {0x04EA,0x04EB,0x04E8}, /* 04EA */ - {0x04EC,0x04ED,0x042D}, {0x04EC,0x04ED,0x042D}, /* 04EC */ - {0x04EE,0x04EF,0x0423}, {0x04EE,0x04EF,0x0423}, /* 04EE */ - {0x04F0,0x04F1,0x0423}, {0x04F0,0x04F1,0x0423}, /* 04F0 */ - {0x04F2,0x04F3,0x0423}, {0x04F2,0x04F3,0x0423}, /* 04F2 */ - {0x04F4,0x04F5,0x0427}, {0x04F4,0x04F5,0x0427}, /* 04F4 */ - {0x04F6,0x04F7,0x04F6}, {0x04F6,0x04F7,0x04F6}, /* 04F6 */ - {0x04F8,0x04F9,0x042B}, {0x04F8,0x04F9,0x042B}, /* 04F8 */ - {0x04FA,0x04FB,0x04FA}, {0x04FA,0x04FB,0x04FA}, /* 04FA */ - {0x04FC,0x04FD,0x04FC}, {0x04FC,0x04FD,0x04FC}, /* 04FC */ - {0x04FE,0x04FF,0x04FE}, {0x04FE,0x04FF,0x04FE} /* 04FE */ -}; - -static MY_UNICASE_CHARACTER u520p05[]={ - {0x0500,0x0501,0x0500}, {0x0500,0x0501,0x0500}, /* 0500 */ - {0x0502,0x0503,0x0502}, {0x0502,0x0503,0x0502}, /* 0502 */ - {0x0504,0x0505,0x0504}, {0x0504,0x0505,0x0504}, /* 0504 */ - {0x0506,0x0507,0x0506}, {0x0506,0x0507,0x0506}, /* 0506 */ - {0x0508,0x0509,0x0508}, {0x0508,0x0509,0x0508}, /* 0508 */ - {0x050A,0x050B,0x050A}, {0x050A,0x050B,0x050A}, /* 050A */ - {0x050C,0x050D,0x050C}, {0x050C,0x050D,0x050C}, /* 050C */ - {0x050E,0x050F,0x050E}, {0x050E,0x050F,0x050E}, /* 050E */ - {0x0510,0x0511,0x0510}, {0x0510,0x0511,0x0510}, /* 0510 */ - {0x0512,0x0513,0x0512}, {0x0512,0x0513,0x0512}, /* 0512 */ - {0x0514,0x0515,0x0514}, {0x0514,0x0515,0x0514}, /* 0514 */ - {0x0516,0x0517,0x0516}, {0x0516,0x0517,0x0516}, /* 0516 */ - {0x0518,0x0519,0x0518}, {0x0518,0x0519,0x0518}, /* 0518 */ - {0x051A,0x051B,0x051A}, {0x051A,0x051B,0x051A}, /* 051A */ - {0x051C,0x051D,0x051C}, {0x051C,0x051D,0x051C}, /* 051C */ - {0x051E,0x051F,0x051E}, {0x051E,0x051F,0x051E}, /* 051E */ - {0x0520,0x0521,0x0520}, {0x0520,0x0521,0x0520}, /* 0520 */ - {0x0522,0x0523,0x0522}, {0x0522,0x0523,0x0522}, /* 0522 */ - {0x0524,0x0525,0x0524}, {0x0524,0x0525,0x0524}, /* 0524 */ - {0x0526,0x0526,0x0526}, {0x0527,0x0527,0x0527}, /* 0526 */ - {0x0528,0x0528,0x0528}, {0x0529,0x0529,0x0529}, /* 0528 */ - {0x052A,0x052A,0x052A}, {0x052B,0x052B,0x052B}, /* 052A */ - {0x052C,0x052C,0x052C}, {0x052D,0x052D,0x052D}, /* 052C */ - {0x052E,0x052E,0x052E}, {0x052F,0x052F,0x052F}, /* 052E */ - {0x0530,0x0530,0x0530}, {0x0531,0x0561,0x0531}, /* 0530 */ - {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533}, /* 0532 */ - {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535}, /* 0534 */ - {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537}, /* 0536 */ - {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539}, /* 0538 */ - {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B}, /* 053A */ - {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D}, /* 053C */ - {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F}, /* 053E */ - {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541}, /* 0540 */ - {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543}, /* 0542 */ - {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545}, /* 0544 */ - {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547}, /* 0546 */ - {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549}, /* 0548 */ - {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B}, /* 054A */ - {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D}, /* 054C */ - {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F}, /* 054E */ - {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551}, /* 0550 */ - {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553}, /* 0552 */ - {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555}, /* 0554 */ - {0x0556,0x0586,0x0556}, {0x0557,0x0557,0x0557}, /* 0556 */ - {0x0558,0x0558,0x0558}, {0x0559,0x0559,0x0559}, /* 0558 */ - {0x055A,0x055A,0x055A}, {0x055B,0x055B,0x055B}, /* 055A */ - {0x055C,0x055C,0x055C}, {0x055D,0x055D,0x055D}, /* 055C */ - {0x055E,0x055E,0x055E}, {0x055F,0x055F,0x055F}, /* 055E */ - {0x0560,0x0560,0x0560}, {0x0531,0x0561,0x0531}, /* 0560 */ - {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533}, /* 0562 */ - {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535}, /* 0564 */ - {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537}, /* 0566 */ - {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539}, /* 0568 */ - {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B}, /* 056A */ - {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D}, /* 056C */ - {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F}, /* 056E */ - {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541}, /* 0570 */ - {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543}, /* 0572 */ - {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545}, /* 0574 */ - {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547}, /* 0576 */ - {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549}, /* 0578 */ - {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B}, /* 057A */ - {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D}, /* 057C */ - {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F}, /* 057E */ - {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551}, /* 0580 */ - {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553}, /* 0582 */ - {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555}, /* 0584 */ - {0x0556,0x0586,0x0556}, {0x0587,0x0587,0x0587}, /* 0586 */ - {0x0588,0x0588,0x0588}, {0x0589,0x0589,0x0589}, /* 0588 */ - {0x058A,0x058A,0x058A}, {0x058B,0x058B,0x058B}, /* 058A */ - {0x058C,0x058C,0x058C}, {0x058D,0x058D,0x058D}, /* 058C */ - {0x058E,0x058E,0x058E}, {0x058F,0x058F,0x058F}, /* 058E */ - {0x0590,0x0590,0x0590}, {0x0591,0x0591,0x0591}, /* 0590 */ - {0x0592,0x0592,0x0592}, {0x0593,0x0593,0x0593}, /* 0592 */ - {0x0594,0x0594,0x0594}, {0x0595,0x0595,0x0595}, /* 0594 */ - {0x0596,0x0596,0x0596}, {0x0597,0x0597,0x0597}, /* 0596 */ - {0x0598,0x0598,0x0598}, {0x0599,0x0599,0x0599}, /* 0598 */ - {0x059A,0x059A,0x059A}, {0x059B,0x059B,0x059B}, /* 059A */ - {0x059C,0x059C,0x059C}, {0x059D,0x059D,0x059D}, /* 059C */ - {0x059E,0x059E,0x059E}, {0x059F,0x059F,0x059F}, /* 059E */ - {0x05A0,0x05A0,0x05A0}, {0x05A1,0x05A1,0x05A1}, /* 05A0 */ - {0x05A2,0x05A2,0x05A2}, {0x05A3,0x05A3,0x05A3}, /* 05A2 */ - {0x05A4,0x05A4,0x05A4}, {0x05A5,0x05A5,0x05A5}, /* 05A4 */ - {0x05A6,0x05A6,0x05A6}, {0x05A7,0x05A7,0x05A7}, /* 05A6 */ - {0x05A8,0x05A8,0x05A8}, {0x05A9,0x05A9,0x05A9}, /* 05A8 */ - {0x05AA,0x05AA,0x05AA}, {0x05AB,0x05AB,0x05AB}, /* 05AA */ - {0x05AC,0x05AC,0x05AC}, {0x05AD,0x05AD,0x05AD}, /* 05AC */ - {0x05AE,0x05AE,0x05AE}, {0x05AF,0x05AF,0x05AF}, /* 05AE */ - {0x05B0,0x05B0,0x05B0}, {0x05B1,0x05B1,0x05B1}, /* 05B0 */ - {0x05B2,0x05B2,0x05B2}, {0x05B3,0x05B3,0x05B3}, /* 05B2 */ - {0x05B4,0x05B4,0x05B4}, {0x05B5,0x05B5,0x05B5}, /* 05B4 */ - {0x05B6,0x05B6,0x05B6}, {0x05B7,0x05B7,0x05B7}, /* 05B6 */ - {0x05B8,0x05B8,0x05B8}, {0x05B9,0x05B9,0x05B9}, /* 05B8 */ - {0x05BA,0x05BA,0x05BA}, {0x05BB,0x05BB,0x05BB}, /* 05BA */ - {0x05BC,0x05BC,0x05BC}, {0x05BD,0x05BD,0x05BD}, /* 05BC */ - {0x05BE,0x05BE,0x05BE}, {0x05BF,0x05BF,0x05BF}, /* 05BE */ - {0x05C0,0x05C0,0x05C0}, {0x05C1,0x05C1,0x05C1}, /* 05C0 */ - {0x05C2,0x05C2,0x05C2}, {0x05C3,0x05C3,0x05C3}, /* 05C2 */ - {0x05C4,0x05C4,0x05C4}, {0x05C5,0x05C5,0x05C5}, /* 05C4 */ - {0x05C6,0x05C6,0x05C6}, {0x05C7,0x05C7,0x05C7}, /* 05C6 */ - {0x05C8,0x05C8,0x05C8}, {0x05C9,0x05C9,0x05C9}, /* 05C8 */ - {0x05CA,0x05CA,0x05CA}, {0x05CB,0x05CB,0x05CB}, /* 05CA */ - {0x05CC,0x05CC,0x05CC}, {0x05CD,0x05CD,0x05CD}, /* 05CC */ - {0x05CE,0x05CE,0x05CE}, {0x05CF,0x05CF,0x05CF}, /* 05CE */ - {0x05D0,0x05D0,0x05D0}, {0x05D1,0x05D1,0x05D1}, /* 05D0 */ - {0x05D2,0x05D2,0x05D2}, {0x05D3,0x05D3,0x05D3}, /* 05D2 */ - {0x05D4,0x05D4,0x05D4}, {0x05D5,0x05D5,0x05D5}, /* 05D4 */ - {0x05D6,0x05D6,0x05D6}, {0x05D7,0x05D7,0x05D7}, /* 05D6 */ - {0x05D8,0x05D8,0x05D8}, {0x05D9,0x05D9,0x05D9}, /* 05D8 */ - {0x05DA,0x05DA,0x05DA}, {0x05DB,0x05DB,0x05DB}, /* 05DA */ - {0x05DC,0x05DC,0x05DC}, {0x05DD,0x05DD,0x05DD}, /* 05DC */ - {0x05DE,0x05DE,0x05DE}, {0x05DF,0x05DF,0x05DF}, /* 05DE */ - {0x05E0,0x05E0,0x05E0}, {0x05E1,0x05E1,0x05E1}, /* 05E0 */ - {0x05E2,0x05E2,0x05E2}, {0x05E3,0x05E3,0x05E3}, /* 05E2 */ - {0x05E4,0x05E4,0x05E4}, {0x05E5,0x05E5,0x05E5}, /* 05E4 */ - {0x05E6,0x05E6,0x05E6}, {0x05E7,0x05E7,0x05E7}, /* 05E6 */ - {0x05E8,0x05E8,0x05E8}, {0x05E9,0x05E9,0x05E9}, /* 05E8 */ - {0x05EA,0x05EA,0x05EA}, {0x05EB,0x05EB,0x05EB}, /* 05EA */ - {0x05EC,0x05EC,0x05EC}, {0x05ED,0x05ED,0x05ED}, /* 05EC */ - {0x05EE,0x05EE,0x05EE}, {0x05EF,0x05EF,0x05EF}, /* 05EE */ - {0x05F0,0x05F0,0x05F0}, {0x05F1,0x05F1,0x05F1}, /* 05F0 */ - {0x05F2,0x05F2,0x05F2}, {0x05F3,0x05F3,0x05F3}, /* 05F2 */ - {0x05F4,0x05F4,0x05F4}, {0x05F5,0x05F5,0x05F5}, /* 05F4 */ - {0x05F6,0x05F6,0x05F6}, {0x05F7,0x05F7,0x05F7}, /* 05F6 */ - {0x05F8,0x05F8,0x05F8}, {0x05F9,0x05F9,0x05F9}, /* 05F8 */ - {0x05FA,0x05FA,0x05FA}, {0x05FB,0x05FB,0x05FB}, /* 05FA */ - {0x05FC,0x05FC,0x05FC}, {0x05FD,0x05FD,0x05FD}, /* 05FC */ - {0x05FE,0x05FE,0x05FE}, {0x05FF,0x05FF,0x05FF} /* 05FE */ -}; - -static MY_UNICASE_CHARACTER u520p10[]={ - {0x1000,0x1000,0x1000}, {0x1001,0x1001,0x1001}, /* 1000 */ - {0x1002,0x1002,0x1002}, {0x1003,0x1003,0x1003}, /* 1002 */ - {0x1004,0x1004,0x1004}, {0x1005,0x1005,0x1005}, /* 1004 */ - {0x1006,0x1006,0x1006}, {0x1007,0x1007,0x1007}, /* 1006 */ - {0x1008,0x1008,0x1008}, {0x1009,0x1009,0x1009}, /* 1008 */ - {0x100A,0x100A,0x100A}, {0x100B,0x100B,0x100B}, /* 100A */ - {0x100C,0x100C,0x100C}, {0x100D,0x100D,0x100D}, /* 100C */ - {0x100E,0x100E,0x100E}, {0x100F,0x100F,0x100F}, /* 100E */ - {0x1010,0x1010,0x1010}, {0x1011,0x1011,0x1011}, /* 1010 */ - {0x1012,0x1012,0x1012}, {0x1013,0x1013,0x1013}, /* 1012 */ - {0x1014,0x1014,0x1014}, {0x1015,0x1015,0x1015}, /* 1014 */ - {0x1016,0x1016,0x1016}, {0x1017,0x1017,0x1017}, /* 1016 */ - {0x1018,0x1018,0x1018}, {0x1019,0x1019,0x1019}, /* 1018 */ - {0x101A,0x101A,0x101A}, {0x101B,0x101B,0x101B}, /* 101A */ - {0x101C,0x101C,0x101C}, {0x101D,0x101D,0x101D}, /* 101C */ - {0x101E,0x101E,0x101E}, {0x101F,0x101F,0x101F}, /* 101E */ - {0x1020,0x1020,0x1020}, {0x1021,0x1021,0x1021}, /* 1020 */ - {0x1022,0x1022,0x1022}, {0x1023,0x1023,0x1023}, /* 1022 */ - {0x1024,0x1024,0x1024}, {0x1025,0x1025,0x1025}, /* 1024 */ - {0x1026,0x1026,0x1026}, {0x1027,0x1027,0x1027}, /* 1026 */ - {0x1028,0x1028,0x1028}, {0x1029,0x1029,0x1029}, /* 1028 */ - {0x102A,0x102A,0x102A}, {0x102B,0x102B,0x102B}, /* 102A */ - {0x102C,0x102C,0x102C}, {0x102D,0x102D,0x102D}, /* 102C */ - {0x102E,0x102E,0x102E}, {0x102F,0x102F,0x102F}, /* 102E */ - {0x1030,0x1030,0x1030}, {0x1031,0x1031,0x1031}, /* 1030 */ - {0x1032,0x1032,0x1032}, {0x1033,0x1033,0x1033}, /* 1032 */ - {0x1034,0x1034,0x1034}, {0x1035,0x1035,0x1035}, /* 1034 */ - {0x1036,0x1036,0x1036}, {0x1037,0x1037,0x1037}, /* 1036 */ - {0x1038,0x1038,0x1038}, {0x1039,0x1039,0x1039}, /* 1038 */ - {0x103A,0x103A,0x103A}, {0x103B,0x103B,0x103B}, /* 103A */ - {0x103C,0x103C,0x103C}, {0x103D,0x103D,0x103D}, /* 103C */ - {0x103E,0x103E,0x103E}, {0x103F,0x103F,0x103F}, /* 103E */ - {0x1040,0x1040,0x1040}, {0x1041,0x1041,0x1041}, /* 1040 */ - {0x1042,0x1042,0x1042}, {0x1043,0x1043,0x1043}, /* 1042 */ - {0x1044,0x1044,0x1044}, {0x1045,0x1045,0x1045}, /* 1044 */ - {0x1046,0x1046,0x1046}, {0x1047,0x1047,0x1047}, /* 1046 */ - {0x1048,0x1048,0x1048}, {0x1049,0x1049,0x1049}, /* 1048 */ - {0x104A,0x104A,0x104A}, {0x104B,0x104B,0x104B}, /* 104A */ - {0x104C,0x104C,0x104C}, {0x104D,0x104D,0x104D}, /* 104C */ - {0x104E,0x104E,0x104E}, {0x104F,0x104F,0x104F}, /* 104E */ - {0x1050,0x1050,0x1050}, {0x1051,0x1051,0x1051}, /* 1050 */ - {0x1052,0x1052,0x1052}, {0x1053,0x1053,0x1053}, /* 1052 */ - {0x1054,0x1054,0x1054}, {0x1055,0x1055,0x1055}, /* 1054 */ - {0x1056,0x1056,0x1056}, {0x1057,0x1057,0x1057}, /* 1056 */ - {0x1058,0x1058,0x1058}, {0x1059,0x1059,0x1059}, /* 1058 */ - {0x105A,0x105A,0x105A}, {0x105B,0x105B,0x105B}, /* 105A */ - {0x105C,0x105C,0x105C}, {0x105D,0x105D,0x105D}, /* 105C */ - {0x105E,0x105E,0x105E}, {0x105F,0x105F,0x105F}, /* 105E */ - {0x1060,0x1060,0x1060}, {0x1061,0x1061,0x1061}, /* 1060 */ - {0x1062,0x1062,0x1062}, {0x1063,0x1063,0x1063}, /* 1062 */ - {0x1064,0x1064,0x1064}, {0x1065,0x1065,0x1065}, /* 1064 */ - {0x1066,0x1066,0x1066}, {0x1067,0x1067,0x1067}, /* 1066 */ - {0x1068,0x1068,0x1068}, {0x1069,0x1069,0x1069}, /* 1068 */ - {0x106A,0x106A,0x106A}, {0x106B,0x106B,0x106B}, /* 106A */ - {0x106C,0x106C,0x106C}, {0x106D,0x106D,0x106D}, /* 106C */ - {0x106E,0x106E,0x106E}, {0x106F,0x106F,0x106F}, /* 106E */ - {0x1070,0x1070,0x1070}, {0x1071,0x1071,0x1071}, /* 1070 */ - {0x1072,0x1072,0x1072}, {0x1073,0x1073,0x1073}, /* 1072 */ - {0x1074,0x1074,0x1074}, {0x1075,0x1075,0x1075}, /* 1074 */ - {0x1076,0x1076,0x1076}, {0x1077,0x1077,0x1077}, /* 1076 */ - {0x1078,0x1078,0x1078}, {0x1079,0x1079,0x1079}, /* 1078 */ - {0x107A,0x107A,0x107A}, {0x107B,0x107B,0x107B}, /* 107A */ - {0x107C,0x107C,0x107C}, {0x107D,0x107D,0x107D}, /* 107C */ - {0x107E,0x107E,0x107E}, {0x107F,0x107F,0x107F}, /* 107E */ - {0x1080,0x1080,0x1080}, {0x1081,0x1081,0x1081}, /* 1080 */ - {0x1082,0x1082,0x1082}, {0x1083,0x1083,0x1083}, /* 1082 */ - {0x1084,0x1084,0x1084}, {0x1085,0x1085,0x1085}, /* 1084 */ - {0x1086,0x1086,0x1086}, {0x1087,0x1087,0x1087}, /* 1086 */ - {0x1088,0x1088,0x1088}, {0x1089,0x1089,0x1089}, /* 1088 */ - {0x108A,0x108A,0x108A}, {0x108B,0x108B,0x108B}, /* 108A */ - {0x108C,0x108C,0x108C}, {0x108D,0x108D,0x108D}, /* 108C */ - {0x108E,0x108E,0x108E}, {0x108F,0x108F,0x108F}, /* 108E */ - {0x1090,0x1090,0x1090}, {0x1091,0x1091,0x1091}, /* 1090 */ - {0x1092,0x1092,0x1092}, {0x1093,0x1093,0x1093}, /* 1092 */ - {0x1094,0x1094,0x1094}, {0x1095,0x1095,0x1095}, /* 1094 */ - {0x1096,0x1096,0x1096}, {0x1097,0x1097,0x1097}, /* 1096 */ - {0x1098,0x1098,0x1098}, {0x1099,0x1099,0x1099}, /* 1098 */ - {0x109A,0x109A,0x109A}, {0x109B,0x109B,0x109B}, /* 109A */ - {0x109C,0x109C,0x109C}, {0x109D,0x109D,0x109D}, /* 109C */ - {0x109E,0x109E,0x109E}, {0x109F,0x109F,0x109F}, /* 109E */ - {0x10A0,0x2D00,0x10A0}, {0x10A1,0x2D01,0x10A1}, /* 10A0 */ - {0x10A2,0x2D02,0x10A2}, {0x10A3,0x2D03,0x10A3}, /* 10A2 */ - {0x10A4,0x2D04,0x10A4}, {0x10A5,0x2D05,0x10A5}, /* 10A4 */ - {0x10A6,0x2D06,0x10A6}, {0x10A7,0x2D07,0x10A7}, /* 10A6 */ - {0x10A8,0x2D08,0x10A8}, {0x10A9,0x2D09,0x10A9}, /* 10A8 */ - {0x10AA,0x2D0A,0x10AA}, {0x10AB,0x2D0B,0x10AB}, /* 10AA */ - {0x10AC,0x2D0C,0x10AC}, {0x10AD,0x2D0D,0x10AD}, /* 10AC */ - {0x10AE,0x2D0E,0x10AE}, {0x10AF,0x2D0F,0x10AF}, /* 10AE */ - {0x10B0,0x2D10,0x10B0}, {0x10B1,0x2D11,0x10B1}, /* 10B0 */ - {0x10B2,0x2D12,0x10B2}, {0x10B3,0x2D13,0x10B3}, /* 10B2 */ - {0x10B4,0x2D14,0x10B4}, {0x10B5,0x2D15,0x10B5}, /* 10B4 */ - {0x10B6,0x2D16,0x10B6}, {0x10B7,0x2D17,0x10B7}, /* 10B6 */ - {0x10B8,0x2D18,0x10B8}, {0x10B9,0x2D19,0x10B9}, /* 10B8 */ - {0x10BA,0x2D1A,0x10BA}, {0x10BB,0x2D1B,0x10BB}, /* 10BA */ - {0x10BC,0x2D1C,0x10BC}, {0x10BD,0x2D1D,0x10BD}, /* 10BC */ - {0x10BE,0x2D1E,0x10BE}, {0x10BF,0x2D1F,0x10BF}, /* 10BE */ - {0x10C0,0x2D20,0x10C0}, {0x10C1,0x2D21,0x10C1}, /* 10C0 */ - {0x10C2,0x2D22,0x10C2}, {0x10C3,0x2D23,0x10C3}, /* 10C2 */ - {0x10C4,0x2D24,0x10C4}, {0x10C5,0x2D25,0x10C5}, /* 10C4 */ - {0x10C6,0x10C6,0x10C6}, {0x10C7,0x10C7,0x10C7}, /* 10C6 */ - {0x10C8,0x10C8,0x10C8}, {0x10C9,0x10C9,0x10C9}, /* 10C8 */ - {0x10CA,0x10CA,0x10CA}, {0x10CB,0x10CB,0x10CB}, /* 10CA */ - {0x10CC,0x10CC,0x10CC}, {0x10CD,0x10CD,0x10CD}, /* 10CC */ - {0x10CE,0x10CE,0x10CE}, {0x10CF,0x10CF,0x10CF}, /* 10CE */ - {0x10D0,0x10D0,0x10D0}, {0x10D1,0x10D1,0x10D1}, /* 10D0 */ - {0x10D2,0x10D2,0x10D2}, {0x10D3,0x10D3,0x10D3}, /* 10D2 */ - {0x10D4,0x10D4,0x10D4}, {0x10D5,0x10D5,0x10D5}, /* 10D4 */ - {0x10D6,0x10D6,0x10D6}, {0x10D7,0x10D7,0x10D7}, /* 10D6 */ - {0x10D8,0x10D8,0x10D8}, {0x10D9,0x10D9,0x10D9}, /* 10D8 */ - {0x10DA,0x10DA,0x10DA}, {0x10DB,0x10DB,0x10DB}, /* 10DA */ - {0x10DC,0x10DC,0x10DC}, {0x10DD,0x10DD,0x10DD}, /* 10DC */ - {0x10DE,0x10DE,0x10DE}, {0x10DF,0x10DF,0x10DF}, /* 10DE */ - {0x10E0,0x10E0,0x10E0}, {0x10E1,0x10E1,0x10E1}, /* 10E0 */ - {0x10E2,0x10E2,0x10E2}, {0x10E3,0x10E3,0x10E3}, /* 10E2 */ - {0x10E4,0x10E4,0x10E4}, {0x10E5,0x10E5,0x10E5}, /* 10E4 */ - {0x10E6,0x10E6,0x10E6}, {0x10E7,0x10E7,0x10E7}, /* 10E6 */ - {0x10E8,0x10E8,0x10E8}, {0x10E9,0x10E9,0x10E9}, /* 10E8 */ - {0x10EA,0x10EA,0x10EA}, {0x10EB,0x10EB,0x10EB}, /* 10EA */ - {0x10EC,0x10EC,0x10EC}, {0x10ED,0x10ED,0x10ED}, /* 10EC */ - {0x10EE,0x10EE,0x10EE}, {0x10EF,0x10EF,0x10EF}, /* 10EE */ - {0x10F0,0x10F0,0x10F0}, {0x10F1,0x10F1,0x10F1}, /* 10F0 */ - {0x10F2,0x10F2,0x10F2}, {0x10F3,0x10F3,0x10F3}, /* 10F2 */ - {0x10F4,0x10F4,0x10F4}, {0x10F5,0x10F5,0x10F5}, /* 10F4 */ - {0x10F6,0x10F6,0x10F6}, {0x10F7,0x10F7,0x10F7}, /* 10F6 */ - {0x10F8,0x10F8,0x10F8}, {0x10F9,0x10F9,0x10F9}, /* 10F8 */ - {0x10FA,0x10FA,0x10FA}, {0x10FB,0x10FB,0x10FB}, /* 10FA */ - {0x10FC,0x10FC,0x10FC}, {0x10FD,0x10FD,0x10FD}, /* 10FC */ - {0x10FE,0x10FE,0x10FE}, {0x10FF,0x10FF,0x10FF} /* 10FE */ -}; - -static MY_UNICASE_CHARACTER u520p1D[]={ - {0x1D00,0x1D00,0x1D00}, {0x1D01,0x1D01,0x1D01}, /* 1D00 */ - {0x1D02,0x1D02,0x1D02}, {0x1D03,0x1D03,0x1D03}, /* 1D02 */ - {0x1D04,0x1D04,0x1D04}, {0x1D05,0x1D05,0x1D05}, /* 1D04 */ - {0x1D06,0x1D06,0x1D06}, {0x1D07,0x1D07,0x1D07}, /* 1D06 */ - {0x1D08,0x1D08,0x1D08}, {0x1D09,0x1D09,0x1D09}, /* 1D08 */ - {0x1D0A,0x1D0A,0x1D0A}, {0x1D0B,0x1D0B,0x1D0B}, /* 1D0A */ - {0x1D0C,0x1D0C,0x1D0C}, {0x1D0D,0x1D0D,0x1D0D}, /* 1D0C */ - {0x1D0E,0x1D0E,0x1D0E}, {0x1D0F,0x1D0F,0x1D0F}, /* 1D0E */ - {0x1D10,0x1D10,0x1D10}, {0x1D11,0x1D11,0x1D11}, /* 1D10 */ - {0x1D12,0x1D12,0x1D12}, {0x1D13,0x1D13,0x1D13}, /* 1D12 */ - {0x1D14,0x1D14,0x1D14}, {0x1D15,0x1D15,0x1D15}, /* 1D14 */ - {0x1D16,0x1D16,0x1D16}, {0x1D17,0x1D17,0x1D17}, /* 1D16 */ - {0x1D18,0x1D18,0x1D18}, {0x1D19,0x1D19,0x1D19}, /* 1D18 */ - {0x1D1A,0x1D1A,0x1D1A}, {0x1D1B,0x1D1B,0x1D1B}, /* 1D1A */ - {0x1D1C,0x1D1C,0x1D1C}, {0x1D1D,0x1D1D,0x1D1D}, /* 1D1C */ - {0x1D1E,0x1D1E,0x1D1E}, {0x1D1F,0x1D1F,0x1D1F}, /* 1D1E */ - {0x1D20,0x1D20,0x1D20}, {0x1D21,0x1D21,0x1D21}, /* 1D20 */ - {0x1D22,0x1D22,0x1D22}, {0x1D23,0x1D23,0x1D23}, /* 1D22 */ - {0x1D24,0x1D24,0x1D24}, {0x1D25,0x1D25,0x1D25}, /* 1D24 */ - {0x1D26,0x1D26,0x1D26}, {0x1D27,0x1D27,0x1D27}, /* 1D26 */ - {0x1D28,0x1D28,0x1D28}, {0x1D29,0x1D29,0x1D29}, /* 1D28 */ - {0x1D2A,0x1D2A,0x1D2A}, {0x1D2B,0x1D2B,0x1D2B}, /* 1D2A */ - {0x1D2C,0x1D2C,0x1D2C}, {0x1D2D,0x1D2D,0x1D2D}, /* 1D2C */ - {0x1D2E,0x1D2E,0x1D2E}, {0x1D2F,0x1D2F,0x1D2F}, /* 1D2E */ - {0x1D30,0x1D30,0x1D30}, {0x1D31,0x1D31,0x1D31}, /* 1D30 */ - {0x1D32,0x1D32,0x1D32}, {0x1D33,0x1D33,0x1D33}, /* 1D32 */ - {0x1D34,0x1D34,0x1D34}, {0x1D35,0x1D35,0x1D35}, /* 1D34 */ - {0x1D36,0x1D36,0x1D36}, {0x1D37,0x1D37,0x1D37}, /* 1D36 */ - {0x1D38,0x1D38,0x1D38}, {0x1D39,0x1D39,0x1D39}, /* 1D38 */ - {0x1D3A,0x1D3A,0x1D3A}, {0x1D3B,0x1D3B,0x1D3B}, /* 1D3A */ - {0x1D3C,0x1D3C,0x1D3C}, {0x1D3D,0x1D3D,0x1D3D}, /* 1D3C */ - {0x1D3E,0x1D3E,0x1D3E}, {0x1D3F,0x1D3F,0x1D3F}, /* 1D3E */ - {0x1D40,0x1D40,0x1D40}, {0x1D41,0x1D41,0x1D41}, /* 1D40 */ - {0x1D42,0x1D42,0x1D42}, {0x1D43,0x1D43,0x1D43}, /* 1D42 */ - {0x1D44,0x1D44,0x1D44}, {0x1D45,0x1D45,0x1D45}, /* 1D44 */ - {0x1D46,0x1D46,0x1D46}, {0x1D47,0x1D47,0x1D47}, /* 1D46 */ - {0x1D48,0x1D48,0x1D48}, {0x1D49,0x1D49,0x1D49}, /* 1D48 */ - {0x1D4A,0x1D4A,0x1D4A}, {0x1D4B,0x1D4B,0x1D4B}, /* 1D4A */ - {0x1D4C,0x1D4C,0x1D4C}, {0x1D4D,0x1D4D,0x1D4D}, /* 1D4C */ - {0x1D4E,0x1D4E,0x1D4E}, {0x1D4F,0x1D4F,0x1D4F}, /* 1D4E */ - {0x1D50,0x1D50,0x1D50}, {0x1D51,0x1D51,0x1D51}, /* 1D50 */ - {0x1D52,0x1D52,0x1D52}, {0x1D53,0x1D53,0x1D53}, /* 1D52 */ - {0x1D54,0x1D54,0x1D54}, {0x1D55,0x1D55,0x1D55}, /* 1D54 */ - {0x1D56,0x1D56,0x1D56}, {0x1D57,0x1D57,0x1D57}, /* 1D56 */ - {0x1D58,0x1D58,0x1D58}, {0x1D59,0x1D59,0x1D59}, /* 1D58 */ - {0x1D5A,0x1D5A,0x1D5A}, {0x1D5B,0x1D5B,0x1D5B}, /* 1D5A */ - {0x1D5C,0x1D5C,0x1D5C}, {0x1D5D,0x1D5D,0x1D5D}, /* 1D5C */ - {0x1D5E,0x1D5E,0x1D5E}, {0x1D5F,0x1D5F,0x1D5F}, /* 1D5E */ - {0x1D60,0x1D60,0x1D60}, {0x1D61,0x1D61,0x1D61}, /* 1D60 */ - {0x1D62,0x1D62,0x1D62}, {0x1D63,0x1D63,0x1D63}, /* 1D62 */ - {0x1D64,0x1D64,0x1D64}, {0x1D65,0x1D65,0x1D65}, /* 1D64 */ - {0x1D66,0x1D66,0x1D66}, {0x1D67,0x1D67,0x1D67}, /* 1D66 */ - {0x1D68,0x1D68,0x1D68}, {0x1D69,0x1D69,0x1D69}, /* 1D68 */ - {0x1D6A,0x1D6A,0x1D6A}, {0x1D6B,0x1D6B,0x1D6B}, /* 1D6A */ - {0x1D6C,0x1D6C,0x1D6C}, {0x1D6D,0x1D6D,0x1D6D}, /* 1D6C */ - {0x1D6E,0x1D6E,0x1D6E}, {0x1D6F,0x1D6F,0x1D6F}, /* 1D6E */ - {0x1D70,0x1D70,0x1D70}, {0x1D71,0x1D71,0x1D71}, /* 1D70 */ - {0x1D72,0x1D72,0x1D72}, {0x1D73,0x1D73,0x1D73}, /* 1D72 */ - {0x1D74,0x1D74,0x1D74}, {0x1D75,0x1D75,0x1D75}, /* 1D74 */ - {0x1D76,0x1D76,0x1D76}, {0x1D77,0x1D77,0x1D77}, /* 1D76 */ - {0x1D78,0x1D78,0x1D78}, {0xA77D,0x1D79,0xA77D}, /* 1D78 */ - {0x1D7A,0x1D7A,0x1D7A}, {0x1D7B,0x1D7B,0x1D7B}, /* 1D7A */ - {0x1D7C,0x1D7C,0x1D7C}, {0x2C63,0x1D7D,0x2C63}, /* 1D7C */ - {0x1D7E,0x1D7E,0x1D7E}, {0x1D7F,0x1D7F,0x1D7F}, /* 1D7E */ - {0x1D80,0x1D80,0x1D80}, {0x1D81,0x1D81,0x1D81}, /* 1D80 */ - {0x1D82,0x1D82,0x1D82}, {0x1D83,0x1D83,0x1D83}, /* 1D82 */ - {0x1D84,0x1D84,0x1D84}, {0x1D85,0x1D85,0x1D85}, /* 1D84 */ - {0x1D86,0x1D86,0x1D86}, {0x1D87,0x1D87,0x1D87}, /* 1D86 */ - {0x1D88,0x1D88,0x1D88}, {0x1D89,0x1D89,0x1D89}, /* 1D88 */ - {0x1D8A,0x1D8A,0x1D8A}, {0x1D8B,0x1D8B,0x1D8B}, /* 1D8A */ - {0x1D8C,0x1D8C,0x1D8C}, {0x1D8D,0x1D8D,0x1D8D}, /* 1D8C */ - {0x1D8E,0x1D8E,0x1D8E}, {0x1D8F,0x1D8F,0x1D8F}, /* 1D8E */ - {0x1D90,0x1D90,0x1D90}, {0x1D91,0x1D91,0x1D91}, /* 1D90 */ - {0x1D92,0x1D92,0x1D92}, {0x1D93,0x1D93,0x1D93}, /* 1D92 */ - {0x1D94,0x1D94,0x1D94}, {0x1D95,0x1D95,0x1D95}, /* 1D94 */ - {0x1D96,0x1D96,0x1D96}, {0x1D97,0x1D97,0x1D97}, /* 1D96 */ - {0x1D98,0x1D98,0x1D98}, {0x1D99,0x1D99,0x1D99}, /* 1D98 */ - {0x1D9A,0x1D9A,0x1D9A}, {0x1D9B,0x1D9B,0x1D9B}, /* 1D9A */ - {0x1D9C,0x1D9C,0x1D9C}, {0x1D9D,0x1D9D,0x1D9D}, /* 1D9C */ - {0x1D9E,0x1D9E,0x1D9E}, {0x1D9F,0x1D9F,0x1D9F}, /* 1D9E */ - {0x1DA0,0x1DA0,0x1DA0}, {0x1DA1,0x1DA1,0x1DA1}, /* 1DA0 */ - {0x1DA2,0x1DA2,0x1DA2}, {0x1DA3,0x1DA3,0x1DA3}, /* 1DA2 */ - {0x1DA4,0x1DA4,0x1DA4}, {0x1DA5,0x1DA5,0x1DA5}, /* 1DA4 */ - {0x1DA6,0x1DA6,0x1DA6}, {0x1DA7,0x1DA7,0x1DA7}, /* 1DA6 */ - {0x1DA8,0x1DA8,0x1DA8}, {0x1DA9,0x1DA9,0x1DA9}, /* 1DA8 */ - {0x1DAA,0x1DAA,0x1DAA}, {0x1DAB,0x1DAB,0x1DAB}, /* 1DAA */ - {0x1DAC,0x1DAC,0x1DAC}, {0x1DAD,0x1DAD,0x1DAD}, /* 1DAC */ - {0x1DAE,0x1DAE,0x1DAE}, {0x1DAF,0x1DAF,0x1DAF}, /* 1DAE */ - {0x1DB0,0x1DB0,0x1DB0}, {0x1DB1,0x1DB1,0x1DB1}, /* 1DB0 */ - {0x1DB2,0x1DB2,0x1DB2}, {0x1DB3,0x1DB3,0x1DB3}, /* 1DB2 */ - {0x1DB4,0x1DB4,0x1DB4}, {0x1DB5,0x1DB5,0x1DB5}, /* 1DB4 */ - {0x1DB6,0x1DB6,0x1DB6}, {0x1DB7,0x1DB7,0x1DB7}, /* 1DB6 */ - {0x1DB8,0x1DB8,0x1DB8}, {0x1DB9,0x1DB9,0x1DB9}, /* 1DB8 */ - {0x1DBA,0x1DBA,0x1DBA}, {0x1DBB,0x1DBB,0x1DBB}, /* 1DBA */ - {0x1DBC,0x1DBC,0x1DBC}, {0x1DBD,0x1DBD,0x1DBD}, /* 1DBC */ - {0x1DBE,0x1DBE,0x1DBE}, {0x1DBF,0x1DBF,0x1DBF}, /* 1DBE */ - {0x1DC0,0x1DC0,0x1DC0}, {0x1DC1,0x1DC1,0x1DC1}, /* 1DC0 */ - {0x1DC2,0x1DC2,0x1DC2}, {0x1DC3,0x1DC3,0x1DC3}, /* 1DC2 */ - {0x1DC4,0x1DC4,0x1DC4}, {0x1DC5,0x1DC5,0x1DC5}, /* 1DC4 */ - {0x1DC6,0x1DC6,0x1DC6}, {0x1DC7,0x1DC7,0x1DC7}, /* 1DC6 */ - {0x1DC8,0x1DC8,0x1DC8}, {0x1DC9,0x1DC9,0x1DC9}, /* 1DC8 */ - {0x1DCA,0x1DCA,0x1DCA}, {0x1DCB,0x1DCB,0x1DCB}, /* 1DCA */ - {0x1DCC,0x1DCC,0x1DCC}, {0x1DCD,0x1DCD,0x1DCD}, /* 1DCC */ - {0x1DCE,0x1DCE,0x1DCE}, {0x1DCF,0x1DCF,0x1DCF}, /* 1DCE */ - {0x1DD0,0x1DD0,0x1DD0}, {0x1DD1,0x1DD1,0x1DD1}, /* 1DD0 */ - {0x1DD2,0x1DD2,0x1DD2}, {0x1DD3,0x1DD3,0x1DD3}, /* 1DD2 */ - {0x1DD4,0x1DD4,0x1DD4}, {0x1DD5,0x1DD5,0x1DD5}, /* 1DD4 */ - {0x1DD6,0x1DD6,0x1DD6}, {0x1DD7,0x1DD7,0x1DD7}, /* 1DD6 */ - {0x1DD8,0x1DD8,0x1DD8}, {0x1DD9,0x1DD9,0x1DD9}, /* 1DD8 */ - {0x1DDA,0x1DDA,0x1DDA}, {0x1DDB,0x1DDB,0x1DDB}, /* 1DDA */ - {0x1DDC,0x1DDC,0x1DDC}, {0x1DDD,0x1DDD,0x1DDD}, /* 1DDC */ - {0x1DDE,0x1DDE,0x1DDE}, {0x1DDF,0x1DDF,0x1DDF}, /* 1DDE */ - {0x1DE0,0x1DE0,0x1DE0}, {0x1DE1,0x1DE1,0x1DE1}, /* 1DE0 */ - {0x1DE2,0x1DE2,0x1DE2}, {0x1DE3,0x1DE3,0x1DE3}, /* 1DE2 */ - {0x1DE4,0x1DE4,0x1DE4}, {0x1DE5,0x1DE5,0x1DE5}, /* 1DE4 */ - {0x1DE6,0x1DE6,0x1DE6}, {0x1DE7,0x1DE7,0x1DE7}, /* 1DE6 */ - {0x1DE8,0x1DE8,0x1DE8}, {0x1DE9,0x1DE9,0x1DE9}, /* 1DE8 */ - {0x1DEA,0x1DEA,0x1DEA}, {0x1DEB,0x1DEB,0x1DEB}, /* 1DEA */ - {0x1DEC,0x1DEC,0x1DEC}, {0x1DED,0x1DED,0x1DED}, /* 1DEC */ - {0x1DEE,0x1DEE,0x1DEE}, {0x1DEF,0x1DEF,0x1DEF}, /* 1DEE */ - {0x1DF0,0x1DF0,0x1DF0}, {0x1DF1,0x1DF1,0x1DF1}, /* 1DF0 */ - {0x1DF2,0x1DF2,0x1DF2}, {0x1DF3,0x1DF3,0x1DF3}, /* 1DF2 */ - {0x1DF4,0x1DF4,0x1DF4}, {0x1DF5,0x1DF5,0x1DF5}, /* 1DF4 */ - {0x1DF6,0x1DF6,0x1DF6}, {0x1DF7,0x1DF7,0x1DF7}, /* 1DF6 */ - {0x1DF8,0x1DF8,0x1DF8}, {0x1DF9,0x1DF9,0x1DF9}, /* 1DF8 */ - {0x1DFA,0x1DFA,0x1DFA}, {0x1DFB,0x1DFB,0x1DFB}, /* 1DFA */ - {0x1DFC,0x1DFC,0x1DFC}, {0x1DFD,0x1DFD,0x1DFD}, /* 1DFC */ - {0x1DFE,0x1DFE,0x1DFE}, {0x1DFF,0x1DFF,0x1DFF} /* 1DFE */ -}; - -static MY_UNICASE_CHARACTER u520p1E[]={ - {0x1E00,0x1E01,0x0041}, {0x1E00,0x1E01,0x0041}, /* 1E00 */ - {0x1E02,0x1E03,0x0042}, {0x1E02,0x1E03,0x0042}, /* 1E02 */ - {0x1E04,0x1E05,0x0042}, {0x1E04,0x1E05,0x0042}, /* 1E04 */ - {0x1E06,0x1E07,0x0042}, {0x1E06,0x1E07,0x0042}, /* 1E06 */ - {0x1E08,0x1E09,0x0043}, {0x1E08,0x1E09,0x0043}, /* 1E08 */ - {0x1E0A,0x1E0B,0x0044}, {0x1E0A,0x1E0B,0x0044}, /* 1E0A */ - {0x1E0C,0x1E0D,0x0044}, {0x1E0C,0x1E0D,0x0044}, /* 1E0C */ - {0x1E0E,0x1E0F,0x0044}, {0x1E0E,0x1E0F,0x0044}, /* 1E0E */ - {0x1E10,0x1E11,0x0044}, {0x1E10,0x1E11,0x0044}, /* 1E10 */ - {0x1E12,0x1E13,0x0044}, {0x1E12,0x1E13,0x0044}, /* 1E12 */ - {0x1E14,0x1E15,0x0045}, {0x1E14,0x1E15,0x0045}, /* 1E14 */ - {0x1E16,0x1E17,0x0045}, {0x1E16,0x1E17,0x0045}, /* 1E16 */ - {0x1E18,0x1E19,0x0045}, {0x1E18,0x1E19,0x0045}, /* 1E18 */ - {0x1E1A,0x1E1B,0x0045}, {0x1E1A,0x1E1B,0x0045}, /* 1E1A */ - {0x1E1C,0x1E1D,0x0045}, {0x1E1C,0x1E1D,0x0045}, /* 1E1C */ - {0x1E1E,0x1E1F,0x0046}, {0x1E1E,0x1E1F,0x0046}, /* 1E1E */ - {0x1E20,0x1E21,0x0047}, {0x1E20,0x1E21,0x0047}, /* 1E20 */ - {0x1E22,0x1E23,0x0048}, {0x1E22,0x1E23,0x0048}, /* 1E22 */ - {0x1E24,0x1E25,0x0048}, {0x1E24,0x1E25,0x0048}, /* 1E24 */ - {0x1E26,0x1E27,0x0048}, {0x1E26,0x1E27,0x0048}, /* 1E26 */ - {0x1E28,0x1E29,0x0048}, {0x1E28,0x1E29,0x0048}, /* 1E28 */ - {0x1E2A,0x1E2B,0x0048}, {0x1E2A,0x1E2B,0x0048}, /* 1E2A */ - {0x1E2C,0x1E2D,0x0049}, {0x1E2C,0x1E2D,0x0049}, /* 1E2C */ - {0x1E2E,0x1E2F,0x0049}, {0x1E2E,0x1E2F,0x0049}, /* 1E2E */ - {0x1E30,0x1E31,0x004B}, {0x1E30,0x1E31,0x004B}, /* 1E30 */ - {0x1E32,0x1E33,0x004B}, {0x1E32,0x1E33,0x004B}, /* 1E32 */ - {0x1E34,0x1E35,0x004B}, {0x1E34,0x1E35,0x004B}, /* 1E34 */ - {0x1E36,0x1E37,0x004C}, {0x1E36,0x1E37,0x004C}, /* 1E36 */ - {0x1E38,0x1E39,0x004C}, {0x1E38,0x1E39,0x004C}, /* 1E38 */ - {0x1E3A,0x1E3B,0x004C}, {0x1E3A,0x1E3B,0x004C}, /* 1E3A */ - {0x1E3C,0x1E3D,0x004C}, {0x1E3C,0x1E3D,0x004C}, /* 1E3C */ - {0x1E3E,0x1E3F,0x004D}, {0x1E3E,0x1E3F,0x004D}, /* 1E3E */ - {0x1E40,0x1E41,0x004D}, {0x1E40,0x1E41,0x004D}, /* 1E40 */ - {0x1E42,0x1E43,0x004D}, {0x1E42,0x1E43,0x004D}, /* 1E42 */ - {0x1E44,0x1E45,0x004E}, {0x1E44,0x1E45,0x004E}, /* 1E44 */ - {0x1E46,0x1E47,0x004E}, {0x1E46,0x1E47,0x004E}, /* 1E46 */ - {0x1E48,0x1E49,0x004E}, {0x1E48,0x1E49,0x004E}, /* 1E48 */ - {0x1E4A,0x1E4B,0x004E}, {0x1E4A,0x1E4B,0x004E}, /* 1E4A */ - {0x1E4C,0x1E4D,0x004F}, {0x1E4C,0x1E4D,0x004F}, /* 1E4C */ - {0x1E4E,0x1E4F,0x004F}, {0x1E4E,0x1E4F,0x004F}, /* 1E4E */ - {0x1E50,0x1E51,0x004F}, {0x1E50,0x1E51,0x004F}, /* 1E50 */ - {0x1E52,0x1E53,0x004F}, {0x1E52,0x1E53,0x004F}, /* 1E52 */ - {0x1E54,0x1E55,0x0050}, {0x1E54,0x1E55,0x0050}, /* 1E54 */ - {0x1E56,0x1E57,0x0050}, {0x1E56,0x1E57,0x0050}, /* 1E56 */ - {0x1E58,0x1E59,0x0052}, {0x1E58,0x1E59,0x0052}, /* 1E58 */ - {0x1E5A,0x1E5B,0x0052}, {0x1E5A,0x1E5B,0x0052}, /* 1E5A */ - {0x1E5C,0x1E5D,0x0052}, {0x1E5C,0x1E5D,0x0052}, /* 1E5C */ - {0x1E5E,0x1E5F,0x0052}, {0x1E5E,0x1E5F,0x0052}, /* 1E5E */ - {0x1E60,0x1E61,0x0053}, {0x1E60,0x1E61,0x0053}, /* 1E60 */ - {0x1E62,0x1E63,0x0053}, {0x1E62,0x1E63,0x0053}, /* 1E62 */ - {0x1E64,0x1E65,0x0053}, {0x1E64,0x1E65,0x0053}, /* 1E64 */ - {0x1E66,0x1E67,0x0053}, {0x1E66,0x1E67,0x0053}, /* 1E66 */ - {0x1E68,0x1E69,0x0053}, {0x1E68,0x1E69,0x0053}, /* 1E68 */ - {0x1E6A,0x1E6B,0x0054}, {0x1E6A,0x1E6B,0x0054}, /* 1E6A */ - {0x1E6C,0x1E6D,0x0054}, {0x1E6C,0x1E6D,0x0054}, /* 1E6C */ - {0x1E6E,0x1E6F,0x0054}, {0x1E6E,0x1E6F,0x0054}, /* 1E6E */ - {0x1E70,0x1E71,0x0054}, {0x1E70,0x1E71,0x0054}, /* 1E70 */ - {0x1E72,0x1E73,0x0055}, {0x1E72,0x1E73,0x0055}, /* 1E72 */ - {0x1E74,0x1E75,0x0055}, {0x1E74,0x1E75,0x0055}, /* 1E74 */ - {0x1E76,0x1E77,0x0055}, {0x1E76,0x1E77,0x0055}, /* 1E76 */ - {0x1E78,0x1E79,0x0055}, {0x1E78,0x1E79,0x0055}, /* 1E78 */ - {0x1E7A,0x1E7B,0x0055}, {0x1E7A,0x1E7B,0x0055}, /* 1E7A */ - {0x1E7C,0x1E7D,0x0056}, {0x1E7C,0x1E7D,0x0056}, /* 1E7C */ - {0x1E7E,0x1E7F,0x0056}, {0x1E7E,0x1E7F,0x0056}, /* 1E7E */ - {0x1E80,0x1E81,0x0057}, {0x1E80,0x1E81,0x0057}, /* 1E80 */ - {0x1E82,0x1E83,0x0057}, {0x1E82,0x1E83,0x0057}, /* 1E82 */ - {0x1E84,0x1E85,0x0057}, {0x1E84,0x1E85,0x0057}, /* 1E84 */ - {0x1E86,0x1E87,0x0057}, {0x1E86,0x1E87,0x0057}, /* 1E86 */ - {0x1E88,0x1E89,0x0057}, {0x1E88,0x1E89,0x0057}, /* 1E88 */ - {0x1E8A,0x1E8B,0x0058}, {0x1E8A,0x1E8B,0x0058}, /* 1E8A */ - {0x1E8C,0x1E8D,0x0058}, {0x1E8C,0x1E8D,0x0058}, /* 1E8C */ - {0x1E8E,0x1E8F,0x0059}, {0x1E8E,0x1E8F,0x0059}, /* 1E8E */ - {0x1E90,0x1E91,0x005A}, {0x1E90,0x1E91,0x005A}, /* 1E90 */ - {0x1E92,0x1E93,0x005A}, {0x1E92,0x1E93,0x005A}, /* 1E92 */ - {0x1E94,0x1E95,0x005A}, {0x1E94,0x1E95,0x005A}, /* 1E94 */ - {0x1E96,0x1E96,0x0048}, {0x1E97,0x1E97,0x0054}, /* 1E96 */ - {0x1E98,0x1E98,0x0057}, {0x1E99,0x1E99,0x0059}, /* 1E98 */ - {0x1E9A,0x1E9A,0x1E9A}, {0x1E60,0x1E9B,0x0053}, /* 1E9A */ - {0x1E9C,0x1E9C,0x1E9C}, {0x1E9D,0x1E9D,0x1E9D}, /* 1E9C */ - {0x1E9E,0x00DF,0x1E9E}, {0x1E9F,0x1E9F,0x1E9F}, /* 1E9E */ - {0x1EA0,0x1EA1,0x0041}, {0x1EA0,0x1EA1,0x0041}, /* 1EA0 */ - {0x1EA2,0x1EA3,0x0041}, {0x1EA2,0x1EA3,0x0041}, /* 1EA2 */ - {0x1EA4,0x1EA5,0x0041}, {0x1EA4,0x1EA5,0x0041}, /* 1EA4 */ - {0x1EA6,0x1EA7,0x0041}, {0x1EA6,0x1EA7,0x0041}, /* 1EA6 */ - {0x1EA8,0x1EA9,0x0041}, {0x1EA8,0x1EA9,0x0041}, /* 1EA8 */ - {0x1EAA,0x1EAB,0x0041}, {0x1EAA,0x1EAB,0x0041}, /* 1EAA */ - {0x1EAC,0x1EAD,0x0041}, {0x1EAC,0x1EAD,0x0041}, /* 1EAC */ - {0x1EAE,0x1EAF,0x0041}, {0x1EAE,0x1EAF,0x0041}, /* 1EAE */ - {0x1EB0,0x1EB1,0x0041}, {0x1EB0,0x1EB1,0x0041}, /* 1EB0 */ - {0x1EB2,0x1EB3,0x0041}, {0x1EB2,0x1EB3,0x0041}, /* 1EB2 */ - {0x1EB4,0x1EB5,0x0041}, {0x1EB4,0x1EB5,0x0041}, /* 1EB4 */ - {0x1EB6,0x1EB7,0x0041}, {0x1EB6,0x1EB7,0x0041}, /* 1EB6 */ - {0x1EB8,0x1EB9,0x0045}, {0x1EB8,0x1EB9,0x0045}, /* 1EB8 */ - {0x1EBA,0x1EBB,0x0045}, {0x1EBA,0x1EBB,0x0045}, /* 1EBA */ - {0x1EBC,0x1EBD,0x0045}, {0x1EBC,0x1EBD,0x0045}, /* 1EBC */ - {0x1EBE,0x1EBF,0x0045}, {0x1EBE,0x1EBF,0x0045}, /* 1EBE */ - {0x1EC0,0x1EC1,0x0045}, {0x1EC0,0x1EC1,0x0045}, /* 1EC0 */ - {0x1EC2,0x1EC3,0x0045}, {0x1EC2,0x1EC3,0x0045}, /* 1EC2 */ - {0x1EC4,0x1EC5,0x0045}, {0x1EC4,0x1EC5,0x0045}, /* 1EC4 */ - {0x1EC6,0x1EC7,0x0045}, {0x1EC6,0x1EC7,0x0045}, /* 1EC6 */ - {0x1EC8,0x1EC9,0x0049}, {0x1EC8,0x1EC9,0x0049}, /* 1EC8 */ - {0x1ECA,0x1ECB,0x0049}, {0x1ECA,0x1ECB,0x0049}, /* 1ECA */ - {0x1ECC,0x1ECD,0x004F}, {0x1ECC,0x1ECD,0x004F}, /* 1ECC */ - {0x1ECE,0x1ECF,0x004F}, {0x1ECE,0x1ECF,0x004F}, /* 1ECE */ - {0x1ED0,0x1ED1,0x004F}, {0x1ED0,0x1ED1,0x004F}, /* 1ED0 */ - {0x1ED2,0x1ED3,0x004F}, {0x1ED2,0x1ED3,0x004F}, /* 1ED2 */ - {0x1ED4,0x1ED5,0x004F}, {0x1ED4,0x1ED5,0x004F}, /* 1ED4 */ - {0x1ED6,0x1ED7,0x004F}, {0x1ED6,0x1ED7,0x004F}, /* 1ED6 */ - {0x1ED8,0x1ED9,0x004F}, {0x1ED8,0x1ED9,0x004F}, /* 1ED8 */ - {0x1EDA,0x1EDB,0x004F}, {0x1EDA,0x1EDB,0x004F}, /* 1EDA */ - {0x1EDC,0x1EDD,0x004F}, {0x1EDC,0x1EDD,0x004F}, /* 1EDC */ - {0x1EDE,0x1EDF,0x004F}, {0x1EDE,0x1EDF,0x004F}, /* 1EDE */ - {0x1EE0,0x1EE1,0x004F}, {0x1EE0,0x1EE1,0x004F}, /* 1EE0 */ - {0x1EE2,0x1EE3,0x004F}, {0x1EE2,0x1EE3,0x004F}, /* 1EE2 */ - {0x1EE4,0x1EE5,0x0055}, {0x1EE4,0x1EE5,0x0055}, /* 1EE4 */ - {0x1EE6,0x1EE7,0x0055}, {0x1EE6,0x1EE7,0x0055}, /* 1EE6 */ - {0x1EE8,0x1EE9,0x0055}, {0x1EE8,0x1EE9,0x0055}, /* 1EE8 */ - {0x1EEA,0x1EEB,0x0055}, {0x1EEA,0x1EEB,0x0055}, /* 1EEA */ - {0x1EEC,0x1EED,0x0055}, {0x1EEC,0x1EED,0x0055}, /* 1EEC */ - {0x1EEE,0x1EEF,0x0055}, {0x1EEE,0x1EEF,0x0055}, /* 1EEE */ - {0x1EF0,0x1EF1,0x0055}, {0x1EF0,0x1EF1,0x0055}, /* 1EF0 */ - {0x1EF2,0x1EF3,0x0059}, {0x1EF2,0x1EF3,0x0059}, /* 1EF2 */ - {0x1EF4,0x1EF5,0x0059}, {0x1EF4,0x1EF5,0x0059}, /* 1EF4 */ - {0x1EF6,0x1EF7,0x0059}, {0x1EF6,0x1EF7,0x0059}, /* 1EF6 */ - {0x1EF8,0x1EF9,0x0059}, {0x1EF8,0x1EF9,0x0059}, /* 1EF8 */ - {0x1EFA,0x1EFB,0x1EFA}, {0x1EFA,0x1EFB,0x1EFA}, /* 1EFA */ - {0x1EFC,0x1EFD,0x1EFC}, {0x1EFC,0x1EFD,0x1EFC}, /* 1EFC */ - {0x1EFE,0x1EFF,0x1EFE}, {0x1EFE,0x1EFF,0x1EFE} /* 1EFE */ -}; - -static MY_UNICASE_CHARACTER u520p1F[]={ - {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391}, /* 1F00 */ - {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391}, /* 1F02 */ - {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391}, /* 1F04 */ - {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391}, /* 1F06 */ - {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391}, /* 1F08 */ - {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391}, /* 1F0A */ - {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391}, /* 1F0C */ - {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391}, /* 1F0E */ - {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395}, /* 1F10 */ - {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395}, /* 1F12 */ - {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395}, /* 1F14 */ - {0x1F16,0x1F16,0x1F16}, {0x1F17,0x1F17,0x1F17}, /* 1F16 */ - {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395}, /* 1F18 */ - {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395}, /* 1F1A */ - {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395}, /* 1F1C */ - {0x1F1E,0x1F1E,0x1F1E}, {0x1F1F,0x1F1F,0x1F1F}, /* 1F1E */ - {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397}, /* 1F20 */ - {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397}, /* 1F22 */ - {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397}, /* 1F24 */ - {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397}, /* 1F26 */ - {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397}, /* 1F28 */ - {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397}, /* 1F2A */ - {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397}, /* 1F2C */ - {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397}, /* 1F2E */ - {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399}, /* 1F30 */ - {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399}, /* 1F32 */ - {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399}, /* 1F34 */ - {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399}, /* 1F36 */ - {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399}, /* 1F38 */ - {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399}, /* 1F3A */ - {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399}, /* 1F3C */ - {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399}, /* 1F3E */ - {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F}, /* 1F40 */ - {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F}, /* 1F42 */ - {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F}, /* 1F44 */ - {0x1F46,0x1F46,0x1F46}, {0x1F47,0x1F47,0x1F47}, /* 1F46 */ - {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F}, /* 1F48 */ - {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F}, /* 1F4A */ - {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F}, /* 1F4C */ - {0x1F4E,0x1F4E,0x1F4E}, {0x1F4F,0x1F4F,0x1F4F}, /* 1F4E */ - {0x1F50,0x1F50,0x03A5}, {0x1F59,0x1F51,0x03A5}, /* 1F50 */ - {0x1F52,0x1F52,0x03A5}, {0x1F5B,0x1F53,0x03A5}, /* 1F52 */ - {0x1F54,0x1F54,0x03A5}, {0x1F5D,0x1F55,0x03A5}, /* 1F54 */ - {0x1F56,0x1F56,0x03A5}, {0x1F5F,0x1F57,0x03A5}, /* 1F56 */ - {0x1F58,0x1F58,0x1F58}, {0x1F59,0x1F51,0x03A5}, /* 1F58 */ - {0x1F5A,0x1F5A,0x1F5A}, {0x1F5B,0x1F53,0x03A5}, /* 1F5A */ - {0x1F5C,0x1F5C,0x1F5C}, {0x1F5D,0x1F55,0x03A5}, /* 1F5C */ - {0x1F5E,0x1F5E,0x1F5E}, {0x1F5F,0x1F57,0x03A5}, /* 1F5E */ - {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9}, /* 1F60 */ - {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9}, /* 1F62 */ - {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9}, /* 1F64 */ - {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9}, /* 1F66 */ - {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9}, /* 1F68 */ - {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9}, /* 1F6A */ - {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9}, /* 1F6C */ - {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9}, /* 1F6E */ - {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB}, /* 1F70 */ - {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9}, /* 1F72 */ - {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB}, /* 1F74 */ - {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB}, /* 1F76 */ - {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9}, /* 1F78 */ - {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB}, /* 1F7A */ - {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB}, /* 1F7C */ - {0x1F7E,0x1F7E,0x1F7E}, {0x1F7F,0x1F7F,0x1F7F}, /* 1F7E */ - {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391}, /* 1F80 */ - {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391}, /* 1F82 */ - {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391}, /* 1F84 */ - {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391}, /* 1F86 */ - {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391}, /* 1F88 */ - {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391}, /* 1F8A */ - {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391}, /* 1F8C */ - {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391}, /* 1F8E */ - {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397}, /* 1F90 */ - {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397}, /* 1F92 */ - {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397}, /* 1F94 */ - {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397}, /* 1F96 */ - {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397}, /* 1F98 */ - {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397}, /* 1F9A */ - {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397}, /* 1F9C */ - {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397}, /* 1F9E */ - {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9}, /* 1FA0 */ - {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9}, /* 1FA2 */ - {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9}, /* 1FA4 */ - {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9}, /* 1FA6 */ - {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9}, /* 1FA8 */ - {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9}, /* 1FAA */ - {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9}, /* 1FAC */ - {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9}, /* 1FAE */ - {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391}, /* 1FB0 */ - {0x1FB2,0x1FB2,0x0391}, {0x1FBC,0x1FB3,0x0391}, /* 1FB2 */ - {0x1FB4,0x1FB4,0x0391}, {0x1FB5,0x1FB5,0x1FB5}, /* 1FB4 */ - {0x1FB6,0x1FB6,0x0391}, {0x1FB7,0x1FB7,0x0391}, /* 1FB6 */ - {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391}, /* 1FB8 */ - {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB}, /* 1FBA */ - {0x1FBC,0x1FB3,0x0391}, {0x1FBD,0x1FBD,0x1FBD}, /* 1FBC */ - {0x0399,0x1FBE,0x0399}, {0x1FBF,0x1FBF,0x1FBF}, /* 1FBE */ - {0x1FC0,0x1FC0,0x1FC0}, {0x1FC1,0x1FC1,0x1FC1}, /* 1FC0 */ - {0x1FC2,0x1FC2,0x0397}, {0x1FCC,0x1FC3,0x0397}, /* 1FC2 */ - {0x1FC4,0x1FC4,0x0397}, {0x1FC5,0x1FC5,0x1FC5}, /* 1FC4 */ - {0x1FC6,0x1FC6,0x0397}, {0x1FC7,0x1FC7,0x0397}, /* 1FC6 */ - {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9}, /* 1FC8 */ - {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB}, /* 1FCA */ - {0x1FCC,0x1FC3,0x0397}, {0x1FCD,0x1FCD,0x1FCD}, /* 1FCC */ - {0x1FCE,0x1FCE,0x1FCE}, {0x1FCF,0x1FCF,0x1FCF}, /* 1FCE */ - {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399}, /* 1FD0 */ - {0x1FD2,0x1FD2,0x0399}, {0x1FD3,0x1FD3,0x1FD3}, /* 1FD2 */ - {0x1FD4,0x1FD4,0x1FD4}, {0x1FD5,0x1FD5,0x1FD5}, /* 1FD4 */ - {0x1FD6,0x1FD6,0x0399}, {0x1FD7,0x1FD7,0x0399}, /* 1FD6 */ - {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399}, /* 1FD8 */ - {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB}, /* 1FDA */ - {0x1FDC,0x1FDC,0x1FDC}, {0x1FDD,0x1FDD,0x1FDD}, /* 1FDC */ - {0x1FDE,0x1FDE,0x1FDE}, {0x1FDF,0x1FDF,0x1FDF}, /* 1FDE */ - {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5}, /* 1FE0 */ - {0x1FE2,0x1FE2,0x03A5}, {0x1FE3,0x1FE3,0x1FE3}, /* 1FE2 */ - {0x1FE4,0x1FE4,0x03A1}, {0x1FEC,0x1FE5,0x03A1}, /* 1FE4 */ - {0x1FE6,0x1FE6,0x03A5}, {0x1FE7,0x1FE7,0x03A5}, /* 1FE6 */ - {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5}, /* 1FE8 */ - {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB}, /* 1FEA */ - {0x1FEC,0x1FE5,0x03A1}, {0x1FED,0x1FED,0x1FED}, /* 1FEC */ - {0x1FEE,0x1FEE,0x1FEE}, {0x1FEF,0x1FEF,0x1FEF}, /* 1FEE */ - {0x1FF0,0x1FF0,0x1FF0}, {0x1FF1,0x1FF1,0x1FF1}, /* 1FF0 */ - {0x1FF2,0x1FF2,0x03A9}, {0x1FFC,0x1FF3,0x03A9}, /* 1FF2 */ - {0x1FF4,0x1FF4,0x03A9}, {0x1FF5,0x1FF5,0x1FF5}, /* 1FF4 */ - {0x1FF6,0x1FF6,0x03A9}, {0x1FF7,0x1FF7,0x03A9}, /* 1FF6 */ - {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9}, /* 1FF8 */ - {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB}, /* 1FFA */ - {0x1FFC,0x1FF3,0x03A9}, {0x1FFD,0x1FFD,0x1FFD}, /* 1FFC */ - {0x1FFE,0x1FFE,0x1FFE}, {0x1FFF,0x1FFF,0x1FFF} /* 1FFE */ -}; - -static MY_UNICASE_CHARACTER u520p21[]={ - {0x2100,0x2100,0x2100}, {0x2101,0x2101,0x2101}, /* 2100 */ - {0x2102,0x2102,0x2102}, {0x2103,0x2103,0x2103}, /* 2102 */ - {0x2104,0x2104,0x2104}, {0x2105,0x2105,0x2105}, /* 2104 */ - {0x2106,0x2106,0x2106}, {0x2107,0x2107,0x2107}, /* 2106 */ - {0x2108,0x2108,0x2108}, {0x2109,0x2109,0x2109}, /* 2108 */ - {0x210A,0x210A,0x210A}, {0x210B,0x210B,0x210B}, /* 210A */ - {0x210C,0x210C,0x210C}, {0x210D,0x210D,0x210D}, /* 210C */ - {0x210E,0x210E,0x210E}, {0x210F,0x210F,0x210F}, /* 210E */ - {0x2110,0x2110,0x2110}, {0x2111,0x2111,0x2111}, /* 2110 */ - {0x2112,0x2112,0x2112}, {0x2113,0x2113,0x2113}, /* 2112 */ - {0x2114,0x2114,0x2114}, {0x2115,0x2115,0x2115}, /* 2114 */ - {0x2116,0x2116,0x2116}, {0x2117,0x2117,0x2117}, /* 2116 */ - {0x2118,0x2118,0x2118}, {0x2119,0x2119,0x2119}, /* 2118 */ - {0x211A,0x211A,0x211A}, {0x211B,0x211B,0x211B}, /* 211A */ - {0x211C,0x211C,0x211C}, {0x211D,0x211D,0x211D}, /* 211C */ - {0x211E,0x211E,0x211E}, {0x211F,0x211F,0x211F}, /* 211E */ - {0x2120,0x2120,0x2120}, {0x2121,0x2121,0x2121}, /* 2120 */ - {0x2122,0x2122,0x2122}, {0x2123,0x2123,0x2123}, /* 2122 */ - {0x2124,0x2124,0x2124}, {0x2125,0x2125,0x2125}, /* 2124 */ - {0x2126,0x03C9,0x2126}, {0x2127,0x2127,0x2127}, /* 2126 */ - {0x2128,0x2128,0x2128}, {0x2129,0x2129,0x2129}, /* 2128 */ - {0x212A,0x006B,0x212A}, {0x212B,0x00E5,0x212B}, /* 212A */ - {0x212C,0x212C,0x212C}, {0x212D,0x212D,0x212D}, /* 212C */ - {0x212E,0x212E,0x212E}, {0x212F,0x212F,0x212F}, /* 212E */ - {0x2130,0x2130,0x2130}, {0x2131,0x2131,0x2131}, /* 2130 */ - {0x2132,0x214E,0x2132}, {0x2133,0x2133,0x2133}, /* 2132 */ - {0x2134,0x2134,0x2134}, {0x2135,0x2135,0x2135}, /* 2134 */ - {0x2136,0x2136,0x2136}, {0x2137,0x2137,0x2137}, /* 2136 */ - {0x2138,0x2138,0x2138}, {0x2139,0x2139,0x2139}, /* 2138 */ - {0x213A,0x213A,0x213A}, {0x213B,0x213B,0x213B}, /* 213A */ - {0x213C,0x213C,0x213C}, {0x213D,0x213D,0x213D}, /* 213C */ - {0x213E,0x213E,0x213E}, {0x213F,0x213F,0x213F}, /* 213E */ - {0x2140,0x2140,0x2140}, {0x2141,0x2141,0x2141}, /* 2140 */ - {0x2142,0x2142,0x2142}, {0x2143,0x2143,0x2143}, /* 2142 */ - {0x2144,0x2144,0x2144}, {0x2145,0x2145,0x2145}, /* 2144 */ - {0x2146,0x2146,0x2146}, {0x2147,0x2147,0x2147}, /* 2146 */ - {0x2148,0x2148,0x2148}, {0x2149,0x2149,0x2149}, /* 2148 */ - {0x214A,0x214A,0x214A}, {0x214B,0x214B,0x214B}, /* 214A */ - {0x214C,0x214C,0x214C}, {0x214D,0x214D,0x214D}, /* 214C */ - {0x2132,0x214E,0x2132}, {0x214F,0x214F,0x214F}, /* 214E */ - {0x2150,0x2150,0x2150}, {0x2151,0x2151,0x2151}, /* 2150 */ - {0x2152,0x2152,0x2152}, {0x2153,0x2153,0x2153}, /* 2152 */ - {0x2154,0x2154,0x2154}, {0x2155,0x2155,0x2155}, /* 2154 */ - {0x2156,0x2156,0x2156}, {0x2157,0x2157,0x2157}, /* 2156 */ - {0x2158,0x2158,0x2158}, {0x2159,0x2159,0x2159}, /* 2158 */ - {0x215A,0x215A,0x215A}, {0x215B,0x215B,0x215B}, /* 215A */ - {0x215C,0x215C,0x215C}, {0x215D,0x215D,0x215D}, /* 215C */ - {0x215E,0x215E,0x215E}, {0x215F,0x215F,0x215F}, /* 215E */ - {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161}, /* 2160 */ - {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163}, /* 2162 */ - {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165}, /* 2164 */ - {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167}, /* 2166 */ - {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169}, /* 2168 */ - {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B}, /* 216A */ - {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D}, /* 216C */ - {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F}, /* 216E */ - {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161}, /* 2170 */ - {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163}, /* 2172 */ - {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165}, /* 2174 */ - {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167}, /* 2176 */ - {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169}, /* 2178 */ - {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B}, /* 217A */ - {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D}, /* 217C */ - {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F}, /* 217E */ - {0x2180,0x2180,0x2180}, {0x2181,0x2181,0x2181}, /* 2180 */ - {0x2182,0x2182,0x2182}, {0x2183,0x2184,0x2183}, /* 2182 */ - {0x2183,0x2184,0x2183}, {0x2185,0x2185,0x2185}, /* 2184 */ - {0x2186,0x2186,0x2186}, {0x2187,0x2187,0x2187}, /* 2186 */ - {0x2188,0x2188,0x2188}, {0x2189,0x2189,0x2189}, /* 2188 */ - {0x218A,0x218A,0x218A}, {0x218B,0x218B,0x218B}, /* 218A */ - {0x218C,0x218C,0x218C}, {0x218D,0x218D,0x218D}, /* 218C */ - {0x218E,0x218E,0x218E}, {0x218F,0x218F,0x218F}, /* 218E */ - {0x2190,0x2190,0x2190}, {0x2191,0x2191,0x2191}, /* 2190 */ - {0x2192,0x2192,0x2192}, {0x2193,0x2193,0x2193}, /* 2192 */ - {0x2194,0x2194,0x2194}, {0x2195,0x2195,0x2195}, /* 2194 */ - {0x2196,0x2196,0x2196}, {0x2197,0x2197,0x2197}, /* 2196 */ - {0x2198,0x2198,0x2198}, {0x2199,0x2199,0x2199}, /* 2198 */ - {0x219A,0x219A,0x219A}, {0x219B,0x219B,0x219B}, /* 219A */ - {0x219C,0x219C,0x219C}, {0x219D,0x219D,0x219D}, /* 219C */ - {0x219E,0x219E,0x219E}, {0x219F,0x219F,0x219F}, /* 219E */ - {0x21A0,0x21A0,0x21A0}, {0x21A1,0x21A1,0x21A1}, /* 21A0 */ - {0x21A2,0x21A2,0x21A2}, {0x21A3,0x21A3,0x21A3}, /* 21A2 */ - {0x21A4,0x21A4,0x21A4}, {0x21A5,0x21A5,0x21A5}, /* 21A4 */ - {0x21A6,0x21A6,0x21A6}, {0x21A7,0x21A7,0x21A7}, /* 21A6 */ - {0x21A8,0x21A8,0x21A8}, {0x21A9,0x21A9,0x21A9}, /* 21A8 */ - {0x21AA,0x21AA,0x21AA}, {0x21AB,0x21AB,0x21AB}, /* 21AA */ - {0x21AC,0x21AC,0x21AC}, {0x21AD,0x21AD,0x21AD}, /* 21AC */ - {0x21AE,0x21AE,0x21AE}, {0x21AF,0x21AF,0x21AF}, /* 21AE */ - {0x21B0,0x21B0,0x21B0}, {0x21B1,0x21B1,0x21B1}, /* 21B0 */ - {0x21B2,0x21B2,0x21B2}, {0x21B3,0x21B3,0x21B3}, /* 21B2 */ - {0x21B4,0x21B4,0x21B4}, {0x21B5,0x21B5,0x21B5}, /* 21B4 */ - {0x21B6,0x21B6,0x21B6}, {0x21B7,0x21B7,0x21B7}, /* 21B6 */ - {0x21B8,0x21B8,0x21B8}, {0x21B9,0x21B9,0x21B9}, /* 21B8 */ - {0x21BA,0x21BA,0x21BA}, {0x21BB,0x21BB,0x21BB}, /* 21BA */ - {0x21BC,0x21BC,0x21BC}, {0x21BD,0x21BD,0x21BD}, /* 21BC */ - {0x21BE,0x21BE,0x21BE}, {0x21BF,0x21BF,0x21BF}, /* 21BE */ - {0x21C0,0x21C0,0x21C0}, {0x21C1,0x21C1,0x21C1}, /* 21C0 */ - {0x21C2,0x21C2,0x21C2}, {0x21C3,0x21C3,0x21C3}, /* 21C2 */ - {0x21C4,0x21C4,0x21C4}, {0x21C5,0x21C5,0x21C5}, /* 21C4 */ - {0x21C6,0x21C6,0x21C6}, {0x21C7,0x21C7,0x21C7}, /* 21C6 */ - {0x21C8,0x21C8,0x21C8}, {0x21C9,0x21C9,0x21C9}, /* 21C8 */ - {0x21CA,0x21CA,0x21CA}, {0x21CB,0x21CB,0x21CB}, /* 21CA */ - {0x21CC,0x21CC,0x21CC}, {0x21CD,0x21CD,0x21CD}, /* 21CC */ - {0x21CE,0x21CE,0x21CE}, {0x21CF,0x21CF,0x21CF}, /* 21CE */ - {0x21D0,0x21D0,0x21D0}, {0x21D1,0x21D1,0x21D1}, /* 21D0 */ - {0x21D2,0x21D2,0x21D2}, {0x21D3,0x21D3,0x21D3}, /* 21D2 */ - {0x21D4,0x21D4,0x21D4}, {0x21D5,0x21D5,0x21D5}, /* 21D4 */ - {0x21D6,0x21D6,0x21D6}, {0x21D7,0x21D7,0x21D7}, /* 21D6 */ - {0x21D8,0x21D8,0x21D8}, {0x21D9,0x21D9,0x21D9}, /* 21D8 */ - {0x21DA,0x21DA,0x21DA}, {0x21DB,0x21DB,0x21DB}, /* 21DA */ - {0x21DC,0x21DC,0x21DC}, {0x21DD,0x21DD,0x21DD}, /* 21DC */ - {0x21DE,0x21DE,0x21DE}, {0x21DF,0x21DF,0x21DF}, /* 21DE */ - {0x21E0,0x21E0,0x21E0}, {0x21E1,0x21E1,0x21E1}, /* 21E0 */ - {0x21E2,0x21E2,0x21E2}, {0x21E3,0x21E3,0x21E3}, /* 21E2 */ - {0x21E4,0x21E4,0x21E4}, {0x21E5,0x21E5,0x21E5}, /* 21E4 */ - {0x21E6,0x21E6,0x21E6}, {0x21E7,0x21E7,0x21E7}, /* 21E6 */ - {0x21E8,0x21E8,0x21E8}, {0x21E9,0x21E9,0x21E9}, /* 21E8 */ - {0x21EA,0x21EA,0x21EA}, {0x21EB,0x21EB,0x21EB}, /* 21EA */ - {0x21EC,0x21EC,0x21EC}, {0x21ED,0x21ED,0x21ED}, /* 21EC */ - {0x21EE,0x21EE,0x21EE}, {0x21EF,0x21EF,0x21EF}, /* 21EE */ - {0x21F0,0x21F0,0x21F0}, {0x21F1,0x21F1,0x21F1}, /* 21F0 */ - {0x21F2,0x21F2,0x21F2}, {0x21F3,0x21F3,0x21F3}, /* 21F2 */ - {0x21F4,0x21F4,0x21F4}, {0x21F5,0x21F5,0x21F5}, /* 21F4 */ - {0x21F6,0x21F6,0x21F6}, {0x21F7,0x21F7,0x21F7}, /* 21F6 */ - {0x21F8,0x21F8,0x21F8}, {0x21F9,0x21F9,0x21F9}, /* 21F8 */ - {0x21FA,0x21FA,0x21FA}, {0x21FB,0x21FB,0x21FB}, /* 21FA */ - {0x21FC,0x21FC,0x21FC}, {0x21FD,0x21FD,0x21FD}, /* 21FC */ - {0x21FE,0x21FE,0x21FE}, {0x21FF,0x21FF,0x21FF} /* 21FE */ -}; - -static MY_UNICASE_CHARACTER u520p24[]={ - {0x2400,0x2400,0x2400}, {0x2401,0x2401,0x2401}, /* 2400 */ - {0x2402,0x2402,0x2402}, {0x2403,0x2403,0x2403}, /* 2402 */ - {0x2404,0x2404,0x2404}, {0x2405,0x2405,0x2405}, /* 2404 */ - {0x2406,0x2406,0x2406}, {0x2407,0x2407,0x2407}, /* 2406 */ - {0x2408,0x2408,0x2408}, {0x2409,0x2409,0x2409}, /* 2408 */ - {0x240A,0x240A,0x240A}, {0x240B,0x240B,0x240B}, /* 240A */ - {0x240C,0x240C,0x240C}, {0x240D,0x240D,0x240D}, /* 240C */ - {0x240E,0x240E,0x240E}, {0x240F,0x240F,0x240F}, /* 240E */ - {0x2410,0x2410,0x2410}, {0x2411,0x2411,0x2411}, /* 2410 */ - {0x2412,0x2412,0x2412}, {0x2413,0x2413,0x2413}, /* 2412 */ - {0x2414,0x2414,0x2414}, {0x2415,0x2415,0x2415}, /* 2414 */ - {0x2416,0x2416,0x2416}, {0x2417,0x2417,0x2417}, /* 2416 */ - {0x2418,0x2418,0x2418}, {0x2419,0x2419,0x2419}, /* 2418 */ - {0x241A,0x241A,0x241A}, {0x241B,0x241B,0x241B}, /* 241A */ - {0x241C,0x241C,0x241C}, {0x241D,0x241D,0x241D}, /* 241C */ - {0x241E,0x241E,0x241E}, {0x241F,0x241F,0x241F}, /* 241E */ - {0x2420,0x2420,0x2420}, {0x2421,0x2421,0x2421}, /* 2420 */ - {0x2422,0x2422,0x2422}, {0x2423,0x2423,0x2423}, /* 2422 */ - {0x2424,0x2424,0x2424}, {0x2425,0x2425,0x2425}, /* 2424 */ - {0x2426,0x2426,0x2426}, {0x2427,0x2427,0x2427}, /* 2426 */ - {0x2428,0x2428,0x2428}, {0x2429,0x2429,0x2429}, /* 2428 */ - {0x242A,0x242A,0x242A}, {0x242B,0x242B,0x242B}, /* 242A */ - {0x242C,0x242C,0x242C}, {0x242D,0x242D,0x242D}, /* 242C */ - {0x242E,0x242E,0x242E}, {0x242F,0x242F,0x242F}, /* 242E */ - {0x2430,0x2430,0x2430}, {0x2431,0x2431,0x2431}, /* 2430 */ - {0x2432,0x2432,0x2432}, {0x2433,0x2433,0x2433}, /* 2432 */ - {0x2434,0x2434,0x2434}, {0x2435,0x2435,0x2435}, /* 2434 */ - {0x2436,0x2436,0x2436}, {0x2437,0x2437,0x2437}, /* 2436 */ - {0x2438,0x2438,0x2438}, {0x2439,0x2439,0x2439}, /* 2438 */ - {0x243A,0x243A,0x243A}, {0x243B,0x243B,0x243B}, /* 243A */ - {0x243C,0x243C,0x243C}, {0x243D,0x243D,0x243D}, /* 243C */ - {0x243E,0x243E,0x243E}, {0x243F,0x243F,0x243F}, /* 243E */ - {0x2440,0x2440,0x2440}, {0x2441,0x2441,0x2441}, /* 2440 */ - {0x2442,0x2442,0x2442}, {0x2443,0x2443,0x2443}, /* 2442 */ - {0x2444,0x2444,0x2444}, {0x2445,0x2445,0x2445}, /* 2444 */ - {0x2446,0x2446,0x2446}, {0x2447,0x2447,0x2447}, /* 2446 */ - {0x2448,0x2448,0x2448}, {0x2449,0x2449,0x2449}, /* 2448 */ - {0x244A,0x244A,0x244A}, {0x244B,0x244B,0x244B}, /* 244A */ - {0x244C,0x244C,0x244C}, {0x244D,0x244D,0x244D}, /* 244C */ - {0x244E,0x244E,0x244E}, {0x244F,0x244F,0x244F}, /* 244E */ - {0x2450,0x2450,0x2450}, {0x2451,0x2451,0x2451}, /* 2450 */ - {0x2452,0x2452,0x2452}, {0x2453,0x2453,0x2453}, /* 2452 */ - {0x2454,0x2454,0x2454}, {0x2455,0x2455,0x2455}, /* 2454 */ - {0x2456,0x2456,0x2456}, {0x2457,0x2457,0x2457}, /* 2456 */ - {0x2458,0x2458,0x2458}, {0x2459,0x2459,0x2459}, /* 2458 */ - {0x245A,0x245A,0x245A}, {0x245B,0x245B,0x245B}, /* 245A */ - {0x245C,0x245C,0x245C}, {0x245D,0x245D,0x245D}, /* 245C */ - {0x245E,0x245E,0x245E}, {0x245F,0x245F,0x245F}, /* 245E */ - {0x2460,0x2460,0x2460}, {0x2461,0x2461,0x2461}, /* 2460 */ - {0x2462,0x2462,0x2462}, {0x2463,0x2463,0x2463}, /* 2462 */ - {0x2464,0x2464,0x2464}, {0x2465,0x2465,0x2465}, /* 2464 */ - {0x2466,0x2466,0x2466}, {0x2467,0x2467,0x2467}, /* 2466 */ - {0x2468,0x2468,0x2468}, {0x2469,0x2469,0x2469}, /* 2468 */ - {0x246A,0x246A,0x246A}, {0x246B,0x246B,0x246B}, /* 246A */ - {0x246C,0x246C,0x246C}, {0x246D,0x246D,0x246D}, /* 246C */ - {0x246E,0x246E,0x246E}, {0x246F,0x246F,0x246F}, /* 246E */ - {0x2470,0x2470,0x2470}, {0x2471,0x2471,0x2471}, /* 2470 */ - {0x2472,0x2472,0x2472}, {0x2473,0x2473,0x2473}, /* 2472 */ - {0x2474,0x2474,0x2474}, {0x2475,0x2475,0x2475}, /* 2474 */ - {0x2476,0x2476,0x2476}, {0x2477,0x2477,0x2477}, /* 2476 */ - {0x2478,0x2478,0x2478}, {0x2479,0x2479,0x2479}, /* 2478 */ - {0x247A,0x247A,0x247A}, {0x247B,0x247B,0x247B}, /* 247A */ - {0x247C,0x247C,0x247C}, {0x247D,0x247D,0x247D}, /* 247C */ - {0x247E,0x247E,0x247E}, {0x247F,0x247F,0x247F}, /* 247E */ - {0x2480,0x2480,0x2480}, {0x2481,0x2481,0x2481}, /* 2480 */ - {0x2482,0x2482,0x2482}, {0x2483,0x2483,0x2483}, /* 2482 */ - {0x2484,0x2484,0x2484}, {0x2485,0x2485,0x2485}, /* 2484 */ - {0x2486,0x2486,0x2486}, {0x2487,0x2487,0x2487}, /* 2486 */ - {0x2488,0x2488,0x2488}, {0x2489,0x2489,0x2489}, /* 2488 */ - {0x248A,0x248A,0x248A}, {0x248B,0x248B,0x248B}, /* 248A */ - {0x248C,0x248C,0x248C}, {0x248D,0x248D,0x248D}, /* 248C */ - {0x248E,0x248E,0x248E}, {0x248F,0x248F,0x248F}, /* 248E */ - {0x2490,0x2490,0x2490}, {0x2491,0x2491,0x2491}, /* 2490 */ - {0x2492,0x2492,0x2492}, {0x2493,0x2493,0x2493}, /* 2492 */ - {0x2494,0x2494,0x2494}, {0x2495,0x2495,0x2495}, /* 2494 */ - {0x2496,0x2496,0x2496}, {0x2497,0x2497,0x2497}, /* 2496 */ - {0x2498,0x2498,0x2498}, {0x2499,0x2499,0x2499}, /* 2498 */ - {0x249A,0x249A,0x249A}, {0x249B,0x249B,0x249B}, /* 249A */ - {0x249C,0x249C,0x249C}, {0x249D,0x249D,0x249D}, /* 249C */ - {0x249E,0x249E,0x249E}, {0x249F,0x249F,0x249F}, /* 249E */ - {0x24A0,0x24A0,0x24A0}, {0x24A1,0x24A1,0x24A1}, /* 24A0 */ - {0x24A2,0x24A2,0x24A2}, {0x24A3,0x24A3,0x24A3}, /* 24A2 */ - {0x24A4,0x24A4,0x24A4}, {0x24A5,0x24A5,0x24A5}, /* 24A4 */ - {0x24A6,0x24A6,0x24A6}, {0x24A7,0x24A7,0x24A7}, /* 24A6 */ - {0x24A8,0x24A8,0x24A8}, {0x24A9,0x24A9,0x24A9}, /* 24A8 */ - {0x24AA,0x24AA,0x24AA}, {0x24AB,0x24AB,0x24AB}, /* 24AA */ - {0x24AC,0x24AC,0x24AC}, {0x24AD,0x24AD,0x24AD}, /* 24AC */ - {0x24AE,0x24AE,0x24AE}, {0x24AF,0x24AF,0x24AF}, /* 24AE */ - {0x24B0,0x24B0,0x24B0}, {0x24B1,0x24B1,0x24B1}, /* 24B0 */ - {0x24B2,0x24B2,0x24B2}, {0x24B3,0x24B3,0x24B3}, /* 24B2 */ - {0x24B4,0x24B4,0x24B4}, {0x24B5,0x24B5,0x24B5}, /* 24B4 */ - {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7}, /* 24B6 */ - {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9}, /* 24B8 */ - {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB}, /* 24BA */ - {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD}, /* 24BC */ - {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF}, /* 24BE */ - {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1}, /* 24C0 */ - {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3}, /* 24C2 */ - {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5}, /* 24C4 */ - {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7}, /* 24C6 */ - {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9}, /* 24C8 */ - {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB}, /* 24CA */ - {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD}, /* 24CC */ - {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF}, /* 24CE */ - {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7}, /* 24D0 */ - {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9}, /* 24D2 */ - {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB}, /* 24D4 */ - {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD}, /* 24D6 */ - {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF}, /* 24D8 */ - {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1}, /* 24DA */ - {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3}, /* 24DC */ - {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5}, /* 24DE */ - {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7}, /* 24E0 */ - {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9}, /* 24E2 */ - {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB}, /* 24E4 */ - {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD}, /* 24E6 */ - {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF}, /* 24E8 */ - {0x24EA,0x24EA,0x24EA}, {0x24EB,0x24EB,0x24EB}, /* 24EA */ - {0x24EC,0x24EC,0x24EC}, {0x24ED,0x24ED,0x24ED}, /* 24EC */ - {0x24EE,0x24EE,0x24EE}, {0x24EF,0x24EF,0x24EF}, /* 24EE */ - {0x24F0,0x24F0,0x24F0}, {0x24F1,0x24F1,0x24F1}, /* 24F0 */ - {0x24F2,0x24F2,0x24F2}, {0x24F3,0x24F3,0x24F3}, /* 24F2 */ - {0x24F4,0x24F4,0x24F4}, {0x24F5,0x24F5,0x24F5}, /* 24F4 */ - {0x24F6,0x24F6,0x24F6}, {0x24F7,0x24F7,0x24F7}, /* 24F6 */ - {0x24F8,0x24F8,0x24F8}, {0x24F9,0x24F9,0x24F9}, /* 24F8 */ - {0x24FA,0x24FA,0x24FA}, {0x24FB,0x24FB,0x24FB}, /* 24FA */ - {0x24FC,0x24FC,0x24FC}, {0x24FD,0x24FD,0x24FD}, /* 24FC */ - {0x24FE,0x24FE,0x24FE}, {0x24FF,0x24FF,0x24FF} /* 24FE */ -}; - -static MY_UNICASE_CHARACTER u520p2C[]={ - {0x2C00,0x2C30,0x2C00}, {0x2C01,0x2C31,0x2C01}, /* 2C00 */ - {0x2C02,0x2C32,0x2C02}, {0x2C03,0x2C33,0x2C03}, /* 2C02 */ - {0x2C04,0x2C34,0x2C04}, {0x2C05,0x2C35,0x2C05}, /* 2C04 */ - {0x2C06,0x2C36,0x2C06}, {0x2C07,0x2C37,0x2C07}, /* 2C06 */ - {0x2C08,0x2C38,0x2C08}, {0x2C09,0x2C39,0x2C09}, /* 2C08 */ - {0x2C0A,0x2C3A,0x2C0A}, {0x2C0B,0x2C3B,0x2C0B}, /* 2C0A */ - {0x2C0C,0x2C3C,0x2C0C}, {0x2C0D,0x2C3D,0x2C0D}, /* 2C0C */ - {0x2C0E,0x2C3E,0x2C0E}, {0x2C0F,0x2C3F,0x2C0F}, /* 2C0E */ - {0x2C10,0x2C40,0x2C10}, {0x2C11,0x2C41,0x2C11}, /* 2C10 */ - {0x2C12,0x2C42,0x2C12}, {0x2C13,0x2C43,0x2C13}, /* 2C12 */ - {0x2C14,0x2C44,0x2C14}, {0x2C15,0x2C45,0x2C15}, /* 2C14 */ - {0x2C16,0x2C46,0x2C16}, {0x2C17,0x2C47,0x2C17}, /* 2C16 */ - {0x2C18,0x2C48,0x2C18}, {0x2C19,0x2C49,0x2C19}, /* 2C18 */ - {0x2C1A,0x2C4A,0x2C1A}, {0x2C1B,0x2C4B,0x2C1B}, /* 2C1A */ - {0x2C1C,0x2C4C,0x2C1C}, {0x2C1D,0x2C4D,0x2C1D}, /* 2C1C */ - {0x2C1E,0x2C4E,0x2C1E}, {0x2C1F,0x2C4F,0x2C1F}, /* 2C1E */ - {0x2C20,0x2C50,0x2C20}, {0x2C21,0x2C51,0x2C21}, /* 2C20 */ - {0x2C22,0x2C52,0x2C22}, {0x2C23,0x2C53,0x2C23}, /* 2C22 */ - {0x2C24,0x2C54,0x2C24}, {0x2C25,0x2C55,0x2C25}, /* 2C24 */ - {0x2C26,0x2C56,0x2C26}, {0x2C27,0x2C57,0x2C27}, /* 2C26 */ - {0x2C28,0x2C58,0x2C28}, {0x2C29,0x2C59,0x2C29}, /* 2C28 */ - {0x2C2A,0x2C5A,0x2C2A}, {0x2C2B,0x2C5B,0x2C2B}, /* 2C2A */ - {0x2C2C,0x2C5C,0x2C2C}, {0x2C2D,0x2C5D,0x2C2D}, /* 2C2C */ - {0x2C2E,0x2C5E,0x2C2E}, {0x2C2F,0x2C2F,0x2C2F}, /* 2C2E */ - {0x2C00,0x2C30,0x2C00}, {0x2C01,0x2C31,0x2C01}, /* 2C30 */ - {0x2C02,0x2C32,0x2C02}, {0x2C03,0x2C33,0x2C03}, /* 2C32 */ - {0x2C04,0x2C34,0x2C04}, {0x2C05,0x2C35,0x2C05}, /* 2C34 */ - {0x2C06,0x2C36,0x2C06}, {0x2C07,0x2C37,0x2C07}, /* 2C36 */ - {0x2C08,0x2C38,0x2C08}, {0x2C09,0x2C39,0x2C09}, /* 2C38 */ - {0x2C0A,0x2C3A,0x2C0A}, {0x2C0B,0x2C3B,0x2C0B}, /* 2C3A */ - {0x2C0C,0x2C3C,0x2C0C}, {0x2C0D,0x2C3D,0x2C0D}, /* 2C3C */ - {0x2C0E,0x2C3E,0x2C0E}, {0x2C0F,0x2C3F,0x2C0F}, /* 2C3E */ - {0x2C10,0x2C40,0x2C10}, {0x2C11,0x2C41,0x2C11}, /* 2C40 */ - {0x2C12,0x2C42,0x2C12}, {0x2C13,0x2C43,0x2C13}, /* 2C42 */ - {0x2C14,0x2C44,0x2C14}, {0x2C15,0x2C45,0x2C15}, /* 2C44 */ - {0x2C16,0x2C46,0x2C16}, {0x2C17,0x2C47,0x2C17}, /* 2C46 */ - {0x2C18,0x2C48,0x2C18}, {0x2C19,0x2C49,0x2C19}, /* 2C48 */ - {0x2C1A,0x2C4A,0x2C1A}, {0x2C1B,0x2C4B,0x2C1B}, /* 2C4A */ - {0x2C1C,0x2C4C,0x2C1C}, {0x2C1D,0x2C4D,0x2C1D}, /* 2C4C */ - {0x2C1E,0x2C4E,0x2C1E}, {0x2C1F,0x2C4F,0x2C1F}, /* 2C4E */ - {0x2C20,0x2C50,0x2C20}, {0x2C21,0x2C51,0x2C21}, /* 2C50 */ - {0x2C22,0x2C52,0x2C22}, {0x2C23,0x2C53,0x2C23}, /* 2C52 */ - {0x2C24,0x2C54,0x2C24}, {0x2C25,0x2C55,0x2C25}, /* 2C54 */ - {0x2C26,0x2C56,0x2C26}, {0x2C27,0x2C57,0x2C27}, /* 2C56 */ - {0x2C28,0x2C58,0x2C28}, {0x2C29,0x2C59,0x2C29}, /* 2C58 */ - {0x2C2A,0x2C5A,0x2C2A}, {0x2C2B,0x2C5B,0x2C2B}, /* 2C5A */ - {0x2C2C,0x2C5C,0x2C2C}, {0x2C2D,0x2C5D,0x2C2D}, /* 2C5C */ - {0x2C2E,0x2C5E,0x2C2E}, {0x2C5F,0x2C5F,0x2C5F}, /* 2C5E */ - {0x2C60,0x2C61,0x2C60}, {0x2C60,0x2C61,0x2C60}, /* 2C60 */ - {0x2C62,0x026B,0x2C62}, {0x2C63,0x1D7D,0x2C63}, /* 2C62 */ - {0x2C64,0x027D,0x2C64}, {0x023A,0x2C65,0x023A}, /* 2C64 */ - {0x023E,0x2C66,0x023E}, {0x2C67,0x2C68,0x2C67}, /* 2C66 */ - {0x2C67,0x2C68,0x2C67}, {0x2C69,0x2C6A,0x2C69}, /* 2C68 */ - {0x2C69,0x2C6A,0x2C69}, {0x2C6B,0x2C6C,0x2C6B}, /* 2C6A */ - {0x2C6B,0x2C6C,0x2C6B}, {0x2C6D,0x0251,0x2C6D}, /* 2C6C */ - {0x2C6E,0x0271,0x2C6E}, {0x2C6F,0x0250,0x2C6F}, /* 2C6E */ - {0x2C70,0x0252,0x2C70}, {0x2C71,0x2C71,0x2C71}, /* 2C70 */ - {0x2C72,0x2C73,0x2C72}, {0x2C72,0x2C73,0x2C72}, /* 2C72 */ - {0x2C74,0x2C74,0x2C74}, {0x2C75,0x2C76,0x2C75}, /* 2C74 */ - {0x2C75,0x2C76,0x2C75}, {0x2C77,0x2C77,0x2C77}, /* 2C76 */ - {0x2C78,0x2C78,0x2C78}, {0x2C79,0x2C79,0x2C79}, /* 2C78 */ - {0x2C7A,0x2C7A,0x2C7A}, {0x2C7B,0x2C7B,0x2C7B}, /* 2C7A */ - {0x2C7C,0x2C7C,0x2C7C}, {0x2C7D,0x2C7D,0x2C7D}, /* 2C7C */ - {0x2C7E,0x023F,0x2C7E}, {0x2C7F,0x0240,0x2C7F}, /* 2C7E */ - {0x2C80,0x2C81,0x2C80}, {0x2C80,0x2C81,0x2C80}, /* 2C80 */ - {0x2C82,0x2C83,0x2C82}, {0x2C82,0x2C83,0x2C82}, /* 2C82 */ - {0x2C84,0x2C85,0x2C84}, {0x2C84,0x2C85,0x2C84}, /* 2C84 */ - {0x2C86,0x2C87,0x2C86}, {0x2C86,0x2C87,0x2C86}, /* 2C86 */ - {0x2C88,0x2C89,0x2C88}, {0x2C88,0x2C89,0x2C88}, /* 2C88 */ - {0x2C8A,0x2C8B,0x2C8A}, {0x2C8A,0x2C8B,0x2C8A}, /* 2C8A */ - {0x2C8C,0x2C8D,0x2C8C}, {0x2C8C,0x2C8D,0x2C8C}, /* 2C8C */ - {0x2C8E,0x2C8F,0x2C8E}, {0x2C8E,0x2C8F,0x2C8E}, /* 2C8E */ - {0x2C90,0x2C91,0x2C90}, {0x2C90,0x2C91,0x2C90}, /* 2C90 */ - {0x2C92,0x2C93,0x2C92}, {0x2C92,0x2C93,0x2C92}, /* 2C92 */ - {0x2C94,0x2C95,0x2C94}, {0x2C94,0x2C95,0x2C94}, /* 2C94 */ - {0x2C96,0x2C97,0x2C96}, {0x2C96,0x2C97,0x2C96}, /* 2C96 */ - {0x2C98,0x2C99,0x2C98}, {0x2C98,0x2C99,0x2C98}, /* 2C98 */ - {0x2C9A,0x2C9B,0x2C9A}, {0x2C9A,0x2C9B,0x2C9A}, /* 2C9A */ - {0x2C9C,0x2C9D,0x2C9C}, {0x2C9C,0x2C9D,0x2C9C}, /* 2C9C */ - {0x2C9E,0x2C9F,0x2C9E}, {0x2C9E,0x2C9F,0x2C9E}, /* 2C9E */ - {0x2CA0,0x2CA1,0x2CA0}, {0x2CA0,0x2CA1,0x2CA0}, /* 2CA0 */ - {0x2CA2,0x2CA3,0x2CA2}, {0x2CA2,0x2CA3,0x2CA2}, /* 2CA2 */ - {0x2CA4,0x2CA5,0x2CA4}, {0x2CA4,0x2CA5,0x2CA4}, /* 2CA4 */ - {0x2CA6,0x2CA7,0x2CA6}, {0x2CA6,0x2CA7,0x2CA6}, /* 2CA6 */ - {0x2CA8,0x2CA9,0x2CA8}, {0x2CA8,0x2CA9,0x2CA8}, /* 2CA8 */ - {0x2CAA,0x2CAB,0x2CAA}, {0x2CAA,0x2CAB,0x2CAA}, /* 2CAA */ - {0x2CAC,0x2CAD,0x2CAC}, {0x2CAC,0x2CAD,0x2CAC}, /* 2CAC */ - {0x2CAE,0x2CAF,0x2CAE}, {0x2CAE,0x2CAF,0x2CAE}, /* 2CAE */ - {0x2CB0,0x2CB1,0x2CB0}, {0x2CB0,0x2CB1,0x2CB0}, /* 2CB0 */ - {0x2CB2,0x2CB3,0x2CB2}, {0x2CB2,0x2CB3,0x2CB2}, /* 2CB2 */ - {0x2CB4,0x2CB5,0x2CB4}, {0x2CB4,0x2CB5,0x2CB4}, /* 2CB4 */ - {0x2CB6,0x2CB7,0x2CB6}, {0x2CB6,0x2CB7,0x2CB6}, /* 2CB6 */ - {0x2CB8,0x2CB9,0x2CB8}, {0x2CB8,0x2CB9,0x2CB8}, /* 2CB8 */ - {0x2CBA,0x2CBB,0x2CBA}, {0x2CBA,0x2CBB,0x2CBA}, /* 2CBA */ - {0x2CBC,0x2CBD,0x2CBC}, {0x2CBC,0x2CBD,0x2CBC}, /* 2CBC */ - {0x2CBE,0x2CBF,0x2CBE}, {0x2CBE,0x2CBF,0x2CBE}, /* 2CBE */ - {0x2CC0,0x2CC1,0x2CC0}, {0x2CC0,0x2CC1,0x2CC0}, /* 2CC0 */ - {0x2CC2,0x2CC3,0x2CC2}, {0x2CC2,0x2CC3,0x2CC2}, /* 2CC2 */ - {0x2CC4,0x2CC5,0x2CC4}, {0x2CC4,0x2CC5,0x2CC4}, /* 2CC4 */ - {0x2CC6,0x2CC7,0x2CC6}, {0x2CC6,0x2CC7,0x2CC6}, /* 2CC6 */ - {0x2CC8,0x2CC9,0x2CC8}, {0x2CC8,0x2CC9,0x2CC8}, /* 2CC8 */ - {0x2CCA,0x2CCB,0x2CCA}, {0x2CCA,0x2CCB,0x2CCA}, /* 2CCA */ - {0x2CCC,0x2CCD,0x2CCC}, {0x2CCC,0x2CCD,0x2CCC}, /* 2CCC */ - {0x2CCE,0x2CCF,0x2CCE}, {0x2CCE,0x2CCF,0x2CCE}, /* 2CCE */ - {0x2CD0,0x2CD1,0x2CD0}, {0x2CD0,0x2CD1,0x2CD0}, /* 2CD0 */ - {0x2CD2,0x2CD3,0x2CD2}, {0x2CD2,0x2CD3,0x2CD2}, /* 2CD2 */ - {0x2CD4,0x2CD5,0x2CD4}, {0x2CD4,0x2CD5,0x2CD4}, /* 2CD4 */ - {0x2CD6,0x2CD7,0x2CD6}, {0x2CD6,0x2CD7,0x2CD6}, /* 2CD6 */ - {0x2CD8,0x2CD9,0x2CD8}, {0x2CD8,0x2CD9,0x2CD8}, /* 2CD8 */ - {0x2CDA,0x2CDB,0x2CDA}, {0x2CDA,0x2CDB,0x2CDA}, /* 2CDA */ - {0x2CDC,0x2CDD,0x2CDC}, {0x2CDC,0x2CDD,0x2CDC}, /* 2CDC */ - {0x2CDE,0x2CDF,0x2CDE}, {0x2CDE,0x2CDF,0x2CDE}, /* 2CDE */ - {0x2CE0,0x2CE1,0x2CE0}, {0x2CE0,0x2CE1,0x2CE0}, /* 2CE0 */ - {0x2CE2,0x2CE3,0x2CE2}, {0x2CE2,0x2CE3,0x2CE2}, /* 2CE2 */ - {0x2CE4,0x2CE4,0x2CE4}, {0x2CE5,0x2CE5,0x2CE5}, /* 2CE4 */ - {0x2CE6,0x2CE6,0x2CE6}, {0x2CE7,0x2CE7,0x2CE7}, /* 2CE6 */ - {0x2CE8,0x2CE8,0x2CE8}, {0x2CE9,0x2CE9,0x2CE9}, /* 2CE8 */ - {0x2CEA,0x2CEA,0x2CEA}, {0x2CEB,0x2CEC,0x2CEB}, /* 2CEA */ - {0x2CEB,0x2CEC,0x2CEB}, {0x2CED,0x2CEE,0x2CED}, /* 2CEC */ - {0x2CED,0x2CEE,0x2CED}, {0x2CEF,0x2CEF,0x2CEF}, /* 2CEE */ - {0x2CF0,0x2CF0,0x2CF0}, {0x2CF1,0x2CF1,0x2CF1}, /* 2CF0 */ - {0x2CF2,0x2CF2,0x2CF2}, {0x2CF3,0x2CF3,0x2CF3}, /* 2CF2 */ - {0x2CF4,0x2CF4,0x2CF4}, {0x2CF5,0x2CF5,0x2CF5}, /* 2CF4 */ - {0x2CF6,0x2CF6,0x2CF6}, {0x2CF7,0x2CF7,0x2CF7}, /* 2CF6 */ - {0x2CF8,0x2CF8,0x2CF8}, {0x2CF9,0x2CF9,0x2CF9}, /* 2CF8 */ - {0x2CFA,0x2CFA,0x2CFA}, {0x2CFB,0x2CFB,0x2CFB}, /* 2CFA */ - {0x2CFC,0x2CFC,0x2CFC}, {0x2CFD,0x2CFD,0x2CFD}, /* 2CFC */ - {0x2CFE,0x2CFE,0x2CFE}, {0x2CFF,0x2CFF,0x2CFF} /* 2CFE */ -}; - -static MY_UNICASE_CHARACTER u520p2D[]={ - {0x10A0,0x2D00,0x10A0}, {0x10A1,0x2D01,0x10A1}, /* 2D00 */ - {0x10A2,0x2D02,0x10A2}, {0x10A3,0x2D03,0x10A3}, /* 2D02 */ - {0x10A4,0x2D04,0x10A4}, {0x10A5,0x2D05,0x10A5}, /* 2D04 */ - {0x10A6,0x2D06,0x10A6}, {0x10A7,0x2D07,0x10A7}, /* 2D06 */ - {0x10A8,0x2D08,0x10A8}, {0x10A9,0x2D09,0x10A9}, /* 2D08 */ - {0x10AA,0x2D0A,0x10AA}, {0x10AB,0x2D0B,0x10AB}, /* 2D0A */ - {0x10AC,0x2D0C,0x10AC}, {0x10AD,0x2D0D,0x10AD}, /* 2D0C */ - {0x10AE,0x2D0E,0x10AE}, {0x10AF,0x2D0F,0x10AF}, /* 2D0E */ - {0x10B0,0x2D10,0x10B0}, {0x10B1,0x2D11,0x10B1}, /* 2D10 */ - {0x10B2,0x2D12,0x10B2}, {0x10B3,0x2D13,0x10B3}, /* 2D12 */ - {0x10B4,0x2D14,0x10B4}, {0x10B5,0x2D15,0x10B5}, /* 2D14 */ - {0x10B6,0x2D16,0x10B6}, {0x10B7,0x2D17,0x10B7}, /* 2D16 */ - {0x10B8,0x2D18,0x10B8}, {0x10B9,0x2D19,0x10B9}, /* 2D18 */ - {0x10BA,0x2D1A,0x10BA}, {0x10BB,0x2D1B,0x10BB}, /* 2D1A */ - {0x10BC,0x2D1C,0x10BC}, {0x10BD,0x2D1D,0x10BD}, /* 2D1C */ - {0x10BE,0x2D1E,0x10BE}, {0x10BF,0x2D1F,0x10BF}, /* 2D1E */ - {0x10C0,0x2D20,0x10C0}, {0x10C1,0x2D21,0x10C1}, /* 2D20 */ - {0x10C2,0x2D22,0x10C2}, {0x10C3,0x2D23,0x10C3}, /* 2D22 */ - {0x10C4,0x2D24,0x10C4}, {0x10C5,0x2D25,0x10C5}, /* 2D24 */ - {0x2D26,0x2D26,0x2D26}, {0x2D27,0x2D27,0x2D27}, /* 2D26 */ - {0x2D28,0x2D28,0x2D28}, {0x2D29,0x2D29,0x2D29}, /* 2D28 */ - {0x2D2A,0x2D2A,0x2D2A}, {0x2D2B,0x2D2B,0x2D2B}, /* 2D2A */ - {0x2D2C,0x2D2C,0x2D2C}, {0x2D2D,0x2D2D,0x2D2D}, /* 2D2C */ - {0x2D2E,0x2D2E,0x2D2E}, {0x2D2F,0x2D2F,0x2D2F}, /* 2D2E */ - {0x2D30,0x2D30,0x2D30}, {0x2D31,0x2D31,0x2D31}, /* 2D30 */ - {0x2D32,0x2D32,0x2D32}, {0x2D33,0x2D33,0x2D33}, /* 2D32 */ - {0x2D34,0x2D34,0x2D34}, {0x2D35,0x2D35,0x2D35}, /* 2D34 */ - {0x2D36,0x2D36,0x2D36}, {0x2D37,0x2D37,0x2D37}, /* 2D36 */ - {0x2D38,0x2D38,0x2D38}, {0x2D39,0x2D39,0x2D39}, /* 2D38 */ - {0x2D3A,0x2D3A,0x2D3A}, {0x2D3B,0x2D3B,0x2D3B}, /* 2D3A */ - {0x2D3C,0x2D3C,0x2D3C}, {0x2D3D,0x2D3D,0x2D3D}, /* 2D3C */ - {0x2D3E,0x2D3E,0x2D3E}, {0x2D3F,0x2D3F,0x2D3F}, /* 2D3E */ - {0x2D40,0x2D40,0x2D40}, {0x2D41,0x2D41,0x2D41}, /* 2D40 */ - {0x2D42,0x2D42,0x2D42}, {0x2D43,0x2D43,0x2D43}, /* 2D42 */ - {0x2D44,0x2D44,0x2D44}, {0x2D45,0x2D45,0x2D45}, /* 2D44 */ - {0x2D46,0x2D46,0x2D46}, {0x2D47,0x2D47,0x2D47}, /* 2D46 */ - {0x2D48,0x2D48,0x2D48}, {0x2D49,0x2D49,0x2D49}, /* 2D48 */ - {0x2D4A,0x2D4A,0x2D4A}, {0x2D4B,0x2D4B,0x2D4B}, /* 2D4A */ - {0x2D4C,0x2D4C,0x2D4C}, {0x2D4D,0x2D4D,0x2D4D}, /* 2D4C */ - {0x2D4E,0x2D4E,0x2D4E}, {0x2D4F,0x2D4F,0x2D4F}, /* 2D4E */ - {0x2D50,0x2D50,0x2D50}, {0x2D51,0x2D51,0x2D51}, /* 2D50 */ - {0x2D52,0x2D52,0x2D52}, {0x2D53,0x2D53,0x2D53}, /* 2D52 */ - {0x2D54,0x2D54,0x2D54}, {0x2D55,0x2D55,0x2D55}, /* 2D54 */ - {0x2D56,0x2D56,0x2D56}, {0x2D57,0x2D57,0x2D57}, /* 2D56 */ - {0x2D58,0x2D58,0x2D58}, {0x2D59,0x2D59,0x2D59}, /* 2D58 */ - {0x2D5A,0x2D5A,0x2D5A}, {0x2D5B,0x2D5B,0x2D5B}, /* 2D5A */ - {0x2D5C,0x2D5C,0x2D5C}, {0x2D5D,0x2D5D,0x2D5D}, /* 2D5C */ - {0x2D5E,0x2D5E,0x2D5E}, {0x2D5F,0x2D5F,0x2D5F}, /* 2D5E */ - {0x2D60,0x2D60,0x2D60}, {0x2D61,0x2D61,0x2D61}, /* 2D60 */ - {0x2D62,0x2D62,0x2D62}, {0x2D63,0x2D63,0x2D63}, /* 2D62 */ - {0x2D64,0x2D64,0x2D64}, {0x2D65,0x2D65,0x2D65}, /* 2D64 */ - {0x2D66,0x2D66,0x2D66}, {0x2D67,0x2D67,0x2D67}, /* 2D66 */ - {0x2D68,0x2D68,0x2D68}, {0x2D69,0x2D69,0x2D69}, /* 2D68 */ - {0x2D6A,0x2D6A,0x2D6A}, {0x2D6B,0x2D6B,0x2D6B}, /* 2D6A */ - {0x2D6C,0x2D6C,0x2D6C}, {0x2D6D,0x2D6D,0x2D6D}, /* 2D6C */ - {0x2D6E,0x2D6E,0x2D6E}, {0x2D6F,0x2D6F,0x2D6F}, /* 2D6E */ - {0x2D70,0x2D70,0x2D70}, {0x2D71,0x2D71,0x2D71}, /* 2D70 */ - {0x2D72,0x2D72,0x2D72}, {0x2D73,0x2D73,0x2D73}, /* 2D72 */ - {0x2D74,0x2D74,0x2D74}, {0x2D75,0x2D75,0x2D75}, /* 2D74 */ - {0x2D76,0x2D76,0x2D76}, {0x2D77,0x2D77,0x2D77}, /* 2D76 */ - {0x2D78,0x2D78,0x2D78}, {0x2D79,0x2D79,0x2D79}, /* 2D78 */ - {0x2D7A,0x2D7A,0x2D7A}, {0x2D7B,0x2D7B,0x2D7B}, /* 2D7A */ - {0x2D7C,0x2D7C,0x2D7C}, {0x2D7D,0x2D7D,0x2D7D}, /* 2D7C */ - {0x2D7E,0x2D7E,0x2D7E}, {0x2D7F,0x2D7F,0x2D7F}, /* 2D7E */ - {0x2D80,0x2D80,0x2D80}, {0x2D81,0x2D81,0x2D81}, /* 2D80 */ - {0x2D82,0x2D82,0x2D82}, {0x2D83,0x2D83,0x2D83}, /* 2D82 */ - {0x2D84,0x2D84,0x2D84}, {0x2D85,0x2D85,0x2D85}, /* 2D84 */ - {0x2D86,0x2D86,0x2D86}, {0x2D87,0x2D87,0x2D87}, /* 2D86 */ - {0x2D88,0x2D88,0x2D88}, {0x2D89,0x2D89,0x2D89}, /* 2D88 */ - {0x2D8A,0x2D8A,0x2D8A}, {0x2D8B,0x2D8B,0x2D8B}, /* 2D8A */ - {0x2D8C,0x2D8C,0x2D8C}, {0x2D8D,0x2D8D,0x2D8D}, /* 2D8C */ - {0x2D8E,0x2D8E,0x2D8E}, {0x2D8F,0x2D8F,0x2D8F}, /* 2D8E */ - {0x2D90,0x2D90,0x2D90}, {0x2D91,0x2D91,0x2D91}, /* 2D90 */ - {0x2D92,0x2D92,0x2D92}, {0x2D93,0x2D93,0x2D93}, /* 2D92 */ - {0x2D94,0x2D94,0x2D94}, {0x2D95,0x2D95,0x2D95}, /* 2D94 */ - {0x2D96,0x2D96,0x2D96}, {0x2D97,0x2D97,0x2D97}, /* 2D96 */ - {0x2D98,0x2D98,0x2D98}, {0x2D99,0x2D99,0x2D99}, /* 2D98 */ - {0x2D9A,0x2D9A,0x2D9A}, {0x2D9B,0x2D9B,0x2D9B}, /* 2D9A */ - {0x2D9C,0x2D9C,0x2D9C}, {0x2D9D,0x2D9D,0x2D9D}, /* 2D9C */ - {0x2D9E,0x2D9E,0x2D9E}, {0x2D9F,0x2D9F,0x2D9F}, /* 2D9E */ - {0x2DA0,0x2DA0,0x2DA0}, {0x2DA1,0x2DA1,0x2DA1}, /* 2DA0 */ - {0x2DA2,0x2DA2,0x2DA2}, {0x2DA3,0x2DA3,0x2DA3}, /* 2DA2 */ - {0x2DA4,0x2DA4,0x2DA4}, {0x2DA5,0x2DA5,0x2DA5}, /* 2DA4 */ - {0x2DA6,0x2DA6,0x2DA6}, {0x2DA7,0x2DA7,0x2DA7}, /* 2DA6 */ - {0x2DA8,0x2DA8,0x2DA8}, {0x2DA9,0x2DA9,0x2DA9}, /* 2DA8 */ - {0x2DAA,0x2DAA,0x2DAA}, {0x2DAB,0x2DAB,0x2DAB}, /* 2DAA */ - {0x2DAC,0x2DAC,0x2DAC}, {0x2DAD,0x2DAD,0x2DAD}, /* 2DAC */ - {0x2DAE,0x2DAE,0x2DAE}, {0x2DAF,0x2DAF,0x2DAF}, /* 2DAE */ - {0x2DB0,0x2DB0,0x2DB0}, {0x2DB1,0x2DB1,0x2DB1}, /* 2DB0 */ - {0x2DB2,0x2DB2,0x2DB2}, {0x2DB3,0x2DB3,0x2DB3}, /* 2DB2 */ - {0x2DB4,0x2DB4,0x2DB4}, {0x2DB5,0x2DB5,0x2DB5}, /* 2DB4 */ - {0x2DB6,0x2DB6,0x2DB6}, {0x2DB7,0x2DB7,0x2DB7}, /* 2DB6 */ - {0x2DB8,0x2DB8,0x2DB8}, {0x2DB9,0x2DB9,0x2DB9}, /* 2DB8 */ - {0x2DBA,0x2DBA,0x2DBA}, {0x2DBB,0x2DBB,0x2DBB}, /* 2DBA */ - {0x2DBC,0x2DBC,0x2DBC}, {0x2DBD,0x2DBD,0x2DBD}, /* 2DBC */ - {0x2DBE,0x2DBE,0x2DBE}, {0x2DBF,0x2DBF,0x2DBF}, /* 2DBE */ - {0x2DC0,0x2DC0,0x2DC0}, {0x2DC1,0x2DC1,0x2DC1}, /* 2DC0 */ - {0x2DC2,0x2DC2,0x2DC2}, {0x2DC3,0x2DC3,0x2DC3}, /* 2DC2 */ - {0x2DC4,0x2DC4,0x2DC4}, {0x2DC5,0x2DC5,0x2DC5}, /* 2DC4 */ - {0x2DC6,0x2DC6,0x2DC6}, {0x2DC7,0x2DC7,0x2DC7}, /* 2DC6 */ - {0x2DC8,0x2DC8,0x2DC8}, {0x2DC9,0x2DC9,0x2DC9}, /* 2DC8 */ - {0x2DCA,0x2DCA,0x2DCA}, {0x2DCB,0x2DCB,0x2DCB}, /* 2DCA */ - {0x2DCC,0x2DCC,0x2DCC}, {0x2DCD,0x2DCD,0x2DCD}, /* 2DCC */ - {0x2DCE,0x2DCE,0x2DCE}, {0x2DCF,0x2DCF,0x2DCF}, /* 2DCE */ - {0x2DD0,0x2DD0,0x2DD0}, {0x2DD1,0x2DD1,0x2DD1}, /* 2DD0 */ - {0x2DD2,0x2DD2,0x2DD2}, {0x2DD3,0x2DD3,0x2DD3}, /* 2DD2 */ - {0x2DD4,0x2DD4,0x2DD4}, {0x2DD5,0x2DD5,0x2DD5}, /* 2DD4 */ - {0x2DD6,0x2DD6,0x2DD6}, {0x2DD7,0x2DD7,0x2DD7}, /* 2DD6 */ - {0x2DD8,0x2DD8,0x2DD8}, {0x2DD9,0x2DD9,0x2DD9}, /* 2DD8 */ - {0x2DDA,0x2DDA,0x2DDA}, {0x2DDB,0x2DDB,0x2DDB}, /* 2DDA */ - {0x2DDC,0x2DDC,0x2DDC}, {0x2DDD,0x2DDD,0x2DDD}, /* 2DDC */ - {0x2DDE,0x2DDE,0x2DDE}, {0x2DDF,0x2DDF,0x2DDF}, /* 2DDE */ - {0x2DE0,0x2DE0,0x2DE0}, {0x2DE1,0x2DE1,0x2DE1}, /* 2DE0 */ - {0x2DE2,0x2DE2,0x2DE2}, {0x2DE3,0x2DE3,0x2DE3}, /* 2DE2 */ - {0x2DE4,0x2DE4,0x2DE4}, {0x2DE5,0x2DE5,0x2DE5}, /* 2DE4 */ - {0x2DE6,0x2DE6,0x2DE6}, {0x2DE7,0x2DE7,0x2DE7}, /* 2DE6 */ - {0x2DE8,0x2DE8,0x2DE8}, {0x2DE9,0x2DE9,0x2DE9}, /* 2DE8 */ - {0x2DEA,0x2DEA,0x2DEA}, {0x2DEB,0x2DEB,0x2DEB}, /* 2DEA */ - {0x2DEC,0x2DEC,0x2DEC}, {0x2DED,0x2DED,0x2DED}, /* 2DEC */ - {0x2DEE,0x2DEE,0x2DEE}, {0x2DEF,0x2DEF,0x2DEF}, /* 2DEE */ - {0x2DF0,0x2DF0,0x2DF0}, {0x2DF1,0x2DF1,0x2DF1}, /* 2DF0 */ - {0x2DF2,0x2DF2,0x2DF2}, {0x2DF3,0x2DF3,0x2DF3}, /* 2DF2 */ - {0x2DF4,0x2DF4,0x2DF4}, {0x2DF5,0x2DF5,0x2DF5}, /* 2DF4 */ - {0x2DF6,0x2DF6,0x2DF6}, {0x2DF7,0x2DF7,0x2DF7}, /* 2DF6 */ - {0x2DF8,0x2DF8,0x2DF8}, {0x2DF9,0x2DF9,0x2DF9}, /* 2DF8 */ - {0x2DFA,0x2DFA,0x2DFA}, {0x2DFB,0x2DFB,0x2DFB}, /* 2DFA */ - {0x2DFC,0x2DFC,0x2DFC}, {0x2DFD,0x2DFD,0x2DFD}, /* 2DFC */ - {0x2DFE,0x2DFE,0x2DFE}, {0x2DFF,0x2DFF,0x2DFF} /* 2DFE */ -}; - -static MY_UNICASE_CHARACTER u520pA6[]={ - {0xA600,0xA600,0xA600}, {0xA601,0xA601,0xA601}, /* A600 */ - {0xA602,0xA602,0xA602}, {0xA603,0xA603,0xA603}, /* A602 */ - {0xA604,0xA604,0xA604}, {0xA605,0xA605,0xA605}, /* A604 */ - {0xA606,0xA606,0xA606}, {0xA607,0xA607,0xA607}, /* A606 */ - {0xA608,0xA608,0xA608}, {0xA609,0xA609,0xA609}, /* A608 */ - {0xA60A,0xA60A,0xA60A}, {0xA60B,0xA60B,0xA60B}, /* A60A */ - {0xA60C,0xA60C,0xA60C}, {0xA60D,0xA60D,0xA60D}, /* A60C */ - {0xA60E,0xA60E,0xA60E}, {0xA60F,0xA60F,0xA60F}, /* A60E */ - {0xA610,0xA610,0xA610}, {0xA611,0xA611,0xA611}, /* A610 */ - {0xA612,0xA612,0xA612}, {0xA613,0xA613,0xA613}, /* A612 */ - {0xA614,0xA614,0xA614}, {0xA615,0xA615,0xA615}, /* A614 */ - {0xA616,0xA616,0xA616}, {0xA617,0xA617,0xA617}, /* A616 */ - {0xA618,0xA618,0xA618}, {0xA619,0xA619,0xA619}, /* A618 */ - {0xA61A,0xA61A,0xA61A}, {0xA61B,0xA61B,0xA61B}, /* A61A */ - {0xA61C,0xA61C,0xA61C}, {0xA61D,0xA61D,0xA61D}, /* A61C */ - {0xA61E,0xA61E,0xA61E}, {0xA61F,0xA61F,0xA61F}, /* A61E */ - {0xA620,0xA620,0xA620}, {0xA621,0xA621,0xA621}, /* A620 */ - {0xA622,0xA622,0xA622}, {0xA623,0xA623,0xA623}, /* A622 */ - {0xA624,0xA624,0xA624}, {0xA625,0xA625,0xA625}, /* A624 */ - {0xA626,0xA626,0xA626}, {0xA627,0xA627,0xA627}, /* A626 */ - {0xA628,0xA628,0xA628}, {0xA629,0xA629,0xA629}, /* A628 */ - {0xA62A,0xA62A,0xA62A}, {0xA62B,0xA62B,0xA62B}, /* A62A */ - {0xA62C,0xA62C,0xA62C}, {0xA62D,0xA62D,0xA62D}, /* A62C */ - {0xA62E,0xA62E,0xA62E}, {0xA62F,0xA62F,0xA62F}, /* A62E */ - {0xA630,0xA630,0xA630}, {0xA631,0xA631,0xA631}, /* A630 */ - {0xA632,0xA632,0xA632}, {0xA633,0xA633,0xA633}, /* A632 */ - {0xA634,0xA634,0xA634}, {0xA635,0xA635,0xA635}, /* A634 */ - {0xA636,0xA636,0xA636}, {0xA637,0xA637,0xA637}, /* A636 */ - {0xA638,0xA638,0xA638}, {0xA639,0xA639,0xA639}, /* A638 */ - {0xA63A,0xA63A,0xA63A}, {0xA63B,0xA63B,0xA63B}, /* A63A */ - {0xA63C,0xA63C,0xA63C}, {0xA63D,0xA63D,0xA63D}, /* A63C */ - {0xA63E,0xA63E,0xA63E}, {0xA63F,0xA63F,0xA63F}, /* A63E */ - {0xA640,0xA641,0xA640}, {0xA640,0xA641,0xA640}, /* A640 */ - {0xA642,0xA643,0xA642}, {0xA642,0xA643,0xA642}, /* A642 */ - {0xA644,0xA645,0xA644}, {0xA644,0xA645,0xA644}, /* A644 */ - {0xA646,0xA647,0xA646}, {0xA646,0xA647,0xA646}, /* A646 */ - {0xA648,0xA649,0xA648}, {0xA648,0xA649,0xA648}, /* A648 */ - {0xA64A,0xA64B,0xA64A}, {0xA64A,0xA64B,0xA64A}, /* A64A */ - {0xA64C,0xA64D,0xA64C}, {0xA64C,0xA64D,0xA64C}, /* A64C */ - {0xA64E,0xA64F,0xA64E}, {0xA64E,0xA64F,0xA64E}, /* A64E */ - {0xA650,0xA651,0xA650}, {0xA650,0xA651,0xA650}, /* A650 */ - {0xA652,0xA653,0xA652}, {0xA652,0xA653,0xA652}, /* A652 */ - {0xA654,0xA655,0xA654}, {0xA654,0xA655,0xA654}, /* A654 */ - {0xA656,0xA657,0xA656}, {0xA656,0xA657,0xA656}, /* A656 */ - {0xA658,0xA659,0xA658}, {0xA658,0xA659,0xA658}, /* A658 */ - {0xA65A,0xA65B,0xA65A}, {0xA65A,0xA65B,0xA65A}, /* A65A */ - {0xA65C,0xA65D,0xA65C}, {0xA65C,0xA65D,0xA65C}, /* A65C */ - {0xA65E,0xA65F,0xA65E}, {0xA65E,0xA65F,0xA65E}, /* A65E */ - {0xA660,0xA660,0xA660}, {0xA661,0xA661,0xA661}, /* A660 */ - {0xA662,0xA663,0xA662}, {0xA662,0xA663,0xA662}, /* A662 */ - {0xA664,0xA665,0xA664}, {0xA664,0xA665,0xA664}, /* A664 */ - {0xA666,0xA667,0xA666}, {0xA666,0xA667,0xA666}, /* A666 */ - {0xA668,0xA669,0xA668}, {0xA668,0xA669,0xA668}, /* A668 */ - {0xA66A,0xA66B,0xA66A}, {0xA66A,0xA66B,0xA66A}, /* A66A */ - {0xA66C,0xA66D,0xA66C}, {0xA66C,0xA66D,0xA66C}, /* A66C */ - {0xA66E,0xA66E,0xA66E}, {0xA66F,0xA66F,0xA66F}, /* A66E */ - {0xA670,0xA670,0xA670}, {0xA671,0xA671,0xA671}, /* A670 */ - {0xA672,0xA672,0xA672}, {0xA673,0xA673,0xA673}, /* A672 */ - {0xA674,0xA674,0xA674}, {0xA675,0xA675,0xA675}, /* A674 */ - {0xA676,0xA676,0xA676}, {0xA677,0xA677,0xA677}, /* A676 */ - {0xA678,0xA678,0xA678}, {0xA679,0xA679,0xA679}, /* A678 */ - {0xA67A,0xA67A,0xA67A}, {0xA67B,0xA67B,0xA67B}, /* A67A */ - {0xA67C,0xA67C,0xA67C}, {0xA67D,0xA67D,0xA67D}, /* A67C */ - {0xA67E,0xA67E,0xA67E}, {0xA67F,0xA67F,0xA67F}, /* A67E */ - {0xA680,0xA681,0xA680}, {0xA680,0xA681,0xA680}, /* A680 */ - {0xA682,0xA683,0xA682}, {0xA682,0xA683,0xA682}, /* A682 */ - {0xA684,0xA685,0xA684}, {0xA684,0xA685,0xA684}, /* A684 */ - {0xA686,0xA687,0xA686}, {0xA686,0xA687,0xA686}, /* A686 */ - {0xA688,0xA689,0xA688}, {0xA688,0xA689,0xA688}, /* A688 */ - {0xA68A,0xA68B,0xA68A}, {0xA68A,0xA68B,0xA68A}, /* A68A */ - {0xA68C,0xA68D,0xA68C}, {0xA68C,0xA68D,0xA68C}, /* A68C */ - {0xA68E,0xA68F,0xA68E}, {0xA68E,0xA68F,0xA68E}, /* A68E */ - {0xA690,0xA691,0xA690}, {0xA690,0xA691,0xA690}, /* A690 */ - {0xA692,0xA693,0xA692}, {0xA692,0xA693,0xA692}, /* A692 */ - {0xA694,0xA695,0xA694}, {0xA694,0xA695,0xA694}, /* A694 */ - {0xA696,0xA697,0xA696}, {0xA696,0xA697,0xA696}, /* A696 */ - {0xA698,0xA698,0xA698}, {0xA699,0xA699,0xA699}, /* A698 */ - {0xA69A,0xA69A,0xA69A}, {0xA69B,0xA69B,0xA69B}, /* A69A */ - {0xA69C,0xA69C,0xA69C}, {0xA69D,0xA69D,0xA69D}, /* A69C */ - {0xA69E,0xA69E,0xA69E}, {0xA69F,0xA69F,0xA69F}, /* A69E */ - {0xA6A0,0xA6A0,0xA6A0}, {0xA6A1,0xA6A1,0xA6A1}, /* A6A0 */ - {0xA6A2,0xA6A2,0xA6A2}, {0xA6A3,0xA6A3,0xA6A3}, /* A6A2 */ - {0xA6A4,0xA6A4,0xA6A4}, {0xA6A5,0xA6A5,0xA6A5}, /* A6A4 */ - {0xA6A6,0xA6A6,0xA6A6}, {0xA6A7,0xA6A7,0xA6A7}, /* A6A6 */ - {0xA6A8,0xA6A8,0xA6A8}, {0xA6A9,0xA6A9,0xA6A9}, /* A6A8 */ - {0xA6AA,0xA6AA,0xA6AA}, {0xA6AB,0xA6AB,0xA6AB}, /* A6AA */ - {0xA6AC,0xA6AC,0xA6AC}, {0xA6AD,0xA6AD,0xA6AD}, /* A6AC */ - {0xA6AE,0xA6AE,0xA6AE}, {0xA6AF,0xA6AF,0xA6AF}, /* A6AE */ - {0xA6B0,0xA6B0,0xA6B0}, {0xA6B1,0xA6B1,0xA6B1}, /* A6B0 */ - {0xA6B2,0xA6B2,0xA6B2}, {0xA6B3,0xA6B3,0xA6B3}, /* A6B2 */ - {0xA6B4,0xA6B4,0xA6B4}, {0xA6B5,0xA6B5,0xA6B5}, /* A6B4 */ - {0xA6B6,0xA6B6,0xA6B6}, {0xA6B7,0xA6B7,0xA6B7}, /* A6B6 */ - {0xA6B8,0xA6B8,0xA6B8}, {0xA6B9,0xA6B9,0xA6B9}, /* A6B8 */ - {0xA6BA,0xA6BA,0xA6BA}, {0xA6BB,0xA6BB,0xA6BB}, /* A6BA */ - {0xA6BC,0xA6BC,0xA6BC}, {0xA6BD,0xA6BD,0xA6BD}, /* A6BC */ - {0xA6BE,0xA6BE,0xA6BE}, {0xA6BF,0xA6BF,0xA6BF}, /* A6BE */ - {0xA6C0,0xA6C0,0xA6C0}, {0xA6C1,0xA6C1,0xA6C1}, /* A6C0 */ - {0xA6C2,0xA6C2,0xA6C2}, {0xA6C3,0xA6C3,0xA6C3}, /* A6C2 */ - {0xA6C4,0xA6C4,0xA6C4}, {0xA6C5,0xA6C5,0xA6C5}, /* A6C4 */ - {0xA6C6,0xA6C6,0xA6C6}, {0xA6C7,0xA6C7,0xA6C7}, /* A6C6 */ - {0xA6C8,0xA6C8,0xA6C8}, {0xA6C9,0xA6C9,0xA6C9}, /* A6C8 */ - {0xA6CA,0xA6CA,0xA6CA}, {0xA6CB,0xA6CB,0xA6CB}, /* A6CA */ - {0xA6CC,0xA6CC,0xA6CC}, {0xA6CD,0xA6CD,0xA6CD}, /* A6CC */ - {0xA6CE,0xA6CE,0xA6CE}, {0xA6CF,0xA6CF,0xA6CF}, /* A6CE */ - {0xA6D0,0xA6D0,0xA6D0}, {0xA6D1,0xA6D1,0xA6D1}, /* A6D0 */ - {0xA6D2,0xA6D2,0xA6D2}, {0xA6D3,0xA6D3,0xA6D3}, /* A6D2 */ - {0xA6D4,0xA6D4,0xA6D4}, {0xA6D5,0xA6D5,0xA6D5}, /* A6D4 */ - {0xA6D6,0xA6D6,0xA6D6}, {0xA6D7,0xA6D7,0xA6D7}, /* A6D6 */ - {0xA6D8,0xA6D8,0xA6D8}, {0xA6D9,0xA6D9,0xA6D9}, /* A6D8 */ - {0xA6DA,0xA6DA,0xA6DA}, {0xA6DB,0xA6DB,0xA6DB}, /* A6DA */ - {0xA6DC,0xA6DC,0xA6DC}, {0xA6DD,0xA6DD,0xA6DD}, /* A6DC */ - {0xA6DE,0xA6DE,0xA6DE}, {0xA6DF,0xA6DF,0xA6DF}, /* A6DE */ - {0xA6E0,0xA6E0,0xA6E0}, {0xA6E1,0xA6E1,0xA6E1}, /* A6E0 */ - {0xA6E2,0xA6E2,0xA6E2}, {0xA6E3,0xA6E3,0xA6E3}, /* A6E2 */ - {0xA6E4,0xA6E4,0xA6E4}, {0xA6E5,0xA6E5,0xA6E5}, /* A6E4 */ - {0xA6E6,0xA6E6,0xA6E6}, {0xA6E7,0xA6E7,0xA6E7}, /* A6E6 */ - {0xA6E8,0xA6E8,0xA6E8}, {0xA6E9,0xA6E9,0xA6E9}, /* A6E8 */ - {0xA6EA,0xA6EA,0xA6EA}, {0xA6EB,0xA6EB,0xA6EB}, /* A6EA */ - {0xA6EC,0xA6EC,0xA6EC}, {0xA6ED,0xA6ED,0xA6ED}, /* A6EC */ - {0xA6EE,0xA6EE,0xA6EE}, {0xA6EF,0xA6EF,0xA6EF}, /* A6EE */ - {0xA6F0,0xA6F0,0xA6F0}, {0xA6F1,0xA6F1,0xA6F1}, /* A6F0 */ - {0xA6F2,0xA6F2,0xA6F2}, {0xA6F3,0xA6F3,0xA6F3}, /* A6F2 */ - {0xA6F4,0xA6F4,0xA6F4}, {0xA6F5,0xA6F5,0xA6F5}, /* A6F4 */ - {0xA6F6,0xA6F6,0xA6F6}, {0xA6F7,0xA6F7,0xA6F7}, /* A6F6 */ - {0xA6F8,0xA6F8,0xA6F8}, {0xA6F9,0xA6F9,0xA6F9}, /* A6F8 */ - {0xA6FA,0xA6FA,0xA6FA}, {0xA6FB,0xA6FB,0xA6FB}, /* A6FA */ - {0xA6FC,0xA6FC,0xA6FC}, {0xA6FD,0xA6FD,0xA6FD}, /* A6FC */ - {0xA6FE,0xA6FE,0xA6FE}, {0xA6FF,0xA6FF,0xA6FF} /* A6FE */ -}; - -static MY_UNICASE_CHARACTER u520pA7[]={ - {0xA700,0xA700,0xA700}, {0xA701,0xA701,0xA701}, /* A700 */ - {0xA702,0xA702,0xA702}, {0xA703,0xA703,0xA703}, /* A702 */ - {0xA704,0xA704,0xA704}, {0xA705,0xA705,0xA705}, /* A704 */ - {0xA706,0xA706,0xA706}, {0xA707,0xA707,0xA707}, /* A706 */ - {0xA708,0xA708,0xA708}, {0xA709,0xA709,0xA709}, /* A708 */ - {0xA70A,0xA70A,0xA70A}, {0xA70B,0xA70B,0xA70B}, /* A70A */ - {0xA70C,0xA70C,0xA70C}, {0xA70D,0xA70D,0xA70D}, /* A70C */ - {0xA70E,0xA70E,0xA70E}, {0xA70F,0xA70F,0xA70F}, /* A70E */ - {0xA710,0xA710,0xA710}, {0xA711,0xA711,0xA711}, /* A710 */ - {0xA712,0xA712,0xA712}, {0xA713,0xA713,0xA713}, /* A712 */ - {0xA714,0xA714,0xA714}, {0xA715,0xA715,0xA715}, /* A714 */ - {0xA716,0xA716,0xA716}, {0xA717,0xA717,0xA717}, /* A716 */ - {0xA718,0xA718,0xA718}, {0xA719,0xA719,0xA719}, /* A718 */ - {0xA71A,0xA71A,0xA71A}, {0xA71B,0xA71B,0xA71B}, /* A71A */ - {0xA71C,0xA71C,0xA71C}, {0xA71D,0xA71D,0xA71D}, /* A71C */ - {0xA71E,0xA71E,0xA71E}, {0xA71F,0xA71F,0xA71F}, /* A71E */ - {0xA720,0xA720,0xA720}, {0xA721,0xA721,0xA721}, /* A720 */ - {0xA722,0xA723,0xA722}, {0xA722,0xA723,0xA722}, /* A722 */ - {0xA724,0xA725,0xA724}, {0xA724,0xA725,0xA724}, /* A724 */ - {0xA726,0xA727,0xA726}, {0xA726,0xA727,0xA726}, /* A726 */ - {0xA728,0xA729,0xA728}, {0xA728,0xA729,0xA728}, /* A728 */ - {0xA72A,0xA72B,0xA72A}, {0xA72A,0xA72B,0xA72A}, /* A72A */ - {0xA72C,0xA72D,0xA72C}, {0xA72C,0xA72D,0xA72C}, /* A72C */ - {0xA72E,0xA72F,0xA72E}, {0xA72E,0xA72F,0xA72E}, /* A72E */ - {0xA730,0xA730,0xA730}, {0xA731,0xA731,0xA731}, /* A730 */ - {0xA732,0xA733,0xA732}, {0xA732,0xA733,0xA732}, /* A732 */ - {0xA734,0xA735,0xA734}, {0xA734,0xA735,0xA734}, /* A734 */ - {0xA736,0xA737,0xA736}, {0xA736,0xA737,0xA736}, /* A736 */ - {0xA738,0xA739,0xA738}, {0xA738,0xA739,0xA738}, /* A738 */ - {0xA73A,0xA73B,0xA73A}, {0xA73A,0xA73B,0xA73A}, /* A73A */ - {0xA73C,0xA73D,0xA73C}, {0xA73C,0xA73D,0xA73C}, /* A73C */ - {0xA73E,0xA73F,0xA73E}, {0xA73E,0xA73F,0xA73E}, /* A73E */ - {0xA740,0xA741,0xA740}, {0xA740,0xA741,0xA740}, /* A740 */ - {0xA742,0xA743,0xA742}, {0xA742,0xA743,0xA742}, /* A742 */ - {0xA744,0xA745,0xA744}, {0xA744,0xA745,0xA744}, /* A744 */ - {0xA746,0xA747,0xA746}, {0xA746,0xA747,0xA746}, /* A746 */ - {0xA748,0xA749,0xA748}, {0xA748,0xA749,0xA748}, /* A748 */ - {0xA74A,0xA74B,0xA74A}, {0xA74A,0xA74B,0xA74A}, /* A74A */ - {0xA74C,0xA74D,0xA74C}, {0xA74C,0xA74D,0xA74C}, /* A74C */ - {0xA74E,0xA74F,0xA74E}, {0xA74E,0xA74F,0xA74E}, /* A74E */ - {0xA750,0xA751,0xA750}, {0xA750,0xA751,0xA750}, /* A750 */ - {0xA752,0xA753,0xA752}, {0xA752,0xA753,0xA752}, /* A752 */ - {0xA754,0xA755,0xA754}, {0xA754,0xA755,0xA754}, /* A754 */ - {0xA756,0xA757,0xA756}, {0xA756,0xA757,0xA756}, /* A756 */ - {0xA758,0xA759,0xA758}, {0xA758,0xA759,0xA758}, /* A758 */ - {0xA75A,0xA75B,0xA75A}, {0xA75A,0xA75B,0xA75A}, /* A75A */ - {0xA75C,0xA75D,0xA75C}, {0xA75C,0xA75D,0xA75C}, /* A75C */ - {0xA75E,0xA75F,0xA75E}, {0xA75E,0xA75F,0xA75E}, /* A75E */ - {0xA760,0xA761,0xA760}, {0xA760,0xA761,0xA760}, /* A760 */ - {0xA762,0xA763,0xA762}, {0xA762,0xA763,0xA762}, /* A762 */ - {0xA764,0xA765,0xA764}, {0xA764,0xA765,0xA764}, /* A764 */ - {0xA766,0xA767,0xA766}, {0xA766,0xA767,0xA766}, /* A766 */ - {0xA768,0xA769,0xA768}, {0xA768,0xA769,0xA768}, /* A768 */ - {0xA76A,0xA76B,0xA76A}, {0xA76A,0xA76B,0xA76A}, /* A76A */ - {0xA76C,0xA76D,0xA76C}, {0xA76C,0xA76D,0xA76C}, /* A76C */ - {0xA76E,0xA76F,0xA76E}, {0xA76E,0xA76F,0xA76E}, /* A76E */ - {0xA770,0xA770,0xA770}, {0xA771,0xA771,0xA771}, /* A770 */ - {0xA772,0xA772,0xA772}, {0xA773,0xA773,0xA773}, /* A772 */ - {0xA774,0xA774,0xA774}, {0xA775,0xA775,0xA775}, /* A774 */ - {0xA776,0xA776,0xA776}, {0xA777,0xA777,0xA777}, /* A776 */ - {0xA778,0xA778,0xA778}, {0xA779,0xA77A,0xA779}, /* A778 */ - {0xA779,0xA77A,0xA779}, {0xA77B,0xA77C,0xA77B}, /* A77A */ - {0xA77B,0xA77C,0xA77B}, {0xA77D,0x1D79,0xA77D}, /* A77C */ - {0xA77E,0xA77F,0xA77E}, {0xA77E,0xA77F,0xA77E}, /* A77E */ - {0xA780,0xA781,0xA780}, {0xA780,0xA781,0xA780}, /* A780 */ - {0xA782,0xA783,0xA782}, {0xA782,0xA783,0xA782}, /* A782 */ - {0xA784,0xA785,0xA784}, {0xA784,0xA785,0xA784}, /* A784 */ - {0xA786,0xA787,0xA786}, {0xA786,0xA787,0xA786}, /* A786 */ - {0xA788,0xA788,0xA788}, {0xA789,0xA789,0xA789}, /* A788 */ - {0xA78A,0xA78A,0xA78A}, {0xA78B,0xA78C,0xA78B}, /* A78A */ - {0xA78B,0xA78C,0xA78B}, {0xA78D,0xA78D,0xA78D}, /* A78C */ - {0xA78E,0xA78E,0xA78E}, {0xA78F,0xA78F,0xA78F}, /* A78E */ - {0xA790,0xA790,0xA790}, {0xA791,0xA791,0xA791}, /* A790 */ - {0xA792,0xA792,0xA792}, {0xA793,0xA793,0xA793}, /* A792 */ - {0xA794,0xA794,0xA794}, {0xA795,0xA795,0xA795}, /* A794 */ - {0xA796,0xA796,0xA796}, {0xA797,0xA797,0xA797}, /* A796 */ - {0xA798,0xA798,0xA798}, {0xA799,0xA799,0xA799}, /* A798 */ - {0xA79A,0xA79A,0xA79A}, {0xA79B,0xA79B,0xA79B}, /* A79A */ - {0xA79C,0xA79C,0xA79C}, {0xA79D,0xA79D,0xA79D}, /* A79C */ - {0xA79E,0xA79E,0xA79E}, {0xA79F,0xA79F,0xA79F}, /* A79E */ - {0xA7A0,0xA7A0,0xA7A0}, {0xA7A1,0xA7A1,0xA7A1}, /* A7A0 */ - {0xA7A2,0xA7A2,0xA7A2}, {0xA7A3,0xA7A3,0xA7A3}, /* A7A2 */ - {0xA7A4,0xA7A4,0xA7A4}, {0xA7A5,0xA7A5,0xA7A5}, /* A7A4 */ - {0xA7A6,0xA7A6,0xA7A6}, {0xA7A7,0xA7A7,0xA7A7}, /* A7A6 */ - {0xA7A8,0xA7A8,0xA7A8}, {0xA7A9,0xA7A9,0xA7A9}, /* A7A8 */ - {0xA7AA,0xA7AA,0xA7AA}, {0xA7AB,0xA7AB,0xA7AB}, /* A7AA */ - {0xA7AC,0xA7AC,0xA7AC}, {0xA7AD,0xA7AD,0xA7AD}, /* A7AC */ - {0xA7AE,0xA7AE,0xA7AE}, {0xA7AF,0xA7AF,0xA7AF}, /* A7AE */ - {0xA7B0,0xA7B0,0xA7B0}, {0xA7B1,0xA7B1,0xA7B1}, /* A7B0 */ - {0xA7B2,0xA7B2,0xA7B2}, {0xA7B3,0xA7B3,0xA7B3}, /* A7B2 */ - {0xA7B4,0xA7B4,0xA7B4}, {0xA7B5,0xA7B5,0xA7B5}, /* A7B4 */ - {0xA7B6,0xA7B6,0xA7B6}, {0xA7B7,0xA7B7,0xA7B7}, /* A7B6 */ - {0xA7B8,0xA7B8,0xA7B8}, {0xA7B9,0xA7B9,0xA7B9}, /* A7B8 */ - {0xA7BA,0xA7BA,0xA7BA}, {0xA7BB,0xA7BB,0xA7BB}, /* A7BA */ - {0xA7BC,0xA7BC,0xA7BC}, {0xA7BD,0xA7BD,0xA7BD}, /* A7BC */ - {0xA7BE,0xA7BE,0xA7BE}, {0xA7BF,0xA7BF,0xA7BF}, /* A7BE */ - {0xA7C0,0xA7C0,0xA7C0}, {0xA7C1,0xA7C1,0xA7C1}, /* A7C0 */ - {0xA7C2,0xA7C2,0xA7C2}, {0xA7C3,0xA7C3,0xA7C3}, /* A7C2 */ - {0xA7C4,0xA7C4,0xA7C4}, {0xA7C5,0xA7C5,0xA7C5}, /* A7C4 */ - {0xA7C6,0xA7C6,0xA7C6}, {0xA7C7,0xA7C7,0xA7C7}, /* A7C6 */ - {0xA7C8,0xA7C8,0xA7C8}, {0xA7C9,0xA7C9,0xA7C9}, /* A7C8 */ - {0xA7CA,0xA7CA,0xA7CA}, {0xA7CB,0xA7CB,0xA7CB}, /* A7CA */ - {0xA7CC,0xA7CC,0xA7CC}, {0xA7CD,0xA7CD,0xA7CD}, /* A7CC */ - {0xA7CE,0xA7CE,0xA7CE}, {0xA7CF,0xA7CF,0xA7CF}, /* A7CE */ - {0xA7D0,0xA7D0,0xA7D0}, {0xA7D1,0xA7D1,0xA7D1}, /* A7D0 */ - {0xA7D2,0xA7D2,0xA7D2}, {0xA7D3,0xA7D3,0xA7D3}, /* A7D2 */ - {0xA7D4,0xA7D4,0xA7D4}, {0xA7D5,0xA7D5,0xA7D5}, /* A7D4 */ - {0xA7D6,0xA7D6,0xA7D6}, {0xA7D7,0xA7D7,0xA7D7}, /* A7D6 */ - {0xA7D8,0xA7D8,0xA7D8}, {0xA7D9,0xA7D9,0xA7D9}, /* A7D8 */ - {0xA7DA,0xA7DA,0xA7DA}, {0xA7DB,0xA7DB,0xA7DB}, /* A7DA */ - {0xA7DC,0xA7DC,0xA7DC}, {0xA7DD,0xA7DD,0xA7DD}, /* A7DC */ - {0xA7DE,0xA7DE,0xA7DE}, {0xA7DF,0xA7DF,0xA7DF}, /* A7DE */ - {0xA7E0,0xA7E0,0xA7E0}, {0xA7E1,0xA7E1,0xA7E1}, /* A7E0 */ - {0xA7E2,0xA7E2,0xA7E2}, {0xA7E3,0xA7E3,0xA7E3}, /* A7E2 */ - {0xA7E4,0xA7E4,0xA7E4}, {0xA7E5,0xA7E5,0xA7E5}, /* A7E4 */ - {0xA7E6,0xA7E6,0xA7E6}, {0xA7E7,0xA7E7,0xA7E7}, /* A7E6 */ - {0xA7E8,0xA7E8,0xA7E8}, {0xA7E9,0xA7E9,0xA7E9}, /* A7E8 */ - {0xA7EA,0xA7EA,0xA7EA}, {0xA7EB,0xA7EB,0xA7EB}, /* A7EA */ - {0xA7EC,0xA7EC,0xA7EC}, {0xA7ED,0xA7ED,0xA7ED}, /* A7EC */ - {0xA7EE,0xA7EE,0xA7EE}, {0xA7EF,0xA7EF,0xA7EF}, /* A7EE */ - {0xA7F0,0xA7F0,0xA7F0}, {0xA7F1,0xA7F1,0xA7F1}, /* A7F0 */ - {0xA7F2,0xA7F2,0xA7F2}, {0xA7F3,0xA7F3,0xA7F3}, /* A7F2 */ - {0xA7F4,0xA7F4,0xA7F4}, {0xA7F5,0xA7F5,0xA7F5}, /* A7F4 */ - {0xA7F6,0xA7F6,0xA7F6}, {0xA7F7,0xA7F7,0xA7F7}, /* A7F6 */ - {0xA7F8,0xA7F8,0xA7F8}, {0xA7F9,0xA7F9,0xA7F9}, /* A7F8 */ - {0xA7FA,0xA7FA,0xA7FA}, {0xA7FB,0xA7FB,0xA7FB}, /* A7FA */ - {0xA7FC,0xA7FC,0xA7FC}, {0xA7FD,0xA7FD,0xA7FD}, /* A7FC */ - {0xA7FE,0xA7FE,0xA7FE}, {0xA7FF,0xA7FF,0xA7FF} /* A7FE */ -}; - -static MY_UNICASE_CHARACTER u520pFF[]={ - {0xFF00,0xFF00,0xFF00}, {0xFF01,0xFF01,0xFF01}, /* FF00 */ - {0xFF02,0xFF02,0xFF02}, {0xFF03,0xFF03,0xFF03}, /* FF02 */ - {0xFF04,0xFF04,0xFF04}, {0xFF05,0xFF05,0xFF05}, /* FF04 */ - {0xFF06,0xFF06,0xFF06}, {0xFF07,0xFF07,0xFF07}, /* FF06 */ - {0xFF08,0xFF08,0xFF08}, {0xFF09,0xFF09,0xFF09}, /* FF08 */ - {0xFF0A,0xFF0A,0xFF0A}, {0xFF0B,0xFF0B,0xFF0B}, /* FF0A */ - {0xFF0C,0xFF0C,0xFF0C}, {0xFF0D,0xFF0D,0xFF0D}, /* FF0C */ - {0xFF0E,0xFF0E,0xFF0E}, {0xFF0F,0xFF0F,0xFF0F}, /* FF0E */ - {0xFF10,0xFF10,0xFF10}, {0xFF11,0xFF11,0xFF11}, /* FF10 */ - {0xFF12,0xFF12,0xFF12}, {0xFF13,0xFF13,0xFF13}, /* FF12 */ - {0xFF14,0xFF14,0xFF14}, {0xFF15,0xFF15,0xFF15}, /* FF14 */ - {0xFF16,0xFF16,0xFF16}, {0xFF17,0xFF17,0xFF17}, /* FF16 */ - {0xFF18,0xFF18,0xFF18}, {0xFF19,0xFF19,0xFF19}, /* FF18 */ - {0xFF1A,0xFF1A,0xFF1A}, {0xFF1B,0xFF1B,0xFF1B}, /* FF1A */ - {0xFF1C,0xFF1C,0xFF1C}, {0xFF1D,0xFF1D,0xFF1D}, /* FF1C */ - {0xFF1E,0xFF1E,0xFF1E}, {0xFF1F,0xFF1F,0xFF1F}, /* FF1E */ - {0xFF20,0xFF20,0xFF20}, {0xFF21,0xFF41,0xFF21}, /* FF20 */ - {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23}, /* FF22 */ - {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25}, /* FF24 */ - {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27}, /* FF26 */ - {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29}, /* FF28 */ - {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B}, /* FF2A */ - {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D}, /* FF2C */ - {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F}, /* FF2E */ - {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31}, /* FF30 */ - {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33}, /* FF32 */ - {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35}, /* FF34 */ - {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37}, /* FF36 */ - {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39}, /* FF38 */ - {0xFF3A,0xFF5A,0xFF3A}, {0xFF3B,0xFF3B,0xFF3B}, /* FF3A */ - {0xFF3C,0xFF3C,0xFF3C}, {0xFF3D,0xFF3D,0xFF3D}, /* FF3C */ - {0xFF3E,0xFF3E,0xFF3E}, {0xFF3F,0xFF3F,0xFF3F}, /* FF3E */ - {0xFF40,0xFF40,0xFF40}, {0xFF21,0xFF41,0xFF21}, /* FF40 */ - {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23}, /* FF42 */ - {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25}, /* FF44 */ - {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27}, /* FF46 */ - {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29}, /* FF48 */ - {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B}, /* FF4A */ - {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D}, /* FF4C */ - {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F}, /* FF4E */ - {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31}, /* FF50 */ - {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33}, /* FF52 */ - {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35}, /* FF54 */ - {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37}, /* FF56 */ - {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39}, /* FF58 */ - {0xFF3A,0xFF5A,0xFF3A}, {0xFF5B,0xFF5B,0xFF5B}, /* FF5A */ - {0xFF5C,0xFF5C,0xFF5C}, {0xFF5D,0xFF5D,0xFF5D}, /* FF5C */ - {0xFF5E,0xFF5E,0xFF5E}, {0xFF5F,0xFF5F,0xFF5F}, /* FF5E */ - {0xFF60,0xFF60,0xFF60}, {0xFF61,0xFF61,0xFF61}, /* FF60 */ - {0xFF62,0xFF62,0xFF62}, {0xFF63,0xFF63,0xFF63}, /* FF62 */ - {0xFF64,0xFF64,0xFF64}, {0xFF65,0xFF65,0xFF65}, /* FF64 */ - {0xFF66,0xFF66,0xFF66}, {0xFF67,0xFF67,0xFF67}, /* FF66 */ - {0xFF68,0xFF68,0xFF68}, {0xFF69,0xFF69,0xFF69}, /* FF68 */ - {0xFF6A,0xFF6A,0xFF6A}, {0xFF6B,0xFF6B,0xFF6B}, /* FF6A */ - {0xFF6C,0xFF6C,0xFF6C}, {0xFF6D,0xFF6D,0xFF6D}, /* FF6C */ - {0xFF6E,0xFF6E,0xFF6E}, {0xFF6F,0xFF6F,0xFF6F}, /* FF6E */ - {0xFF70,0xFF70,0xFF70}, {0xFF71,0xFF71,0xFF71}, /* FF70 */ - {0xFF72,0xFF72,0xFF72}, {0xFF73,0xFF73,0xFF73}, /* FF72 */ - {0xFF74,0xFF74,0xFF74}, {0xFF75,0xFF75,0xFF75}, /* FF74 */ - {0xFF76,0xFF76,0xFF76}, {0xFF77,0xFF77,0xFF77}, /* FF76 */ - {0xFF78,0xFF78,0xFF78}, {0xFF79,0xFF79,0xFF79}, /* FF78 */ - {0xFF7A,0xFF7A,0xFF7A}, {0xFF7B,0xFF7B,0xFF7B}, /* FF7A */ - {0xFF7C,0xFF7C,0xFF7C}, {0xFF7D,0xFF7D,0xFF7D}, /* FF7C */ - {0xFF7E,0xFF7E,0xFF7E}, {0xFF7F,0xFF7F,0xFF7F}, /* FF7E */ - {0xFF80,0xFF80,0xFF80}, {0xFF81,0xFF81,0xFF81}, /* FF80 */ - {0xFF82,0xFF82,0xFF82}, {0xFF83,0xFF83,0xFF83}, /* FF82 */ - {0xFF84,0xFF84,0xFF84}, {0xFF85,0xFF85,0xFF85}, /* FF84 */ - {0xFF86,0xFF86,0xFF86}, {0xFF87,0xFF87,0xFF87}, /* FF86 */ - {0xFF88,0xFF88,0xFF88}, {0xFF89,0xFF89,0xFF89}, /* FF88 */ - {0xFF8A,0xFF8A,0xFF8A}, {0xFF8B,0xFF8B,0xFF8B}, /* FF8A */ - {0xFF8C,0xFF8C,0xFF8C}, {0xFF8D,0xFF8D,0xFF8D}, /* FF8C */ - {0xFF8E,0xFF8E,0xFF8E}, {0xFF8F,0xFF8F,0xFF8F}, /* FF8E */ - {0xFF90,0xFF90,0xFF90}, {0xFF91,0xFF91,0xFF91}, /* FF90 */ - {0xFF92,0xFF92,0xFF92}, {0xFF93,0xFF93,0xFF93}, /* FF92 */ - {0xFF94,0xFF94,0xFF94}, {0xFF95,0xFF95,0xFF95}, /* FF94 */ - {0xFF96,0xFF96,0xFF96}, {0xFF97,0xFF97,0xFF97}, /* FF96 */ - {0xFF98,0xFF98,0xFF98}, {0xFF99,0xFF99,0xFF99}, /* FF98 */ - {0xFF9A,0xFF9A,0xFF9A}, {0xFF9B,0xFF9B,0xFF9B}, /* FF9A */ - {0xFF9C,0xFF9C,0xFF9C}, {0xFF9D,0xFF9D,0xFF9D}, /* FF9C */ - {0xFF9E,0xFF9E,0xFF9E}, {0xFF9F,0xFF9F,0xFF9F}, /* FF9E */ - {0xFFA0,0xFFA0,0xFFA0}, {0xFFA1,0xFFA1,0xFFA1}, /* FFA0 */ - {0xFFA2,0xFFA2,0xFFA2}, {0xFFA3,0xFFA3,0xFFA3}, /* FFA2 */ - {0xFFA4,0xFFA4,0xFFA4}, {0xFFA5,0xFFA5,0xFFA5}, /* FFA4 */ - {0xFFA6,0xFFA6,0xFFA6}, {0xFFA7,0xFFA7,0xFFA7}, /* FFA6 */ - {0xFFA8,0xFFA8,0xFFA8}, {0xFFA9,0xFFA9,0xFFA9}, /* FFA8 */ - {0xFFAA,0xFFAA,0xFFAA}, {0xFFAB,0xFFAB,0xFFAB}, /* FFAA */ - {0xFFAC,0xFFAC,0xFFAC}, {0xFFAD,0xFFAD,0xFFAD}, /* FFAC */ - {0xFFAE,0xFFAE,0xFFAE}, {0xFFAF,0xFFAF,0xFFAF}, /* FFAE */ - {0xFFB0,0xFFB0,0xFFB0}, {0xFFB1,0xFFB1,0xFFB1}, /* FFB0 */ - {0xFFB2,0xFFB2,0xFFB2}, {0xFFB3,0xFFB3,0xFFB3}, /* FFB2 */ - {0xFFB4,0xFFB4,0xFFB4}, {0xFFB5,0xFFB5,0xFFB5}, /* FFB4 */ - {0xFFB6,0xFFB6,0xFFB6}, {0xFFB7,0xFFB7,0xFFB7}, /* FFB6 */ - {0xFFB8,0xFFB8,0xFFB8}, {0xFFB9,0xFFB9,0xFFB9}, /* FFB8 */ - {0xFFBA,0xFFBA,0xFFBA}, {0xFFBB,0xFFBB,0xFFBB}, /* FFBA */ - {0xFFBC,0xFFBC,0xFFBC}, {0xFFBD,0xFFBD,0xFFBD}, /* FFBC */ - {0xFFBE,0xFFBE,0xFFBE}, {0xFFBF,0xFFBF,0xFFBF}, /* FFBE */ - {0xFFC0,0xFFC0,0xFFC0}, {0xFFC1,0xFFC1,0xFFC1}, /* FFC0 */ - {0xFFC2,0xFFC2,0xFFC2}, {0xFFC3,0xFFC3,0xFFC3}, /* FFC2 */ - {0xFFC4,0xFFC4,0xFFC4}, {0xFFC5,0xFFC5,0xFFC5}, /* FFC4 */ - {0xFFC6,0xFFC6,0xFFC6}, {0xFFC7,0xFFC7,0xFFC7}, /* FFC6 */ - {0xFFC8,0xFFC8,0xFFC8}, {0xFFC9,0xFFC9,0xFFC9}, /* FFC8 */ - {0xFFCA,0xFFCA,0xFFCA}, {0xFFCB,0xFFCB,0xFFCB}, /* FFCA */ - {0xFFCC,0xFFCC,0xFFCC}, {0xFFCD,0xFFCD,0xFFCD}, /* FFCC */ - {0xFFCE,0xFFCE,0xFFCE}, {0xFFCF,0xFFCF,0xFFCF}, /* FFCE */ - {0xFFD0,0xFFD0,0xFFD0}, {0xFFD1,0xFFD1,0xFFD1}, /* FFD0 */ - {0xFFD2,0xFFD2,0xFFD2}, {0xFFD3,0xFFD3,0xFFD3}, /* FFD2 */ - {0xFFD4,0xFFD4,0xFFD4}, {0xFFD5,0xFFD5,0xFFD5}, /* FFD4 */ - {0xFFD6,0xFFD6,0xFFD6}, {0xFFD7,0xFFD7,0xFFD7}, /* FFD6 */ - {0xFFD8,0xFFD8,0xFFD8}, {0xFFD9,0xFFD9,0xFFD9}, /* FFD8 */ - {0xFFDA,0xFFDA,0xFFDA}, {0xFFDB,0xFFDB,0xFFDB}, /* FFDA */ - {0xFFDC,0xFFDC,0xFFDC}, {0xFFDD,0xFFDD,0xFFDD}, /* FFDC */ - {0xFFDE,0xFFDE,0xFFDE}, {0xFFDF,0xFFDF,0xFFDF}, /* FFDE */ - {0xFFE0,0xFFE0,0xFFE0}, {0xFFE1,0xFFE1,0xFFE1}, /* FFE0 */ - {0xFFE2,0xFFE2,0xFFE2}, {0xFFE3,0xFFE3,0xFFE3}, /* FFE2 */ - {0xFFE4,0xFFE4,0xFFE4}, {0xFFE5,0xFFE5,0xFFE5}, /* FFE4 */ - {0xFFE6,0xFFE6,0xFFE6}, {0xFFE7,0xFFE7,0xFFE7}, /* FFE6 */ - {0xFFE8,0xFFE8,0xFFE8}, {0xFFE9,0xFFE9,0xFFE9}, /* FFE8 */ - {0xFFEA,0xFFEA,0xFFEA}, {0xFFEB,0xFFEB,0xFFEB}, /* FFEA */ - {0xFFEC,0xFFEC,0xFFEC}, {0xFFED,0xFFED,0xFFED}, /* FFEC */ - {0xFFEE,0xFFEE,0xFFEE}, {0xFFEF,0xFFEF,0xFFEF}, /* FFEE */ - {0xFFF0,0xFFF0,0xFFF0}, {0xFFF1,0xFFF1,0xFFF1}, /* FFF0 */ - {0xFFF2,0xFFF2,0xFFF2}, {0xFFF3,0xFFF3,0xFFF3}, /* FFF2 */ - {0xFFF4,0xFFF4,0xFFF4}, {0xFFF5,0xFFF5,0xFFF5}, /* FFF4 */ - {0xFFF6,0xFFF6,0xFFF6}, {0xFFF7,0xFFF7,0xFFF7}, /* FFF6 */ - {0xFFF8,0xFFF8,0xFFF8}, {0xFFF9,0xFFF9,0xFFF9}, /* FFF8 */ - {0xFFFA,0xFFFA,0xFFFA}, {0xFFFB,0xFFFB,0xFFFB}, /* FFFA */ - {0xFFFC,0xFFFC,0xFFFC}, {0xFFFD,0xFFFD,0xFFFD}, /* FFFC */ - {0xFFFE,0xFFFE,0xFFFE}, {0xFFFF,0xFFFF,0xFFFF} /* FFFE */ -}; - -static MY_UNICASE_CHARACTER u520p104[]={ - {0x10400,0x10428,0x10400}, {0x10401,0x10429,0x10401}, /* 10400 */ - {0x10402,0x1042A,0x10402}, {0x10403,0x1042B,0x10403}, /* 10402 */ - {0x10404,0x1042C,0x10404}, {0x10405,0x1042D,0x10405}, /* 10404 */ - {0x10406,0x1042E,0x10406}, {0x10407,0x1042F,0x10407}, /* 10406 */ - {0x10408,0x10430,0x10408}, {0x10409,0x10431,0x10409}, /* 10408 */ - {0x1040A,0x10432,0x1040A}, {0x1040B,0x10433,0x1040B}, /* 1040A */ - {0x1040C,0x10434,0x1040C}, {0x1040D,0x10435,0x1040D}, /* 1040C */ - {0x1040E,0x10436,0x1040E}, {0x1040F,0x10437,0x1040F}, /* 1040E */ - {0x10410,0x10438,0x10410}, {0x10411,0x10439,0x10411}, /* 10410 */ - {0x10412,0x1043A,0x10412}, {0x10413,0x1043B,0x10413}, /* 10412 */ - {0x10414,0x1043C,0x10414}, {0x10415,0x1043D,0x10415}, /* 10414 */ - {0x10416,0x1043E,0x10416}, {0x10417,0x1043F,0x10417}, /* 10416 */ - {0x10418,0x10440,0x10418}, {0x10419,0x10441,0x10419}, /* 10418 */ - {0x1041A,0x10442,0x1041A}, {0x1041B,0x10443,0x1041B}, /* 1041A */ - {0x1041C,0x10444,0x1041C}, {0x1041D,0x10445,0x1041D}, /* 1041C */ - {0x1041E,0x10446,0x1041E}, {0x1041F,0x10447,0x1041F}, /* 1041E */ - {0x10420,0x10448,0x10420}, {0x10421,0x10449,0x10421}, /* 10420 */ - {0x10422,0x1044A,0x10422}, {0x10423,0x1044B,0x10423}, /* 10422 */ - {0x10424,0x1044C,0x10424}, {0x10425,0x1044D,0x10425}, /* 10424 */ - {0x10426,0x1044E,0x10426}, {0x10427,0x1044F,0x10427}, /* 10426 */ - {0x10400,0x10428,0x10400}, {0x10401,0x10429,0x10401}, /* 10428 */ - {0x10402,0x1042A,0x10402}, {0x10403,0x1042B,0x10403}, /* 1042A */ - {0x10404,0x1042C,0x10404}, {0x10405,0x1042D,0x10405}, /* 1042C */ - {0x10406,0x1042E,0x10406}, {0x10407,0x1042F,0x10407}, /* 1042E */ - {0x10408,0x10430,0x10408}, {0x10409,0x10431,0x10409}, /* 10430 */ - {0x1040A,0x10432,0x1040A}, {0x1040B,0x10433,0x1040B}, /* 10432 */ - {0x1040C,0x10434,0x1040C}, {0x1040D,0x10435,0x1040D}, /* 10434 */ - {0x1040E,0x10436,0x1040E}, {0x1040F,0x10437,0x1040F}, /* 10436 */ - {0x10410,0x10438,0x10410}, {0x10411,0x10439,0x10411}, /* 10438 */ - {0x10412,0x1043A,0x10412}, {0x10413,0x1043B,0x10413}, /* 1043A */ - {0x10414,0x1043C,0x10414}, {0x10415,0x1043D,0x10415}, /* 1043C */ - {0x10416,0x1043E,0x10416}, {0x10417,0x1043F,0x10417}, /* 1043E */ - {0x10418,0x10440,0x10418}, {0x10419,0x10441,0x10419}, /* 10440 */ - {0x1041A,0x10442,0x1041A}, {0x1041B,0x10443,0x1041B}, /* 10442 */ - {0x1041C,0x10444,0x1041C}, {0x1041D,0x10445,0x1041D}, /* 10444 */ - {0x1041E,0x10446,0x1041E}, {0x1041F,0x10447,0x1041F}, /* 10446 */ - {0x10420,0x10448,0x10420}, {0x10421,0x10449,0x10421}, /* 10448 */ - {0x10422,0x1044A,0x10422}, {0x10423,0x1044B,0x10423}, /* 1044A */ - {0x10424,0x1044C,0x10424}, {0x10425,0x1044D,0x10425}, /* 1044C */ - {0x10426,0x1044E,0x10426}, {0x10427,0x1044F,0x10427}, /* 1044E */ - {0x10450,0x10450,0x10450}, {0x10451,0x10451,0x10451}, /* 10450 */ - {0x10452,0x10452,0x10452}, {0x10453,0x10453,0x10453}, /* 10452 */ - {0x10454,0x10454,0x10454}, {0x10455,0x10455,0x10455}, /* 10454 */ - {0x10456,0x10456,0x10456}, {0x10457,0x10457,0x10457}, /* 10456 */ - {0x10458,0x10458,0x10458}, {0x10459,0x10459,0x10459}, /* 10458 */ - {0x1045A,0x1045A,0x1045A}, {0x1045B,0x1045B,0x1045B}, /* 1045A */ - {0x1045C,0x1045C,0x1045C}, {0x1045D,0x1045D,0x1045D}, /* 1045C */ - {0x1045E,0x1045E,0x1045E}, {0x1045F,0x1045F,0x1045F}, /* 1045E */ - {0x10460,0x10460,0x10460}, {0x10461,0x10461,0x10461}, /* 10460 */ - {0x10462,0x10462,0x10462}, {0x10463,0x10463,0x10463}, /* 10462 */ - {0x10464,0x10464,0x10464}, {0x10465,0x10465,0x10465}, /* 10464 */ - {0x10466,0x10466,0x10466}, {0x10467,0x10467,0x10467}, /* 10466 */ - {0x10468,0x10468,0x10468}, {0x10469,0x10469,0x10469}, /* 10468 */ - {0x1046A,0x1046A,0x1046A}, {0x1046B,0x1046B,0x1046B}, /* 1046A */ - {0x1046C,0x1046C,0x1046C}, {0x1046D,0x1046D,0x1046D}, /* 1046C */ - {0x1046E,0x1046E,0x1046E}, {0x1046F,0x1046F,0x1046F}, /* 1046E */ - {0x10470,0x10470,0x10470}, {0x10471,0x10471,0x10471}, /* 10470 */ - {0x10472,0x10472,0x10472}, {0x10473,0x10473,0x10473}, /* 10472 */ - {0x10474,0x10474,0x10474}, {0x10475,0x10475,0x10475}, /* 10474 */ - {0x10476,0x10476,0x10476}, {0x10477,0x10477,0x10477}, /* 10476 */ - {0x10478,0x10478,0x10478}, {0x10479,0x10479,0x10479}, /* 10478 */ - {0x1047A,0x1047A,0x1047A}, {0x1047B,0x1047B,0x1047B}, /* 1047A */ - {0x1047C,0x1047C,0x1047C}, {0x1047D,0x1047D,0x1047D}, /* 1047C */ - {0x1047E,0x1047E,0x1047E}, {0x1047F,0x1047F,0x1047F}, /* 1047E */ - {0x10480,0x10480,0x10480}, {0x10481,0x10481,0x10481}, /* 10480 */ - {0x10482,0x10482,0x10482}, {0x10483,0x10483,0x10483}, /* 10482 */ - {0x10484,0x10484,0x10484}, {0x10485,0x10485,0x10485}, /* 10484 */ - {0x10486,0x10486,0x10486}, {0x10487,0x10487,0x10487}, /* 10486 */ - {0x10488,0x10488,0x10488}, {0x10489,0x10489,0x10489}, /* 10488 */ - {0x1048A,0x1048A,0x1048A}, {0x1048B,0x1048B,0x1048B}, /* 1048A */ - {0x1048C,0x1048C,0x1048C}, {0x1048D,0x1048D,0x1048D}, /* 1048C */ - {0x1048E,0x1048E,0x1048E}, {0x1048F,0x1048F,0x1048F}, /* 1048E */ - {0x10490,0x10490,0x10490}, {0x10491,0x10491,0x10491}, /* 10490 */ - {0x10492,0x10492,0x10492}, {0x10493,0x10493,0x10493}, /* 10492 */ - {0x10494,0x10494,0x10494}, {0x10495,0x10495,0x10495}, /* 10494 */ - {0x10496,0x10496,0x10496}, {0x10497,0x10497,0x10497}, /* 10496 */ - {0x10498,0x10498,0x10498}, {0x10499,0x10499,0x10499}, /* 10498 */ - {0x1049A,0x1049A,0x1049A}, {0x1049B,0x1049B,0x1049B}, /* 1049A */ - {0x1049C,0x1049C,0x1049C}, {0x1049D,0x1049D,0x1049D}, /* 1049C */ - {0x1049E,0x1049E,0x1049E}, {0x1049F,0x1049F,0x1049F}, /* 1049E */ - {0x104A0,0x104A0,0x104A0}, {0x104A1,0x104A1,0x104A1}, /* 104A0 */ - {0x104A2,0x104A2,0x104A2}, {0x104A3,0x104A3,0x104A3}, /* 104A2 */ - {0x104A4,0x104A4,0x104A4}, {0x104A5,0x104A5,0x104A5}, /* 104A4 */ - {0x104A6,0x104A6,0x104A6}, {0x104A7,0x104A7,0x104A7}, /* 104A6 */ - {0x104A8,0x104A8,0x104A8}, {0x104A9,0x104A9,0x104A9}, /* 104A8 */ - {0x104AA,0x104AA,0x104AA}, {0x104AB,0x104AB,0x104AB}, /* 104AA */ - {0x104AC,0x104AC,0x104AC}, {0x104AD,0x104AD,0x104AD}, /* 104AC */ - {0x104AE,0x104AE,0x104AE}, {0x104AF,0x104AF,0x104AF}, /* 104AE */ - {0x104B0,0x104B0,0x104B0}, {0x104B1,0x104B1,0x104B1}, /* 104B0 */ - {0x104B2,0x104B2,0x104B2}, {0x104B3,0x104B3,0x104B3}, /* 104B2 */ - {0x104B4,0x104B4,0x104B4}, {0x104B5,0x104B5,0x104B5}, /* 104B4 */ - {0x104B6,0x104B6,0x104B6}, {0x104B7,0x104B7,0x104B7}, /* 104B6 */ - {0x104B8,0x104B8,0x104B8}, {0x104B9,0x104B9,0x104B9}, /* 104B8 */ - {0x104BA,0x104BA,0x104BA}, {0x104BB,0x104BB,0x104BB}, /* 104BA */ - {0x104BC,0x104BC,0x104BC}, {0x104BD,0x104BD,0x104BD}, /* 104BC */ - {0x104BE,0x104BE,0x104BE}, {0x104BF,0x104BF,0x104BF}, /* 104BE */ - {0x104C0,0x104C0,0x104C0}, {0x104C1,0x104C1,0x104C1}, /* 104C0 */ - {0x104C2,0x104C2,0x104C2}, {0x104C3,0x104C3,0x104C3}, /* 104C2 */ - {0x104C4,0x104C4,0x104C4}, {0x104C5,0x104C5,0x104C5}, /* 104C4 */ - {0x104C6,0x104C6,0x104C6}, {0x104C7,0x104C7,0x104C7}, /* 104C6 */ - {0x104C8,0x104C8,0x104C8}, {0x104C9,0x104C9,0x104C9}, /* 104C8 */ - {0x104CA,0x104CA,0x104CA}, {0x104CB,0x104CB,0x104CB}, /* 104CA */ - {0x104CC,0x104CC,0x104CC}, {0x104CD,0x104CD,0x104CD}, /* 104CC */ - {0x104CE,0x104CE,0x104CE}, {0x104CF,0x104CF,0x104CF}, /* 104CE */ - {0x104D0,0x104D0,0x104D0}, {0x104D1,0x104D1,0x104D1}, /* 104D0 */ - {0x104D2,0x104D2,0x104D2}, {0x104D3,0x104D3,0x104D3}, /* 104D2 */ - {0x104D4,0x104D4,0x104D4}, {0x104D5,0x104D5,0x104D5}, /* 104D4 */ - {0x104D6,0x104D6,0x104D6}, {0x104D7,0x104D7,0x104D7}, /* 104D6 */ - {0x104D8,0x104D8,0x104D8}, {0x104D9,0x104D9,0x104D9}, /* 104D8 */ - {0x104DA,0x104DA,0x104DA}, {0x104DB,0x104DB,0x104DB}, /* 104DA */ - {0x104DC,0x104DC,0x104DC}, {0x104DD,0x104DD,0x104DD}, /* 104DC */ - {0x104DE,0x104DE,0x104DE}, {0x104DF,0x104DF,0x104DF}, /* 104DE */ - {0x104E0,0x104E0,0x104E0}, {0x104E1,0x104E1,0x104E1}, /* 104E0 */ - {0x104E2,0x104E2,0x104E2}, {0x104E3,0x104E3,0x104E3}, /* 104E2 */ - {0x104E4,0x104E4,0x104E4}, {0x104E5,0x104E5,0x104E5}, /* 104E4 */ - {0x104E6,0x104E6,0x104E6}, {0x104E7,0x104E7,0x104E7}, /* 104E6 */ - {0x104E8,0x104E8,0x104E8}, {0x104E9,0x104E9,0x104E9}, /* 104E8 */ - {0x104EA,0x104EA,0x104EA}, {0x104EB,0x104EB,0x104EB}, /* 104EA */ - {0x104EC,0x104EC,0x104EC}, {0x104ED,0x104ED,0x104ED}, /* 104EC */ - {0x104EE,0x104EE,0x104EE}, {0x104EF,0x104EF,0x104EF}, /* 104EE */ - {0x104F0,0x104F0,0x104F0}, {0x104F1,0x104F1,0x104F1}, /* 104F0 */ - {0x104F2,0x104F2,0x104F2}, {0x104F3,0x104F3,0x104F3}, /* 104F2 */ - {0x104F4,0x104F4,0x104F4}, {0x104F5,0x104F5,0x104F5}, /* 104F4 */ - {0x104F6,0x104F6,0x104F6}, {0x104F7,0x104F7,0x104F7}, /* 104F6 */ - {0x104F8,0x104F8,0x104F8}, {0x104F9,0x104F9,0x104F9}, /* 104F8 */ - {0x104FA,0x104FA,0x104FA}, {0x104FB,0x104FB,0x104FB}, /* 104FA */ - {0x104FC,0x104FC,0x104FC}, {0x104FD,0x104FD,0x104FD}, /* 104FC */ - {0x104FE,0x104FE,0x104FE}, {0x104FF,0x104FF,0x104FF} /* 104FE */ -}; - - -MY_UNICASE_CHARACTER *my_unicase_pages_unicode520[4352]= -{ - u520p00, u520p01, u520p02, u520p03, u520p04, u520p05, plane06, plane07, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - u520p10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, u520p1D, u520p1E, u520p1F, - NULL, u520p21, NULL, NULL, u520p24, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, u520p2C, u520p2D, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, u520pA6, u520pA7, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, u520pFF, - NULL, NULL, NULL, NULL,u520p104, NULL, NULL, NULL, -}; - - -MY_UNICASE_INFO my_unicase_unicode520= -{ - 0x104FF, - my_unicase_pages_unicode520 -}; - - static uint my_casefold_multiply_utf8mbx(CHARSET_INFO *cs) { DBUG_ASSERT(cs->mbminlen == 1 && cs->mbmaxlen >= 3); - if (cs->caseinfo == &my_unicase_unicode520) + if (cs->casefold == &my_casefold_unicode520) return 2; - if (cs->caseinfo == &my_unicase_turkish) + if (cs->casefold == &my_casefold_turkish) return 2; - if (cs->caseinfo == &my_unicase_default) + if (cs->casefold == &my_casefold_default) return 1; - if (cs->caseinfo == &my_unicase_mysql500) + if (cs->casefold == &my_casefold_mysql500) return 1; DBUG_ASSERT(0); /*Unknown case folding data */ return 1; @@ -4670,7 +145,7 @@ int my_wildcmp_unicode_impl(CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many, - MY_UNICASE_INFO *weights, int recurse_level) + MY_CASEFOLD_INFO *weights, int recurse_level) { int result= -1; /* Not found, using wildcards */ my_wc_t s_wc, w_wc; @@ -4815,7 +290,7 @@ my_wildcmp_unicode(CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many, - MY_UNICASE_INFO *weights) + MY_CASEFOLD_INFO *weights) { return my_wildcmp_unicode_impl(cs, str, str_end, wildstr, wildend, @@ -5198,7 +673,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs, int srcres, dstres; const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); while ((src < srcend) && @@ -5220,7 +695,7 @@ static void my_hash_sort_utf8mb3_nopad(CHARSET_INFO *cs, const uchar *s, size_t my_wc_t wc; int res; const uchar *e= s+slen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; register ulong m1= *nr1, m2= *nr2; while ((s < e) && (res=my_utf8mb3_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) @@ -5251,7 +726,7 @@ static size_t my_caseup_str_utf8mb3(CHARSET_INFO *cs, char *src) my_wc_t wc; int srcres, dstres; char *dst= src, *dst0= src; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(cs->cset->caseup_multiply(cs) == 1); while (*src && @@ -5276,7 +751,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs, int srcres, dstres; const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); while ((src < srcend) && @@ -5297,7 +772,7 @@ static size_t my_casedn_str_utf8mb3(CHARSET_INFO *cs, char *src) my_wc_t wc; int srcres, dstres; char *dst= src, *dst0= src; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(cs->cset->casedn_multiply(cs) == 1); while (*src && @@ -5350,7 +825,7 @@ static size_t my_casedn_str_utf8mb3(CHARSET_INFO *cs, char *src) static int my_strcasecmp_utf8mb3(CHARSET_INFO *cs, const char *s, const char *t) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; while (s[0] && t[0]) { my_wc_t s_wc,t_wc; @@ -5432,7 +907,7 @@ int my_wildcmp_utf8mb3(CHARSET_INFO *cs, const char *wildstr,const char *wildend, int escape, int w_one, int w_many) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; return my_wildcmp_unicode(cs,str,str_end,wildstr,wildend, escape,w_one,w_many,uni_plane); } @@ -5467,33 +942,32 @@ int my_charlen_utf8mb3(CHARSET_INFO *cs __attribute__((unused)), static inline int my_weight_mb1_utf8mb3_general_ci(uchar b) { - return (int) my_unicase_default_page00[b & 0xFF].sort; + return (int) weight_general_ci_page00[b & 0xFF]; } static inline int my_weight_mb2_utf8mb3_general_ci(uchar b0, uchar b1) { my_wc_t wc= UTF8MB2_CODE(b0, b1); - MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8]; + const uint16 *page= weight_general_ci_index[wc >> 8]; /* 2-byte utf8 sequences encode Unicode characters up to U+07FF. - my_unicase_default_pages[N] has non-NULL page pointers + weight_general_ci_index[N] has non-NULL page pointers for all N in the range [0..7]. - - my_unicase_default_pages[0..5] point to real translation data - - my_unicase_default_pages[6..7] point to dummy pages + - weight_general_ci_index[0..5] point to real translation data + - weight_general_ci_index[6..7] point to dummy pages (without real translation). By adding these dummy pages we can avoid testing 'page' against NULL. This gives up to 20% performance improvement. */ - return (int) page[wc & 0xFF].sort; + return (int) page[wc & 0xFF]; } static inline int my_weight_mb3_utf8mb3_general_ci(uchar b0, uchar b1, uchar b2) { my_wc_t wc= UTF8MB3_CODE(b0, b1, b2); - MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); + return my_general_ci_bmp_char_to_weight((uint16) wc); } @@ -5502,9 +976,7 @@ static inline int my_weight_mb3_utf8mb3_general_ci(uchar b0, uchar b1, uchar b2) #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_utf8mb3_quick(pwc, s, e) #define OPTIMIZE_ASCII 1 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_bmp_char_to_weight(x) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB1(x) my_weight_mb1_utf8mb3_general_ci(x) #define WEIGHT_MB2(x,y) my_weight_mb2_utf8mb3_general_ci(x,y) @@ -5525,19 +997,19 @@ static inline int my_weight_mb3_utf8mb3_general_ci(uchar b0, uchar b1, uchar b2) static inline int my_weight_mb1_utf8mb3_general_mysql500_ci(uchar b) { - return (int) my_unicase_mysql500_page00[b & 0xFF].sort; + return (int) weight_general_mysql500_ci_page00[b & 0xFF]; } static inline int my_weight_mb2_utf8mb3_general_mysql500_ci(uchar b0, uchar b1) { my_wc_t wc= UTF8MB2_CODE(b0, b1); - MY_UNICASE_CHARACTER *page= my_unicase_mysql500_pages[wc >> 8]; + const uint16 *page= weight_general_mysql500_ci_index[wc >> 8]; /* `page` should never be NULL for 2-byte utf8 characters. See comments in my_weight_mb2_utf8mb3_general_ci(). */ - return (int) page[wc & 0xFF].sort; + return (int) page[wc & 0xFF]; } @@ -5545,8 +1017,16 @@ static inline int my_weight_mb3_utf8mb3_general_mysql500_ci(uchar b0, uchar b1, uchar b2) { my_wc_t wc= UTF8MB3_CODE(b0, b1, b2); - MY_UNICASE_CHARACTER *page= my_unicase_mysql500_pages[wc >> 8]; - return (int) (page ? page[wc & 0xFF].sort : wc); + const uint16 *page= weight_general_mysql500_ci_index[wc >> 8]; + return (int) (page ? page[wc & 0xFF] : wc); +} + + +static inline int +my_wc_weight_utf8mb3_general_mysql500_ci(my_wc_t wc) +{ + const uint16 *page= weight_general_mysql500_ci_index[wc >> 8]; + return (int) (page ? page[wc & 0xFF] : wc); } @@ -5554,10 +1034,8 @@ my_weight_mb3_utf8mb3_general_mysql500_ci(uchar b0, uchar b1, uchar b2) #define DEFINE_STRNXFRM_UNICODE #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_utf8mb3_quick(pwc, s, e) #define OPTIMIZE_ASCII 1 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_mysql500_page00 -#define UNICASE_PAGES my_unicase_mysql500_pages #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) +#define MY_WC_WEIGHT(x) my_wc_weight_utf8mb3_general_mysql500_ci(x) #define WEIGHT_MB1(x) my_weight_mb1_utf8mb3_general_mysql500_ci(x) #define WEIGHT_MB2(x,y) my_weight_mb2_utf8mb3_general_mysql500_ci(x,y) #define WEIGHT_MB3(x,y,z) my_weight_mb3_utf8mb3_general_mysql500_ci(x,y,z) @@ -5775,8 +1253,7 @@ struct charset_info_st my_charset_utf8mb3_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -5807,8 +1284,7 @@ struct charset_info_st my_charset_utf8mb3_general_mysql500_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_mysql500, /* caseinfo */ + &my_casefold_mysql500, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -5839,8 +1315,7 @@ struct charset_info_st my_charset_utf8mb3_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -5871,8 +1346,7 @@ struct charset_info_st my_charset_utf8mb3_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ + &my_casefold_default, /* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -5903,8 +1377,7 @@ struct charset_info_st my_charset_utf8mb3_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -5940,7 +1413,7 @@ static int my_strnncoll_utf8mb3_cs(CHARSET_INFO *cs, const uchar *te=t+tlen; int save_diff = 0; int diff; - MY_UNICASE_INFO *const *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *const *uni_plane= cs->casefold; while ( s < se && t < te ) { @@ -5983,7 +1456,7 @@ static int my_strnncollsp_utf8mb3_cs(CHARSET_INFO *cs, const uchar *se= s + slen; const uchar *te= t + tlen; int save_diff= 0; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; while ( s < se && t < te ) { @@ -6067,8 +1540,7 @@ struct charset_info_st my_charset_utf8mb3_general_cs= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -7341,9 +2813,7 @@ my_wc_to_printable_filename(CHARSET_INFO *cs, my_wc_t wc, #define DEFINE_STRNXFRM_UNICODE #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_filename(cs, pwc, s, e) #define OPTIMIZE_ASCII 0 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_char_to_weight(x) /* #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) @@ -7426,8 +2896,7 @@ struct charset_info_st my_charset_filename= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -7651,7 +3120,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen, int srcres, dstres; const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); while ((src < srcend) && @@ -7675,7 +3144,7 @@ my_hash_sort_utf8mb4_nopad(CHARSET_INFO *cs, const uchar *s, size_t slen, my_wc_t wc; int res; const uchar *e= s + slen; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; register ulong m1= *nr1, m2= *nr2; while ((res= my_mb_wc_utf8mb4(cs, &wc, (uchar*) s, (uchar*) e)) > 0) @@ -7719,7 +3188,7 @@ my_caseup_str_utf8mb4(CHARSET_INFO *cs, char *src) my_wc_t wc; int srcres, dstres; char *dst= src, *dst0= src; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(cs->cset->caseup_multiply(cs) == 1); while (*src && @@ -7745,7 +3214,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs, int srcres, dstres; const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); while ((src < srcend) && @@ -7768,7 +3237,7 @@ my_casedn_str_utf8mb4(CHARSET_INFO *cs, char *src) my_wc_t wc; int srcres, dstres; char *dst= src, *dst0= src; - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(cs->cset->casedn_multiply(cs) == 1); while (*src && @@ -7817,7 +3286,7 @@ my_casedn_str_utf8mb4(CHARSET_INFO *cs, char *src) static int my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t) { - MY_UNICASE_INFO *uni_plane= cs->caseinfo; + MY_CASEFOLD_INFO *uni_plane= cs->casefold; while (s[0] && t[0]) { my_wc_t s_wc,t_wc; @@ -7881,7 +3350,7 @@ my_wildcmp_utf8mb4(CHARSET_INFO *cs, int escape, int w_one, int w_many) { return my_wildcmp_unicode(cs, str, strend, wildstr, wildend, - escape, w_one, w_many, cs->caseinfo); + escape, w_one, w_many, cs->casefold); } @@ -7928,9 +3397,7 @@ my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)), #define DEFINE_STRNXFRM_UNICODE_NOPAD #define MY_MB_WC(cs, pwc, s, e) my_mb_wc_utf8mb4_quick(pwc, s, e) #define OPTIMIZE_ASCII 1 -#define UNICASE_MAXCHAR MY_UNICASE_INFO_DEFAULT_MAXCHAR -#define UNICASE_PAGE0 my_unicase_default_page00 -#define UNICASE_PAGES my_unicase_default_pages +#define MY_WC_WEIGHT(x) my_general_ci_char_to_weight(x) #define IS_MB4_CHAR(b0,b1,b2,b3) IS_UTF8MB4_STEP3(b0,b1,b2,b3) #define WEIGHT_ILSEQ(x) (0xFF0000 + (uchar) (x)) #define WEIGHT_MB1(b0) my_weight_mb1_utf8mb3_general_ci(b0) @@ -8116,8 +3583,7 @@ struct charset_info_st my_charset_utf8mb4_general_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -8149,8 +3615,7 @@ struct charset_info_st my_charset_utf8mb4_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -8182,8 +3647,7 @@ struct charset_info_st my_charset_utf8mb4_general_nopad_ci= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ @@ -8215,8 +3679,7 @@ struct charset_info_st my_charset_utf8mb4_nopad_bin= NULL, /* uca */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ - NULL, /* casefold */ - &my_unicase_default,/* caseinfo */ + &my_casefold_default,/* casefold */ NULL, /* state_map */ NULL, /* ident_map */ 1, /* strxfrm_multiply */ diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index 86b7de97010d7..a908bdd2b9526 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -711,7 +711,6 @@ struct charset_info_st my_charset_cp1250_czech_cs = tab_cp1250_uni, /* tab_to_uni */ idx_uni_cp1250, /* tab_from_uni */ NULL, /* casefold */ - &my_unicase_default, /* caseinfo */ NULL, /* state_map */ NULL, /* ident_map */ 2, /* strxfrm_multiply */ diff --git a/strings/strcoll.inl b/strings/strcoll.inl index ce220bebadbc3..a70009991df0a 100644 --- a/strings/strcoll.inl +++ b/strings/strcoll.inl @@ -490,16 +490,12 @@ MY_FUNCTION_NAME(strnxfrm)(CHARSET_INFO *cs, #error OPTIMIZE_ASCII must be defined for DEFINE_STRNXFRM_UNICODE #endif -#ifndef UNICASE_MAXCHAR -#error UNICASE_MAXCHAR must be defined for DEFINE_STRNXFRM_UNICODE +#if OPTIMIZE_ASCII && !defined(WEIGHT_MB1) +#error WEIGHT_MB1 must be defined for DEFINE_STRNXFRM_UNICODE #endif -#ifndef UNICASE_PAGE0 -#error UNICASE_PAGE0 must be defined for DEFINE_STRNXFRM_UNICODE -#endif - -#ifndef UNICASE_PAGES -#error UNICASE_PAGES must be defined for DEFINE_STRNXFRM_UNICODE +#ifndef MY_WC_WEIGHT +#error MY_WC_WEIGHT must be defined for DEFINE_STRNXFRM_UNICODE #endif @@ -514,7 +510,6 @@ MY_FUNCTION_NAME(strnxfrm_internal)(CHARSET_INFO *cs __attribute__((unused)), DBUG_ASSERT(src || !se); DBUG_ASSERT((cs->state & MY_CS_LOWER_SORT) == 0); - DBUG_ASSERT(0x7F <= UNICASE_MAXCHAR); for (; dst < de && *nweights; (*nweights)--) { @@ -524,7 +519,7 @@ MY_FUNCTION_NAME(strnxfrm_internal)(CHARSET_INFO *cs __attribute__((unused)), break; if (src[0] <= 0x7F) { - wc= UNICASE_PAGE0[*src++].sort; + wc= WEIGHT_MB1(*src++); PUT_WC_BE2_HAVE_1BYTE(dst, de, wc); continue; } @@ -532,14 +527,7 @@ MY_FUNCTION_NAME(strnxfrm_internal)(CHARSET_INFO *cs __attribute__((unused)), if ((res= MY_MB_WC(cs, &wc, src, se)) <= 0) break; src+= res; - if (wc <= UNICASE_MAXCHAR) - { - MY_UNICASE_CHARACTER *page; - if ((page= UNICASE_PAGES[wc >> 8])) - wc= page[wc & 0xFF].sort; - } - else - wc= MY_CS_REPLACEMENT_CHARACTER; + wc= MY_WC_WEIGHT(wc); PUT_WC_BE2_HAVE_1BYTE(dst, de, wc); } return dst - dst0; @@ -722,9 +710,7 @@ MY_FUNCTION_NAME(strnxfrm_nopad)(CHARSET_INFO *cs, #undef MY_FUNCTION_NAME #undef MY_MB_WC #undef OPTIMIZE_ASCII -#undef UNICASE_MAXCHAR -#undef UNICASE_PAGE0 -#undef UNICASE_PAGES +#undef MY_WC_WEIGHT #undef WEIGHT_ILSEQ #undef WEIGHT_MB1 #undef WEIGHT_MB2 diff --git a/strings/unidata-dump.c b/strings/unidata-dump.c new file mode 100644 index 0000000000000..5ecc8cb0c8cb1 --- /dev/null +++ b/strings/unidata-dump.c @@ -0,0 +1,1110 @@ +const char COPYING[]= "\ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.\n\ + Copyright (c) 2009, 2023, MariaDB Corporation.\n\ +\n\ + This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; version 2 of the License.\n\ +\n\ + This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details.\n\ +\n\ + You should have received a copy of the GNU General Public License\n\ + along with this program; if not, write to the Free Software\n\ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA\n\ +*/\n"; + +#include +#include +#include + +#define MAX_UNI_CHAR 0x10FFFF +#define MAX_UNI_PAGE 0x10FF + +#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1)) + + +typedef unsigned int my_wchar_t; + +/* Character types, as in m_ctype.h */ +#define _MY_U 01 /* Upper case */ +#define _MY_L 02 /* Lower case */ +#define _MY_NMR 04 /* Numeral (digit) */ +#define _MY_SPC 010 /* Spacing character */ +#define _MY_PNT 020 /* Punctuation */ +#define _MY_CTR 040 /* Control character */ +#define _MY_B 0100 /* Blank */ +#define _MY_X 0200 /* heXadecimal digit */ + +#define CT_MAX _MY_X +#define CT_CJK _MY_L | _MY_U +#define CT_HANGUL _MY_L | _MY_U +#define CT_NONE 0 + + +/* Decomposition types */ +typedef enum +{ + DT_UNKNOWN, + DT_FONT, + DT_NOBREAK, + DT_INITIAL, + DT_MEDIAL, + DT_FINAL, + DT_ISOLATED, + DT_CIRCLE, + DT_SUPER, + DT_SUB, + DT_VERTICAL, + DT_WIDE, + DT_NARROW, + DT_SMALL, + DT_SQUARE, + DT_FRACTION, + DT_COMPAT +} decomposition_type_t; + + +typedef enum +{ + PAGE_DATA_USELESS= 0, + PAGE_DATA_IMPORTANT= 1, + PAGE_DATA_DUMMY= 2 +} page_data_type_t; + + +typedef struct +{ + page_data_type_t page_tab; + int page_overridden; + int page_ctype; +} PAGE_STAT; + + +typedef struct +{ + const char *mode_name; + int print_ctype; + int print_toupper; + int print_tolower; + int print_noaccent; + int print_noaccent_tolower; + int print_noaccent_toupper; + int print_curly_brackets_in_items; + int print_curly_brackets_in_index; + int chars_per_line; + int single_array; + int pages_per_line_in_index; + int const_data; + const char *page_data_type_name; + const char *page_name; + const char *page_name_derived; + const char *index_data_type_name; + const char *index_name; +} UNIDATA_OPT_MODE; + + +typedef struct +{ + my_wchar_t max_char; + my_wchar_t dummy_pages_codepoint_max; + const char *filename; + UNIDATA_OPT_MODE mode; +} UNIDATA_OPT; + + +my_wchar_t npages_by_opt(const UNIDATA_OPT *opt) +{ + return (opt->max_char + 1) / 256; +} + + +typedef struct my_ctype_name_st +{ + const char *name; + int val; + int to_be_decomposed; +} MY_CTYPE_NAME_ST; + + +static MY_CTYPE_NAME_ST my_ctype_name[]= +{ + {"Lu", _MY_U, 1}, /* Letter, Uppercase */ + {"Ll", _MY_L, 1}, /* Letter, Lowercase */ + {"Lt", _MY_U, 1}, /* Letter, Titlecase */ + {"Lo", _MY_L, 1}, /* Letter, other */ + {"Lm", _MY_L, 0}, /* Letter, Modifier */ + + {"Nd", _MY_NMR, 0}, /* Number, Decimal Digit */ + {"Nl", _MY_NMR|_MY_U|_MY_L, 0}, /* Number, Letter */ + {"No", _MY_NMR|_MY_PNT, 0}, /* Number, Other */ + + {"Mn", _MY_L|_MY_PNT, 0}, /* Mark, Nonspacing */ + {"Mc", _MY_L|_MY_PNT, 1}, /* Mark, Spacing Combining */ + {"Me", _MY_L|_MY_PNT, 0}, /* Mark, Enclosing */ + + {"Pc", _MY_PNT, 0}, /* Punctuation, Connector */ + {"Pd", _MY_PNT, 0}, /* Punctuation, Dash */ + {"Ps", _MY_PNT, 0}, /* Punctuation, Open */ + {"Pe", _MY_PNT, 0}, /* Punctuation, Close */ + {"Pi", _MY_PNT, 0}, /* Punctuation, Initial quote */ + {"Pf", _MY_PNT, 0}, /* Punctuation, Final quote */ + {"Po", _MY_PNT, 0}, /* Punctuation, Other */ + + {"Sm", _MY_PNT, 0}, /* Symbol, Math */ + {"Sc", _MY_PNT, 0}, /* Symbol, Currency */ + {"Sk", _MY_PNT, 0}, /* Symbol, Modifier */ + {"So", _MY_PNT, 0}, /* Symbol, Other */ + + {"Zs", _MY_SPC, 0}, /* Separator, Space */ + {"Zl", _MY_SPC, 0}, /* Separator, Line */ + {"Zp", _MY_SPC, 0}, /* Separator, Paragraph */ + + {"Cc", _MY_CTR, 0}, /* Other, Control */ + {"Cf", _MY_CTR, 0}, /* Other, Format */ + {"Cs", _MY_CTR, 0}, /* Other, Surrogate */ + {"Co", _MY_CTR, 0}, /* Other, Private Use */ + {"Cn", _MY_CTR, 0}, /* Other, Not Assigned */ + {NULL, 0, 0} +}; + + +static const MY_CTYPE_NAME_ST * +ctype_name_st_find(my_wchar_t codepoint, const char *tok) +{ + MY_CTYPE_NAME_ST *p; + for (p= my_ctype_name; p->name; p++) + { + if (!strncasecmp(p->name, tok, 2)) + return p; + } + return NULL; +} + + +static int +ctype_name_st_to_num(const MY_CTYPE_NAME_ST *st, my_wchar_t codepoint) +{ + if ((codepoint >= 'a' && codepoint <= 'z') || + (codepoint >= 'A' && codepoint <= 'Z')) + return st->val | _MY_X; + return st->val; +} + + +static UNIDATA_OPT opt_caseinfo= +{ + 0x10FFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "caseinfo", /* mode name */ + 0, /* print_ctype */ + 1, /* print_toupper */ + 1, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 1, /* print_noaccent_toupper */ + 1, /* print_curly_brackets_in_items */ + 0, /* print_curly_brackets_in_index */ + 2, /* chars_per_line */ + 0, /* single_array */ + 8, /* pages_per_line_in_index */ + 0, /* const_data */ + "MY_UNICASE_CHARACTER", /* page_data_type_name */ + "plane", /* page_name */ + NULL, /* page_name_derived */ + "MY_UNICASE_CHARACTER *", /* index_data_type_name */ + "my_unicase_default_pages" /* index_name */ + } +}; + + +static UNIDATA_OPT opt_casefold= +{ + 0x10FFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "casefold", /* mode name */ + 0, /* print_ctype */ + 1, /* print_toupper */ + 1, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 0, /* print_noaccent_toupper */ + 1, /* print_curly_brackets_in_items */ + 0, /* print_curly_brackets_in_index */ + 2, /* chars_per_line */ + 0, /* single_array */ + 8, /* pages_per_line_in_index */ + 1, /* const_data */ + "MY_CASEFOLD_CHARACTER" , /* page_data_type_name */ + "page", /* page_name */ + NULL, /* page_name_derived */ + "MY_CASEFOLD_CHARACTER *", /* index_data_type_name */ + "my_casefold_default_pages" /* index_name */ + } +}; + + +static UNIDATA_OPT opt_casefold_tr= +{ + 0x10FFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "casefold-tr", /* mode name */ + 0, /* print_ctype */ + 1, /* print_toupper */ + 1, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 0, /* print_noaccent_toupper */ + 1, /* print_curly_brackets_in_items */ + 0, /* print_curly_brackets_in_index */ + 2, /* chars_per_line */ + 0, /* single_array */ + 8, /* pages_per_line_in_index */ + 1, /* const_data */ + "MY_CASEFOLD_CHARACTER" , /* page_data_type_name */ + "page_tr", /* page_name */ + "page", /* page_name_derived */ + "MY_CASEFOLD_CHARACTER *", /* index_data_type_name */ + "my_casefold_tr_pages" /* index_name */ + } +}; + + +static UNIDATA_OPT opt_weight_general_ci= +{ + 0xFFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "weight_general_ci", /* mode name */ + 0, /* print_ctype */ + 0, /* print_toupper */ + 0, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 1, /* print_noaccent_toupper */ + 0, /* print_curly_brackets_in_items */ + 0, /* print_curly_brackets_in_index */ + 8, /* chars_per_line */ + 0, /* single_array */ + 2, /* pages_per_line_in_index */ + 1, /* const_data */ + "uint16", /* page_data_type_name */ + "weight_general_ci_page", /* page_name */ + NULL, /* page_name_derived */ + "uint16 *", /* index_data_type_name */ + "weight_general_ci_index" /* index_name */ + } +}; + + +static UNIDATA_OPT opt_weight_general_mysql500_ci= +{ + 0xFFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "weight_general_mysql500_ci", /* mode name */ + 0, /* print_ctype */ + 0, /* print_toupper */ + 0, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 1, /* print_noaccent_toupper */ + 0, /* print_curly_brackets_in_items */ + 0, /* print_curly_brackets_in_index */ + 8, /* chars_per_line */ + 0, /* single_array */ + 2, /* pages_per_line_in_index */ + 1, /* const_data */ + "uint16", /* page_data_type_name */ + "weight_general_mysql500_ci_page", /* page_name */ + "weight_general_ci_page", /* page_name_derived */ + "uint16 *", /* index_data_type_name */ + "weight_general_mysql500_ci_index" /* index_name */ + } +}; + + +static UNIDATA_OPT opt_ctype= +{ + 0x10FFFF, /* max_char */ + 0x7FF, /* dummy_pages_codepoint_max == utf8 mb2 range */ + NULL, /*filename*/ + { + "ctype", /* mode name */ + 1, /* print_ctype */ + 0, /* print_toupper */ + 0, /* print_tolower */ + 0, /* print_noaccent */ + 0, /* print_noaccent_tolower */ + 0, /* print_noaccent_toupper */ + 0, /* print_curly_brackets_in_items */ + 1, /* print_curly_brackets_in_index */ + 16, /* chars_per_line */ + 0, /* single_array */ + 1, /* pages_per_line_in_index */ + 1, /* const_data */ + "unsigned char", /* page_data_type_name */ + "uctype_page", /* page_name */ + NULL, /* page_name_derived */ + "MY_UNI_CTYPE", /* index_data_type_name */ + "my_uni_ctype" /* index_name */ + } +}; + + +int opt_set_mode(UNIDATA_OPT *to, const char *name_and_value, const char *value) +{ + if (!strcmp(value, "casefold")) + { + to->mode= opt_casefold.mode; + return 0; + } + else if (!strcmp(value, "casefold-tr")) + { + to->mode= opt_casefold_tr.mode; + return 0; + } + else if (!strcmp(value, "caseinfo")) + { + to->mode= opt_caseinfo.mode; + return 0; + } + else if (!strcmp(value, "weight_general_ci")) + { + to->mode= opt_weight_general_ci.mode; + return 0; + } + else if (!strcmp(value, "weight_general_mysql500_ci")) + { + to->mode= opt_weight_general_mysql500_ci.mode; + return 0; + } + else if (!strcmp(value, "ctype")) + { + to->mode= opt_ctype.mode; + return 0; + } + fprintf(stderr, "Bad option: %s\n", name_and_value); + return 1; +} + + +static decomposition_type_t +get_decomposition_type(const char *str) +{ + if (!strcmp(str, "")) return DT_FONT; + if (!strcmp(str, "")) return DT_NOBREAK; + if (!strcmp(str, "")) return DT_INITIAL; + if (!strcmp(str, "")) return DT_MEDIAL; + if (!strcmp(str, "")) return DT_FINAL; + if (!strcmp(str, "")) return DT_ISOLATED; + if (!strcmp(str, "")) return DT_CIRCLE; + if (!strcmp(str, "")) return DT_SUPER; + if (!strcmp(str, "")) return DT_SUB; + if (!strcmp(str, "")) return DT_VERTICAL; + if (!strcmp(str, "")) return DT_WIDE; + if (!strcmp(str, "")) return DT_NARROW; + if (!strcmp(str, "")) return DT_SMALL; + if (!strcmp(str, "")) return DT_SQUARE; + if (!strcmp(str, "")) return DT_FRACTION; + if (!strcmp(str, "")) return DT_COMPAT; + return DT_UNKNOWN; +} + + +#define MAX_DECOMP 20 + + +typedef struct +{ + int ctype; + int toupper; + int tolower; + int noaccent; + int noaccent_tolower; + int noaccent_toupper; + int decomp_type; + int decomp[MAX_DECOMP]; + int to_be_decomposed; +} UNIDATA_CHAR; + + + +/************* Initialization functions *********/ + + +static int +strip_accent(UNIDATA_CHAR *code, int i) +{ + if (code[i].decomp[0] && + code[i].decomp[1] >= 0x0300 && + code[i].decomp[1] <= 0x036F && + code[i].decomp[2] == 0) + return strip_accent(code, code[i].decomp[0]); + return i; +} + + +static void +set_noaccent(const UNIDATA_OPT *opt, UNIDATA_CHAR *code) +{ + my_wchar_t i; + for (i= 0; i <= opt->max_char; i++) + { + code[i].noaccent= strip_accent(code, i); + } +} + + +static void +set_noaccent_tolower(const UNIDATA_OPT *opt, UNIDATA_CHAR *code) +{ + my_wchar_t i; + for (i= 0; i <= opt->max_char; i++) + { + code[i].noaccent_tolower= code[code[i].noaccent].tolower; + } +} + + +static void +set_noaccent_toupper(const UNIDATA_OPT *opt, UNIDATA_CHAR *code) +{ + my_wchar_t i; + for (i= 0; i <= opt->max_char; i++) + { + code[i].noaccent_toupper= code[code[i].noaccent].toupper; + } +} + + +static void +set_default_case_folding(const UNIDATA_OPT *opt, UNIDATA_CHAR *code) +{ + my_wchar_t i; + for (i= 0; i <= opt->max_char; i++) + { + code[i].tolower= i; + code[i].toupper= i; + } +} + + +/* + Fill ideographs +*/ + +static void +fill_cjk(UNIDATA_CHAR *code) +{ + size_t i; + /* CJK Ideographs Extension A (U+3400 - U+4DB5) */ + for(i=0x3400;i<=0x4DB5;i++) + { + code[i].tolower=i; + code[i].ctype= CT_CJK; + } + /* CJK Ideographs (U+4E00 - U+9FA5) */ + for(i=0x4E00;i<=0x9FA5;i++) + { + code[i].tolower=i; + code[i].ctype= CT_CJK; + } + /* Hangul Syllables (U+AC00 - U+D7A3) */ + for(i=0xAC00;i<=0xD7A3;i++) + { + code[i].tolower=i; + code[i].ctype= CT_HANGUL; + } +} + + +/************* Loading functions ***************/ + + +static void handle_general_category(const UNIDATA_OPT *opt, + UNIDATA_CHAR *ch, + const char *tok, + my_wchar_t codepoint) +{ + /* + TODO: check if ctype is set correctly. + A difference can break fulltext indexes. + */ + + const MY_CTYPE_NAME_ST *ct= ctype_name_st_find( + (my_wchar_t) codepoint, tok); + if (ct) + { + ch->ctype|= ctype_name_st_to_num( + ct, + (my_wchar_t) codepoint); + ch->to_be_decomposed= ct->to_be_decomposed; + } +} + + +int handle_decomposition(UNIDATA_CHAR *ch, char *tok, const char *str) +{ + char *lt, *part; + size_t num; + + if (!ch->to_be_decomposed) + return 0; /* Decompose only letters */ + + for (part= strtok_r(tok, " ", <), num= 0; + part; + part= strtok_r(NULL, " ", <)) + { + char *end; + if (part[0] == '<') + { + if ((ch->decomp_type= get_decomposition_type(part)) == DT_UNKNOWN) + { + fprintf(stderr, "Unknown decomposition type:\n%s\n", str); + return 1; + } + continue; + } + + if (num + 1 >= MAX_DECOMP) + { + fprintf(stderr, "Too many decomposition parts:\n%s\n", str); + return 1; + } + ch->decomp[num]= strtol(part,&end,16); + ch->decomp[num+1]= 0; + num++; + } + return 0; +} + + +static int +parse_unidata_line(const UNIDATA_OPT *opt, char *str, UNIDATA_CHAR *unidata) +{ + unsigned long codepoint= 0; + int fieldno= 0; + char *s; + + for (s= str; *s; fieldno++) + { + char *tok= s, *e; + + if ((e= strchr(s,';'))) + { + *e= '\0'; + s= e + 1; + } + else + { + s+= strlen(s); + } + + switch (fieldno) + { + case 0: /* Code point */ + codepoint= strtoul(tok, NULL, 16); + if (codepoint > opt->max_char) + return 1; + break; + case 1: /* name */ + break; + case 2: /* general category */ + handle_general_category(opt, &unidata[codepoint], + tok, (my_wchar_t) codepoint); + break; + case 3: /* Canonical combining class */ + break; + case 4: /* BiDi class */ + break; + case 5: /* Decomposition type */ + if (tok[0] && handle_decomposition(&unidata[codepoint], tok, str)) + return -1; + break; + case 6: /* Numeric_Type, Numeric Value */ + break; + case 7: /* Numeric_Type, Numeric Value */ + break; + case 8: /* Numeric_Type, Numeric Value */ + break; + case 9: /* BiDi mirrored */ + break; + case 10: /* Unicode_1_Name */ + break; + case 11: /* ISO_Comment */ + break; + case 12: /*Simple_Uppercase_Mapping*/ + if (tok[0]) + unidata[codepoint].toupper= strtol(tok, NULL, 16); + break; + case 13: /*Simple_Lowercase_Mapping*/ + if (tok[0]) + unidata[codepoint].tolower= strtol(tok, NULL, 16); + break; + case 14: /* Simple_Titlecase_Mapping */ + break; + } + } + + return 0; +} + + +static int +load_unidata_file(const UNIDATA_OPT *opt, FILE *f, UNIDATA_CHAR *unidata) +{ + char str[1024]; + + while (fgets(str, sizeof(str), f)) + { + if (parse_unidata_line(opt, str, unidata) < 0) + return 1; + } + return 0; +} + + +static int +load_unidata(const UNIDATA_OPT *opt, UNIDATA_CHAR *unidata) +{ + FILE *f; + int rc; + if (!(f= fopen(opt->filename, "r"))) + { + fprintf(stderr, "Could not open file '%s'\n", opt->filename); + return 1; + } + rc= load_unidata_file(opt, f, unidata); + fclose(f); + return rc; +} + +/************** Printing functions ********************/ + +static void +print_one_char(const UNIDATA_OPT *opt, UNIDATA_CHAR *data, int code) +{ + UNIDATA_CHAR *ch= &data[code]; + const char *comma= ""; + + if (opt->mode.print_curly_brackets_in_items) + printf("{"); + + if (opt->mode.print_ctype) + { + printf("%s", comma); + printf("%3d", ch->ctype); + comma= ","; + } + + if (opt->mode.print_toupper) + { + printf("%s", comma); + printf("0x%04X", ch->toupper); + comma= ","; + } + + if (opt->mode.print_tolower) + { + printf("%s", comma); + printf("0x%04X", ch->tolower); + comma= ","; + } + + if (opt->mode.print_noaccent) + { + printf("%s", comma); + printf("0x%04X", ch->noaccent); + comma= ","; + } + + if (opt->mode.print_noaccent_tolower) + { + printf("%s", comma); + printf("0x%04X", ch->noaccent_tolower); + comma= ","; + } + + if (opt->mode.print_noaccent_toupper) + { + printf("%s", comma); + printf("0x%04X", ch->noaccent_toupper); + comma= ","; + } + + if (opt->mode.print_curly_brackets_in_items) + printf("}"); + + if (opt->mode.single_array || + (code & 0xFF) != 0xFF) /* Don't print comma for the last char in a page */ + printf(","); + else + printf(" "); +} + + +static void +print_one_page(const UNIDATA_OPT *opt, UNIDATA_CHAR *data, + my_wchar_t pageno, const PAGE_STAT *pstat) +{ + my_wchar_t charnum; + + if (!opt->mode.single_array || pageno == 0) + { + printf("%s%s%s %s%02X[256]={%s\n", + pageno == 0 ? "" : "static ", + opt->mode.const_data ? "const " : "", + opt->mode.page_data_type_name, opt->mode.page_name, + (unsigned int) pageno, + pstat[pageno].page_tab == PAGE_DATA_DUMMY ? + " /* This page is dummy */" : ""); + } + + for (charnum= 0; charnum < 256; charnum++) + { + my_wchar_t codepoint= (pageno << 8) + charnum; + my_wchar_t rem= charnum % opt->mode.chars_per_line; + if (!rem) + printf(" "); + print_one_char(opt, data, codepoint); + if (rem + 1 == opt->mode.chars_per_line) + { + printf(" /* %04X */", (codepoint + 1) - opt->mode.chars_per_line); + printf("\n"); + } + } + if (!opt->mode.single_array) + printf("};\n\n"); +} + + +static const char *page_name_in_index(const UNIDATA_OPT *opt, + const PAGE_STAT *pstat, + my_wchar_t pageno) +{ + if (!opt->mode.page_name_derived) + return opt->mode.page_name; + + return pstat[pageno].page_overridden ? + opt->mode.page_name : + opt->mode.page_name_derived; +} + + +static void print_page_index(const UNIDATA_OPT *opt, + const PAGE_STAT *pstat) +{ + my_wchar_t page; + my_wchar_t npages= npages_by_opt(opt); + int printing_ctype= !strcmp(opt->mode.index_data_type_name, "MY_UNI_CTYPE"); + + printf("%s%s %s[%d]={\n", + opt->mode.const_data ? "const " : "", + opt->mode.index_data_type_name, opt->mode.index_name, + (unsigned int) npages); + + for (page= 0; page < npages; page++) + { + my_wchar_t rem= page % opt->mode.pages_per_line_in_index; + if (!rem) + printf(" "); + if (opt->mode.print_curly_brackets_in_index) + printf("{"); + if (printing_ctype) + printf("%d,", pstat[page].page_ctype); + + if (pstat[page].page_tab) + printf("%s%02X", page_name_in_index(opt, pstat, page), page); + else + printf("NULL"); + + if (opt->mode.print_curly_brackets_in_index) + printf("}"); + + if (page + 1 < npages) + printf(","); + + if (rem + 1 == opt->mode.pages_per_line_in_index) + printf("\n"); + else + printf(" "); + } + printf("};\n"); +} + + +static void print(UNIDATA_OPT *opt, UNIDATA_CHAR *unidata, const PAGE_STAT *pstat) +{ + my_wchar_t npages= npages_by_opt(opt); + my_wchar_t page; + + /* Print all pages */ + for (page= 0; page < npages; page++) + { + if (opt->mode.page_name_derived && !pstat[page].page_overridden) + continue; + if (opt->mode.single_array || pstat[page].page_tab) + print_one_page(opt, unidata, page, pstat); + } + + /* Print index */ + if (!opt->mode.single_array) + print_page_index(opt, pstat); +} + + +void print_command_line_options(int ac, char **av) +{ + int i; + printf("/*\n"); + printf(" Generated by:\n"); + for (i= 0; i < ac; i++) + { + printf(" %s%s%s\n", i > 0 ? " " : "", av[i], i+1 < ac ? " \\" :""); + } + printf("\n"); + printf("*/\n"); +} + + +static void calc_page_parameters(const UNIDATA_OPT *opt, const UNIDATA_CHAR *code, + PAGE_STAT *pstat) +{ + my_wchar_t npages= npages_by_opt(opt); + my_wchar_t page; + for(page= 0; page < npages; page++) + { + int ntype[CT_MAX + 1], t; + int character, done=0; + + memset(ntype,0,sizeof(ntype)); + for(character= 0;character < 256; character++) + { + size_t cod= (page << 8) + character; + const UNIDATA_CHAR *ch= &code[cod]; + ntype[ch->ctype]++; + + if((ch->tolower != cod || + ch->toupper != cod || + ch->noaccent != cod || + ch->noaccent_toupper != cod) && + (opt->mode.print_tolower || + opt->mode.print_toupper || + opt->mode.print_noaccent || + opt->mode.print_noaccent_toupper)) + { + pstat[page].page_tab= PAGE_DATA_IMPORTANT; + } + } + + if (opt->mode.print_ctype) + { + for (t= 0; t <= CT_MAX; t++) + { + if(ntype[t]==256) + { + /* All ctypes are the same */ + pstat[page].page_ctype= t; + done=1; + break; + } + } + } + else + { + done= 1; /* Don't need ctype */ + } + + if(!done) + { + /* Mixed page, lets create the table */ + pstat[page].page_ctype= CT_NONE; + pstat[page].page_tab= PAGE_DATA_IMPORTANT; + } + if (!pstat[page].page_tab && + page <= (opt->dummy_pages_codepoint_max >> 8)) + pstat[page].page_tab= PAGE_DATA_DUMMY; + } +} + + +static UNIDATA_CHAR code[MAX_UNI_CHAR + 1]; +static PAGE_STAT pstat[MAX_UNI_PAGE + 1]; + + +int usage(int ac, char **av) +{ + fprintf(stderr, "Usage: %s filename\n", av[0]); + return 1; +} + + +const char *one_opt(const char *option, const char *name, size_t length) +{ + if (!strncmp(option, name, length)) + return option + length; + return 0; +} + + +int get_option_bool(int *to, const char *name_and_value, const char *value) +{ + if (!strcmp(value, "1")) + *to= 1; + else if (!strcmp(value, "0")) + *to= 0; + else + { + fprintf(stderr, "Bad option: %s\n", name_and_value); + return 1; + } + return 0; +} + + +int get_option_codepoint(my_wchar_t *to, const char *name_and_value, const char *value) +{ + unsigned long codepoint= value[0]=='0' && value[1]=='x' ? + strtoul(value + 2, NULL, 16) : + strtoul(value, NULL, 10); + if (codepoint > MAX_UNI_CHAR) + { + fprintf(stderr, "Too large --max-char: %s\n", name_and_value); + return 1; + } + *to= (my_wchar_t) codepoint; + return 0; +} + + +int process_param(UNIDATA_OPT *opt, int ac, char **av) +{ + int i; + if (ac < 2) + return usage(ac, av); + for (i= 1; i < ac; i++) + { + const char *op; + if ((op= one_opt(av[i], STRING_WITH_LEN("--mode=")))) + { + if (opt_set_mode(opt, av[i], op)) + return 1; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--max-char=")))) + { + if (get_option_codepoint(&opt->max_char, av[i], op)) + return 1; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--print-toupper=")))) + { + if (get_option_bool(&opt->mode.print_toupper, av[i], op)) + return 1; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--print-tolower=")))) + { + if (get_option_bool(&opt->mode.print_tolower, av[i], op)) + return 1; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--print-noaccent-toupper=")))) + { + if (get_option_bool(&opt->mode.print_noaccent_toupper, av[i], op)) + return 1; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--page-name=")))) + { + opt->mode.page_name= op; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--page-name-derived=")))) + { + opt->mode.page_name_derived= op; + } + else if ((op= one_opt(av[i], STRING_WITH_LEN("--index-name=")))) + { + opt->mode.index_name= op; + } + else + { + if (av[i][0] == '-' && av[i][1] == '-') + { + fprintf(stderr, "Unknown option: %s\n", av[i]); + return 1; + } + break; + } + } + if (i + 1 != ac) + return usage(ac, av); + opt->filename= av[i]; + return 0; +} + + +int main(int ac,char **av) +{ + UNIDATA_OPT opt= opt_caseinfo; + + if (process_param(&opt, ac, av)) + return 1; + + memset(code,0,sizeof(code)); + memset(pstat,0,sizeof(pstat)); + + set_default_case_folding(&opt, code); + + fill_cjk(code); + + if (load_unidata(&opt, code)) + return 1; + + set_noaccent(&opt, code); + set_noaccent_tolower(&opt, code); + set_noaccent_toupper(&opt, code); + + /* + Bug#8385: utf8_general_ci treats cyrillic letters I and SHORT I as the same + Because of decomposition applied, noaccent_toupper for the following letters: + U+0419 CYRILLIC CAPITAL LETTER SHORT I + U+0439 CYRILLIC SMALL LETTER SHORT I + was set to: + U+418 CYRILLIC CAPITAL LETTER I + Reset it back to U+0419. + */ + code[0x0419].noaccent_toupper= 0x0419; + code[0x0439].noaccent_toupper= 0x0419; + + /* + Bug#27877 incorrect german order in utf8_general_ci + */ + if (strcmp(opt.mode.mode_name, "weight_general_mysql500_ci")) + { + code[0x00DF].noaccent_toupper= code['s'].noaccent_toupper; + } + else + pstat[0].page_overridden= 1; + + if (!strcmp(opt.mode.mode_name, "casefold-tr")) + { + code[0x49].tolower= 0x0131; + code[0x69].toupper= 0x0130; + pstat[0].page_overridden= 1; + } + + calc_page_parameters(&opt, code, pstat); + + printf("%s\n", COPYING); + print_command_line_options(ac, av); + print(&opt, code, pstat); + + return 0; +} From c21745dbe4b8e1489b1f2f27de094df04143830a Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 2 Mar 2023 17:37:36 +0400 Subject: [PATCH 31/70] MDEV-30577 Case folding for uca1400 collations is not up to date Adding casefolding for Unicode-14.0.0 into uca1400 collations. --- mysql-test/include/ctype_casefolding.inc | 6 + .../ctype_casefolding_supplementary.inc | 16 + mysql-test/main/ctype_ldml.result | 47 + mysql-test/main/ctype_ldml.test | 7 + mysql-test/main/ctype_utf8_uca.result | 63 + mysql-test/main/ctype_utf8mb4_uca.result | 165 + mysql-test/main/ctype_utf8mb4_uca.test | 5 + ...type_utf8mb4_uca1400_ai_ci_casefold.result | 2927 ++++++++++++ .../ctype_utf8mb4_uca1400_ai_ci_casefold.test | 15 + strings/ctype-uca.c | 6 +- strings/ctype-unicode1400-casefold-tr.h | 704 +++ strings/ctype-unicode1400-casefold.h | 4240 +++++++++++++++++ strings/ctype-unidata.c | 18 + strings/ctype-unidata.h | 2 + strings/ctype-utf8.c | 4 +- 15 files changed, 8221 insertions(+), 4 deletions(-) create mode 100644 mysql-test/include/ctype_casefolding_supplementary.inc create mode 100644 mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.result create mode 100644 mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.test create mode 100644 strings/ctype-unicode1400-casefold-tr.h create mode 100644 strings/ctype-unicode1400-casefold.h diff --git a/mysql-test/include/ctype_casefolding.inc b/mysql-test/include/ctype_casefolding.inc index 74b2ab7650a79..fc77b396f6831 100644 --- a/mysql-test/include/ctype_casefolding.inc +++ b/mysql-test/include/ctype_casefolding.inc @@ -21,6 +21,12 @@ INSERT INTO case_folding (code) VALUES (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; + UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; DROP TABLE case_folding; diff --git a/mysql-test/include/ctype_casefolding_supplementary.inc b/mysql-test/include/ctype_casefolding_supplementary.inc new file mode 100644 index 0000000000000..7646ab5682e9f --- /dev/null +++ b/mysql-test/include/ctype_casefolding_supplementary.inc @@ -0,0 +1,16 @@ +CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c, SPACE(64) AS comment LIMIT 0; +SHOW CREATE TABLE case_folding; + +INSERT INTO case_folding (code, comment) VALUES (0x10595, 'VITHKUQI CAPITAL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x105BC, 'VITHKUQI SMALL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E921, 'ADLAM CAPITAL LETTER SHA (Unicode-9.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E943, 'ADLAM SMALL LETTER SHA (Unicode-9.0)'); + +UPDATE case_folding SET c=CHAR(code USING utf32); +SELECT + HEX(CONVERT(c USING utf32)) AS ch, + HEX(CONVERT(LOWER(c) USING utf32)) AS cl, + HEX(CONVERT(UPPER(c) USING utf32)) AS cu, + comment +FROM case_folding ORDER BY BINARY(c); +DROP TABLE case_folding; diff --git a/mysql-test/main/ctype_ldml.result b/mysql-test/main/ctype_ldml.result index a23e835d1faad..31508fcd1b150 100644 --- a/mysql-test/main/ctype_ldml.result +++ b/mysql-test/main/ctype_ldml.result @@ -3074,6 +3074,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -3091,6 +3096,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; # # End of 10.3 tests @@ -3267,6 +3276,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -3284,6 +3298,39 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B19F E2B0AF Ⱟ +2C5F E2B19F E2B0AF ⱟ +A7C0 EA9F81 EA9F80 Ꟁ +A7C1 EA9F81 EA9F80 ꟁ +DROP TABLE case_folding; +# +# MDEV-30577 Case folding for uca1400 collations is not up to date +# +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci; +CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c, SPACE(64) AS comment LIMIT 0; +SHOW CREATE TABLE case_folding; +Table Create Table +case_folding CREATE TABLE `case_folding` ( + `code` int(1) NOT NULL, + `c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci DEFAULT NULL, + `comment` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO case_folding (code, comment) VALUES (0x10595, 'VITHKUQI CAPITAL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x105BC, 'VITHKUQI SMALL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E921, 'ADLAM CAPITAL LETTER SHA (Unicode-9.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E943, 'ADLAM SMALL LETTER SHA (Unicode-9.0)'); +UPDATE case_folding SET c=CHAR(code USING utf32); +SELECT +HEX(CONVERT(c USING utf32)) AS ch, +HEX(CONVERT(LOWER(c) USING utf32)) AS cl, +HEX(CONVERT(UPPER(c) USING utf32)) AS cu, +comment +FROM case_folding ORDER BY BINARY(c); +ch cl cu comment +00010595 000105BC 00010595 VITHKUQI CAPITAL LETTER ZE (Unicode-14.0) +000105BC 000105BC 00010595 VITHKUQI SMALL LETTER ZE (Unicode-14.0) +0001E921 0001E943 0001E921 ADLAM CAPITAL LETTER SHA (Unicode-9.0) +0001E943 0001E943 0001E921 ADLAM SMALL LETTER SHA (Unicode-9.0) DROP TABLE case_folding; # # End of 10.10 tests diff --git a/mysql-test/main/ctype_ldml.test b/mysql-test/main/ctype_ldml.test index 6336a1d0f5f41..9189630e5a34e 100644 --- a/mysql-test/main/ctype_ldml.test +++ b/mysql-test/main/ctype_ldml.test @@ -704,6 +704,13 @@ DROP TABLE t1; SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci; --source include/ctype_casefolding.inc +--echo # +--echo # MDEV-30577 Case folding for uca1400 collations is not up to date +--echo # + +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci; +--source include/ctype_casefolding_supplementary.inc + --echo # --echo # End of 10.10 tests --echo # diff --git a/mysql-test/main/ctype_utf8_uca.result b/mysql-test/main/ctype_utf8_uca.result index bacdd81cbd9b1..97bdadbb97b9c 100644 --- a/mysql-test/main/ctype_utf8_uca.result +++ b/mysql-test/main/ctype_utf8_uca.result @@ -618,6 +618,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -635,6 +640,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci /*Unicode-4.0 folding, with Turkish mapping for I */; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -661,6 +670,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -678,6 +692,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 C4B0 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -704,6 +722,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -721,6 +744,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -747,6 +774,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -764,6 +796,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb3 COLLATE utf8mb3_myanmar_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -790,6 +826,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -807,6 +848,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb3 COLLATE utf8mb3_thai_520_w2; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -833,6 +878,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -850,6 +900,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; # # End of 10.3 tests @@ -1805,6 +1859,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -1822,6 +1881,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B19F E2B0AF Ⱟ +2C5F E2B19F E2B0AF ⱟ +A7C0 EA9F81 EA9F80 Ꟁ +A7C1 EA9F81 EA9F80 ꟁ DROP TABLE case_folding; # # End of 10.10 tests diff --git a/mysql-test/main/ctype_utf8mb4_uca.result b/mysql-test/main/ctype_utf8mb4_uca.result index 42de45c98a3c7..3cd25891119c6 100644 --- a/mysql-test/main/ctype_utf8mb4_uca.result +++ b/mysql-test/main/ctype_utf8mb4_uca.result @@ -6636,6 +6636,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6653,6 +6658,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci /*Unicode-4.0 folding with Turkish mapping for I */; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -6679,6 +6688,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6696,6 +6710,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 C4B0 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -6722,6 +6740,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6739,6 +6762,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -6765,6 +6792,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6782,6 +6814,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb4 COLLATE utf8mb4_myanmar_ci; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -6808,6 +6844,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6825,6 +6866,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; SET NAMES utf8mb4 COLLATE utf8mb4_thai_520_w2; CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; @@ -6851,6 +6896,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -6868,6 +6918,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B0AF E2B0AF Ⱟ +2C5F E2B19F E2B19F ⱟ +A7C0 EA9F80 EA9F80 Ꟁ +A7C1 EA9F81 EA9F81 ꟁ DROP TABLE case_folding; # # End of 10.3 tests @@ -11499,6 +11553,11 @@ INSERT INTO case_folding (code) VALUES (0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, (0x0131) /* LATIN SMALL LETTER DOTLESS I */ ; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; UPDATE case_folding SET c=CHAR(code USING ucs2); SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c @@ -11516,6 +11575,112 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c 69 69 49 i 130 69 C4B0 İ 131 C4B1 49 ı +2C2F E2B19F E2B0AF Ⱟ +2C5F E2B19F E2B0AF ⱟ +A7C0 EA9F81 EA9F80 Ꟁ +A7C1 EA9F81 EA9F80 ꟁ +DROP TABLE case_folding; +CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c, SPACE(64) AS comment LIMIT 0; +SHOW CREATE TABLE case_folding; +Table Create Table +case_folding CREATE TABLE `case_folding` ( + `code` int(1) NOT NULL, + `c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL, + `comment` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO case_folding (code, comment) VALUES (0x10595, 'VITHKUQI CAPITAL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x105BC, 'VITHKUQI SMALL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E921, 'ADLAM CAPITAL LETTER SHA (Unicode-9.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E943, 'ADLAM SMALL LETTER SHA (Unicode-9.0)'); +UPDATE case_folding SET c=CHAR(code USING utf32); +SELECT +HEX(CONVERT(c USING utf32)) AS ch, +HEX(CONVERT(LOWER(c) USING utf32)) AS cl, +HEX(CONVERT(UPPER(c) USING utf32)) AS cu, +comment +FROM case_folding ORDER BY BINARY(c); +ch cl cu comment +00010595 000105BC 00010595 VITHKUQI CAPITAL LETTER ZE (Unicode-14.0) +000105BC 000105BC 00010595 VITHKUQI SMALL LETTER ZE (Unicode-14.0) +0001E921 0001E943 0001E921 ADLAM CAPITAL LETTER SHA (Unicode-9.0) +0001E943 0001E943 0001E921 ADLAM SMALL LETTER SHA (Unicode-9.0) +DROP TABLE case_folding; +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_turkish_ai_ci; +CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0; +SHOW CREATE TABLE case_folding; +Table Create Table +case_folding CREATE TABLE `case_folding` ( + `code` int(1) NOT NULL, + `c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_turkish_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO case_folding (code) VALUES +(0x23A), +(0x23E), +(0x23F), +(0x240), +(0x250), +(0x251), +(0x252), +(0x26B), +(0x271), +(0x27D); +INSERT INTO case_folding (code) VALUES +(0x0049) /* LATIN CAPITAL LETTER I */, +(0x0069) /* LATIN SMALL LETTER I */, +(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */, +(0x0131) /* LATIN SMALL LETTER DOTLESS I */ +; +INSERT INTO case_folding (code) VALUES +(0x2C2F) /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0x2C5F) /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI (Unicode-14.0) */, +(0xA7C0) /* LATIN CAPITAL LETTER OLD POLISH O (Unicode-14.0) */, +(0xA7C1) /* LATIN SMALL LETTER OLD POLISH O (Unicode-14.0) */; +UPDATE case_folding SET c=CHAR(code USING ucs2); +SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding; +HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c +23A E2B1A5 C8BA Ⱥ +23E E2B1A6 C8BE Ⱦ +23F C8BF E2B1BE ȿ +240 C980 E2B1BF ɀ +250 C990 E2B1AF ɐ +251 C991 E2B1AD ɑ +252 C992 E2B1B0 ɒ +26B C9AB E2B1A2 ɫ +271 C9B1 E2B1AE ɱ +27D C9BD E2B1A4 ɽ +49 C4B1 49 I +69 69 C4B0 i +130 69 C4B0 İ +131 C4B1 49 ı +2C2F E2B19F E2B0AF Ⱟ +2C5F E2B19F E2B0AF ⱟ +A7C0 EA9F81 EA9F80 Ꟁ +A7C1 EA9F81 EA9F80 ꟁ +DROP TABLE case_folding; +CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c, SPACE(64) AS comment LIMIT 0; +SHOW CREATE TABLE case_folding; +Table Create Table +case_folding CREATE TABLE `case_folding` ( + `code` int(1) NOT NULL, + `c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_turkish_ai_ci DEFAULT NULL, + `comment` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_turkish_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO case_folding (code, comment) VALUES (0x10595, 'VITHKUQI CAPITAL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x105BC, 'VITHKUQI SMALL LETTER ZE (Unicode-14.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E921, 'ADLAM CAPITAL LETTER SHA (Unicode-9.0)'); +INSERT INTO case_folding (code, comment) VALUES (0x1E943, 'ADLAM SMALL LETTER SHA (Unicode-9.0)'); +UPDATE case_folding SET c=CHAR(code USING utf32); +SELECT +HEX(CONVERT(c USING utf32)) AS ch, +HEX(CONVERT(LOWER(c) USING utf32)) AS cl, +HEX(CONVERT(UPPER(c) USING utf32)) AS cu, +comment +FROM case_folding ORDER BY BINARY(c); +ch cl cu comment +00010595 000105BC 00010595 VITHKUQI CAPITAL LETTER ZE (Unicode-14.0) +000105BC 000105BC 00010595 VITHKUQI SMALL LETTER ZE (Unicode-14.0) +0001E921 0001E943 0001E921 ADLAM CAPITAL LETTER SHA (Unicode-9.0) +0001E943 0001E943 0001E921 ADLAM SMALL LETTER SHA (Unicode-9.0) DROP TABLE case_folding; # # End of 10.10 tests diff --git a/mysql-test/main/ctype_utf8mb4_uca.test b/mysql-test/main/ctype_utf8mb4_uca.test index 3f428447cc93b..1b709ebba6926 100644 --- a/mysql-test/main/ctype_utf8mb4_uca.test +++ b/mysql-test/main/ctype_utf8mb4_uca.test @@ -435,6 +435,11 @@ DROP PROCEDURE test_styles; SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; --source include/ctype_casefolding.inc +--source include/ctype_casefolding_supplementary.inc + +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_turkish_ai_ci; +--source include/ctype_casefolding.inc +--source include/ctype_casefolding_supplementary.inc --echo # --echo # End of 10.10 tests diff --git a/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.result b/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.result new file mode 100644 index 0000000000000..85e87f217cc6e --- /dev/null +++ b/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.result @@ -0,0 +1,2927 @@ +# +# Start of 10.10 tests +# +# +# MDEV-30577 Case folding for uca1400 collations is not up to date +# +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; +EXECUTE IMMEDIATE SFORMAT(' +CREATE VIEW v_bmp AS +SELECT + seq AS codepoint, + LPAD(HEX(seq),4,''0'') AS codepoint_hex4, + CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c +FROM + seq_0_to_65535', @@character_set_connection, @@collation_connection); +SELECT COLLATION(c) FROM v_bmp LIMIT 1; +COLLATION(c) +utf8mb4_uca1400_ai_ci +SELECT +codepoint_hex4, +HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)), +HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2)) +FROM v_bmp +WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c)); +codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2)) +0041 0061 0041 +0042 0062 0042 +0043 0063 0043 +0044 0064 0044 +0045 0065 0045 +0046 0066 0046 +0047 0067 0047 +0048 0068 0048 +0049 0069 0049 +004A 006A 004A +004B 006B 004B +004C 006C 004C +004D 006D 004D +004E 006E 004E +004F 006F 004F +0050 0070 0050 +0051 0071 0051 +0052 0072 0052 +0053 0073 0053 +0054 0074 0054 +0055 0075 0055 +0056 0076 0056 +0057 0077 0057 +0058 0078 0058 +0059 0079 0059 +005A 007A 005A +0061 0061 0041 +0062 0062 0042 +0063 0063 0043 +0064 0064 0044 +0065 0065 0045 +0066 0066 0046 +0067 0067 0047 +0068 0068 0048 +0069 0069 0049 +006A 006A 004A +006B 006B 004B +006C 006C 004C +006D 006D 004D +006E 006E 004E +006F 006F 004F +0070 0070 0050 +0071 0071 0051 +0072 0072 0052 +0073 0073 0053 +0074 0074 0054 +0075 0075 0055 +0076 0076 0056 +0077 0077 0057 +0078 0078 0058 +0079 0079 0059 +007A 007A 005A +00B5 00B5 039C +00C0 00E0 00C0 +00C1 00E1 00C1 +00C2 00E2 00C2 +00C3 00E3 00C3 +00C4 00E4 00C4 +00C5 00E5 00C5 +00C6 00E6 00C6 +00C7 00E7 00C7 +00C8 00E8 00C8 +00C9 00E9 00C9 +00CA 00EA 00CA +00CB 00EB 00CB +00CC 00EC 00CC +00CD 00ED 00CD +00CE 00EE 00CE +00CF 00EF 00CF +00D0 00F0 00D0 +00D1 00F1 00D1 +00D2 00F2 00D2 +00D3 00F3 00D3 +00D4 00F4 00D4 +00D5 00F5 00D5 +00D6 00F6 00D6 +00D8 00F8 00D8 +00D9 00F9 00D9 +00DA 00FA 00DA +00DB 00FB 00DB +00DC 00FC 00DC +00DD 00FD 00DD +00DE 00FE 00DE +00E0 00E0 00C0 +00E1 00E1 00C1 +00E2 00E2 00C2 +00E3 00E3 00C3 +00E4 00E4 00C4 +00E5 00E5 00C5 +00E6 00E6 00C6 +00E7 00E7 00C7 +00E8 00E8 00C8 +00E9 00E9 00C9 +00EA 00EA 00CA +00EB 00EB 00CB +00EC 00EC 00CC +00ED 00ED 00CD +00EE 00EE 00CE +00EF 00EF 00CF +00F0 00F0 00D0 +00F1 00F1 00D1 +00F2 00F2 00D2 +00F3 00F3 00D3 +00F4 00F4 00D4 +00F5 00F5 00D5 +00F6 00F6 00D6 +00F8 00F8 00D8 +00F9 00F9 00D9 +00FA 00FA 00DA +00FB 00FB 00DB +00FC 00FC 00DC +00FD 00FD 00DD +00FE 00FE 00DE +00FF 00FF 0178 +0100 0101 0100 +0101 0101 0100 +0102 0103 0102 +0103 0103 0102 +0104 0105 0104 +0105 0105 0104 +0106 0107 0106 +0107 0107 0106 +0108 0109 0108 +0109 0109 0108 +010A 010B 010A +010B 010B 010A +010C 010D 010C +010D 010D 010C +010E 010F 010E +010F 010F 010E +0110 0111 0110 +0111 0111 0110 +0112 0113 0112 +0113 0113 0112 +0114 0115 0114 +0115 0115 0114 +0116 0117 0116 +0117 0117 0116 +0118 0119 0118 +0119 0119 0118 +011A 011B 011A +011B 011B 011A +011C 011D 011C +011D 011D 011C +011E 011F 011E +011F 011F 011E +0120 0121 0120 +0121 0121 0120 +0122 0123 0122 +0123 0123 0122 +0124 0125 0124 +0125 0125 0124 +0126 0127 0126 +0127 0127 0126 +0128 0129 0128 +0129 0129 0128 +012A 012B 012A +012B 012B 012A +012C 012D 012C +012D 012D 012C +012E 012F 012E +012F 012F 012E +0130 0069 0130 +0131 0131 0049 +0132 0133 0132 +0133 0133 0132 +0134 0135 0134 +0135 0135 0134 +0136 0137 0136 +0137 0137 0136 +0139 013A 0139 +013A 013A 0139 +013B 013C 013B +013C 013C 013B +013D 013E 013D +013E 013E 013D +013F 0140 013F +0140 0140 013F +0141 0142 0141 +0142 0142 0141 +0143 0144 0143 +0144 0144 0143 +0145 0146 0145 +0146 0146 0145 +0147 0148 0147 +0148 0148 0147 +014A 014B 014A +014B 014B 014A +014C 014D 014C +014D 014D 014C +014E 014F 014E +014F 014F 014E +0150 0151 0150 +0151 0151 0150 +0152 0153 0152 +0153 0153 0152 +0154 0155 0154 +0155 0155 0154 +0156 0157 0156 +0157 0157 0156 +0158 0159 0158 +0159 0159 0158 +015A 015B 015A +015B 015B 015A +015C 015D 015C +015D 015D 015C +015E 015F 015E +015F 015F 015E +0160 0161 0160 +0161 0161 0160 +0162 0163 0162 +0163 0163 0162 +0164 0165 0164 +0165 0165 0164 +0166 0167 0166 +0167 0167 0166 +0168 0169 0168 +0169 0169 0168 +016A 016B 016A +016B 016B 016A +016C 016D 016C +016D 016D 016C +016E 016F 016E +016F 016F 016E +0170 0171 0170 +0171 0171 0170 +0172 0173 0172 +0173 0173 0172 +0174 0175 0174 +0175 0175 0174 +0176 0177 0176 +0177 0177 0176 +0178 00FF 0178 +0179 017A 0179 +017A 017A 0179 +017B 017C 017B +017C 017C 017B +017D 017E 017D +017E 017E 017D +017F 017F 0053 +0180 0180 0243 +0181 0253 0181 +0182 0183 0182 +0183 0183 0182 +0184 0185 0184 +0185 0185 0184 +0186 0254 0186 +0187 0188 0187 +0188 0188 0187 +0189 0256 0189 +018A 0257 018A +018B 018C 018B +018C 018C 018B +018E 01DD 018E +018F 0259 018F +0190 025B 0190 +0191 0192 0191 +0192 0192 0191 +0193 0260 0193 +0194 0263 0194 +0195 0195 01F6 +0196 0269 0196 +0197 0268 0197 +0198 0199 0198 +0199 0199 0198 +019A 019A 023D +019C 026F 019C +019D 0272 019D +019E 019E 0220 +019F 0275 019F +01A0 01A1 01A0 +01A1 01A1 01A0 +01A2 01A3 01A2 +01A3 01A3 01A2 +01A4 01A5 01A4 +01A5 01A5 01A4 +01A6 0280 01A6 +01A7 01A8 01A7 +01A8 01A8 01A7 +01A9 0283 01A9 +01AC 01AD 01AC +01AD 01AD 01AC +01AE 0288 01AE +01AF 01B0 01AF +01B0 01B0 01AF +01B1 028A 01B1 +01B2 028B 01B2 +01B3 01B4 01B3 +01B4 01B4 01B3 +01B5 01B6 01B5 +01B6 01B6 01B5 +01B7 0292 01B7 +01B8 01B9 01B8 +01B9 01B9 01B8 +01BC 01BD 01BC +01BD 01BD 01BC +01BF 01BF 01F7 +01C4 01C6 01C4 +01C5 01C6 01C4 +01C6 01C6 01C4 +01C7 01C9 01C7 +01C8 01C9 01C7 +01C9 01C9 01C7 +01CA 01CC 01CA +01CB 01CC 01CA +01CC 01CC 01CA +01CD 01CE 01CD +01CE 01CE 01CD +01CF 01D0 01CF +01D0 01D0 01CF +01D1 01D2 01D1 +01D2 01D2 01D1 +01D3 01D4 01D3 +01D4 01D4 01D3 +01D5 01D6 01D5 +01D6 01D6 01D5 +01D7 01D8 01D7 +01D8 01D8 01D7 +01D9 01DA 01D9 +01DA 01DA 01D9 +01DB 01DC 01DB +01DC 01DC 01DB +01DD 01DD 018E +01DE 01DF 01DE +01DF 01DF 01DE +01E0 01E1 01E0 +01E1 01E1 01E0 +01E2 01E3 01E2 +01E3 01E3 01E2 +01E4 01E5 01E4 +01E5 01E5 01E4 +01E6 01E7 01E6 +01E7 01E7 01E6 +01E8 01E9 01E8 +01E9 01E9 01E8 +01EA 01EB 01EA +01EB 01EB 01EA +01EC 01ED 01EC +01ED 01ED 01EC +01EE 01EF 01EE +01EF 01EF 01EE +01F1 01F3 01F1 +01F2 01F3 01F1 +01F3 01F3 01F1 +01F4 01F5 01F4 +01F5 01F5 01F4 +01F6 0195 01F6 +01F7 01BF 01F7 +01F8 01F9 01F8 +01F9 01F9 01F8 +01FA 01FB 01FA +01FB 01FB 01FA +01FC 01FD 01FC +01FD 01FD 01FC +01FE 01FF 01FE +01FF 01FF 01FE +0200 0201 0200 +0201 0201 0200 +0202 0203 0202 +0203 0203 0202 +0204 0205 0204 +0205 0205 0204 +0206 0207 0206 +0207 0207 0206 +0208 0209 0208 +0209 0209 0208 +020A 020B 020A +020B 020B 020A +020C 020D 020C +020D 020D 020C +020E 020F 020E +020F 020F 020E +0210 0211 0210 +0211 0211 0210 +0212 0213 0212 +0213 0213 0212 +0214 0215 0214 +0215 0215 0214 +0216 0217 0216 +0217 0217 0216 +0218 0219 0218 +0219 0219 0218 +021A 021B 021A +021B 021B 021A +021C 021D 021C +021D 021D 021C +021E 021F 021E +021F 021F 021E +0220 019E 0220 +0222 0223 0222 +0223 0223 0222 +0224 0225 0224 +0225 0225 0224 +0226 0227 0226 +0227 0227 0226 +0228 0229 0228 +0229 0229 0228 +022A 022B 022A +022B 022B 022A +022C 022D 022C +022D 022D 022C +022E 022F 022E +022F 022F 022E +0230 0231 0230 +0231 0231 0230 +0232 0233 0232 +0233 0233 0232 +023A 2C65 023A +023B 023C 023B +023C 023C 023B +023D 019A 023D +023E 2C66 023E +023F 023F 2C7E +0240 0240 2C7F +0241 0242 0241 +0242 0242 0241 +0243 0180 0243 +0244 0289 0244 +0245 028C 0245 +0246 0247 0246 +0247 0247 0246 +0248 0249 0248 +0249 0249 0248 +024A 024B 024A +024B 024B 024A +024C 024D 024C +024D 024D 024C +024E 024F 024E +024F 024F 024E +0250 0250 2C6F +0251 0251 2C6D +0252 0252 2C70 +0253 0253 0181 +0254 0254 0186 +0256 0256 0189 +0257 0257 018A +0259 0259 018F +025B 025B 0190 +025C 025C A7AB +0260 0260 0193 +0261 0261 A7AC +0263 0263 0194 +0265 0265 A78D +0266 0266 A7AA +0268 0268 0197 +0269 0269 0196 +026A 026A A7AE +026B 026B 2C62 +026C 026C A7AD +026F 026F 019C +0271 0271 2C6E +0272 0272 019D +0275 0275 019F +027D 027D 2C64 +0280 0280 01A6 +0282 0282 A7C5 +0283 0283 01A9 +0287 0287 A7B1 +0288 0288 01AE +0289 0289 0244 +028A 028A 01B1 +028B 028B 01B2 +028C 028C 0245 +0292 0292 01B7 +029D 029D A7B2 +029E 029E A7B0 +0345 0345 0399 +0370 0371 0370 +0371 0371 0370 +0372 0373 0372 +0373 0373 0372 +0376 0377 0376 +0377 0377 0376 +037B 037B 03FD +037C 037C 03FE +037D 037D 03FF +037F 03F3 037F +0386 03AC 0386 +0388 03AD 0388 +0389 03AE 0389 +038A 03AF 038A +038C 03CC 038C +038E 03CD 038E +038F 03CE 038F +0391 03B1 0391 +0392 03B2 0392 +0393 03B3 0393 +0394 03B4 0394 +0395 03B5 0395 +0396 03B6 0396 +0397 03B7 0397 +0398 03B8 0398 +0399 03B9 0399 +039A 03BA 039A +039B 03BB 039B +039C 03BC 039C +039D 03BD 039D +039E 03BE 039E +039F 03BF 039F +03A0 03C0 03A0 +03A1 03C1 03A1 +03A3 03C3 03A3 +03A4 03C4 03A4 +03A5 03C5 03A5 +03A6 03C6 03A6 +03A7 03C7 03A7 +03A8 03C8 03A8 +03A9 03C9 03A9 +03AA 03CA 03AA +03AB 03CB 03AB +03AC 03AC 0386 +03AD 03AD 0388 +03AE 03AE 0389 +03AF 03AF 038A +03B1 03B1 0391 +03B2 03B2 0392 +03B3 03B3 0393 +03B4 03B4 0394 +03B5 03B5 0395 +03B6 03B6 0396 +03B7 03B7 0397 +03B8 03B8 0398 +03B9 03B9 0399 +03BA 03BA 039A +03BB 03BB 039B +03BC 03BC 039C +03BD 03BD 039D +03BE 03BE 039E +03BF 03BF 039F +03C0 03C0 03A0 +03C1 03C1 03A1 +03C2 03C2 03A3 +03C3 03C3 03A3 +03C4 03C4 03A4 +03C5 03C5 03A5 +03C6 03C6 03A6 +03C7 03C7 03A7 +03C8 03C8 03A8 +03C9 03C9 03A9 +03CA 03CA 03AA +03CB 03CB 03AB +03CC 03CC 038C +03CD 03CD 038E +03CE 03CE 038F +03CF 03D7 03CF +03D0 03D0 0392 +03D1 03D1 0398 +03D5 03D5 03A6 +03D6 03D6 03A0 +03D7 03D7 03CF +03D8 03D9 03D8 +03D9 03D9 03D8 +03DA 03DB 03DA +03DB 03DB 03DA +03DC 03DD 03DC +03DD 03DD 03DC +03DE 03DF 03DE +03DF 03DF 03DE +03E0 03E1 03E0 +03E1 03E1 03E0 +03E2 03E3 03E2 +03E3 03E3 03E2 +03E4 03E5 03E4 +03E5 03E5 03E4 +03E6 03E7 03E6 +03E7 03E7 03E6 +03E8 03E9 03E8 +03E9 03E9 03E8 +03EA 03EB 03EA +03EB 03EB 03EA +03EC 03ED 03EC +03ED 03ED 03EC +03EE 03EF 03EE +03EF 03EF 03EE +03F0 03F0 039A +03F1 03F1 03A1 +03F2 03F2 03F9 +03F3 03F3 037F +03F4 03B8 03F4 +03F5 03F5 0395 +03F7 03F8 03F7 +03F8 03F8 03F7 +03F9 03F2 03F9 +03FA 03FB 03FA +03FB 03FB 03FA +03FD 037B 03FD +03FE 037C 03FE +03FF 037D 03FF +0400 0450 0400 +0401 0451 0401 +0402 0452 0402 +0403 0453 0403 +0404 0454 0404 +0405 0455 0405 +0406 0456 0406 +0407 0457 0407 +0408 0458 0408 +0409 0459 0409 +040A 045A 040A +040B 045B 040B +040C 045C 040C +040D 045D 040D +040E 045E 040E +040F 045F 040F +0410 0430 0410 +0411 0431 0411 +0412 0432 0412 +0413 0433 0413 +0414 0434 0414 +0415 0435 0415 +0416 0436 0416 +0417 0437 0417 +0418 0438 0418 +0419 0439 0419 +041A 043A 041A +041B 043B 041B +041C 043C 041C +041D 043D 041D +041E 043E 041E +041F 043F 041F +0420 0440 0420 +0421 0441 0421 +0422 0442 0422 +0423 0443 0423 +0424 0444 0424 +0425 0445 0425 +0426 0446 0426 +0427 0447 0427 +0428 0448 0428 +0429 0449 0429 +042A 044A 042A +042B 044B 042B +042C 044C 042C +042D 044D 042D +042E 044E 042E +042F 044F 042F +0430 0430 0410 +0431 0431 0411 +0432 0432 0412 +0433 0433 0413 +0434 0434 0414 +0435 0435 0415 +0436 0436 0416 +0437 0437 0417 +0438 0438 0418 +0439 0439 0419 +043A 043A 041A +043B 043B 041B +043C 043C 041C +043D 043D 041D +043E 043E 041E +043F 043F 041F +0440 0440 0420 +0441 0441 0421 +0442 0442 0422 +0443 0443 0423 +0444 0444 0424 +0445 0445 0425 +0446 0446 0426 +0447 0447 0427 +0448 0448 0428 +0449 0449 0429 +044A 044A 042A +044B 044B 042B +044C 044C 042C +044D 044D 042D +044E 044E 042E +044F 044F 042F +0450 0450 0400 +0451 0451 0401 +0452 0452 0402 +0453 0453 0403 +0454 0454 0404 +0455 0455 0405 +0456 0456 0406 +0457 0457 0407 +0458 0458 0408 +0459 0459 0409 +045A 045A 040A +045B 045B 040B +045C 045C 040C +045D 045D 040D +045E 045E 040E +045F 045F 040F +0460 0461 0460 +0461 0461 0460 +0462 0463 0462 +0463 0463 0462 +0464 0465 0464 +0465 0465 0464 +0466 0467 0466 +0467 0467 0466 +0468 0469 0468 +0469 0469 0468 +046A 046B 046A +046B 046B 046A +046C 046D 046C +046D 046D 046C +046E 046F 046E +046F 046F 046E +0470 0471 0470 +0471 0471 0470 +0472 0473 0472 +0473 0473 0472 +0474 0475 0474 +0475 0475 0474 +0476 0477 0476 +0477 0477 0476 +0478 0479 0478 +0479 0479 0478 +047A 047B 047A +047B 047B 047A +047C 047D 047C +047D 047D 047C +047E 047F 047E +047F 047F 047E +0480 0481 0480 +0481 0481 0480 +048A 048B 048A +048B 048B 048A +048C 048D 048C +048D 048D 048C +048E 048F 048E +048F 048F 048E +0490 0491 0490 +0491 0491 0490 +0492 0493 0492 +0493 0493 0492 +0494 0495 0494 +0495 0495 0494 +0496 0497 0496 +0497 0497 0496 +0498 0499 0498 +0499 0499 0498 +049A 049B 049A +049B 049B 049A +049C 049D 049C +049D 049D 049C +049E 049F 049E +049F 049F 049E +04A0 04A1 04A0 +04A1 04A1 04A0 +04A2 04A3 04A2 +04A3 04A3 04A2 +04A4 04A5 04A4 +04A5 04A5 04A4 +04A6 04A7 04A6 +04A7 04A7 04A6 +04A8 04A9 04A8 +04A9 04A9 04A8 +04AA 04AB 04AA +04AB 04AB 04AA +04AC 04AD 04AC +04AD 04AD 04AC +04AE 04AF 04AE +04AF 04AF 04AE +04B0 04B1 04B0 +04B1 04B1 04B0 +04B2 04B3 04B2 +04B3 04B3 04B2 +04B4 04B5 04B4 +04B5 04B5 04B4 +04B6 04B7 04B6 +04B7 04B7 04B6 +04B8 04B9 04B8 +04B9 04B9 04B8 +04BA 04BB 04BA +04BB 04BB 04BA +04BC 04BD 04BC +04BD 04BD 04BC +04BE 04BF 04BE +04BF 04BF 04BE +04C0 04CF 04C0 +04C1 04C2 04C1 +04C2 04C2 04C1 +04C3 04C4 04C3 +04C4 04C4 04C3 +04C5 04C6 04C5 +04C6 04C6 04C5 +04C7 04C8 04C7 +04C8 04C8 04C7 +04C9 04CA 04C9 +04CA 04CA 04C9 +04CB 04CC 04CB +04CC 04CC 04CB +04CD 04CE 04CD +04CE 04CE 04CD +04CF 04CF 04C0 +04D0 04D1 04D0 +04D1 04D1 04D0 +04D2 04D3 04D2 +04D3 04D3 04D2 +04D4 04D5 04D4 +04D5 04D5 04D4 +04D6 04D7 04D6 +04D7 04D7 04D6 +04D8 04D9 04D8 +04D9 04D9 04D8 +04DA 04DB 04DA +04DB 04DB 04DA +04DC 04DD 04DC +04DD 04DD 04DC +04DE 04DF 04DE +04DF 04DF 04DE +04E0 04E1 04E0 +04E1 04E1 04E0 +04E2 04E3 04E2 +04E3 04E3 04E2 +04E4 04E5 04E4 +04E5 04E5 04E4 +04E6 04E7 04E6 +04E7 04E7 04E6 +04E8 04E9 04E8 +04E9 04E9 04E8 +04EA 04EB 04EA +04EB 04EB 04EA +04EC 04ED 04EC +04ED 04ED 04EC +04EE 04EF 04EE +04EF 04EF 04EE +04F0 04F1 04F0 +04F1 04F1 04F0 +04F2 04F3 04F2 +04F3 04F3 04F2 +04F4 04F5 04F4 +04F5 04F5 04F4 +04F6 04F7 04F6 +04F7 04F7 04F6 +04F8 04F9 04F8 +04F9 04F9 04F8 +04FA 04FB 04FA +04FB 04FB 04FA +04FC 04FD 04FC +04FD 04FD 04FC +04FE 04FF 04FE +04FF 04FF 04FE +0500 0501 0500 +0501 0501 0500 +0502 0503 0502 +0503 0503 0502 +0504 0505 0504 +0505 0505 0504 +0506 0507 0506 +0507 0507 0506 +0508 0509 0508 +0509 0509 0508 +050A 050B 050A +050B 050B 050A +050C 050D 050C +050D 050D 050C +050E 050F 050E +050F 050F 050E +0510 0511 0510 +0511 0511 0510 +0512 0513 0512 +0513 0513 0512 +0514 0515 0514 +0515 0515 0514 +0516 0517 0516 +0517 0517 0516 +0518 0519 0518 +0519 0519 0518 +051A 051B 051A +051B 051B 051A +051C 051D 051C +051D 051D 051C +051E 051F 051E +051F 051F 051E +0520 0521 0520 +0521 0521 0520 +0522 0523 0522 +0523 0523 0522 +0524 0525 0524 +0525 0525 0524 +0526 0527 0526 +0527 0527 0526 +0528 0529 0528 +0529 0529 0528 +052A 052B 052A +052B 052B 052A +052C 052D 052C +052D 052D 052C +052E 052F 052E +052F 052F 052E +0531 0561 0531 +0532 0562 0532 +0533 0563 0533 +0534 0564 0534 +0535 0565 0535 +0536 0566 0536 +0537 0567 0537 +0538 0568 0538 +0539 0569 0539 +053A 056A 053A +053B 056B 053B +053C 056C 053C +053D 056D 053D +053E 056E 053E +053F 056F 053F +0540 0570 0540 +0541 0571 0541 +0542 0572 0542 +0543 0573 0543 +0544 0574 0544 +0545 0575 0545 +0546 0576 0546 +0547 0577 0547 +0548 0578 0548 +0549 0579 0549 +054A 057A 054A +054B 057B 054B +054C 057C 054C +054D 057D 054D +054E 057E 054E +054F 057F 054F +0550 0580 0550 +0551 0581 0551 +0552 0582 0552 +0553 0583 0553 +0554 0584 0554 +0555 0585 0555 +0556 0586 0556 +0561 0561 0531 +0562 0562 0532 +0563 0563 0533 +0564 0564 0534 +0565 0565 0535 +0566 0566 0536 +0567 0567 0537 +0568 0568 0538 +0569 0569 0539 +056A 056A 053A +056B 056B 053B +056C 056C 053C +056D 056D 053D +056E 056E 053E +056F 056F 053F +0570 0570 0540 +0571 0571 0541 +0572 0572 0542 +0573 0573 0543 +0574 0574 0544 +0575 0575 0545 +0576 0576 0546 +0577 0577 0547 +0578 0578 0548 +0579 0579 0549 +057A 057A 054A +057B 057B 054B +057C 057C 054C +057D 057D 054D +057E 057E 054E +057F 057F 054F +0580 0580 0550 +0581 0581 0551 +0582 0582 0552 +0583 0583 0553 +0584 0584 0554 +0585 0585 0555 +0586 0586 0556 +10A0 2D00 10A0 +10A1 2D01 10A1 +10A2 2D02 10A2 +10A3 2D03 10A3 +10A4 2D04 10A4 +10A5 2D05 10A5 +10A6 2D06 10A6 +10A7 2D07 10A7 +10A8 2D08 10A8 +10A9 2D09 10A9 +10AA 2D0A 10AA +10AB 2D0B 10AB +10AC 2D0C 10AC +10AD 2D0D 10AD +10AE 2D0E 10AE +10AF 2D0F 10AF +10B0 2D10 10B0 +10B1 2D11 10B1 +10B2 2D12 10B2 +10B3 2D13 10B3 +10B4 2D14 10B4 +10B5 2D15 10B5 +10B6 2D16 10B6 +10B7 2D17 10B7 +10B8 2D18 10B8 +10B9 2D19 10B9 +10BA 2D1A 10BA +10BB 2D1B 10BB +10BC 2D1C 10BC +10BD 2D1D 10BD +10BE 2D1E 10BE +10BF 2D1F 10BF +10C0 2D20 10C0 +10C1 2D21 10C1 +10C2 2D22 10C2 +10C3 2D23 10C3 +10C4 2D24 10C4 +10C5 2D25 10C5 +10C7 2D27 10C7 +10CD 2D2D 10CD +10D0 10D0 1C90 +10D1 10D1 1C91 +10D2 10D2 1C92 +10D3 10D3 1C93 +10D4 10D4 1C94 +10D5 10D5 1C95 +10D6 10D6 1C96 +10D7 10D7 1C97 +10D8 10D8 1C98 +10D9 10D9 1C99 +10DA 10DA 1C9A +10DB 10DB 1C9B +10DC 10DC 1C9C +10DD 10DD 1C9D +10DE 10DE 1C9E +10DF 10DF 1C9F +10E0 10E0 1CA0 +10E1 10E1 1CA1 +10E2 10E2 1CA2 +10E3 10E3 1CA3 +10E4 10E4 1CA4 +10E5 10E5 1CA5 +10E6 10E6 1CA6 +10E7 10E7 1CA7 +10E8 10E8 1CA8 +10E9 10E9 1CA9 +10EA 10EA 1CAA +10EB 10EB 1CAB +10EC 10EC 1CAC +10ED 10ED 1CAD +10EE 10EE 1CAE +10EF 10EF 1CAF +10F0 10F0 1CB0 +10F1 10F1 1CB1 +10F2 10F2 1CB2 +10F3 10F3 1CB3 +10F4 10F4 1CB4 +10F5 10F5 1CB5 +10F6 10F6 1CB6 +10F7 10F7 1CB7 +10F8 10F8 1CB8 +10F9 10F9 1CB9 +10FA 10FA 1CBA +10FD 10FD 1CBD +10FE 10FE 1CBE +10FF 10FF 1CBF +13A0 AB70 13A0 +13A1 AB71 13A1 +13A2 AB72 13A2 +13A3 AB73 13A3 +13A4 AB74 13A4 +13A5 AB75 13A5 +13A6 AB76 13A6 +13A7 AB77 13A7 +13A8 AB78 13A8 +13A9 AB79 13A9 +13AA AB7A 13AA +13AB AB7B 13AB +13AC AB7C 13AC +13AD AB7D 13AD +13AE AB7E 13AE +13AF AB7F 13AF +13B0 AB80 13B0 +13B1 AB81 13B1 +13B2 AB82 13B2 +13B3 AB83 13B3 +13B4 AB84 13B4 +13B5 AB85 13B5 +13B6 AB86 13B6 +13B7 AB87 13B7 +13B8 AB88 13B8 +13B9 AB89 13B9 +13BA AB8A 13BA +13BB AB8B 13BB +13BC AB8C 13BC +13BD AB8D 13BD +13BE AB8E 13BE +13BF AB8F 13BF +13C0 AB90 13C0 +13C1 AB91 13C1 +13C2 AB92 13C2 +13C3 AB93 13C3 +13C4 AB94 13C4 +13C5 AB95 13C5 +13C6 AB96 13C6 +13C7 AB97 13C7 +13C8 AB98 13C8 +13C9 AB99 13C9 +13CA AB9A 13CA +13CB AB9B 13CB +13CC AB9C 13CC +13CD AB9D 13CD +13CE AB9E 13CE +13CF AB9F 13CF +13D0 ABA0 13D0 +13D1 ABA1 13D1 +13D2 ABA2 13D2 +13D3 ABA3 13D3 +13D4 ABA4 13D4 +13D5 ABA5 13D5 +13D6 ABA6 13D6 +13D7 ABA7 13D7 +13D8 ABA8 13D8 +13D9 ABA9 13D9 +13DA ABAA 13DA +13DB ABAB 13DB +13DC ABAC 13DC +13DD ABAD 13DD +13DE ABAE 13DE +13DF ABAF 13DF +13E0 ABB0 13E0 +13E1 ABB1 13E1 +13E2 ABB2 13E2 +13E3 ABB3 13E3 +13E4 ABB4 13E4 +13E5 ABB5 13E5 +13E6 ABB6 13E6 +13E7 ABB7 13E7 +13E8 ABB8 13E8 +13E9 ABB9 13E9 +13EA ABBA 13EA +13EB ABBB 13EB +13EC ABBC 13EC +13ED ABBD 13ED +13EE ABBE 13EE +13EF ABBF 13EF +13F0 13F8 13F0 +13F1 13F9 13F1 +13F2 13FA 13F2 +13F3 13FB 13F3 +13F4 13FC 13F4 +13F5 13FD 13F5 +13F8 13F8 13F0 +13F9 13F9 13F1 +13FA 13FA 13F2 +13FB 13FB 13F3 +13FC 13FC 13F4 +13FD 13FD 13F5 +1C80 1C80 0412 +1C81 1C81 0414 +1C82 1C82 041E +1C83 1C83 0421 +1C84 1C84 0422 +1C85 1C85 0422 +1C86 1C86 042A +1C87 1C87 0462 +1C88 1C88 A64A +1C90 10D0 1C90 +1C91 10D1 1C91 +1C92 10D2 1C92 +1C93 10D3 1C93 +1C94 10D4 1C94 +1C95 10D5 1C95 +1C96 10D6 1C96 +1C97 10D7 1C97 +1C98 10D8 1C98 +1C99 10D9 1C99 +1C9A 10DA 1C9A +1C9B 10DB 1C9B +1C9C 10DC 1C9C +1C9D 10DD 1C9D +1C9E 10DE 1C9E +1C9F 10DF 1C9F +1CA0 10E0 1CA0 +1CA1 10E1 1CA1 +1CA2 10E2 1CA2 +1CA3 10E3 1CA3 +1CA4 10E4 1CA4 +1CA5 10E5 1CA5 +1CA6 10E6 1CA6 +1CA7 10E7 1CA7 +1CA8 10E8 1CA8 +1CA9 10E9 1CA9 +1CAA 10EA 1CAA +1CAB 10EB 1CAB +1CAC 10EC 1CAC +1CAD 10ED 1CAD +1CAE 10EE 1CAE +1CAF 10EF 1CAF +1CB0 10F0 1CB0 +1CB1 10F1 1CB1 +1CB2 10F2 1CB2 +1CB3 10F3 1CB3 +1CB4 10F4 1CB4 +1CB5 10F5 1CB5 +1CB6 10F6 1CB6 +1CB7 10F7 1CB7 +1CB8 10F8 1CB8 +1CB9 10F9 1CB9 +1CBA 10FA 1CBA +1CBD 10FD 1CBD +1CBE 10FE 1CBE +1CBF 10FF 1CBF +1D79 1D79 A77D +1D7D 1D7D 2C63 +1D8E 1D8E A7C6 +1E00 1E01 1E00 +1E01 1E01 1E00 +1E02 1E03 1E02 +1E03 1E03 1E02 +1E04 1E05 1E04 +1E05 1E05 1E04 +1E06 1E07 1E06 +1E07 1E07 1E06 +1E08 1E09 1E08 +1E09 1E09 1E08 +1E0A 1E0B 1E0A +1E0B 1E0B 1E0A +1E0C 1E0D 1E0C +1E0D 1E0D 1E0C +1E0E 1E0F 1E0E +1E0F 1E0F 1E0E +1E10 1E11 1E10 +1E11 1E11 1E10 +1E12 1E13 1E12 +1E13 1E13 1E12 +1E14 1E15 1E14 +1E15 1E15 1E14 +1E16 1E17 1E16 +1E17 1E17 1E16 +1E18 1E19 1E18 +1E19 1E19 1E18 +1E1A 1E1B 1E1A +1E1B 1E1B 1E1A +1E1C 1E1D 1E1C +1E1D 1E1D 1E1C +1E1E 1E1F 1E1E +1E1F 1E1F 1E1E +1E20 1E21 1E20 +1E21 1E21 1E20 +1E22 1E23 1E22 +1E23 1E23 1E22 +1E24 1E25 1E24 +1E25 1E25 1E24 +1E26 1E27 1E26 +1E27 1E27 1E26 +1E28 1E29 1E28 +1E29 1E29 1E28 +1E2A 1E2B 1E2A +1E2B 1E2B 1E2A +1E2C 1E2D 1E2C +1E2D 1E2D 1E2C +1E2E 1E2F 1E2E +1E2F 1E2F 1E2E +1E30 1E31 1E30 +1E31 1E31 1E30 +1E32 1E33 1E32 +1E33 1E33 1E32 +1E34 1E35 1E34 +1E35 1E35 1E34 +1E36 1E37 1E36 +1E37 1E37 1E36 +1E38 1E39 1E38 +1E39 1E39 1E38 +1E3A 1E3B 1E3A +1E3B 1E3B 1E3A +1E3C 1E3D 1E3C +1E3D 1E3D 1E3C +1E3E 1E3F 1E3E +1E3F 1E3F 1E3E +1E40 1E41 1E40 +1E41 1E41 1E40 +1E42 1E43 1E42 +1E43 1E43 1E42 +1E44 1E45 1E44 +1E45 1E45 1E44 +1E46 1E47 1E46 +1E47 1E47 1E46 +1E48 1E49 1E48 +1E49 1E49 1E48 +1E4A 1E4B 1E4A +1E4B 1E4B 1E4A +1E4C 1E4D 1E4C +1E4D 1E4D 1E4C +1E4E 1E4F 1E4E +1E4F 1E4F 1E4E +1E50 1E51 1E50 +1E51 1E51 1E50 +1E52 1E53 1E52 +1E53 1E53 1E52 +1E54 1E55 1E54 +1E55 1E55 1E54 +1E56 1E57 1E56 +1E57 1E57 1E56 +1E58 1E59 1E58 +1E59 1E59 1E58 +1E5A 1E5B 1E5A +1E5B 1E5B 1E5A +1E5C 1E5D 1E5C +1E5D 1E5D 1E5C +1E5E 1E5F 1E5E +1E5F 1E5F 1E5E +1E60 1E61 1E60 +1E61 1E61 1E60 +1E62 1E63 1E62 +1E63 1E63 1E62 +1E64 1E65 1E64 +1E65 1E65 1E64 +1E66 1E67 1E66 +1E67 1E67 1E66 +1E68 1E69 1E68 +1E69 1E69 1E68 +1E6A 1E6B 1E6A +1E6B 1E6B 1E6A +1E6C 1E6D 1E6C +1E6D 1E6D 1E6C +1E6E 1E6F 1E6E +1E6F 1E6F 1E6E +1E70 1E71 1E70 +1E71 1E71 1E70 +1E72 1E73 1E72 +1E73 1E73 1E72 +1E74 1E75 1E74 +1E75 1E75 1E74 +1E76 1E77 1E76 +1E77 1E77 1E76 +1E78 1E79 1E78 +1E79 1E79 1E78 +1E7A 1E7B 1E7A +1E7B 1E7B 1E7A +1E7C 1E7D 1E7C +1E7D 1E7D 1E7C +1E7E 1E7F 1E7E +1E7F 1E7F 1E7E +1E80 1E81 1E80 +1E81 1E81 1E80 +1E82 1E83 1E82 +1E83 1E83 1E82 +1E84 1E85 1E84 +1E85 1E85 1E84 +1E86 1E87 1E86 +1E87 1E87 1E86 +1E88 1E89 1E88 +1E89 1E89 1E88 +1E8A 1E8B 1E8A +1E8B 1E8B 1E8A +1E8C 1E8D 1E8C +1E8D 1E8D 1E8C +1E8E 1E8F 1E8E +1E8F 1E8F 1E8E +1E90 1E91 1E90 +1E91 1E91 1E90 +1E92 1E93 1E92 +1E93 1E93 1E92 +1E94 1E95 1E94 +1E95 1E95 1E94 +1E9B 1E9B 1E60 +1E9E 00DF 1E9E +1EA0 1EA1 1EA0 +1EA1 1EA1 1EA0 +1EA2 1EA3 1EA2 +1EA3 1EA3 1EA2 +1EA4 1EA5 1EA4 +1EA5 1EA5 1EA4 +1EA6 1EA7 1EA6 +1EA7 1EA7 1EA6 +1EA8 1EA9 1EA8 +1EA9 1EA9 1EA8 +1EAA 1EAB 1EAA +1EAB 1EAB 1EAA +1EAC 1EAD 1EAC +1EAD 1EAD 1EAC +1EAE 1EAF 1EAE +1EAF 1EAF 1EAE +1EB0 1EB1 1EB0 +1EB1 1EB1 1EB0 +1EB2 1EB3 1EB2 +1EB3 1EB3 1EB2 +1EB4 1EB5 1EB4 +1EB5 1EB5 1EB4 +1EB6 1EB7 1EB6 +1EB7 1EB7 1EB6 +1EB8 1EB9 1EB8 +1EB9 1EB9 1EB8 +1EBA 1EBB 1EBA +1EBB 1EBB 1EBA +1EBC 1EBD 1EBC +1EBD 1EBD 1EBC +1EBE 1EBF 1EBE +1EBF 1EBF 1EBE +1EC0 1EC1 1EC0 +1EC1 1EC1 1EC0 +1EC2 1EC3 1EC2 +1EC3 1EC3 1EC2 +1EC4 1EC5 1EC4 +1EC5 1EC5 1EC4 +1EC6 1EC7 1EC6 +1EC7 1EC7 1EC6 +1EC8 1EC9 1EC8 +1EC9 1EC9 1EC8 +1ECA 1ECB 1ECA +1ECB 1ECB 1ECA +1ECC 1ECD 1ECC +1ECD 1ECD 1ECC +1ECE 1ECF 1ECE +1ECF 1ECF 1ECE +1ED0 1ED1 1ED0 +1ED1 1ED1 1ED0 +1ED2 1ED3 1ED2 +1ED3 1ED3 1ED2 +1ED4 1ED5 1ED4 +1ED5 1ED5 1ED4 +1ED6 1ED7 1ED6 +1ED7 1ED7 1ED6 +1ED8 1ED9 1ED8 +1ED9 1ED9 1ED8 +1EDA 1EDB 1EDA +1EDB 1EDB 1EDA +1EDC 1EDD 1EDC +1EDD 1EDD 1EDC +1EDE 1EDF 1EDE +1EDF 1EDF 1EDE +1EE0 1EE1 1EE0 +1EE1 1EE1 1EE0 +1EE2 1EE3 1EE2 +1EE3 1EE3 1EE2 +1EE4 1EE5 1EE4 +1EE5 1EE5 1EE4 +1EE6 1EE7 1EE6 +1EE7 1EE7 1EE6 +1EE8 1EE9 1EE8 +1EE9 1EE9 1EE8 +1EEA 1EEB 1EEA +1EEB 1EEB 1EEA +1EEC 1EED 1EEC +1EED 1EED 1EEC +1EEE 1EEF 1EEE +1EEF 1EEF 1EEE +1EF0 1EF1 1EF0 +1EF1 1EF1 1EF0 +1EF2 1EF3 1EF2 +1EF3 1EF3 1EF2 +1EF4 1EF5 1EF4 +1EF5 1EF5 1EF4 +1EF6 1EF7 1EF6 +1EF7 1EF7 1EF6 +1EF8 1EF9 1EF8 +1EF9 1EF9 1EF8 +1EFA 1EFB 1EFA +1EFB 1EFB 1EFA +1EFC 1EFD 1EFC +1EFD 1EFD 1EFC +1EFE 1EFF 1EFE +1EFF 1EFF 1EFE +1F00 1F00 1F08 +1F01 1F01 1F09 +1F02 1F02 1F0A +1F03 1F03 1F0B +1F04 1F04 1F0C +1F05 1F05 1F0D +1F06 1F06 1F0E +1F07 1F07 1F0F +1F08 1F00 1F08 +1F09 1F01 1F09 +1F0A 1F02 1F0A +1F0B 1F03 1F0B +1F0C 1F04 1F0C +1F0D 1F05 1F0D +1F0E 1F06 1F0E +1F0F 1F07 1F0F +1F10 1F10 1F18 +1F11 1F11 1F19 +1F12 1F12 1F1A +1F13 1F13 1F1B +1F14 1F14 1F1C +1F15 1F15 1F1D +1F18 1F10 1F18 +1F19 1F11 1F19 +1F1A 1F12 1F1A +1F1B 1F13 1F1B +1F1C 1F14 1F1C +1F1D 1F15 1F1D +1F20 1F20 1F28 +1F21 1F21 1F29 +1F22 1F22 1F2A +1F23 1F23 1F2B +1F24 1F24 1F2C +1F25 1F25 1F2D +1F26 1F26 1F2E +1F27 1F27 1F2F +1F28 1F20 1F28 +1F29 1F21 1F29 +1F2A 1F22 1F2A +1F2B 1F23 1F2B +1F2C 1F24 1F2C +1F2D 1F25 1F2D +1F2E 1F26 1F2E +1F2F 1F27 1F2F +1F30 1F30 1F38 +1F31 1F31 1F39 +1F32 1F32 1F3A +1F33 1F33 1F3B +1F34 1F34 1F3C +1F35 1F35 1F3D +1F36 1F36 1F3E +1F37 1F37 1F3F +1F38 1F30 1F38 +1F39 1F31 1F39 +1F3A 1F32 1F3A +1F3B 1F33 1F3B +1F3C 1F34 1F3C +1F3D 1F35 1F3D +1F3E 1F36 1F3E +1F3F 1F37 1F3F +1F40 1F40 1F48 +1F41 1F41 1F49 +1F42 1F42 1F4A +1F43 1F43 1F4B +1F44 1F44 1F4C +1F45 1F45 1F4D +1F48 1F40 1F48 +1F49 1F41 1F49 +1F4A 1F42 1F4A +1F4B 1F43 1F4B +1F4C 1F44 1F4C +1F4D 1F45 1F4D +1F51 1F51 1F59 +1F53 1F53 1F5B +1F55 1F55 1F5D +1F57 1F57 1F5F +1F59 1F51 1F59 +1F5B 1F53 1F5B +1F5D 1F55 1F5D +1F5F 1F57 1F5F +1F60 1F60 1F68 +1F61 1F61 1F69 +1F62 1F62 1F6A +1F63 1F63 1F6B +1F64 1F64 1F6C +1F65 1F65 1F6D +1F66 1F66 1F6E +1F67 1F67 1F6F +1F68 1F60 1F68 +1F69 1F61 1F69 +1F6A 1F62 1F6A +1F6B 1F63 1F6B +1F6C 1F64 1F6C +1F6D 1F65 1F6D +1F6E 1F66 1F6E +1F6F 1F67 1F6F +1F70 1F70 1FBA +1F71 1F71 1FBB +1F72 1F72 1FC8 +1F73 1F73 1FC9 +1F74 1F74 1FCA +1F75 1F75 1FCB +1F76 1F76 1FDA +1F77 1F77 1FDB +1F78 1F78 1FF8 +1F79 1F79 1FF9 +1F7A 1F7A 1FEA +1F7B 1F7B 1FEB +1F7C 1F7C 1FFA +1F7D 1F7D 1FFB +1F80 1F80 1F88 +1F81 1F81 1F89 +1F82 1F82 1F8A +1F83 1F83 1F8B +1F84 1F84 1F8C +1F85 1F85 1F8D +1F86 1F86 1F8E +1F87 1F87 1F8F +1F88 1F80 1F88 +1F89 1F81 1F89 +1F8A 1F82 1F8A +1F8B 1F83 1F8B +1F8C 1F84 1F8C +1F8D 1F85 1F8D +1F8E 1F86 1F8E +1F8F 1F87 1F8F +1F90 1F90 1F98 +1F91 1F91 1F99 +1F92 1F92 1F9A +1F93 1F93 1F9B +1F94 1F94 1F9C +1F95 1F95 1F9D +1F96 1F96 1F9E +1F97 1F97 1F9F +1F98 1F90 1F98 +1F99 1F91 1F99 +1F9A 1F92 1F9A +1F9B 1F93 1F9B +1F9C 1F94 1F9C +1F9D 1F95 1F9D +1F9E 1F96 1F9E +1F9F 1F97 1F9F +1FA0 1FA0 1FA8 +1FA1 1FA1 1FA9 +1FA2 1FA2 1FAA +1FA3 1FA3 1FAB +1FA4 1FA4 1FAC +1FA5 1FA5 1FAD +1FA6 1FA6 1FAE +1FA7 1FA7 1FAF +1FA8 1FA0 1FA8 +1FA9 1FA1 1FA9 +1FAA 1FA2 1FAA +1FAB 1FA3 1FAB +1FAC 1FA4 1FAC +1FAD 1FA5 1FAD +1FAE 1FA6 1FAE +1FAF 1FA7 1FAF +1FB0 1FB0 1FB8 +1FB1 1FB1 1FB9 +1FB3 1FB3 1FBC +1FB8 1FB0 1FB8 +1FB9 1FB1 1FB9 +1FBA 1F70 1FBA +1FBB 1F71 1FBB +1FBC 1FB3 1FBC +1FBE 1FBE 0399 +1FC3 1FC3 1FCC +1FC8 1F72 1FC8 +1FC9 1F73 1FC9 +1FCA 1F74 1FCA +1FCB 1F75 1FCB +1FCC 1FC3 1FCC +1FD0 1FD0 1FD8 +1FD1 1FD1 1FD9 +1FD8 1FD0 1FD8 +1FD9 1FD1 1FD9 +1FDA 1F76 1FDA +1FDB 1F77 1FDB +1FE0 1FE0 1FE8 +1FE1 1FE1 1FE9 +1FE5 1FE5 1FEC +1FE8 1FE0 1FE8 +1FE9 1FE1 1FE9 +1FEA 1F7A 1FEA +1FEB 1F7B 1FEB +1FEC 1FE5 1FEC +1FF3 1FF3 1FFC +1FF8 1F78 1FF8 +1FF9 1F79 1FF9 +1FFA 1F7C 1FFA +1FFB 1F7D 1FFB +1FFC 1FF3 1FFC +2126 03C9 2126 +212A 006B 212A +212B 00E5 212B +2132 214E 2132 +214E 214E 2132 +2160 2170 2160 +2161 2171 2161 +2162 2172 2162 +2163 2173 2163 +2164 2174 2164 +2165 2175 2165 +2166 2176 2166 +2167 2177 2167 +2168 2178 2168 +2169 2179 2169 +216A 217A 216A +216B 217B 216B +216C 217C 216C +216D 217D 216D +216E 217E 216E +216F 217F 216F +2170 2170 2160 +2171 2171 2161 +2172 2172 2162 +2173 2173 2163 +2174 2174 2164 +2175 2175 2165 +2176 2176 2166 +2177 2177 2167 +2178 2178 2168 +2179 2179 2169 +217A 217A 216A +217B 217B 216B +217C 217C 216C +217D 217D 216D +217E 217E 216E +217F 217F 216F +2183 2184 2183 +2184 2184 2183 +24B6 24D0 24B6 +24B7 24D1 24B7 +24B8 24D2 24B8 +24B9 24D3 24B9 +24BA 24D4 24BA +24BB 24D5 24BB +24BC 24D6 24BC +24BD 24D7 24BD +24BE 24D8 24BE +24BF 24D9 24BF +24C0 24DA 24C0 +24C1 24DB 24C1 +24C2 24DC 24C2 +24C3 24DD 24C3 +24C4 24DE 24C4 +24C5 24DF 24C5 +24C6 24E0 24C6 +24C7 24E1 24C7 +24C8 24E2 24C8 +24C9 24E3 24C9 +24CA 24E4 24CA +24CB 24E5 24CB +24CC 24E6 24CC +24CD 24E7 24CD +24CE 24E8 24CE +24CF 24E9 24CF +24D0 24D0 24B6 +24D1 24D1 24B7 +24D2 24D2 24B8 +24D3 24D3 24B9 +24D4 24D4 24BA +24D5 24D5 24BB +24D6 24D6 24BC +24D7 24D7 24BD +24D8 24D8 24BE +24D9 24D9 24BF +24DA 24DA 24C0 +24DB 24DB 24C1 +24DC 24DC 24C2 +24DD 24DD 24C3 +24DE 24DE 24C4 +24DF 24DF 24C5 +24E0 24E0 24C6 +24E1 24E1 24C7 +24E2 24E2 24C8 +24E3 24E3 24C9 +24E4 24E4 24CA +24E5 24E5 24CB +24E6 24E6 24CC +24E7 24E7 24CD +24E8 24E8 24CE +24E9 24E9 24CF +2C00 2C30 2C00 +2C01 2C31 2C01 +2C02 2C32 2C02 +2C03 2C33 2C03 +2C04 2C34 2C04 +2C05 2C35 2C05 +2C06 2C36 2C06 +2C07 2C37 2C07 +2C08 2C38 2C08 +2C09 2C39 2C09 +2C0A 2C3A 2C0A +2C0B 2C3B 2C0B +2C0C 2C3C 2C0C +2C0D 2C3D 2C0D +2C0E 2C3E 2C0E +2C0F 2C3F 2C0F +2C10 2C40 2C10 +2C11 2C41 2C11 +2C12 2C42 2C12 +2C13 2C43 2C13 +2C14 2C44 2C14 +2C15 2C45 2C15 +2C16 2C46 2C16 +2C17 2C47 2C17 +2C18 2C48 2C18 +2C19 2C49 2C19 +2C1A 2C4A 2C1A +2C1B 2C4B 2C1B +2C1C 2C4C 2C1C +2C1D 2C4D 2C1D +2C1E 2C4E 2C1E +2C1F 2C4F 2C1F +2C20 2C50 2C20 +2C21 2C51 2C21 +2C22 2C52 2C22 +2C23 2C53 2C23 +2C24 2C54 2C24 +2C25 2C55 2C25 +2C26 2C56 2C26 +2C27 2C57 2C27 +2C28 2C58 2C28 +2C29 2C59 2C29 +2C2A 2C5A 2C2A +2C2B 2C5B 2C2B +2C2C 2C5C 2C2C +2C2D 2C5D 2C2D +2C2E 2C5E 2C2E +2C2F 2C5F 2C2F +2C30 2C30 2C00 +2C31 2C31 2C01 +2C32 2C32 2C02 +2C33 2C33 2C03 +2C34 2C34 2C04 +2C35 2C35 2C05 +2C36 2C36 2C06 +2C37 2C37 2C07 +2C38 2C38 2C08 +2C39 2C39 2C09 +2C3A 2C3A 2C0A +2C3B 2C3B 2C0B +2C3C 2C3C 2C0C +2C3D 2C3D 2C0D +2C3E 2C3E 2C0E +2C3F 2C3F 2C0F +2C40 2C40 2C10 +2C41 2C41 2C11 +2C42 2C42 2C12 +2C43 2C43 2C13 +2C44 2C44 2C14 +2C45 2C45 2C15 +2C46 2C46 2C16 +2C47 2C47 2C17 +2C48 2C48 2C18 +2C49 2C49 2C19 +2C4A 2C4A 2C1A +2C4B 2C4B 2C1B +2C4C 2C4C 2C1C +2C4D 2C4D 2C1D +2C4E 2C4E 2C1E +2C4F 2C4F 2C1F +2C50 2C50 2C20 +2C51 2C51 2C21 +2C52 2C52 2C22 +2C53 2C53 2C23 +2C54 2C54 2C24 +2C55 2C55 2C25 +2C56 2C56 2C26 +2C57 2C57 2C27 +2C58 2C58 2C28 +2C59 2C59 2C29 +2C5A 2C5A 2C2A +2C5B 2C5B 2C2B +2C5C 2C5C 2C2C +2C5D 2C5D 2C2D +2C5E 2C5E 2C2E +2C5F 2C5F 2C2F +2C60 2C61 2C60 +2C61 2C61 2C60 +2C62 026B 2C62 +2C63 1D7D 2C63 +2C64 027D 2C64 +2C65 2C65 023A +2C66 2C66 023E +2C67 2C68 2C67 +2C68 2C68 2C67 +2C69 2C6A 2C69 +2C6A 2C6A 2C69 +2C6B 2C6C 2C6B +2C6C 2C6C 2C6B +2C6D 0251 2C6D +2C6E 0271 2C6E +2C6F 0250 2C6F +2C70 0252 2C70 +2C72 2C73 2C72 +2C73 2C73 2C72 +2C75 2C76 2C75 +2C76 2C76 2C75 +2C7E 023F 2C7E +2C7F 0240 2C7F +2C80 2C81 2C80 +2C81 2C81 2C80 +2C82 2C83 2C82 +2C83 2C83 2C82 +2C84 2C85 2C84 +2C85 2C85 2C84 +2C86 2C87 2C86 +2C87 2C87 2C86 +2C88 2C89 2C88 +2C89 2C89 2C88 +2C8A 2C8B 2C8A +2C8B 2C8B 2C8A +2C8C 2C8D 2C8C +2C8D 2C8D 2C8C +2C8E 2C8F 2C8E +2C8F 2C8F 2C8E +2C90 2C91 2C90 +2C91 2C91 2C90 +2C92 2C93 2C92 +2C93 2C93 2C92 +2C94 2C95 2C94 +2C95 2C95 2C94 +2C96 2C97 2C96 +2C97 2C97 2C96 +2C98 2C99 2C98 +2C99 2C99 2C98 +2C9A 2C9B 2C9A +2C9B 2C9B 2C9A +2C9C 2C9D 2C9C +2C9D 2C9D 2C9C +2C9E 2C9F 2C9E +2C9F 2C9F 2C9E +2CA0 2CA1 2CA0 +2CA1 2CA1 2CA0 +2CA2 2CA3 2CA2 +2CA3 2CA3 2CA2 +2CA4 2CA5 2CA4 +2CA5 2CA5 2CA4 +2CA6 2CA7 2CA6 +2CA7 2CA7 2CA6 +2CA8 2CA9 2CA8 +2CA9 2CA9 2CA8 +2CAA 2CAB 2CAA +2CAB 2CAB 2CAA +2CAC 2CAD 2CAC +2CAD 2CAD 2CAC +2CAE 2CAF 2CAE +2CAF 2CAF 2CAE +2CB0 2CB1 2CB0 +2CB1 2CB1 2CB0 +2CB2 2CB3 2CB2 +2CB3 2CB3 2CB2 +2CB4 2CB5 2CB4 +2CB5 2CB5 2CB4 +2CB6 2CB7 2CB6 +2CB7 2CB7 2CB6 +2CB8 2CB9 2CB8 +2CB9 2CB9 2CB8 +2CBA 2CBB 2CBA +2CBB 2CBB 2CBA +2CBC 2CBD 2CBC +2CBD 2CBD 2CBC +2CBE 2CBF 2CBE +2CBF 2CBF 2CBE +2CC0 2CC1 2CC0 +2CC1 2CC1 2CC0 +2CC2 2CC3 2CC2 +2CC3 2CC3 2CC2 +2CC4 2CC5 2CC4 +2CC5 2CC5 2CC4 +2CC6 2CC7 2CC6 +2CC7 2CC7 2CC6 +2CC8 2CC9 2CC8 +2CC9 2CC9 2CC8 +2CCA 2CCB 2CCA +2CCB 2CCB 2CCA +2CCC 2CCD 2CCC +2CCD 2CCD 2CCC +2CCE 2CCF 2CCE +2CCF 2CCF 2CCE +2CD0 2CD1 2CD0 +2CD1 2CD1 2CD0 +2CD2 2CD3 2CD2 +2CD3 2CD3 2CD2 +2CD4 2CD5 2CD4 +2CD5 2CD5 2CD4 +2CD6 2CD7 2CD6 +2CD7 2CD7 2CD6 +2CD8 2CD9 2CD8 +2CD9 2CD9 2CD8 +2CDA 2CDB 2CDA +2CDB 2CDB 2CDA +2CDC 2CDD 2CDC +2CDD 2CDD 2CDC +2CDE 2CDF 2CDE +2CDF 2CDF 2CDE +2CE0 2CE1 2CE0 +2CE1 2CE1 2CE0 +2CE2 2CE3 2CE2 +2CE3 2CE3 2CE2 +2CEB 2CEC 2CEB +2CEC 2CEC 2CEB +2CED 2CEE 2CED +2CEE 2CEE 2CED +2CF2 2CF3 2CF2 +2CF3 2CF3 2CF2 +2D00 2D00 10A0 +2D01 2D01 10A1 +2D02 2D02 10A2 +2D03 2D03 10A3 +2D04 2D04 10A4 +2D05 2D05 10A5 +2D06 2D06 10A6 +2D07 2D07 10A7 +2D08 2D08 10A8 +2D09 2D09 10A9 +2D0A 2D0A 10AA +2D0B 2D0B 10AB +2D0C 2D0C 10AC +2D0D 2D0D 10AD +2D0E 2D0E 10AE +2D0F 2D0F 10AF +2D10 2D10 10B0 +2D11 2D11 10B1 +2D12 2D12 10B2 +2D13 2D13 10B3 +2D14 2D14 10B4 +2D15 2D15 10B5 +2D16 2D16 10B6 +2D17 2D17 10B7 +2D18 2D18 10B8 +2D19 2D19 10B9 +2D1A 2D1A 10BA +2D1B 2D1B 10BB +2D1C 2D1C 10BC +2D1D 2D1D 10BD +2D1E 2D1E 10BE +2D1F 2D1F 10BF +2D20 2D20 10C0 +2D21 2D21 10C1 +2D22 2D22 10C2 +2D23 2D23 10C3 +2D24 2D24 10C4 +2D25 2D25 10C5 +2D27 2D27 10C7 +2D2D 2D2D 10CD +A640 A641 A640 +A641 A641 A640 +A642 A643 A642 +A643 A643 A642 +A644 A645 A644 +A645 A645 A644 +A646 A647 A646 +A647 A647 A646 +A648 A649 A648 +A649 A649 A648 +A64A A64B A64A +A64B A64B A64A +A64C A64D A64C +A64D A64D A64C +A64E A64F A64E +A64F A64F A64E +A650 A651 A650 +A651 A651 A650 +A652 A653 A652 +A653 A653 A652 +A654 A655 A654 +A655 A655 A654 +A656 A657 A656 +A657 A657 A656 +A658 A659 A658 +A659 A659 A658 +A65A A65B A65A +A65B A65B A65A +A65C A65D A65C +A65D A65D A65C +A65E A65F A65E +A65F A65F A65E +A660 A661 A660 +A661 A661 A660 +A662 A663 A662 +A663 A663 A662 +A664 A665 A664 +A665 A665 A664 +A666 A667 A666 +A667 A667 A666 +A668 A669 A668 +A669 A669 A668 +A66A A66B A66A +A66B A66B A66A +A66C A66D A66C +A66D A66D A66C +A680 A681 A680 +A681 A681 A680 +A682 A683 A682 +A683 A683 A682 +A684 A685 A684 +A685 A685 A684 +A686 A687 A686 +A687 A687 A686 +A688 A689 A688 +A689 A689 A688 +A68A A68B A68A +A68B A68B A68A +A68C A68D A68C +A68D A68D A68C +A68E A68F A68E +A68F A68F A68E +A690 A691 A690 +A691 A691 A690 +A692 A693 A692 +A693 A693 A692 +A694 A695 A694 +A695 A695 A694 +A696 A697 A696 +A697 A697 A696 +A698 A699 A698 +A699 A699 A698 +A69A A69B A69A +A69B A69B A69A +A722 A723 A722 +A723 A723 A722 +A724 A725 A724 +A725 A725 A724 +A726 A727 A726 +A727 A727 A726 +A728 A729 A728 +A729 A729 A728 +A72A A72B A72A +A72B A72B A72A +A72C A72D A72C +A72D A72D A72C +A72E A72F A72E +A72F A72F A72E +A732 A733 A732 +A733 A733 A732 +A734 A735 A734 +A735 A735 A734 +A736 A737 A736 +A737 A737 A736 +A738 A739 A738 +A739 A739 A738 +A73A A73B A73A +A73B A73B A73A +A73C A73D A73C +A73D A73D A73C +A73E A73F A73E +A73F A73F A73E +A740 A741 A740 +A741 A741 A740 +A742 A743 A742 +A743 A743 A742 +A744 A745 A744 +A745 A745 A744 +A746 A747 A746 +A747 A747 A746 +A748 A749 A748 +A749 A749 A748 +A74A A74B A74A +A74B A74B A74A +A74C A74D A74C +A74D A74D A74C +A74E A74F A74E +A74F A74F A74E +A750 A751 A750 +A751 A751 A750 +A752 A753 A752 +A753 A753 A752 +A754 A755 A754 +A755 A755 A754 +A756 A757 A756 +A757 A757 A756 +A758 A759 A758 +A759 A759 A758 +A75A A75B A75A +A75B A75B A75A +A75C A75D A75C +A75D A75D A75C +A75E A75F A75E +A75F A75F A75E +A760 A761 A760 +A761 A761 A760 +A762 A763 A762 +A763 A763 A762 +A764 A765 A764 +A765 A765 A764 +A766 A767 A766 +A767 A767 A766 +A768 A769 A768 +A769 A769 A768 +A76A A76B A76A +A76B A76B A76A +A76C A76D A76C +A76D A76D A76C +A76E A76F A76E +A76F A76F A76E +A779 A77A A779 +A77A A77A A779 +A77B A77C A77B +A77C A77C A77B +A77D 1D79 A77D +A77E A77F A77E +A77F A77F A77E +A780 A781 A780 +A781 A781 A780 +A782 A783 A782 +A783 A783 A782 +A784 A785 A784 +A785 A785 A784 +A786 A787 A786 +A787 A787 A786 +A78B A78C A78B +A78C A78C A78B +A78D 0265 A78D +A790 A791 A790 +A791 A791 A790 +A792 A793 A792 +A793 A793 A792 +A794 A794 A7C4 +A796 A797 A796 +A797 A797 A796 +A798 A799 A798 +A799 A799 A798 +A79A A79B A79A +A79B A79B A79A +A79C A79D A79C +A79D A79D A79C +A79E A79F A79E +A79F A79F A79E +A7A0 A7A1 A7A0 +A7A1 A7A1 A7A0 +A7A2 A7A3 A7A2 +A7A3 A7A3 A7A2 +A7A4 A7A5 A7A4 +A7A5 A7A5 A7A4 +A7A6 A7A7 A7A6 +A7A7 A7A7 A7A6 +A7A8 A7A9 A7A8 +A7A9 A7A9 A7A8 +A7AA 0266 A7AA +A7AB 025C A7AB +A7AC 0261 A7AC +A7AD 026C A7AD +A7AE 026A A7AE +A7B0 029E A7B0 +A7B1 0287 A7B1 +A7B2 029D A7B2 +A7B3 AB53 A7B3 +A7B4 A7B5 A7B4 +A7B5 A7B5 A7B4 +A7B6 A7B7 A7B6 +A7B7 A7B7 A7B6 +A7B8 A7B9 A7B8 +A7B9 A7B9 A7B8 +A7BA A7BB A7BA +A7BB A7BB A7BA +A7BC A7BD A7BC +A7BD A7BD A7BC +A7BE A7BF A7BE +A7BF A7BF A7BE +A7C0 A7C1 A7C0 +A7C1 A7C1 A7C0 +A7C2 A7C3 A7C2 +A7C3 A7C3 A7C2 +A7C4 A794 A7C4 +A7C5 0282 A7C5 +A7C6 1D8E A7C6 +A7C7 A7C8 A7C7 +A7C8 A7C8 A7C7 +A7C9 A7CA A7C9 +A7CA A7CA A7C9 +A7D0 A7D1 A7D0 +A7D1 A7D1 A7D0 +A7D6 A7D7 A7D6 +A7D7 A7D7 A7D6 +A7D8 A7D9 A7D8 +A7D9 A7D9 A7D8 +A7F5 A7F6 A7F5 +A7F6 A7F6 A7F5 +AB53 AB53 A7B3 +AB70 AB70 13A0 +AB71 AB71 13A1 +AB72 AB72 13A2 +AB73 AB73 13A3 +AB74 AB74 13A4 +AB75 AB75 13A5 +AB76 AB76 13A6 +AB77 AB77 13A7 +AB78 AB78 13A8 +AB79 AB79 13A9 +AB7A AB7A 13AA +AB7B AB7B 13AB +AB7C AB7C 13AC +AB7D AB7D 13AD +AB7E AB7E 13AE +AB7F AB7F 13AF +AB80 AB80 13B0 +AB81 AB81 13B1 +AB82 AB82 13B2 +AB83 AB83 13B3 +AB84 AB84 13B4 +AB85 AB85 13B5 +AB86 AB86 13B6 +AB87 AB87 13B7 +AB88 AB88 13B8 +AB89 AB89 13B9 +AB8A AB8A 13BA +AB8B AB8B 13BB +AB8C AB8C 13BC +AB8D AB8D 13BD +AB8E AB8E 13BE +AB8F AB8F 13BF +AB90 AB90 13C0 +AB91 AB91 13C1 +AB92 AB92 13C2 +AB93 AB93 13C3 +AB94 AB94 13C4 +AB95 AB95 13C5 +AB96 AB96 13C6 +AB97 AB97 13C7 +AB98 AB98 13C8 +AB99 AB99 13C9 +AB9A AB9A 13CA +AB9B AB9B 13CB +AB9C AB9C 13CC +AB9D AB9D 13CD +AB9E AB9E 13CE +AB9F AB9F 13CF +ABA0 ABA0 13D0 +ABA1 ABA1 13D1 +ABA2 ABA2 13D2 +ABA3 ABA3 13D3 +ABA4 ABA4 13D4 +ABA5 ABA5 13D5 +ABA6 ABA6 13D6 +ABA7 ABA7 13D7 +ABA8 ABA8 13D8 +ABA9 ABA9 13D9 +ABAA ABAA 13DA +ABAB ABAB 13DB +ABAC ABAC 13DC +ABAD ABAD 13DD +ABAE ABAE 13DE +ABAF ABAF 13DF +ABB0 ABB0 13E0 +ABB1 ABB1 13E1 +ABB2 ABB2 13E2 +ABB3 ABB3 13E3 +ABB4 ABB4 13E4 +ABB5 ABB5 13E5 +ABB6 ABB6 13E6 +ABB7 ABB7 13E7 +ABB8 ABB8 13E8 +ABB9 ABB9 13E9 +ABBA ABBA 13EA +ABBB ABBB 13EB +ABBC ABBC 13EC +ABBD ABBD 13ED +ABBE ABBE 13EE +ABBF ABBF 13EF +FF21 FF41 FF21 +FF22 FF42 FF22 +FF23 FF43 FF23 +FF24 FF44 FF24 +FF25 FF45 FF25 +FF26 FF46 FF26 +FF27 FF47 FF27 +FF28 FF48 FF28 +FF29 FF49 FF29 +FF2A FF4A FF2A +FF2B FF4B FF2B +FF2C FF4C FF2C +FF2D FF4D FF2D +FF2E FF4E FF2E +FF2F FF4F FF2F +FF30 FF50 FF30 +FF31 FF51 FF31 +FF32 FF52 FF32 +FF33 FF53 FF33 +FF34 FF54 FF34 +FF35 FF55 FF35 +FF36 FF56 FF36 +FF37 FF57 FF37 +FF38 FF58 FF38 +FF39 FF59 FF39 +FF3A FF5A FF3A +FF41 FF41 FF21 +FF42 FF42 FF22 +FF43 FF43 FF23 +FF44 FF44 FF24 +FF45 FF45 FF25 +FF46 FF46 FF26 +FF47 FF47 FF27 +FF48 FF48 FF28 +FF49 FF49 FF29 +FF4A FF4A FF2A +FF4B FF4B FF2B +FF4C FF4C FF2C +FF4D FF4D FF2D +FF4E FF4E FF2E +FF4F FF4F FF2F +FF50 FF50 FF30 +FF51 FF51 FF31 +FF52 FF52 FF32 +FF53 FF53 FF33 +FF54 FF54 FF34 +FF55 FF55 FF35 +FF56 FF56 FF36 +FF57 FF57 FF37 +FF58 FF58 FF38 +FF59 FF59 FF39 +FF5A FF5A FF3A +DROP VIEW v_bmp; +EXECUTE IMMEDIATE SFORMAT(' +CREATE VIEW v_supplementary AS +SELECT + seq AS codepoint, + LPAD(HEX(seq),8,''0'') AS codepoint_hex8, + CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c +FROM + seq_65536_to_1114111', @@character_set_connection, @@collation_connection); +SELECT COLLATION(c) FROM v_supplementary LIMIT 1; +COLLATION(c) +utf8mb4_uca1400_ai_ci +SELECT +codepoint_hex8, +HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)), +HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32)) +FROM v_supplementary +WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c)); +codepoint_hex8 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32)) +00010400 00010428 00010400 +00010401 00010429 00010401 +00010402 0001042A 00010402 +00010403 0001042B 00010403 +00010404 0001042C 00010404 +00010405 0001042D 00010405 +00010406 0001042E 00010406 +00010407 0001042F 00010407 +00010408 00010430 00010408 +00010409 00010431 00010409 +0001040A 00010432 0001040A +0001040B 00010433 0001040B +0001040C 00010434 0001040C +0001040D 00010435 0001040D +0001040E 00010436 0001040E +0001040F 00010437 0001040F +00010410 00010438 00010410 +00010411 00010439 00010411 +00010412 0001043A 00010412 +00010413 0001043B 00010413 +00010414 0001043C 00010414 +00010415 0001043D 00010415 +00010416 0001043E 00010416 +00010417 0001043F 00010417 +00010418 00010440 00010418 +00010419 00010441 00010419 +0001041A 00010442 0001041A +0001041B 00010443 0001041B +0001041C 00010444 0001041C +0001041D 00010445 0001041D +0001041E 00010446 0001041E +0001041F 00010447 0001041F +00010420 00010448 00010420 +00010421 00010449 00010421 +00010422 0001044A 00010422 +00010423 0001044B 00010423 +00010424 0001044C 00010424 +00010425 0001044D 00010425 +00010426 0001044E 00010426 +00010427 0001044F 00010427 +00010428 00010428 00010400 +00010429 00010429 00010401 +0001042A 0001042A 00010402 +0001042B 0001042B 00010403 +0001042C 0001042C 00010404 +0001042D 0001042D 00010405 +0001042E 0001042E 00010406 +0001042F 0001042F 00010407 +00010430 00010430 00010408 +00010431 00010431 00010409 +00010432 00010432 0001040A +00010433 00010433 0001040B +00010434 00010434 0001040C +00010435 00010435 0001040D +00010436 00010436 0001040E +00010437 00010437 0001040F +00010438 00010438 00010410 +00010439 00010439 00010411 +0001043A 0001043A 00010412 +0001043B 0001043B 00010413 +0001043C 0001043C 00010414 +0001043D 0001043D 00010415 +0001043E 0001043E 00010416 +0001043F 0001043F 00010417 +00010440 00010440 00010418 +00010441 00010441 00010419 +00010442 00010442 0001041A +00010443 00010443 0001041B +00010444 00010444 0001041C +00010445 00010445 0001041D +00010446 00010446 0001041E +00010447 00010447 0001041F +00010448 00010448 00010420 +00010449 00010449 00010421 +0001044A 0001044A 00010422 +0001044B 0001044B 00010423 +0001044C 0001044C 00010424 +0001044D 0001044D 00010425 +0001044E 0001044E 00010426 +0001044F 0001044F 00010427 +000104B0 000104D8 000104B0 +000104B1 000104D9 000104B1 +000104B2 000104DA 000104B2 +000104B3 000104DB 000104B3 +000104B4 000104DC 000104B4 +000104B5 000104DD 000104B5 +000104B6 000104DE 000104B6 +000104B7 000104DF 000104B7 +000104B8 000104E0 000104B8 +000104B9 000104E1 000104B9 +000104BA 000104E2 000104BA +000104BB 000104E3 000104BB +000104BC 000104E4 000104BC +000104BD 000104E5 000104BD +000104BE 000104E6 000104BE +000104BF 000104E7 000104BF +000104C0 000104E8 000104C0 +000104C1 000104E9 000104C1 +000104C2 000104EA 000104C2 +000104C3 000104EB 000104C3 +000104C4 000104EC 000104C4 +000104C5 000104ED 000104C5 +000104C6 000104EE 000104C6 +000104C7 000104EF 000104C7 +000104C8 000104F0 000104C8 +000104C9 000104F1 000104C9 +000104CA 000104F2 000104CA +000104CB 000104F3 000104CB +000104CC 000104F4 000104CC +000104CD 000104F5 000104CD +000104CE 000104F6 000104CE +000104CF 000104F7 000104CF +000104D0 000104F8 000104D0 +000104D1 000104F9 000104D1 +000104D2 000104FA 000104D2 +000104D3 000104FB 000104D3 +000104D8 000104D8 000104B0 +000104D9 000104D9 000104B1 +000104DA 000104DA 000104B2 +000104DB 000104DB 000104B3 +000104DC 000104DC 000104B4 +000104DD 000104DD 000104B5 +000104DE 000104DE 000104B6 +000104DF 000104DF 000104B7 +000104E0 000104E0 000104B8 +000104E1 000104E1 000104B9 +000104E2 000104E2 000104BA +000104E3 000104E3 000104BB +000104E4 000104E4 000104BC +000104E5 000104E5 000104BD +000104E6 000104E6 000104BE +000104E7 000104E7 000104BF +000104E8 000104E8 000104C0 +000104E9 000104E9 000104C1 +000104EA 000104EA 000104C2 +000104EB 000104EB 000104C3 +000104EC 000104EC 000104C4 +000104ED 000104ED 000104C5 +000104EE 000104EE 000104C6 +000104EF 000104EF 000104C7 +000104F0 000104F0 000104C8 +000104F1 000104F1 000104C9 +000104F2 000104F2 000104CA +000104F3 000104F3 000104CB +000104F4 000104F4 000104CC +000104F5 000104F5 000104CD +000104F6 000104F6 000104CE +000104F7 000104F7 000104CF +000104F8 000104F8 000104D0 +000104F9 000104F9 000104D1 +000104FA 000104FA 000104D2 +000104FB 000104FB 000104D3 +00010570 00010597 00010570 +00010571 00010598 00010571 +00010572 00010599 00010572 +00010573 0001059A 00010573 +00010574 0001059B 00010574 +00010575 0001059C 00010575 +00010576 0001059D 00010576 +00010577 0001059E 00010577 +00010578 0001059F 00010578 +00010579 000105A0 00010579 +0001057A 000105A1 0001057A +0001057C 000105A3 0001057C +0001057D 000105A4 0001057D +0001057E 000105A5 0001057E +0001057F 000105A6 0001057F +00010580 000105A7 00010580 +00010581 000105A8 00010581 +00010582 000105A9 00010582 +00010583 000105AA 00010583 +00010584 000105AB 00010584 +00010585 000105AC 00010585 +00010586 000105AD 00010586 +00010587 000105AE 00010587 +00010588 000105AF 00010588 +00010589 000105B0 00010589 +0001058A 000105B1 0001058A +0001058C 000105B3 0001058C +0001058D 000105B4 0001058D +0001058E 000105B5 0001058E +0001058F 000105B6 0001058F +00010590 000105B7 00010590 +00010591 000105B8 00010591 +00010592 000105B9 00010592 +00010594 000105BB 00010594 +00010595 000105BC 00010595 +00010597 00010597 00010570 +00010598 00010598 00010571 +00010599 00010599 00010572 +0001059A 0001059A 00010573 +0001059B 0001059B 00010574 +0001059C 0001059C 00010575 +0001059D 0001059D 00010576 +0001059E 0001059E 00010577 +0001059F 0001059F 00010578 +000105A0 000105A0 00010579 +000105A1 000105A1 0001057A +000105A3 000105A3 0001057C +000105A4 000105A4 0001057D +000105A5 000105A5 0001057E +000105A6 000105A6 0001057F +000105A7 000105A7 00010580 +000105A8 000105A8 00010581 +000105A9 000105A9 00010582 +000105AA 000105AA 00010583 +000105AB 000105AB 00010584 +000105AC 000105AC 00010585 +000105AD 000105AD 00010586 +000105AE 000105AE 00010587 +000105AF 000105AF 00010588 +000105B0 000105B0 00010589 +000105B1 000105B1 0001058A +000105B3 000105B3 0001058C +000105B4 000105B4 0001058D +000105B5 000105B5 0001058E +000105B6 000105B6 0001058F +000105B7 000105B7 00010590 +000105B8 000105B8 00010591 +000105B9 000105B9 00010592 +000105BB 000105BB 00010594 +000105BC 000105BC 00010595 +00010C80 00010CC0 00010C80 +00010C81 00010CC1 00010C81 +00010C82 00010CC2 00010C82 +00010C83 00010CC3 00010C83 +00010C84 00010CC4 00010C84 +00010C85 00010CC5 00010C85 +00010C86 00010CC6 00010C86 +00010C87 00010CC7 00010C87 +00010C88 00010CC8 00010C88 +00010C89 00010CC9 00010C89 +00010C8A 00010CCA 00010C8A +00010C8B 00010CCB 00010C8B +00010C8C 00010CCC 00010C8C +00010C8D 00010CCD 00010C8D +00010C8E 00010CCE 00010C8E +00010C8F 00010CCF 00010C8F +00010C90 00010CD0 00010C90 +00010C91 00010CD1 00010C91 +00010C92 00010CD2 00010C92 +00010C93 00010CD3 00010C93 +00010C94 00010CD4 00010C94 +00010C95 00010CD5 00010C95 +00010C96 00010CD6 00010C96 +00010C97 00010CD7 00010C97 +00010C98 00010CD8 00010C98 +00010C99 00010CD9 00010C99 +00010C9A 00010CDA 00010C9A +00010C9B 00010CDB 00010C9B +00010C9C 00010CDC 00010C9C +00010C9D 00010CDD 00010C9D +00010C9E 00010CDE 00010C9E +00010C9F 00010CDF 00010C9F +00010CA0 00010CE0 00010CA0 +00010CA1 00010CE1 00010CA1 +00010CA2 00010CE2 00010CA2 +00010CA3 00010CE3 00010CA3 +00010CA4 00010CE4 00010CA4 +00010CA5 00010CE5 00010CA5 +00010CA6 00010CE6 00010CA6 +00010CA7 00010CE7 00010CA7 +00010CA8 00010CE8 00010CA8 +00010CA9 00010CE9 00010CA9 +00010CAA 00010CEA 00010CAA +00010CAB 00010CEB 00010CAB +00010CAC 00010CEC 00010CAC +00010CAD 00010CED 00010CAD +00010CAE 00010CEE 00010CAE +00010CAF 00010CEF 00010CAF +00010CB0 00010CF0 00010CB0 +00010CB1 00010CF1 00010CB1 +00010CB2 00010CF2 00010CB2 +00010CC0 00010CC0 00010C80 +00010CC1 00010CC1 00010C81 +00010CC2 00010CC2 00010C82 +00010CC3 00010CC3 00010C83 +00010CC4 00010CC4 00010C84 +00010CC5 00010CC5 00010C85 +00010CC6 00010CC6 00010C86 +00010CC7 00010CC7 00010C87 +00010CC8 00010CC8 00010C88 +00010CC9 00010CC9 00010C89 +00010CCA 00010CCA 00010C8A +00010CCB 00010CCB 00010C8B +00010CCC 00010CCC 00010C8C +00010CCD 00010CCD 00010C8D +00010CCE 00010CCE 00010C8E +00010CCF 00010CCF 00010C8F +00010CD0 00010CD0 00010C90 +00010CD1 00010CD1 00010C91 +00010CD2 00010CD2 00010C92 +00010CD3 00010CD3 00010C93 +00010CD4 00010CD4 00010C94 +00010CD5 00010CD5 00010C95 +00010CD6 00010CD6 00010C96 +00010CD7 00010CD7 00010C97 +00010CD8 00010CD8 00010C98 +00010CD9 00010CD9 00010C99 +00010CDA 00010CDA 00010C9A +00010CDB 00010CDB 00010C9B +00010CDC 00010CDC 00010C9C +00010CDD 00010CDD 00010C9D +00010CDE 00010CDE 00010C9E +00010CDF 00010CDF 00010C9F +00010CE0 00010CE0 00010CA0 +00010CE1 00010CE1 00010CA1 +00010CE2 00010CE2 00010CA2 +00010CE3 00010CE3 00010CA3 +00010CE4 00010CE4 00010CA4 +00010CE5 00010CE5 00010CA5 +00010CE6 00010CE6 00010CA6 +00010CE7 00010CE7 00010CA7 +00010CE8 00010CE8 00010CA8 +00010CE9 00010CE9 00010CA9 +00010CEA 00010CEA 00010CAA +00010CEB 00010CEB 00010CAB +00010CEC 00010CEC 00010CAC +00010CED 00010CED 00010CAD +00010CEE 00010CEE 00010CAE +00010CEF 00010CEF 00010CAF +00010CF0 00010CF0 00010CB0 +00010CF1 00010CF1 00010CB1 +00010CF2 00010CF2 00010CB2 +000118A0 000118C0 000118A0 +000118A1 000118C1 000118A1 +000118A2 000118C2 000118A2 +000118A3 000118C3 000118A3 +000118A4 000118C4 000118A4 +000118A5 000118C5 000118A5 +000118A6 000118C6 000118A6 +000118A7 000118C7 000118A7 +000118A8 000118C8 000118A8 +000118A9 000118C9 000118A9 +000118AA 000118CA 000118AA +000118AB 000118CB 000118AB +000118AC 000118CC 000118AC +000118AD 000118CD 000118AD +000118AE 000118CE 000118AE +000118AF 000118CF 000118AF +000118B0 000118D0 000118B0 +000118B1 000118D1 000118B1 +000118B2 000118D2 000118B2 +000118B3 000118D3 000118B3 +000118B4 000118D4 000118B4 +000118B5 000118D5 000118B5 +000118B6 000118D6 000118B6 +000118B7 000118D7 000118B7 +000118B8 000118D8 000118B8 +000118B9 000118D9 000118B9 +000118BA 000118DA 000118BA +000118BB 000118DB 000118BB +000118BC 000118DC 000118BC +000118BD 000118DD 000118BD +000118BE 000118DE 000118BE +000118BF 000118DF 000118BF +000118C0 000118C0 000118A0 +000118C1 000118C1 000118A1 +000118C2 000118C2 000118A2 +000118C3 000118C3 000118A3 +000118C4 000118C4 000118A4 +000118C5 000118C5 000118A5 +000118C6 000118C6 000118A6 +000118C7 000118C7 000118A7 +000118C8 000118C8 000118A8 +000118C9 000118C9 000118A9 +000118CA 000118CA 000118AA +000118CB 000118CB 000118AB +000118CC 000118CC 000118AC +000118CD 000118CD 000118AD +000118CE 000118CE 000118AE +000118CF 000118CF 000118AF +000118D0 000118D0 000118B0 +000118D1 000118D1 000118B1 +000118D2 000118D2 000118B2 +000118D3 000118D3 000118B3 +000118D4 000118D4 000118B4 +000118D5 000118D5 000118B5 +000118D6 000118D6 000118B6 +000118D7 000118D7 000118B7 +000118D8 000118D8 000118B8 +000118D9 000118D9 000118B9 +000118DA 000118DA 000118BA +000118DB 000118DB 000118BB +000118DC 000118DC 000118BC +000118DD 000118DD 000118BD +000118DE 000118DE 000118BE +000118DF 000118DF 000118BF +00016E40 00016E60 00016E40 +00016E41 00016E61 00016E41 +00016E42 00016E62 00016E42 +00016E43 00016E63 00016E43 +00016E44 00016E64 00016E44 +00016E45 00016E65 00016E45 +00016E46 00016E66 00016E46 +00016E47 00016E67 00016E47 +00016E48 00016E68 00016E48 +00016E49 00016E69 00016E49 +00016E4A 00016E6A 00016E4A +00016E4B 00016E6B 00016E4B +00016E4C 00016E6C 00016E4C +00016E4D 00016E6D 00016E4D +00016E4E 00016E6E 00016E4E +00016E4F 00016E6F 00016E4F +00016E50 00016E70 00016E50 +00016E51 00016E71 00016E51 +00016E52 00016E72 00016E52 +00016E53 00016E73 00016E53 +00016E54 00016E74 00016E54 +00016E55 00016E75 00016E55 +00016E56 00016E76 00016E56 +00016E57 00016E77 00016E57 +00016E58 00016E78 00016E58 +00016E59 00016E79 00016E59 +00016E5A 00016E7A 00016E5A +00016E5B 00016E7B 00016E5B +00016E5C 00016E7C 00016E5C +00016E5D 00016E7D 00016E5D +00016E5E 00016E7E 00016E5E +00016E5F 00016E7F 00016E5F +00016E60 00016E60 00016E40 +00016E61 00016E61 00016E41 +00016E62 00016E62 00016E42 +00016E63 00016E63 00016E43 +00016E64 00016E64 00016E44 +00016E65 00016E65 00016E45 +00016E66 00016E66 00016E46 +00016E67 00016E67 00016E47 +00016E68 00016E68 00016E48 +00016E69 00016E69 00016E49 +00016E6A 00016E6A 00016E4A +00016E6B 00016E6B 00016E4B +00016E6C 00016E6C 00016E4C +00016E6D 00016E6D 00016E4D +00016E6E 00016E6E 00016E4E +00016E6F 00016E6F 00016E4F +00016E70 00016E70 00016E50 +00016E71 00016E71 00016E51 +00016E72 00016E72 00016E52 +00016E73 00016E73 00016E53 +00016E74 00016E74 00016E54 +00016E75 00016E75 00016E55 +00016E76 00016E76 00016E56 +00016E77 00016E77 00016E57 +00016E78 00016E78 00016E58 +00016E79 00016E79 00016E59 +00016E7A 00016E7A 00016E5A +00016E7B 00016E7B 00016E5B +00016E7C 00016E7C 00016E5C +00016E7D 00016E7D 00016E5D +00016E7E 00016E7E 00016E5E +00016E7F 00016E7F 00016E5F +0001E900 0001E922 0001E900 +0001E901 0001E923 0001E901 +0001E902 0001E924 0001E902 +0001E903 0001E925 0001E903 +0001E904 0001E926 0001E904 +0001E905 0001E927 0001E905 +0001E906 0001E928 0001E906 +0001E907 0001E929 0001E907 +0001E908 0001E92A 0001E908 +0001E909 0001E92B 0001E909 +0001E90A 0001E92C 0001E90A +0001E90B 0001E92D 0001E90B +0001E90C 0001E92E 0001E90C +0001E90D 0001E92F 0001E90D +0001E90E 0001E930 0001E90E +0001E90F 0001E931 0001E90F +0001E910 0001E932 0001E910 +0001E911 0001E933 0001E911 +0001E912 0001E934 0001E912 +0001E913 0001E935 0001E913 +0001E914 0001E936 0001E914 +0001E915 0001E937 0001E915 +0001E916 0001E938 0001E916 +0001E917 0001E939 0001E917 +0001E918 0001E93A 0001E918 +0001E919 0001E93B 0001E919 +0001E91A 0001E93C 0001E91A +0001E91B 0001E93D 0001E91B +0001E91C 0001E93E 0001E91C +0001E91D 0001E93F 0001E91D +0001E91E 0001E940 0001E91E +0001E91F 0001E941 0001E91F +0001E920 0001E942 0001E920 +0001E921 0001E943 0001E921 +0001E922 0001E922 0001E900 +0001E923 0001E923 0001E901 +0001E924 0001E924 0001E902 +0001E925 0001E925 0001E903 +0001E926 0001E926 0001E904 +0001E927 0001E927 0001E905 +0001E928 0001E928 0001E906 +0001E929 0001E929 0001E907 +0001E92A 0001E92A 0001E908 +0001E92B 0001E92B 0001E909 +0001E92C 0001E92C 0001E90A +0001E92D 0001E92D 0001E90B +0001E92E 0001E92E 0001E90C +0001E92F 0001E92F 0001E90D +0001E930 0001E930 0001E90E +0001E931 0001E931 0001E90F +0001E932 0001E932 0001E910 +0001E933 0001E933 0001E911 +0001E934 0001E934 0001E912 +0001E935 0001E935 0001E913 +0001E936 0001E936 0001E914 +0001E937 0001E937 0001E915 +0001E938 0001E938 0001E916 +0001E939 0001E939 0001E917 +0001E93A 0001E93A 0001E918 +0001E93B 0001E93B 0001E919 +0001E93C 0001E93C 0001E91A +0001E93D 0001E93D 0001E91B +0001E93E 0001E93E 0001E91C +0001E93F 0001E93F 0001E91D +0001E940 0001E940 0001E91E +0001E941 0001E941 0001E91F +0001E942 0001E942 0001E920 +0001E943 0001E943 0001E921 +DROP VIEW v_supplementary; +# +# End of 10.10 tests +# diff --git a/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.test b/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.test new file mode 100644 index 0000000000000..288f86155e216 --- /dev/null +++ b/mysql-test/main/ctype_utf8mb4_uca1400_ai_ci_casefold.test @@ -0,0 +1,15 @@ +--echo # +--echo # Start of 10.10 tests +--echo # + +--echo # +--echo # MDEV-30577 Case folding for uca1400 collations is not up to date +--echo # + +SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; +--source include/ctype_unicode_casefold_bmp.inc +--source include/ctype_unicode_casefold_supplementary.inc + +--echo # +--echo # End of 10.10 tests +--echo # diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 1e8661bef5489..aa4d366208f9e 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -34768,7 +34768,7 @@ create_tailoring(struct charset_info_st *cs, else if (rules.version == 1400) /* Unicode-14.0.0 */ { src_uca= &my_uca_v1400; - cs->casefold= &my_casefold_unicode520; + cs->casefold= &my_casefold_unicode1400; } else if (rules.version == 400) /* Unicode-4.0.0 requested */ { @@ -39455,9 +39455,9 @@ my_uca1400_collation_definition_init(MY_CHARSET_LOADER *loader, dst->uca= &my_uca_v1400; dst->tailoring= def->tailoring; if (def->tailoring == turkish) - dst->casefold= &my_casefold_turkish; /*TODO: casefold_1400_turkish */ + dst->casefold= &my_casefold_unicode1400tr; else - dst->casefold= &my_casefold_unicode520; /*TODO: casefold_1400*/ + dst->casefold= &my_casefold_unicode1400; if (nopad) dst->state|= MY_CS_NOPAD; my_ci_set_level_flags(dst, (1 << MY_CS_LEVEL_BIT_PRIMARY) | diff --git a/strings/ctype-unicode1400-casefold-tr.h b/strings/ctype-unicode1400-casefold-tr.h new file mode 100644 index 0000000000000..25e1b5d3d59e2 --- /dev/null +++ b/strings/ctype-unicode1400-casefold-tr.h @@ -0,0 +1,704 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=casefold-tr \ + --page-name=u1400tr_casefold_page \ + --page-name-derived=u1400_casefold_page \ + --index-name=my_u1400tr_casefold_index \ + UnicodeData-14.0.0.txt + +*/ +const MY_CASEFOLD_CHARACTER u1400tr_casefold_page00[256]={ + {0x0000,0x0000},{0x0001,0x0001}, /* 0000 */ + {0x0002,0x0002},{0x0003,0x0003}, /* 0002 */ + {0x0004,0x0004},{0x0005,0x0005}, /* 0004 */ + {0x0006,0x0006},{0x0007,0x0007}, /* 0006 */ + {0x0008,0x0008},{0x0009,0x0009}, /* 0008 */ + {0x000A,0x000A},{0x000B,0x000B}, /* 000A */ + {0x000C,0x000C},{0x000D,0x000D}, /* 000C */ + {0x000E,0x000E},{0x000F,0x000F}, /* 000E */ + {0x0010,0x0010},{0x0011,0x0011}, /* 0010 */ + {0x0012,0x0012},{0x0013,0x0013}, /* 0012 */ + {0x0014,0x0014},{0x0015,0x0015}, /* 0014 */ + {0x0016,0x0016},{0x0017,0x0017}, /* 0016 */ + {0x0018,0x0018},{0x0019,0x0019}, /* 0018 */ + {0x001A,0x001A},{0x001B,0x001B}, /* 001A */ + {0x001C,0x001C},{0x001D,0x001D}, /* 001C */ + {0x001E,0x001E},{0x001F,0x001F}, /* 001E */ + {0x0020,0x0020},{0x0021,0x0021}, /* 0020 */ + {0x0022,0x0022},{0x0023,0x0023}, /* 0022 */ + {0x0024,0x0024},{0x0025,0x0025}, /* 0024 */ + {0x0026,0x0026},{0x0027,0x0027}, /* 0026 */ + {0x0028,0x0028},{0x0029,0x0029}, /* 0028 */ + {0x002A,0x002A},{0x002B,0x002B}, /* 002A */ + {0x002C,0x002C},{0x002D,0x002D}, /* 002C */ + {0x002E,0x002E},{0x002F,0x002F}, /* 002E */ + {0x0030,0x0030},{0x0031,0x0031}, /* 0030 */ + {0x0032,0x0032},{0x0033,0x0033}, /* 0032 */ + {0x0034,0x0034},{0x0035,0x0035}, /* 0034 */ + {0x0036,0x0036},{0x0037,0x0037}, /* 0036 */ + {0x0038,0x0038},{0x0039,0x0039}, /* 0038 */ + {0x003A,0x003A},{0x003B,0x003B}, /* 003A */ + {0x003C,0x003C},{0x003D,0x003D}, /* 003C */ + {0x003E,0x003E},{0x003F,0x003F}, /* 003E */ + {0x0040,0x0040},{0x0041,0x0061}, /* 0040 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0042 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0044 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0046 */ + {0x0048,0x0068},{0x0049,0x0131}, /* 0048 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 004A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 004C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 004E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0050 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0052 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0054 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0056 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0058 */ + {0x005A,0x007A},{0x005B,0x005B}, /* 005A */ + {0x005C,0x005C},{0x005D,0x005D}, /* 005C */ + {0x005E,0x005E},{0x005F,0x005F}, /* 005E */ + {0x0060,0x0060},{0x0041,0x0061}, /* 0060 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0062 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0064 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0066 */ + {0x0048,0x0068},{0x0130,0x0069}, /* 0068 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 006A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 006C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 006E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0070 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0072 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0074 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0076 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0078 */ + {0x005A,0x007A},{0x007B,0x007B}, /* 007A */ + {0x007C,0x007C},{0x007D,0x007D}, /* 007C */ + {0x007E,0x007E},{0x007F,0x007F}, /* 007E */ + {0x0080,0x0080},{0x0081,0x0081}, /* 0080 */ + {0x0082,0x0082},{0x0083,0x0083}, /* 0082 */ + {0x0084,0x0084},{0x0085,0x0085}, /* 0084 */ + {0x0086,0x0086},{0x0087,0x0087}, /* 0086 */ + {0x0088,0x0088},{0x0089,0x0089}, /* 0088 */ + {0x008A,0x008A},{0x008B,0x008B}, /* 008A */ + {0x008C,0x008C},{0x008D,0x008D}, /* 008C */ + {0x008E,0x008E},{0x008F,0x008F}, /* 008E */ + {0x0090,0x0090},{0x0091,0x0091}, /* 0090 */ + {0x0092,0x0092},{0x0093,0x0093}, /* 0092 */ + {0x0094,0x0094},{0x0095,0x0095}, /* 0094 */ + {0x0096,0x0096},{0x0097,0x0097}, /* 0096 */ + {0x0098,0x0098},{0x0099,0x0099}, /* 0098 */ + {0x009A,0x009A},{0x009B,0x009B}, /* 009A */ + {0x009C,0x009C},{0x009D,0x009D}, /* 009C */ + {0x009E,0x009E},{0x009F,0x009F}, /* 009E */ + {0x00A0,0x00A0},{0x00A1,0x00A1}, /* 00A0 */ + {0x00A2,0x00A2},{0x00A3,0x00A3}, /* 00A2 */ + {0x00A4,0x00A4},{0x00A5,0x00A5}, /* 00A4 */ + {0x00A6,0x00A6},{0x00A7,0x00A7}, /* 00A6 */ + {0x00A8,0x00A8},{0x00A9,0x00A9}, /* 00A8 */ + {0x00AA,0x00AA},{0x00AB,0x00AB}, /* 00AA */ + {0x00AC,0x00AC},{0x00AD,0x00AD}, /* 00AC */ + {0x00AE,0x00AE},{0x00AF,0x00AF}, /* 00AE */ + {0x00B0,0x00B0},{0x00B1,0x00B1}, /* 00B0 */ + {0x00B2,0x00B2},{0x00B3,0x00B3}, /* 00B2 */ + {0x00B4,0x00B4},{0x039C,0x00B5}, /* 00B4 */ + {0x00B6,0x00B6},{0x00B7,0x00B7}, /* 00B6 */ + {0x00B8,0x00B8},{0x00B9,0x00B9}, /* 00B8 */ + {0x00BA,0x00BA},{0x00BB,0x00BB}, /* 00BA */ + {0x00BC,0x00BC},{0x00BD,0x00BD}, /* 00BC */ + {0x00BE,0x00BE},{0x00BF,0x00BF}, /* 00BE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00C0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00C2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00C4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00C6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00C8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00CA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00CC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00CE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00D0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00D2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00D4 */ + {0x00D6,0x00F6},{0x00D7,0x00D7}, /* 00D6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00D8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00DA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00DC */ + {0x00DE,0x00FE},{0x00DF,0x00DF}, /* 00DE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00E0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00E2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00E4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00E6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00E8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00EA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00EC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00EE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00F0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00F2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00F4 */ + {0x00D6,0x00F6},{0x00F7,0x00F7}, /* 00F6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00F8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00FA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00FC */ + {0x00DE,0x00FE},{0x0178,0x00FF} /* 00FE */ +}; + +const MY_CASEFOLD_CHARACTER * my_u1400tr_casefold_index[4352]={ + u1400tr_casefold_page00, u1400_casefold_page01, u1400_casefold_page02, u1400_casefold_page03, u1400_casefold_page04, u1400_casefold_page05, u1400_casefold_page06, u1400_casefold_page07, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u1400_casefold_page10, NULL, NULL, u1400_casefold_page13, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page1C, u1400_casefold_page1D, u1400_casefold_page1E, u1400_casefold_page1F, + NULL, u1400_casefold_page21, NULL, NULL, u1400_casefold_page24, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page2C, u1400_casefold_page2D, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_pageA6, u1400_casefold_pageA7, + NULL, NULL, NULL, u1400_casefold_pageAB, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_pageFF, + NULL, NULL, NULL, NULL, u1400_casefold_page104, u1400_casefold_page105, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page10C, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u1400_casefold_page118, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_page16E, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, u1400_casefold_page1E9, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; diff --git a/strings/ctype-unicode1400-casefold.h b/strings/ctype-unicode1400-casefold.h new file mode 100644 index 0000000000000..dae180d015717 --- /dev/null +++ b/strings/ctype-unicode1400-casefold.h @@ -0,0 +1,4240 @@ +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. + Copyright (c) 2009, 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + +/* + Generated by: + ./unidata-dump \ + --mode=casefold \ + --page-name=u1400_casefold_page \ + --index-name=my_u1400_casefold_index \ + UnicodeData-14.0.0.txt + +*/ +const MY_CASEFOLD_CHARACTER u1400_casefold_page00[256]={ + {0x0000,0x0000},{0x0001,0x0001}, /* 0000 */ + {0x0002,0x0002},{0x0003,0x0003}, /* 0002 */ + {0x0004,0x0004},{0x0005,0x0005}, /* 0004 */ + {0x0006,0x0006},{0x0007,0x0007}, /* 0006 */ + {0x0008,0x0008},{0x0009,0x0009}, /* 0008 */ + {0x000A,0x000A},{0x000B,0x000B}, /* 000A */ + {0x000C,0x000C},{0x000D,0x000D}, /* 000C */ + {0x000E,0x000E},{0x000F,0x000F}, /* 000E */ + {0x0010,0x0010},{0x0011,0x0011}, /* 0010 */ + {0x0012,0x0012},{0x0013,0x0013}, /* 0012 */ + {0x0014,0x0014},{0x0015,0x0015}, /* 0014 */ + {0x0016,0x0016},{0x0017,0x0017}, /* 0016 */ + {0x0018,0x0018},{0x0019,0x0019}, /* 0018 */ + {0x001A,0x001A},{0x001B,0x001B}, /* 001A */ + {0x001C,0x001C},{0x001D,0x001D}, /* 001C */ + {0x001E,0x001E},{0x001F,0x001F}, /* 001E */ + {0x0020,0x0020},{0x0021,0x0021}, /* 0020 */ + {0x0022,0x0022},{0x0023,0x0023}, /* 0022 */ + {0x0024,0x0024},{0x0025,0x0025}, /* 0024 */ + {0x0026,0x0026},{0x0027,0x0027}, /* 0026 */ + {0x0028,0x0028},{0x0029,0x0029}, /* 0028 */ + {0x002A,0x002A},{0x002B,0x002B}, /* 002A */ + {0x002C,0x002C},{0x002D,0x002D}, /* 002C */ + {0x002E,0x002E},{0x002F,0x002F}, /* 002E */ + {0x0030,0x0030},{0x0031,0x0031}, /* 0030 */ + {0x0032,0x0032},{0x0033,0x0033}, /* 0032 */ + {0x0034,0x0034},{0x0035,0x0035}, /* 0034 */ + {0x0036,0x0036},{0x0037,0x0037}, /* 0036 */ + {0x0038,0x0038},{0x0039,0x0039}, /* 0038 */ + {0x003A,0x003A},{0x003B,0x003B}, /* 003A */ + {0x003C,0x003C},{0x003D,0x003D}, /* 003C */ + {0x003E,0x003E},{0x003F,0x003F}, /* 003E */ + {0x0040,0x0040},{0x0041,0x0061}, /* 0040 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0042 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0044 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0046 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0048 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 004A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 004C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 004E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0050 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0052 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0054 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0056 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0058 */ + {0x005A,0x007A},{0x005B,0x005B}, /* 005A */ + {0x005C,0x005C},{0x005D,0x005D}, /* 005C */ + {0x005E,0x005E},{0x005F,0x005F}, /* 005E */ + {0x0060,0x0060},{0x0041,0x0061}, /* 0060 */ + {0x0042,0x0062},{0x0043,0x0063}, /* 0062 */ + {0x0044,0x0064},{0x0045,0x0065}, /* 0064 */ + {0x0046,0x0066},{0x0047,0x0067}, /* 0066 */ + {0x0048,0x0068},{0x0049,0x0069}, /* 0068 */ + {0x004A,0x006A},{0x004B,0x006B}, /* 006A */ + {0x004C,0x006C},{0x004D,0x006D}, /* 006C */ + {0x004E,0x006E},{0x004F,0x006F}, /* 006E */ + {0x0050,0x0070},{0x0051,0x0071}, /* 0070 */ + {0x0052,0x0072},{0x0053,0x0073}, /* 0072 */ + {0x0054,0x0074},{0x0055,0x0075}, /* 0074 */ + {0x0056,0x0076},{0x0057,0x0077}, /* 0076 */ + {0x0058,0x0078},{0x0059,0x0079}, /* 0078 */ + {0x005A,0x007A},{0x007B,0x007B}, /* 007A */ + {0x007C,0x007C},{0x007D,0x007D}, /* 007C */ + {0x007E,0x007E},{0x007F,0x007F}, /* 007E */ + {0x0080,0x0080},{0x0081,0x0081}, /* 0080 */ + {0x0082,0x0082},{0x0083,0x0083}, /* 0082 */ + {0x0084,0x0084},{0x0085,0x0085}, /* 0084 */ + {0x0086,0x0086},{0x0087,0x0087}, /* 0086 */ + {0x0088,0x0088},{0x0089,0x0089}, /* 0088 */ + {0x008A,0x008A},{0x008B,0x008B}, /* 008A */ + {0x008C,0x008C},{0x008D,0x008D}, /* 008C */ + {0x008E,0x008E},{0x008F,0x008F}, /* 008E */ + {0x0090,0x0090},{0x0091,0x0091}, /* 0090 */ + {0x0092,0x0092},{0x0093,0x0093}, /* 0092 */ + {0x0094,0x0094},{0x0095,0x0095}, /* 0094 */ + {0x0096,0x0096},{0x0097,0x0097}, /* 0096 */ + {0x0098,0x0098},{0x0099,0x0099}, /* 0098 */ + {0x009A,0x009A},{0x009B,0x009B}, /* 009A */ + {0x009C,0x009C},{0x009D,0x009D}, /* 009C */ + {0x009E,0x009E},{0x009F,0x009F}, /* 009E */ + {0x00A0,0x00A0},{0x00A1,0x00A1}, /* 00A0 */ + {0x00A2,0x00A2},{0x00A3,0x00A3}, /* 00A2 */ + {0x00A4,0x00A4},{0x00A5,0x00A5}, /* 00A4 */ + {0x00A6,0x00A6},{0x00A7,0x00A7}, /* 00A6 */ + {0x00A8,0x00A8},{0x00A9,0x00A9}, /* 00A8 */ + {0x00AA,0x00AA},{0x00AB,0x00AB}, /* 00AA */ + {0x00AC,0x00AC},{0x00AD,0x00AD}, /* 00AC */ + {0x00AE,0x00AE},{0x00AF,0x00AF}, /* 00AE */ + {0x00B0,0x00B0},{0x00B1,0x00B1}, /* 00B0 */ + {0x00B2,0x00B2},{0x00B3,0x00B3}, /* 00B2 */ + {0x00B4,0x00B4},{0x039C,0x00B5}, /* 00B4 */ + {0x00B6,0x00B6},{0x00B7,0x00B7}, /* 00B6 */ + {0x00B8,0x00B8},{0x00B9,0x00B9}, /* 00B8 */ + {0x00BA,0x00BA},{0x00BB,0x00BB}, /* 00BA */ + {0x00BC,0x00BC},{0x00BD,0x00BD}, /* 00BC */ + {0x00BE,0x00BE},{0x00BF,0x00BF}, /* 00BE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00C0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00C2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00C4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00C6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00C8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00CA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00CC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00CE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00D0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00D2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00D4 */ + {0x00D6,0x00F6},{0x00D7,0x00D7}, /* 00D6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00D8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00DA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00DC */ + {0x00DE,0x00FE},{0x00DF,0x00DF}, /* 00DE */ + {0x00C0,0x00E0},{0x00C1,0x00E1}, /* 00E0 */ + {0x00C2,0x00E2},{0x00C3,0x00E3}, /* 00E2 */ + {0x00C4,0x00E4},{0x00C5,0x00E5}, /* 00E4 */ + {0x00C6,0x00E6},{0x00C7,0x00E7}, /* 00E6 */ + {0x00C8,0x00E8},{0x00C9,0x00E9}, /* 00E8 */ + {0x00CA,0x00EA},{0x00CB,0x00EB}, /* 00EA */ + {0x00CC,0x00EC},{0x00CD,0x00ED}, /* 00EC */ + {0x00CE,0x00EE},{0x00CF,0x00EF}, /* 00EE */ + {0x00D0,0x00F0},{0x00D1,0x00F1}, /* 00F0 */ + {0x00D2,0x00F2},{0x00D3,0x00F3}, /* 00F2 */ + {0x00D4,0x00F4},{0x00D5,0x00F5}, /* 00F4 */ + {0x00D6,0x00F6},{0x00F7,0x00F7}, /* 00F6 */ + {0x00D8,0x00F8},{0x00D9,0x00F9}, /* 00F8 */ + {0x00DA,0x00FA},{0x00DB,0x00FB}, /* 00FA */ + {0x00DC,0x00FC},{0x00DD,0x00FD}, /* 00FC */ + {0x00DE,0x00FE},{0x0178,0x00FF} /* 00FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page01[256]={ + {0x0100,0x0101},{0x0100,0x0101}, /* 0100 */ + {0x0102,0x0103},{0x0102,0x0103}, /* 0102 */ + {0x0104,0x0105},{0x0104,0x0105}, /* 0104 */ + {0x0106,0x0107},{0x0106,0x0107}, /* 0106 */ + {0x0108,0x0109},{0x0108,0x0109}, /* 0108 */ + {0x010A,0x010B},{0x010A,0x010B}, /* 010A */ + {0x010C,0x010D},{0x010C,0x010D}, /* 010C */ + {0x010E,0x010F},{0x010E,0x010F}, /* 010E */ + {0x0110,0x0111},{0x0110,0x0111}, /* 0110 */ + {0x0112,0x0113},{0x0112,0x0113}, /* 0112 */ + {0x0114,0x0115},{0x0114,0x0115}, /* 0114 */ + {0x0116,0x0117},{0x0116,0x0117}, /* 0116 */ + {0x0118,0x0119},{0x0118,0x0119}, /* 0118 */ + {0x011A,0x011B},{0x011A,0x011B}, /* 011A */ + {0x011C,0x011D},{0x011C,0x011D}, /* 011C */ + {0x011E,0x011F},{0x011E,0x011F}, /* 011E */ + {0x0120,0x0121},{0x0120,0x0121}, /* 0120 */ + {0x0122,0x0123},{0x0122,0x0123}, /* 0122 */ + {0x0124,0x0125},{0x0124,0x0125}, /* 0124 */ + {0x0126,0x0127},{0x0126,0x0127}, /* 0126 */ + {0x0128,0x0129},{0x0128,0x0129}, /* 0128 */ + {0x012A,0x012B},{0x012A,0x012B}, /* 012A */ + {0x012C,0x012D},{0x012C,0x012D}, /* 012C */ + {0x012E,0x012F},{0x012E,0x012F}, /* 012E */ + {0x0130,0x0069},{0x0049,0x0131}, /* 0130 */ + {0x0132,0x0133},{0x0132,0x0133}, /* 0132 */ + {0x0134,0x0135},{0x0134,0x0135}, /* 0134 */ + {0x0136,0x0137},{0x0136,0x0137}, /* 0136 */ + {0x0138,0x0138},{0x0139,0x013A}, /* 0138 */ + {0x0139,0x013A},{0x013B,0x013C}, /* 013A */ + {0x013B,0x013C},{0x013D,0x013E}, /* 013C */ + {0x013D,0x013E},{0x013F,0x0140}, /* 013E */ + {0x013F,0x0140},{0x0141,0x0142}, /* 0140 */ + {0x0141,0x0142},{0x0143,0x0144}, /* 0142 */ + {0x0143,0x0144},{0x0145,0x0146}, /* 0144 */ + {0x0145,0x0146},{0x0147,0x0148}, /* 0146 */ + {0x0147,0x0148},{0x0149,0x0149}, /* 0148 */ + {0x014A,0x014B},{0x014A,0x014B}, /* 014A */ + {0x014C,0x014D},{0x014C,0x014D}, /* 014C */ + {0x014E,0x014F},{0x014E,0x014F}, /* 014E */ + {0x0150,0x0151},{0x0150,0x0151}, /* 0150 */ + {0x0152,0x0153},{0x0152,0x0153}, /* 0152 */ + {0x0154,0x0155},{0x0154,0x0155}, /* 0154 */ + {0x0156,0x0157},{0x0156,0x0157}, /* 0156 */ + {0x0158,0x0159},{0x0158,0x0159}, /* 0158 */ + {0x015A,0x015B},{0x015A,0x015B}, /* 015A */ + {0x015C,0x015D},{0x015C,0x015D}, /* 015C */ + {0x015E,0x015F},{0x015E,0x015F}, /* 015E */ + {0x0160,0x0161},{0x0160,0x0161}, /* 0160 */ + {0x0162,0x0163},{0x0162,0x0163}, /* 0162 */ + {0x0164,0x0165},{0x0164,0x0165}, /* 0164 */ + {0x0166,0x0167},{0x0166,0x0167}, /* 0166 */ + {0x0168,0x0169},{0x0168,0x0169}, /* 0168 */ + {0x016A,0x016B},{0x016A,0x016B}, /* 016A */ + {0x016C,0x016D},{0x016C,0x016D}, /* 016C */ + {0x016E,0x016F},{0x016E,0x016F}, /* 016E */ + {0x0170,0x0171},{0x0170,0x0171}, /* 0170 */ + {0x0172,0x0173},{0x0172,0x0173}, /* 0172 */ + {0x0174,0x0175},{0x0174,0x0175}, /* 0174 */ + {0x0176,0x0177},{0x0176,0x0177}, /* 0176 */ + {0x0178,0x00FF},{0x0179,0x017A}, /* 0178 */ + {0x0179,0x017A},{0x017B,0x017C}, /* 017A */ + {0x017B,0x017C},{0x017D,0x017E}, /* 017C */ + {0x017D,0x017E},{0x0053,0x017F}, /* 017E */ + {0x0243,0x0180},{0x0181,0x0253}, /* 0180 */ + {0x0182,0x0183},{0x0182,0x0183}, /* 0182 */ + {0x0184,0x0185},{0x0184,0x0185}, /* 0184 */ + {0x0186,0x0254},{0x0187,0x0188}, /* 0186 */ + {0x0187,0x0188},{0x0189,0x0256}, /* 0188 */ + {0x018A,0x0257},{0x018B,0x018C}, /* 018A */ + {0x018B,0x018C},{0x018D,0x018D}, /* 018C */ + {0x018E,0x01DD},{0x018F,0x0259}, /* 018E */ + {0x0190,0x025B},{0x0191,0x0192}, /* 0190 */ + {0x0191,0x0192},{0x0193,0x0260}, /* 0192 */ + {0x0194,0x0263},{0x01F6,0x0195}, /* 0194 */ + {0x0196,0x0269},{0x0197,0x0268}, /* 0196 */ + {0x0198,0x0199},{0x0198,0x0199}, /* 0198 */ + {0x023D,0x019A},{0x019B,0x019B}, /* 019A */ + {0x019C,0x026F},{0x019D,0x0272}, /* 019C */ + {0x0220,0x019E},{0x019F,0x0275}, /* 019E */ + {0x01A0,0x01A1},{0x01A0,0x01A1}, /* 01A0 */ + {0x01A2,0x01A3},{0x01A2,0x01A3}, /* 01A2 */ + {0x01A4,0x01A5},{0x01A4,0x01A5}, /* 01A4 */ + {0x01A6,0x0280},{0x01A7,0x01A8}, /* 01A6 */ + {0x01A7,0x01A8},{0x01A9,0x0283}, /* 01A8 */ + {0x01AA,0x01AA},{0x01AB,0x01AB}, /* 01AA */ + {0x01AC,0x01AD},{0x01AC,0x01AD}, /* 01AC */ + {0x01AE,0x0288},{0x01AF,0x01B0}, /* 01AE */ + {0x01AF,0x01B0},{0x01B1,0x028A}, /* 01B0 */ + {0x01B2,0x028B},{0x01B3,0x01B4}, /* 01B2 */ + {0x01B3,0x01B4},{0x01B5,0x01B6}, /* 01B4 */ + {0x01B5,0x01B6},{0x01B7,0x0292}, /* 01B6 */ + {0x01B8,0x01B9},{0x01B8,0x01B9}, /* 01B8 */ + {0x01BA,0x01BA},{0x01BB,0x01BB}, /* 01BA */ + {0x01BC,0x01BD},{0x01BC,0x01BD}, /* 01BC */ + {0x01BE,0x01BE},{0x01F7,0x01BF}, /* 01BE */ + {0x01C0,0x01C0},{0x01C1,0x01C1}, /* 01C0 */ + {0x01C2,0x01C2},{0x01C3,0x01C3}, /* 01C2 */ + {0x01C4,0x01C6},{0x01C4,0x01C6}, /* 01C4 */ + {0x01C4,0x01C6},{0x01C7,0x01C9}, /* 01C6 */ + {0x01C7,0x01C9},{0x01C7,0x01C9}, /* 01C8 */ + {0x01CA,0x01CC},{0x01CA,0x01CC}, /* 01CA */ + {0x01CA,0x01CC},{0x01CD,0x01CE}, /* 01CC */ + {0x01CD,0x01CE},{0x01CF,0x01D0}, /* 01CE */ + {0x01CF,0x01D0},{0x01D1,0x01D2}, /* 01D0 */ + {0x01D1,0x01D2},{0x01D3,0x01D4}, /* 01D2 */ + {0x01D3,0x01D4},{0x01D5,0x01D6}, /* 01D4 */ + {0x01D5,0x01D6},{0x01D7,0x01D8}, /* 01D6 */ + {0x01D7,0x01D8},{0x01D9,0x01DA}, /* 01D8 */ + {0x01D9,0x01DA},{0x01DB,0x01DC}, /* 01DA */ + {0x01DB,0x01DC},{0x018E,0x01DD}, /* 01DC */ + {0x01DE,0x01DF},{0x01DE,0x01DF}, /* 01DE */ + {0x01E0,0x01E1},{0x01E0,0x01E1}, /* 01E0 */ + {0x01E2,0x01E3},{0x01E2,0x01E3}, /* 01E2 */ + {0x01E4,0x01E5},{0x01E4,0x01E5}, /* 01E4 */ + {0x01E6,0x01E7},{0x01E6,0x01E7}, /* 01E6 */ + {0x01E8,0x01E9},{0x01E8,0x01E9}, /* 01E8 */ + {0x01EA,0x01EB},{0x01EA,0x01EB}, /* 01EA */ + {0x01EC,0x01ED},{0x01EC,0x01ED}, /* 01EC */ + {0x01EE,0x01EF},{0x01EE,0x01EF}, /* 01EE */ + {0x01F0,0x01F0},{0x01F1,0x01F3}, /* 01F0 */ + {0x01F1,0x01F3},{0x01F1,0x01F3}, /* 01F2 */ + {0x01F4,0x01F5},{0x01F4,0x01F5}, /* 01F4 */ + {0x01F6,0x0195},{0x01F7,0x01BF}, /* 01F6 */ + {0x01F8,0x01F9},{0x01F8,0x01F9}, /* 01F8 */ + {0x01FA,0x01FB},{0x01FA,0x01FB}, /* 01FA */ + {0x01FC,0x01FD},{0x01FC,0x01FD}, /* 01FC */ + {0x01FE,0x01FF},{0x01FE,0x01FF} /* 01FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page02[256]={ + {0x0200,0x0201},{0x0200,0x0201}, /* 0200 */ + {0x0202,0x0203},{0x0202,0x0203}, /* 0202 */ + {0x0204,0x0205},{0x0204,0x0205}, /* 0204 */ + {0x0206,0x0207},{0x0206,0x0207}, /* 0206 */ + {0x0208,0x0209},{0x0208,0x0209}, /* 0208 */ + {0x020A,0x020B},{0x020A,0x020B}, /* 020A */ + {0x020C,0x020D},{0x020C,0x020D}, /* 020C */ + {0x020E,0x020F},{0x020E,0x020F}, /* 020E */ + {0x0210,0x0211},{0x0210,0x0211}, /* 0210 */ + {0x0212,0x0213},{0x0212,0x0213}, /* 0212 */ + {0x0214,0x0215},{0x0214,0x0215}, /* 0214 */ + {0x0216,0x0217},{0x0216,0x0217}, /* 0216 */ + {0x0218,0x0219},{0x0218,0x0219}, /* 0218 */ + {0x021A,0x021B},{0x021A,0x021B}, /* 021A */ + {0x021C,0x021D},{0x021C,0x021D}, /* 021C */ + {0x021E,0x021F},{0x021E,0x021F}, /* 021E */ + {0x0220,0x019E},{0x0221,0x0221}, /* 0220 */ + {0x0222,0x0223},{0x0222,0x0223}, /* 0222 */ + {0x0224,0x0225},{0x0224,0x0225}, /* 0224 */ + {0x0226,0x0227},{0x0226,0x0227}, /* 0226 */ + {0x0228,0x0229},{0x0228,0x0229}, /* 0228 */ + {0x022A,0x022B},{0x022A,0x022B}, /* 022A */ + {0x022C,0x022D},{0x022C,0x022D}, /* 022C */ + {0x022E,0x022F},{0x022E,0x022F}, /* 022E */ + {0x0230,0x0231},{0x0230,0x0231}, /* 0230 */ + {0x0232,0x0233},{0x0232,0x0233}, /* 0232 */ + {0x0234,0x0234},{0x0235,0x0235}, /* 0234 */ + {0x0236,0x0236},{0x0237,0x0237}, /* 0236 */ + {0x0238,0x0238},{0x0239,0x0239}, /* 0238 */ + {0x023A,0x2C65},{0x023B,0x023C}, /* 023A */ + {0x023B,0x023C},{0x023D,0x019A}, /* 023C */ + {0x023E,0x2C66},{0x2C7E,0x023F}, /* 023E */ + {0x2C7F,0x0240},{0x0241,0x0242}, /* 0240 */ + {0x0241,0x0242},{0x0243,0x0180}, /* 0242 */ + {0x0244,0x0289},{0x0245,0x028C}, /* 0244 */ + {0x0246,0x0247},{0x0246,0x0247}, /* 0246 */ + {0x0248,0x0249},{0x0248,0x0249}, /* 0248 */ + {0x024A,0x024B},{0x024A,0x024B}, /* 024A */ + {0x024C,0x024D},{0x024C,0x024D}, /* 024C */ + {0x024E,0x024F},{0x024E,0x024F}, /* 024E */ + {0x2C6F,0x0250},{0x2C6D,0x0251}, /* 0250 */ + {0x2C70,0x0252},{0x0181,0x0253}, /* 0252 */ + {0x0186,0x0254},{0x0255,0x0255}, /* 0254 */ + {0x0189,0x0256},{0x018A,0x0257}, /* 0256 */ + {0x0258,0x0258},{0x018F,0x0259}, /* 0258 */ + {0x025A,0x025A},{0x0190,0x025B}, /* 025A */ + {0xA7AB,0x025C},{0x025D,0x025D}, /* 025C */ + {0x025E,0x025E},{0x025F,0x025F}, /* 025E */ + {0x0193,0x0260},{0xA7AC,0x0261}, /* 0260 */ + {0x0262,0x0262},{0x0194,0x0263}, /* 0262 */ + {0x0264,0x0264},{0xA78D,0x0265}, /* 0264 */ + {0xA7AA,0x0266},{0x0267,0x0267}, /* 0266 */ + {0x0197,0x0268},{0x0196,0x0269}, /* 0268 */ + {0xA7AE,0x026A},{0x2C62,0x026B}, /* 026A */ + {0xA7AD,0x026C},{0x026D,0x026D}, /* 026C */ + {0x026E,0x026E},{0x019C,0x026F}, /* 026E */ + {0x0270,0x0270},{0x2C6E,0x0271}, /* 0270 */ + {0x019D,0x0272},{0x0273,0x0273}, /* 0272 */ + {0x0274,0x0274},{0x019F,0x0275}, /* 0274 */ + {0x0276,0x0276},{0x0277,0x0277}, /* 0276 */ + {0x0278,0x0278},{0x0279,0x0279}, /* 0278 */ + {0x027A,0x027A},{0x027B,0x027B}, /* 027A */ + {0x027C,0x027C},{0x2C64,0x027D}, /* 027C */ + {0x027E,0x027E},{0x027F,0x027F}, /* 027E */ + {0x01A6,0x0280},{0x0281,0x0281}, /* 0280 */ + {0xA7C5,0x0282},{0x01A9,0x0283}, /* 0282 */ + {0x0284,0x0284},{0x0285,0x0285}, /* 0284 */ + {0x0286,0x0286},{0xA7B1,0x0287}, /* 0286 */ + {0x01AE,0x0288},{0x0244,0x0289}, /* 0288 */ + {0x01B1,0x028A},{0x01B2,0x028B}, /* 028A */ + {0x0245,0x028C},{0x028D,0x028D}, /* 028C */ + {0x028E,0x028E},{0x028F,0x028F}, /* 028E */ + {0x0290,0x0290},{0x0291,0x0291}, /* 0290 */ + {0x01B7,0x0292},{0x0293,0x0293}, /* 0292 */ + {0x0294,0x0294},{0x0295,0x0295}, /* 0294 */ + {0x0296,0x0296},{0x0297,0x0297}, /* 0296 */ + {0x0298,0x0298},{0x0299,0x0299}, /* 0298 */ + {0x029A,0x029A},{0x029B,0x029B}, /* 029A */ + {0x029C,0x029C},{0xA7B2,0x029D}, /* 029C */ + {0xA7B0,0x029E},{0x029F,0x029F}, /* 029E */ + {0x02A0,0x02A0},{0x02A1,0x02A1}, /* 02A0 */ + {0x02A2,0x02A2},{0x02A3,0x02A3}, /* 02A2 */ + {0x02A4,0x02A4},{0x02A5,0x02A5}, /* 02A4 */ + {0x02A6,0x02A6},{0x02A7,0x02A7}, /* 02A6 */ + {0x02A8,0x02A8},{0x02A9,0x02A9}, /* 02A8 */ + {0x02AA,0x02AA},{0x02AB,0x02AB}, /* 02AA */ + {0x02AC,0x02AC},{0x02AD,0x02AD}, /* 02AC */ + {0x02AE,0x02AE},{0x02AF,0x02AF}, /* 02AE */ + {0x02B0,0x02B0},{0x02B1,0x02B1}, /* 02B0 */ + {0x02B2,0x02B2},{0x02B3,0x02B3}, /* 02B2 */ + {0x02B4,0x02B4},{0x02B5,0x02B5}, /* 02B4 */ + {0x02B6,0x02B6},{0x02B7,0x02B7}, /* 02B6 */ + {0x02B8,0x02B8},{0x02B9,0x02B9}, /* 02B8 */ + {0x02BA,0x02BA},{0x02BB,0x02BB}, /* 02BA */ + {0x02BC,0x02BC},{0x02BD,0x02BD}, /* 02BC */ + {0x02BE,0x02BE},{0x02BF,0x02BF}, /* 02BE */ + {0x02C0,0x02C0},{0x02C1,0x02C1}, /* 02C0 */ + {0x02C2,0x02C2},{0x02C3,0x02C3}, /* 02C2 */ + {0x02C4,0x02C4},{0x02C5,0x02C5}, /* 02C4 */ + {0x02C6,0x02C6},{0x02C7,0x02C7}, /* 02C6 */ + {0x02C8,0x02C8},{0x02C9,0x02C9}, /* 02C8 */ + {0x02CA,0x02CA},{0x02CB,0x02CB}, /* 02CA */ + {0x02CC,0x02CC},{0x02CD,0x02CD}, /* 02CC */ + {0x02CE,0x02CE},{0x02CF,0x02CF}, /* 02CE */ + {0x02D0,0x02D0},{0x02D1,0x02D1}, /* 02D0 */ + {0x02D2,0x02D2},{0x02D3,0x02D3}, /* 02D2 */ + {0x02D4,0x02D4},{0x02D5,0x02D5}, /* 02D4 */ + {0x02D6,0x02D6},{0x02D7,0x02D7}, /* 02D6 */ + {0x02D8,0x02D8},{0x02D9,0x02D9}, /* 02D8 */ + {0x02DA,0x02DA},{0x02DB,0x02DB}, /* 02DA */ + {0x02DC,0x02DC},{0x02DD,0x02DD}, /* 02DC */ + {0x02DE,0x02DE},{0x02DF,0x02DF}, /* 02DE */ + {0x02E0,0x02E0},{0x02E1,0x02E1}, /* 02E0 */ + {0x02E2,0x02E2},{0x02E3,0x02E3}, /* 02E2 */ + {0x02E4,0x02E4},{0x02E5,0x02E5}, /* 02E4 */ + {0x02E6,0x02E6},{0x02E7,0x02E7}, /* 02E6 */ + {0x02E8,0x02E8},{0x02E9,0x02E9}, /* 02E8 */ + {0x02EA,0x02EA},{0x02EB,0x02EB}, /* 02EA */ + {0x02EC,0x02EC},{0x02ED,0x02ED}, /* 02EC */ + {0x02EE,0x02EE},{0x02EF,0x02EF}, /* 02EE */ + {0x02F0,0x02F0},{0x02F1,0x02F1}, /* 02F0 */ + {0x02F2,0x02F2},{0x02F3,0x02F3}, /* 02F2 */ + {0x02F4,0x02F4},{0x02F5,0x02F5}, /* 02F4 */ + {0x02F6,0x02F6},{0x02F7,0x02F7}, /* 02F6 */ + {0x02F8,0x02F8},{0x02F9,0x02F9}, /* 02F8 */ + {0x02FA,0x02FA},{0x02FB,0x02FB}, /* 02FA */ + {0x02FC,0x02FC},{0x02FD,0x02FD}, /* 02FC */ + {0x02FE,0x02FE},{0x02FF,0x02FF} /* 02FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page03[256]={ + {0x0300,0x0300},{0x0301,0x0301}, /* 0300 */ + {0x0302,0x0302},{0x0303,0x0303}, /* 0302 */ + {0x0304,0x0304},{0x0305,0x0305}, /* 0304 */ + {0x0306,0x0306},{0x0307,0x0307}, /* 0306 */ + {0x0308,0x0308},{0x0309,0x0309}, /* 0308 */ + {0x030A,0x030A},{0x030B,0x030B}, /* 030A */ + {0x030C,0x030C},{0x030D,0x030D}, /* 030C */ + {0x030E,0x030E},{0x030F,0x030F}, /* 030E */ + {0x0310,0x0310},{0x0311,0x0311}, /* 0310 */ + {0x0312,0x0312},{0x0313,0x0313}, /* 0312 */ + {0x0314,0x0314},{0x0315,0x0315}, /* 0314 */ + {0x0316,0x0316},{0x0317,0x0317}, /* 0316 */ + {0x0318,0x0318},{0x0319,0x0319}, /* 0318 */ + {0x031A,0x031A},{0x031B,0x031B}, /* 031A */ + {0x031C,0x031C},{0x031D,0x031D}, /* 031C */ + {0x031E,0x031E},{0x031F,0x031F}, /* 031E */ + {0x0320,0x0320},{0x0321,0x0321}, /* 0320 */ + {0x0322,0x0322},{0x0323,0x0323}, /* 0322 */ + {0x0324,0x0324},{0x0325,0x0325}, /* 0324 */ + {0x0326,0x0326},{0x0327,0x0327}, /* 0326 */ + {0x0328,0x0328},{0x0329,0x0329}, /* 0328 */ + {0x032A,0x032A},{0x032B,0x032B}, /* 032A */ + {0x032C,0x032C},{0x032D,0x032D}, /* 032C */ + {0x032E,0x032E},{0x032F,0x032F}, /* 032E */ + {0x0330,0x0330},{0x0331,0x0331}, /* 0330 */ + {0x0332,0x0332},{0x0333,0x0333}, /* 0332 */ + {0x0334,0x0334},{0x0335,0x0335}, /* 0334 */ + {0x0336,0x0336},{0x0337,0x0337}, /* 0336 */ + {0x0338,0x0338},{0x0339,0x0339}, /* 0338 */ + {0x033A,0x033A},{0x033B,0x033B}, /* 033A */ + {0x033C,0x033C},{0x033D,0x033D}, /* 033C */ + {0x033E,0x033E},{0x033F,0x033F}, /* 033E */ + {0x0340,0x0340},{0x0341,0x0341}, /* 0340 */ + {0x0342,0x0342},{0x0343,0x0343}, /* 0342 */ + {0x0344,0x0344},{0x0399,0x0345}, /* 0344 */ + {0x0346,0x0346},{0x0347,0x0347}, /* 0346 */ + {0x0348,0x0348},{0x0349,0x0349}, /* 0348 */ + {0x034A,0x034A},{0x034B,0x034B}, /* 034A */ + {0x034C,0x034C},{0x034D,0x034D}, /* 034C */ + {0x034E,0x034E},{0x034F,0x034F}, /* 034E */ + {0x0350,0x0350},{0x0351,0x0351}, /* 0350 */ + {0x0352,0x0352},{0x0353,0x0353}, /* 0352 */ + {0x0354,0x0354},{0x0355,0x0355}, /* 0354 */ + {0x0356,0x0356},{0x0357,0x0357}, /* 0356 */ + {0x0358,0x0358},{0x0359,0x0359}, /* 0358 */ + {0x035A,0x035A},{0x035B,0x035B}, /* 035A */ + {0x035C,0x035C},{0x035D,0x035D}, /* 035C */ + {0x035E,0x035E},{0x035F,0x035F}, /* 035E */ + {0x0360,0x0360},{0x0361,0x0361}, /* 0360 */ + {0x0362,0x0362},{0x0363,0x0363}, /* 0362 */ + {0x0364,0x0364},{0x0365,0x0365}, /* 0364 */ + {0x0366,0x0366},{0x0367,0x0367}, /* 0366 */ + {0x0368,0x0368},{0x0369,0x0369}, /* 0368 */ + {0x036A,0x036A},{0x036B,0x036B}, /* 036A */ + {0x036C,0x036C},{0x036D,0x036D}, /* 036C */ + {0x036E,0x036E},{0x036F,0x036F}, /* 036E */ + {0x0370,0x0371},{0x0370,0x0371}, /* 0370 */ + {0x0372,0x0373},{0x0372,0x0373}, /* 0372 */ + {0x0374,0x0374},{0x0375,0x0375}, /* 0374 */ + {0x0376,0x0377},{0x0376,0x0377}, /* 0376 */ + {0x0378,0x0378},{0x0379,0x0379}, /* 0378 */ + {0x037A,0x037A},{0x03FD,0x037B}, /* 037A */ + {0x03FE,0x037C},{0x03FF,0x037D}, /* 037C */ + {0x037E,0x037E},{0x037F,0x03F3}, /* 037E */ + {0x0380,0x0380},{0x0381,0x0381}, /* 0380 */ + {0x0382,0x0382},{0x0383,0x0383}, /* 0382 */ + {0x0384,0x0384},{0x0385,0x0385}, /* 0384 */ + {0x0386,0x03AC},{0x0387,0x0387}, /* 0386 */ + {0x0388,0x03AD},{0x0389,0x03AE}, /* 0388 */ + {0x038A,0x03AF},{0x038B,0x038B}, /* 038A */ + {0x038C,0x03CC},{0x038D,0x038D}, /* 038C */ + {0x038E,0x03CD},{0x038F,0x03CE}, /* 038E */ + {0x0390,0x0390},{0x0391,0x03B1}, /* 0390 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 0392 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 0394 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 0396 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 0398 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 039A */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 039C */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 039E */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03A0 */ + {0x03A2,0x03A2},{0x03A3,0x03C3}, /* 03A2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03A4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03A6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03A8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03AA */ + {0x0386,0x03AC},{0x0388,0x03AD}, /* 03AC */ + {0x0389,0x03AE},{0x038A,0x03AF}, /* 03AE */ + {0x03B0,0x03B0},{0x0391,0x03B1}, /* 03B0 */ + {0x0392,0x03B2},{0x0393,0x03B3}, /* 03B2 */ + {0x0394,0x03B4},{0x0395,0x03B5}, /* 03B4 */ + {0x0396,0x03B6},{0x0397,0x03B7}, /* 03B6 */ + {0x0398,0x03B8},{0x0399,0x03B9}, /* 03B8 */ + {0x039A,0x03BA},{0x039B,0x03BB}, /* 03BA */ + {0x039C,0x03BC},{0x039D,0x03BD}, /* 03BC */ + {0x039E,0x03BE},{0x039F,0x03BF}, /* 03BE */ + {0x03A0,0x03C0},{0x03A1,0x03C1}, /* 03C0 */ + {0x03A3,0x03C2},{0x03A3,0x03C3}, /* 03C2 */ + {0x03A4,0x03C4},{0x03A5,0x03C5}, /* 03C4 */ + {0x03A6,0x03C6},{0x03A7,0x03C7}, /* 03C6 */ + {0x03A8,0x03C8},{0x03A9,0x03C9}, /* 03C8 */ + {0x03AA,0x03CA},{0x03AB,0x03CB}, /* 03CA */ + {0x038C,0x03CC},{0x038E,0x03CD}, /* 03CC */ + {0x038F,0x03CE},{0x03CF,0x03D7}, /* 03CE */ + {0x0392,0x03D0},{0x0398,0x03D1}, /* 03D0 */ + {0x03D2,0x03D2},{0x03D3,0x03D3}, /* 03D2 */ + {0x03D4,0x03D4},{0x03A6,0x03D5}, /* 03D4 */ + {0x03A0,0x03D6},{0x03CF,0x03D7}, /* 03D6 */ + {0x03D8,0x03D9},{0x03D8,0x03D9}, /* 03D8 */ + {0x03DA,0x03DB},{0x03DA,0x03DB}, /* 03DA */ + {0x03DC,0x03DD},{0x03DC,0x03DD}, /* 03DC */ + {0x03DE,0x03DF},{0x03DE,0x03DF}, /* 03DE */ + {0x03E0,0x03E1},{0x03E0,0x03E1}, /* 03E0 */ + {0x03E2,0x03E3},{0x03E2,0x03E3}, /* 03E2 */ + {0x03E4,0x03E5},{0x03E4,0x03E5}, /* 03E4 */ + {0x03E6,0x03E7},{0x03E6,0x03E7}, /* 03E6 */ + {0x03E8,0x03E9},{0x03E8,0x03E9}, /* 03E8 */ + {0x03EA,0x03EB},{0x03EA,0x03EB}, /* 03EA */ + {0x03EC,0x03ED},{0x03EC,0x03ED}, /* 03EC */ + {0x03EE,0x03EF},{0x03EE,0x03EF}, /* 03EE */ + {0x039A,0x03F0},{0x03A1,0x03F1}, /* 03F0 */ + {0x03F9,0x03F2},{0x037F,0x03F3}, /* 03F2 */ + {0x03F4,0x03B8},{0x0395,0x03F5}, /* 03F4 */ + {0x03F6,0x03F6},{0x03F7,0x03F8}, /* 03F6 */ + {0x03F7,0x03F8},{0x03F9,0x03F2}, /* 03F8 */ + {0x03FA,0x03FB},{0x03FA,0x03FB}, /* 03FA */ + {0x03FC,0x03FC},{0x03FD,0x037B}, /* 03FC */ + {0x03FE,0x037C},{0x03FF,0x037D} /* 03FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page04[256]={ + {0x0400,0x0450},{0x0401,0x0451}, /* 0400 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0402 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0404 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0406 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0408 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 040A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 040C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 040E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0410 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0412 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0414 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0416 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0418 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 041A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 041C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 041E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0420 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0422 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0424 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0426 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0428 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 042A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 042C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 042E */ + {0x0410,0x0430},{0x0411,0x0431}, /* 0430 */ + {0x0412,0x0432},{0x0413,0x0433}, /* 0432 */ + {0x0414,0x0434},{0x0415,0x0435}, /* 0434 */ + {0x0416,0x0436},{0x0417,0x0437}, /* 0436 */ + {0x0418,0x0438},{0x0419,0x0439}, /* 0438 */ + {0x041A,0x043A},{0x041B,0x043B}, /* 043A */ + {0x041C,0x043C},{0x041D,0x043D}, /* 043C */ + {0x041E,0x043E},{0x041F,0x043F}, /* 043E */ + {0x0420,0x0440},{0x0421,0x0441}, /* 0440 */ + {0x0422,0x0442},{0x0423,0x0443}, /* 0442 */ + {0x0424,0x0444},{0x0425,0x0445}, /* 0444 */ + {0x0426,0x0446},{0x0427,0x0447}, /* 0446 */ + {0x0428,0x0448},{0x0429,0x0449}, /* 0448 */ + {0x042A,0x044A},{0x042B,0x044B}, /* 044A */ + {0x042C,0x044C},{0x042D,0x044D}, /* 044C */ + {0x042E,0x044E},{0x042F,0x044F}, /* 044E */ + {0x0400,0x0450},{0x0401,0x0451}, /* 0450 */ + {0x0402,0x0452},{0x0403,0x0453}, /* 0452 */ + {0x0404,0x0454},{0x0405,0x0455}, /* 0454 */ + {0x0406,0x0456},{0x0407,0x0457}, /* 0456 */ + {0x0408,0x0458},{0x0409,0x0459}, /* 0458 */ + {0x040A,0x045A},{0x040B,0x045B}, /* 045A */ + {0x040C,0x045C},{0x040D,0x045D}, /* 045C */ + {0x040E,0x045E},{0x040F,0x045F}, /* 045E */ + {0x0460,0x0461},{0x0460,0x0461}, /* 0460 */ + {0x0462,0x0463},{0x0462,0x0463}, /* 0462 */ + {0x0464,0x0465},{0x0464,0x0465}, /* 0464 */ + {0x0466,0x0467},{0x0466,0x0467}, /* 0466 */ + {0x0468,0x0469},{0x0468,0x0469}, /* 0468 */ + {0x046A,0x046B},{0x046A,0x046B}, /* 046A */ + {0x046C,0x046D},{0x046C,0x046D}, /* 046C */ + {0x046E,0x046F},{0x046E,0x046F}, /* 046E */ + {0x0470,0x0471},{0x0470,0x0471}, /* 0470 */ + {0x0472,0x0473},{0x0472,0x0473}, /* 0472 */ + {0x0474,0x0475},{0x0474,0x0475}, /* 0474 */ + {0x0476,0x0477},{0x0476,0x0477}, /* 0476 */ + {0x0478,0x0479},{0x0478,0x0479}, /* 0478 */ + {0x047A,0x047B},{0x047A,0x047B}, /* 047A */ + {0x047C,0x047D},{0x047C,0x047D}, /* 047C */ + {0x047E,0x047F},{0x047E,0x047F}, /* 047E */ + {0x0480,0x0481},{0x0480,0x0481}, /* 0480 */ + {0x0482,0x0482},{0x0483,0x0483}, /* 0482 */ + {0x0484,0x0484},{0x0485,0x0485}, /* 0484 */ + {0x0486,0x0486},{0x0487,0x0487}, /* 0486 */ + {0x0488,0x0488},{0x0489,0x0489}, /* 0488 */ + {0x048A,0x048B},{0x048A,0x048B}, /* 048A */ + {0x048C,0x048D},{0x048C,0x048D}, /* 048C */ + {0x048E,0x048F},{0x048E,0x048F}, /* 048E */ + {0x0490,0x0491},{0x0490,0x0491}, /* 0490 */ + {0x0492,0x0493},{0x0492,0x0493}, /* 0492 */ + {0x0494,0x0495},{0x0494,0x0495}, /* 0494 */ + {0x0496,0x0497},{0x0496,0x0497}, /* 0496 */ + {0x0498,0x0499},{0x0498,0x0499}, /* 0498 */ + {0x049A,0x049B},{0x049A,0x049B}, /* 049A */ + {0x049C,0x049D},{0x049C,0x049D}, /* 049C */ + {0x049E,0x049F},{0x049E,0x049F}, /* 049E */ + {0x04A0,0x04A1},{0x04A0,0x04A1}, /* 04A0 */ + {0x04A2,0x04A3},{0x04A2,0x04A3}, /* 04A2 */ + {0x04A4,0x04A5},{0x04A4,0x04A5}, /* 04A4 */ + {0x04A6,0x04A7},{0x04A6,0x04A7}, /* 04A6 */ + {0x04A8,0x04A9},{0x04A8,0x04A9}, /* 04A8 */ + {0x04AA,0x04AB},{0x04AA,0x04AB}, /* 04AA */ + {0x04AC,0x04AD},{0x04AC,0x04AD}, /* 04AC */ + {0x04AE,0x04AF},{0x04AE,0x04AF}, /* 04AE */ + {0x04B0,0x04B1},{0x04B0,0x04B1}, /* 04B0 */ + {0x04B2,0x04B3},{0x04B2,0x04B3}, /* 04B2 */ + {0x04B4,0x04B5},{0x04B4,0x04B5}, /* 04B4 */ + {0x04B6,0x04B7},{0x04B6,0x04B7}, /* 04B6 */ + {0x04B8,0x04B9},{0x04B8,0x04B9}, /* 04B8 */ + {0x04BA,0x04BB},{0x04BA,0x04BB}, /* 04BA */ + {0x04BC,0x04BD},{0x04BC,0x04BD}, /* 04BC */ + {0x04BE,0x04BF},{0x04BE,0x04BF}, /* 04BE */ + {0x04C0,0x04CF},{0x04C1,0x04C2}, /* 04C0 */ + {0x04C1,0x04C2},{0x04C3,0x04C4}, /* 04C2 */ + {0x04C3,0x04C4},{0x04C5,0x04C6}, /* 04C4 */ + {0x04C5,0x04C6},{0x04C7,0x04C8}, /* 04C6 */ + {0x04C7,0x04C8},{0x04C9,0x04CA}, /* 04C8 */ + {0x04C9,0x04CA},{0x04CB,0x04CC}, /* 04CA */ + {0x04CB,0x04CC},{0x04CD,0x04CE}, /* 04CC */ + {0x04CD,0x04CE},{0x04C0,0x04CF}, /* 04CE */ + {0x04D0,0x04D1},{0x04D0,0x04D1}, /* 04D0 */ + {0x04D2,0x04D3},{0x04D2,0x04D3}, /* 04D2 */ + {0x04D4,0x04D5},{0x04D4,0x04D5}, /* 04D4 */ + {0x04D6,0x04D7},{0x04D6,0x04D7}, /* 04D6 */ + {0x04D8,0x04D9},{0x04D8,0x04D9}, /* 04D8 */ + {0x04DA,0x04DB},{0x04DA,0x04DB}, /* 04DA */ + {0x04DC,0x04DD},{0x04DC,0x04DD}, /* 04DC */ + {0x04DE,0x04DF},{0x04DE,0x04DF}, /* 04DE */ + {0x04E0,0x04E1},{0x04E0,0x04E1}, /* 04E0 */ + {0x04E2,0x04E3},{0x04E2,0x04E3}, /* 04E2 */ + {0x04E4,0x04E5},{0x04E4,0x04E5}, /* 04E4 */ + {0x04E6,0x04E7},{0x04E6,0x04E7}, /* 04E6 */ + {0x04E8,0x04E9},{0x04E8,0x04E9}, /* 04E8 */ + {0x04EA,0x04EB},{0x04EA,0x04EB}, /* 04EA */ + {0x04EC,0x04ED},{0x04EC,0x04ED}, /* 04EC */ + {0x04EE,0x04EF},{0x04EE,0x04EF}, /* 04EE */ + {0x04F0,0x04F1},{0x04F0,0x04F1}, /* 04F0 */ + {0x04F2,0x04F3},{0x04F2,0x04F3}, /* 04F2 */ + {0x04F4,0x04F5},{0x04F4,0x04F5}, /* 04F4 */ + {0x04F6,0x04F7},{0x04F6,0x04F7}, /* 04F6 */ + {0x04F8,0x04F9},{0x04F8,0x04F9}, /* 04F8 */ + {0x04FA,0x04FB},{0x04FA,0x04FB}, /* 04FA */ + {0x04FC,0x04FD},{0x04FC,0x04FD}, /* 04FC */ + {0x04FE,0x04FF},{0x04FE,0x04FF} /* 04FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page05[256]={ + {0x0500,0x0501},{0x0500,0x0501}, /* 0500 */ + {0x0502,0x0503},{0x0502,0x0503}, /* 0502 */ + {0x0504,0x0505},{0x0504,0x0505}, /* 0504 */ + {0x0506,0x0507},{0x0506,0x0507}, /* 0506 */ + {0x0508,0x0509},{0x0508,0x0509}, /* 0508 */ + {0x050A,0x050B},{0x050A,0x050B}, /* 050A */ + {0x050C,0x050D},{0x050C,0x050D}, /* 050C */ + {0x050E,0x050F},{0x050E,0x050F}, /* 050E */ + {0x0510,0x0511},{0x0510,0x0511}, /* 0510 */ + {0x0512,0x0513},{0x0512,0x0513}, /* 0512 */ + {0x0514,0x0515},{0x0514,0x0515}, /* 0514 */ + {0x0516,0x0517},{0x0516,0x0517}, /* 0516 */ + {0x0518,0x0519},{0x0518,0x0519}, /* 0518 */ + {0x051A,0x051B},{0x051A,0x051B}, /* 051A */ + {0x051C,0x051D},{0x051C,0x051D}, /* 051C */ + {0x051E,0x051F},{0x051E,0x051F}, /* 051E */ + {0x0520,0x0521},{0x0520,0x0521}, /* 0520 */ + {0x0522,0x0523},{0x0522,0x0523}, /* 0522 */ + {0x0524,0x0525},{0x0524,0x0525}, /* 0524 */ + {0x0526,0x0527},{0x0526,0x0527}, /* 0526 */ + {0x0528,0x0529},{0x0528,0x0529}, /* 0528 */ + {0x052A,0x052B},{0x052A,0x052B}, /* 052A */ + {0x052C,0x052D},{0x052C,0x052D}, /* 052C */ + {0x052E,0x052F},{0x052E,0x052F}, /* 052E */ + {0x0530,0x0530},{0x0531,0x0561}, /* 0530 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0532 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0534 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0536 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0538 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 053A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 053C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 053E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0540 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0542 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0544 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0546 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0548 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 054A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 054C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 054E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0550 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0552 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0554 */ + {0x0556,0x0586},{0x0557,0x0557}, /* 0556 */ + {0x0558,0x0558},{0x0559,0x0559}, /* 0558 */ + {0x055A,0x055A},{0x055B,0x055B}, /* 055A */ + {0x055C,0x055C},{0x055D,0x055D}, /* 055C */ + {0x055E,0x055E},{0x055F,0x055F}, /* 055E */ + {0x0560,0x0560},{0x0531,0x0561}, /* 0560 */ + {0x0532,0x0562},{0x0533,0x0563}, /* 0562 */ + {0x0534,0x0564},{0x0535,0x0565}, /* 0564 */ + {0x0536,0x0566},{0x0537,0x0567}, /* 0566 */ + {0x0538,0x0568},{0x0539,0x0569}, /* 0568 */ + {0x053A,0x056A},{0x053B,0x056B}, /* 056A */ + {0x053C,0x056C},{0x053D,0x056D}, /* 056C */ + {0x053E,0x056E},{0x053F,0x056F}, /* 056E */ + {0x0540,0x0570},{0x0541,0x0571}, /* 0570 */ + {0x0542,0x0572},{0x0543,0x0573}, /* 0572 */ + {0x0544,0x0574},{0x0545,0x0575}, /* 0574 */ + {0x0546,0x0576},{0x0547,0x0577}, /* 0576 */ + {0x0548,0x0578},{0x0549,0x0579}, /* 0578 */ + {0x054A,0x057A},{0x054B,0x057B}, /* 057A */ + {0x054C,0x057C},{0x054D,0x057D}, /* 057C */ + {0x054E,0x057E},{0x054F,0x057F}, /* 057E */ + {0x0550,0x0580},{0x0551,0x0581}, /* 0580 */ + {0x0552,0x0582},{0x0553,0x0583}, /* 0582 */ + {0x0554,0x0584},{0x0555,0x0585}, /* 0584 */ + {0x0556,0x0586},{0x0587,0x0587}, /* 0586 */ + {0x0588,0x0588},{0x0589,0x0589}, /* 0588 */ + {0x058A,0x058A},{0x058B,0x058B}, /* 058A */ + {0x058C,0x058C},{0x058D,0x058D}, /* 058C */ + {0x058E,0x058E},{0x058F,0x058F}, /* 058E */ + {0x0590,0x0590},{0x0591,0x0591}, /* 0590 */ + {0x0592,0x0592},{0x0593,0x0593}, /* 0592 */ + {0x0594,0x0594},{0x0595,0x0595}, /* 0594 */ + {0x0596,0x0596},{0x0597,0x0597}, /* 0596 */ + {0x0598,0x0598},{0x0599,0x0599}, /* 0598 */ + {0x059A,0x059A},{0x059B,0x059B}, /* 059A */ + {0x059C,0x059C},{0x059D,0x059D}, /* 059C */ + {0x059E,0x059E},{0x059F,0x059F}, /* 059E */ + {0x05A0,0x05A0},{0x05A1,0x05A1}, /* 05A0 */ + {0x05A2,0x05A2},{0x05A3,0x05A3}, /* 05A2 */ + {0x05A4,0x05A4},{0x05A5,0x05A5}, /* 05A4 */ + {0x05A6,0x05A6},{0x05A7,0x05A7}, /* 05A6 */ + {0x05A8,0x05A8},{0x05A9,0x05A9}, /* 05A8 */ + {0x05AA,0x05AA},{0x05AB,0x05AB}, /* 05AA */ + {0x05AC,0x05AC},{0x05AD,0x05AD}, /* 05AC */ + {0x05AE,0x05AE},{0x05AF,0x05AF}, /* 05AE */ + {0x05B0,0x05B0},{0x05B1,0x05B1}, /* 05B0 */ + {0x05B2,0x05B2},{0x05B3,0x05B3}, /* 05B2 */ + {0x05B4,0x05B4},{0x05B5,0x05B5}, /* 05B4 */ + {0x05B6,0x05B6},{0x05B7,0x05B7}, /* 05B6 */ + {0x05B8,0x05B8},{0x05B9,0x05B9}, /* 05B8 */ + {0x05BA,0x05BA},{0x05BB,0x05BB}, /* 05BA */ + {0x05BC,0x05BC},{0x05BD,0x05BD}, /* 05BC */ + {0x05BE,0x05BE},{0x05BF,0x05BF}, /* 05BE */ + {0x05C0,0x05C0},{0x05C1,0x05C1}, /* 05C0 */ + {0x05C2,0x05C2},{0x05C3,0x05C3}, /* 05C2 */ + {0x05C4,0x05C4},{0x05C5,0x05C5}, /* 05C4 */ + {0x05C6,0x05C6},{0x05C7,0x05C7}, /* 05C6 */ + {0x05C8,0x05C8},{0x05C9,0x05C9}, /* 05C8 */ + {0x05CA,0x05CA},{0x05CB,0x05CB}, /* 05CA */ + {0x05CC,0x05CC},{0x05CD,0x05CD}, /* 05CC */ + {0x05CE,0x05CE},{0x05CF,0x05CF}, /* 05CE */ + {0x05D0,0x05D0},{0x05D1,0x05D1}, /* 05D0 */ + {0x05D2,0x05D2},{0x05D3,0x05D3}, /* 05D2 */ + {0x05D4,0x05D4},{0x05D5,0x05D5}, /* 05D4 */ + {0x05D6,0x05D6},{0x05D7,0x05D7}, /* 05D6 */ + {0x05D8,0x05D8},{0x05D9,0x05D9}, /* 05D8 */ + {0x05DA,0x05DA},{0x05DB,0x05DB}, /* 05DA */ + {0x05DC,0x05DC},{0x05DD,0x05DD}, /* 05DC */ + {0x05DE,0x05DE},{0x05DF,0x05DF}, /* 05DE */ + {0x05E0,0x05E0},{0x05E1,0x05E1}, /* 05E0 */ + {0x05E2,0x05E2},{0x05E3,0x05E3}, /* 05E2 */ + {0x05E4,0x05E4},{0x05E5,0x05E5}, /* 05E4 */ + {0x05E6,0x05E6},{0x05E7,0x05E7}, /* 05E6 */ + {0x05E8,0x05E8},{0x05E9,0x05E9}, /* 05E8 */ + {0x05EA,0x05EA},{0x05EB,0x05EB}, /* 05EA */ + {0x05EC,0x05EC},{0x05ED,0x05ED}, /* 05EC */ + {0x05EE,0x05EE},{0x05EF,0x05EF}, /* 05EE */ + {0x05F0,0x05F0},{0x05F1,0x05F1}, /* 05F0 */ + {0x05F2,0x05F2},{0x05F3,0x05F3}, /* 05F2 */ + {0x05F4,0x05F4},{0x05F5,0x05F5}, /* 05F4 */ + {0x05F6,0x05F6},{0x05F7,0x05F7}, /* 05F6 */ + {0x05F8,0x05F8},{0x05F9,0x05F9}, /* 05F8 */ + {0x05FA,0x05FA},{0x05FB,0x05FB}, /* 05FA */ + {0x05FC,0x05FC},{0x05FD,0x05FD}, /* 05FC */ + {0x05FE,0x05FE},{0x05FF,0x05FF} /* 05FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page06[256]={ /* This page is dummy */ + {0x0600,0x0600},{0x0601,0x0601}, /* 0600 */ + {0x0602,0x0602},{0x0603,0x0603}, /* 0602 */ + {0x0604,0x0604},{0x0605,0x0605}, /* 0604 */ + {0x0606,0x0606},{0x0607,0x0607}, /* 0606 */ + {0x0608,0x0608},{0x0609,0x0609}, /* 0608 */ + {0x060A,0x060A},{0x060B,0x060B}, /* 060A */ + {0x060C,0x060C},{0x060D,0x060D}, /* 060C */ + {0x060E,0x060E},{0x060F,0x060F}, /* 060E */ + {0x0610,0x0610},{0x0611,0x0611}, /* 0610 */ + {0x0612,0x0612},{0x0613,0x0613}, /* 0612 */ + {0x0614,0x0614},{0x0615,0x0615}, /* 0614 */ + {0x0616,0x0616},{0x0617,0x0617}, /* 0616 */ + {0x0618,0x0618},{0x0619,0x0619}, /* 0618 */ + {0x061A,0x061A},{0x061B,0x061B}, /* 061A */ + {0x061C,0x061C},{0x061D,0x061D}, /* 061C */ + {0x061E,0x061E},{0x061F,0x061F}, /* 061E */ + {0x0620,0x0620},{0x0621,0x0621}, /* 0620 */ + {0x0622,0x0622},{0x0623,0x0623}, /* 0622 */ + {0x0624,0x0624},{0x0625,0x0625}, /* 0624 */ + {0x0626,0x0626},{0x0627,0x0627}, /* 0626 */ + {0x0628,0x0628},{0x0629,0x0629}, /* 0628 */ + {0x062A,0x062A},{0x062B,0x062B}, /* 062A */ + {0x062C,0x062C},{0x062D,0x062D}, /* 062C */ + {0x062E,0x062E},{0x062F,0x062F}, /* 062E */ + {0x0630,0x0630},{0x0631,0x0631}, /* 0630 */ + {0x0632,0x0632},{0x0633,0x0633}, /* 0632 */ + {0x0634,0x0634},{0x0635,0x0635}, /* 0634 */ + {0x0636,0x0636},{0x0637,0x0637}, /* 0636 */ + {0x0638,0x0638},{0x0639,0x0639}, /* 0638 */ + {0x063A,0x063A},{0x063B,0x063B}, /* 063A */ + {0x063C,0x063C},{0x063D,0x063D}, /* 063C */ + {0x063E,0x063E},{0x063F,0x063F}, /* 063E */ + {0x0640,0x0640},{0x0641,0x0641}, /* 0640 */ + {0x0642,0x0642},{0x0643,0x0643}, /* 0642 */ + {0x0644,0x0644},{0x0645,0x0645}, /* 0644 */ + {0x0646,0x0646},{0x0647,0x0647}, /* 0646 */ + {0x0648,0x0648},{0x0649,0x0649}, /* 0648 */ + {0x064A,0x064A},{0x064B,0x064B}, /* 064A */ + {0x064C,0x064C},{0x064D,0x064D}, /* 064C */ + {0x064E,0x064E},{0x064F,0x064F}, /* 064E */ + {0x0650,0x0650},{0x0651,0x0651}, /* 0650 */ + {0x0652,0x0652},{0x0653,0x0653}, /* 0652 */ + {0x0654,0x0654},{0x0655,0x0655}, /* 0654 */ + {0x0656,0x0656},{0x0657,0x0657}, /* 0656 */ + {0x0658,0x0658},{0x0659,0x0659}, /* 0658 */ + {0x065A,0x065A},{0x065B,0x065B}, /* 065A */ + {0x065C,0x065C},{0x065D,0x065D}, /* 065C */ + {0x065E,0x065E},{0x065F,0x065F}, /* 065E */ + {0x0660,0x0660},{0x0661,0x0661}, /* 0660 */ + {0x0662,0x0662},{0x0663,0x0663}, /* 0662 */ + {0x0664,0x0664},{0x0665,0x0665}, /* 0664 */ + {0x0666,0x0666},{0x0667,0x0667}, /* 0666 */ + {0x0668,0x0668},{0x0669,0x0669}, /* 0668 */ + {0x066A,0x066A},{0x066B,0x066B}, /* 066A */ + {0x066C,0x066C},{0x066D,0x066D}, /* 066C */ + {0x066E,0x066E},{0x066F,0x066F}, /* 066E */ + {0x0670,0x0670},{0x0671,0x0671}, /* 0670 */ + {0x0672,0x0672},{0x0673,0x0673}, /* 0672 */ + {0x0674,0x0674},{0x0675,0x0675}, /* 0674 */ + {0x0676,0x0676},{0x0677,0x0677}, /* 0676 */ + {0x0678,0x0678},{0x0679,0x0679}, /* 0678 */ + {0x067A,0x067A},{0x067B,0x067B}, /* 067A */ + {0x067C,0x067C},{0x067D,0x067D}, /* 067C */ + {0x067E,0x067E},{0x067F,0x067F}, /* 067E */ + {0x0680,0x0680},{0x0681,0x0681}, /* 0680 */ + {0x0682,0x0682},{0x0683,0x0683}, /* 0682 */ + {0x0684,0x0684},{0x0685,0x0685}, /* 0684 */ + {0x0686,0x0686},{0x0687,0x0687}, /* 0686 */ + {0x0688,0x0688},{0x0689,0x0689}, /* 0688 */ + {0x068A,0x068A},{0x068B,0x068B}, /* 068A */ + {0x068C,0x068C},{0x068D,0x068D}, /* 068C */ + {0x068E,0x068E},{0x068F,0x068F}, /* 068E */ + {0x0690,0x0690},{0x0691,0x0691}, /* 0690 */ + {0x0692,0x0692},{0x0693,0x0693}, /* 0692 */ + {0x0694,0x0694},{0x0695,0x0695}, /* 0694 */ + {0x0696,0x0696},{0x0697,0x0697}, /* 0696 */ + {0x0698,0x0698},{0x0699,0x0699}, /* 0698 */ + {0x069A,0x069A},{0x069B,0x069B}, /* 069A */ + {0x069C,0x069C},{0x069D,0x069D}, /* 069C */ + {0x069E,0x069E},{0x069F,0x069F}, /* 069E */ + {0x06A0,0x06A0},{0x06A1,0x06A1}, /* 06A0 */ + {0x06A2,0x06A2},{0x06A3,0x06A3}, /* 06A2 */ + {0x06A4,0x06A4},{0x06A5,0x06A5}, /* 06A4 */ + {0x06A6,0x06A6},{0x06A7,0x06A7}, /* 06A6 */ + {0x06A8,0x06A8},{0x06A9,0x06A9}, /* 06A8 */ + {0x06AA,0x06AA},{0x06AB,0x06AB}, /* 06AA */ + {0x06AC,0x06AC},{0x06AD,0x06AD}, /* 06AC */ + {0x06AE,0x06AE},{0x06AF,0x06AF}, /* 06AE */ + {0x06B0,0x06B0},{0x06B1,0x06B1}, /* 06B0 */ + {0x06B2,0x06B2},{0x06B3,0x06B3}, /* 06B2 */ + {0x06B4,0x06B4},{0x06B5,0x06B5}, /* 06B4 */ + {0x06B6,0x06B6},{0x06B7,0x06B7}, /* 06B6 */ + {0x06B8,0x06B8},{0x06B9,0x06B9}, /* 06B8 */ + {0x06BA,0x06BA},{0x06BB,0x06BB}, /* 06BA */ + {0x06BC,0x06BC},{0x06BD,0x06BD}, /* 06BC */ + {0x06BE,0x06BE},{0x06BF,0x06BF}, /* 06BE */ + {0x06C0,0x06C0},{0x06C1,0x06C1}, /* 06C0 */ + {0x06C2,0x06C2},{0x06C3,0x06C3}, /* 06C2 */ + {0x06C4,0x06C4},{0x06C5,0x06C5}, /* 06C4 */ + {0x06C6,0x06C6},{0x06C7,0x06C7}, /* 06C6 */ + {0x06C8,0x06C8},{0x06C9,0x06C9}, /* 06C8 */ + {0x06CA,0x06CA},{0x06CB,0x06CB}, /* 06CA */ + {0x06CC,0x06CC},{0x06CD,0x06CD}, /* 06CC */ + {0x06CE,0x06CE},{0x06CF,0x06CF}, /* 06CE */ + {0x06D0,0x06D0},{0x06D1,0x06D1}, /* 06D0 */ + {0x06D2,0x06D2},{0x06D3,0x06D3}, /* 06D2 */ + {0x06D4,0x06D4},{0x06D5,0x06D5}, /* 06D4 */ + {0x06D6,0x06D6},{0x06D7,0x06D7}, /* 06D6 */ + {0x06D8,0x06D8},{0x06D9,0x06D9}, /* 06D8 */ + {0x06DA,0x06DA},{0x06DB,0x06DB}, /* 06DA */ + {0x06DC,0x06DC},{0x06DD,0x06DD}, /* 06DC */ + {0x06DE,0x06DE},{0x06DF,0x06DF}, /* 06DE */ + {0x06E0,0x06E0},{0x06E1,0x06E1}, /* 06E0 */ + {0x06E2,0x06E2},{0x06E3,0x06E3}, /* 06E2 */ + {0x06E4,0x06E4},{0x06E5,0x06E5}, /* 06E4 */ + {0x06E6,0x06E6},{0x06E7,0x06E7}, /* 06E6 */ + {0x06E8,0x06E8},{0x06E9,0x06E9}, /* 06E8 */ + {0x06EA,0x06EA},{0x06EB,0x06EB}, /* 06EA */ + {0x06EC,0x06EC},{0x06ED,0x06ED}, /* 06EC */ + {0x06EE,0x06EE},{0x06EF,0x06EF}, /* 06EE */ + {0x06F0,0x06F0},{0x06F1,0x06F1}, /* 06F0 */ + {0x06F2,0x06F2},{0x06F3,0x06F3}, /* 06F2 */ + {0x06F4,0x06F4},{0x06F5,0x06F5}, /* 06F4 */ + {0x06F6,0x06F6},{0x06F7,0x06F7}, /* 06F6 */ + {0x06F8,0x06F8},{0x06F9,0x06F9}, /* 06F8 */ + {0x06FA,0x06FA},{0x06FB,0x06FB}, /* 06FA */ + {0x06FC,0x06FC},{0x06FD,0x06FD}, /* 06FC */ + {0x06FE,0x06FE},{0x06FF,0x06FF} /* 06FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page07[256]={ /* This page is dummy */ + {0x0700,0x0700},{0x0701,0x0701}, /* 0700 */ + {0x0702,0x0702},{0x0703,0x0703}, /* 0702 */ + {0x0704,0x0704},{0x0705,0x0705}, /* 0704 */ + {0x0706,0x0706},{0x0707,0x0707}, /* 0706 */ + {0x0708,0x0708},{0x0709,0x0709}, /* 0708 */ + {0x070A,0x070A},{0x070B,0x070B}, /* 070A */ + {0x070C,0x070C},{0x070D,0x070D}, /* 070C */ + {0x070E,0x070E},{0x070F,0x070F}, /* 070E */ + {0x0710,0x0710},{0x0711,0x0711}, /* 0710 */ + {0x0712,0x0712},{0x0713,0x0713}, /* 0712 */ + {0x0714,0x0714},{0x0715,0x0715}, /* 0714 */ + {0x0716,0x0716},{0x0717,0x0717}, /* 0716 */ + {0x0718,0x0718},{0x0719,0x0719}, /* 0718 */ + {0x071A,0x071A},{0x071B,0x071B}, /* 071A */ + {0x071C,0x071C},{0x071D,0x071D}, /* 071C */ + {0x071E,0x071E},{0x071F,0x071F}, /* 071E */ + {0x0720,0x0720},{0x0721,0x0721}, /* 0720 */ + {0x0722,0x0722},{0x0723,0x0723}, /* 0722 */ + {0x0724,0x0724},{0x0725,0x0725}, /* 0724 */ + {0x0726,0x0726},{0x0727,0x0727}, /* 0726 */ + {0x0728,0x0728},{0x0729,0x0729}, /* 0728 */ + {0x072A,0x072A},{0x072B,0x072B}, /* 072A */ + {0x072C,0x072C},{0x072D,0x072D}, /* 072C */ + {0x072E,0x072E},{0x072F,0x072F}, /* 072E */ + {0x0730,0x0730},{0x0731,0x0731}, /* 0730 */ + {0x0732,0x0732},{0x0733,0x0733}, /* 0732 */ + {0x0734,0x0734},{0x0735,0x0735}, /* 0734 */ + {0x0736,0x0736},{0x0737,0x0737}, /* 0736 */ + {0x0738,0x0738},{0x0739,0x0739}, /* 0738 */ + {0x073A,0x073A},{0x073B,0x073B}, /* 073A */ + {0x073C,0x073C},{0x073D,0x073D}, /* 073C */ + {0x073E,0x073E},{0x073F,0x073F}, /* 073E */ + {0x0740,0x0740},{0x0741,0x0741}, /* 0740 */ + {0x0742,0x0742},{0x0743,0x0743}, /* 0742 */ + {0x0744,0x0744},{0x0745,0x0745}, /* 0744 */ + {0x0746,0x0746},{0x0747,0x0747}, /* 0746 */ + {0x0748,0x0748},{0x0749,0x0749}, /* 0748 */ + {0x074A,0x074A},{0x074B,0x074B}, /* 074A */ + {0x074C,0x074C},{0x074D,0x074D}, /* 074C */ + {0x074E,0x074E},{0x074F,0x074F}, /* 074E */ + {0x0750,0x0750},{0x0751,0x0751}, /* 0750 */ + {0x0752,0x0752},{0x0753,0x0753}, /* 0752 */ + {0x0754,0x0754},{0x0755,0x0755}, /* 0754 */ + {0x0756,0x0756},{0x0757,0x0757}, /* 0756 */ + {0x0758,0x0758},{0x0759,0x0759}, /* 0758 */ + {0x075A,0x075A},{0x075B,0x075B}, /* 075A */ + {0x075C,0x075C},{0x075D,0x075D}, /* 075C */ + {0x075E,0x075E},{0x075F,0x075F}, /* 075E */ + {0x0760,0x0760},{0x0761,0x0761}, /* 0760 */ + {0x0762,0x0762},{0x0763,0x0763}, /* 0762 */ + {0x0764,0x0764},{0x0765,0x0765}, /* 0764 */ + {0x0766,0x0766},{0x0767,0x0767}, /* 0766 */ + {0x0768,0x0768},{0x0769,0x0769}, /* 0768 */ + {0x076A,0x076A},{0x076B,0x076B}, /* 076A */ + {0x076C,0x076C},{0x076D,0x076D}, /* 076C */ + {0x076E,0x076E},{0x076F,0x076F}, /* 076E */ + {0x0770,0x0770},{0x0771,0x0771}, /* 0770 */ + {0x0772,0x0772},{0x0773,0x0773}, /* 0772 */ + {0x0774,0x0774},{0x0775,0x0775}, /* 0774 */ + {0x0776,0x0776},{0x0777,0x0777}, /* 0776 */ + {0x0778,0x0778},{0x0779,0x0779}, /* 0778 */ + {0x077A,0x077A},{0x077B,0x077B}, /* 077A */ + {0x077C,0x077C},{0x077D,0x077D}, /* 077C */ + {0x077E,0x077E},{0x077F,0x077F}, /* 077E */ + {0x0780,0x0780},{0x0781,0x0781}, /* 0780 */ + {0x0782,0x0782},{0x0783,0x0783}, /* 0782 */ + {0x0784,0x0784},{0x0785,0x0785}, /* 0784 */ + {0x0786,0x0786},{0x0787,0x0787}, /* 0786 */ + {0x0788,0x0788},{0x0789,0x0789}, /* 0788 */ + {0x078A,0x078A},{0x078B,0x078B}, /* 078A */ + {0x078C,0x078C},{0x078D,0x078D}, /* 078C */ + {0x078E,0x078E},{0x078F,0x078F}, /* 078E */ + {0x0790,0x0790},{0x0791,0x0791}, /* 0790 */ + {0x0792,0x0792},{0x0793,0x0793}, /* 0792 */ + {0x0794,0x0794},{0x0795,0x0795}, /* 0794 */ + {0x0796,0x0796},{0x0797,0x0797}, /* 0796 */ + {0x0798,0x0798},{0x0799,0x0799}, /* 0798 */ + {0x079A,0x079A},{0x079B,0x079B}, /* 079A */ + {0x079C,0x079C},{0x079D,0x079D}, /* 079C */ + {0x079E,0x079E},{0x079F,0x079F}, /* 079E */ + {0x07A0,0x07A0},{0x07A1,0x07A1}, /* 07A0 */ + {0x07A2,0x07A2},{0x07A3,0x07A3}, /* 07A2 */ + {0x07A4,0x07A4},{0x07A5,0x07A5}, /* 07A4 */ + {0x07A6,0x07A6},{0x07A7,0x07A7}, /* 07A6 */ + {0x07A8,0x07A8},{0x07A9,0x07A9}, /* 07A8 */ + {0x07AA,0x07AA},{0x07AB,0x07AB}, /* 07AA */ + {0x07AC,0x07AC},{0x07AD,0x07AD}, /* 07AC */ + {0x07AE,0x07AE},{0x07AF,0x07AF}, /* 07AE */ + {0x07B0,0x07B0},{0x07B1,0x07B1}, /* 07B0 */ + {0x07B2,0x07B2},{0x07B3,0x07B3}, /* 07B2 */ + {0x07B4,0x07B4},{0x07B5,0x07B5}, /* 07B4 */ + {0x07B6,0x07B6},{0x07B7,0x07B7}, /* 07B6 */ + {0x07B8,0x07B8},{0x07B9,0x07B9}, /* 07B8 */ + {0x07BA,0x07BA},{0x07BB,0x07BB}, /* 07BA */ + {0x07BC,0x07BC},{0x07BD,0x07BD}, /* 07BC */ + {0x07BE,0x07BE},{0x07BF,0x07BF}, /* 07BE */ + {0x07C0,0x07C0},{0x07C1,0x07C1}, /* 07C0 */ + {0x07C2,0x07C2},{0x07C3,0x07C3}, /* 07C2 */ + {0x07C4,0x07C4},{0x07C5,0x07C5}, /* 07C4 */ + {0x07C6,0x07C6},{0x07C7,0x07C7}, /* 07C6 */ + {0x07C8,0x07C8},{0x07C9,0x07C9}, /* 07C8 */ + {0x07CA,0x07CA},{0x07CB,0x07CB}, /* 07CA */ + {0x07CC,0x07CC},{0x07CD,0x07CD}, /* 07CC */ + {0x07CE,0x07CE},{0x07CF,0x07CF}, /* 07CE */ + {0x07D0,0x07D0},{0x07D1,0x07D1}, /* 07D0 */ + {0x07D2,0x07D2},{0x07D3,0x07D3}, /* 07D2 */ + {0x07D4,0x07D4},{0x07D5,0x07D5}, /* 07D4 */ + {0x07D6,0x07D6},{0x07D7,0x07D7}, /* 07D6 */ + {0x07D8,0x07D8},{0x07D9,0x07D9}, /* 07D8 */ + {0x07DA,0x07DA},{0x07DB,0x07DB}, /* 07DA */ + {0x07DC,0x07DC},{0x07DD,0x07DD}, /* 07DC */ + {0x07DE,0x07DE},{0x07DF,0x07DF}, /* 07DE */ + {0x07E0,0x07E0},{0x07E1,0x07E1}, /* 07E0 */ + {0x07E2,0x07E2},{0x07E3,0x07E3}, /* 07E2 */ + {0x07E4,0x07E4},{0x07E5,0x07E5}, /* 07E4 */ + {0x07E6,0x07E6},{0x07E7,0x07E7}, /* 07E6 */ + {0x07E8,0x07E8},{0x07E9,0x07E9}, /* 07E8 */ + {0x07EA,0x07EA},{0x07EB,0x07EB}, /* 07EA */ + {0x07EC,0x07EC},{0x07ED,0x07ED}, /* 07EC */ + {0x07EE,0x07EE},{0x07EF,0x07EF}, /* 07EE */ + {0x07F0,0x07F0},{0x07F1,0x07F1}, /* 07F0 */ + {0x07F2,0x07F2},{0x07F3,0x07F3}, /* 07F2 */ + {0x07F4,0x07F4},{0x07F5,0x07F5}, /* 07F4 */ + {0x07F6,0x07F6},{0x07F7,0x07F7}, /* 07F6 */ + {0x07F8,0x07F8},{0x07F9,0x07F9}, /* 07F8 */ + {0x07FA,0x07FA},{0x07FB,0x07FB}, /* 07FA */ + {0x07FC,0x07FC},{0x07FD,0x07FD}, /* 07FC */ + {0x07FE,0x07FE},{0x07FF,0x07FF} /* 07FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page10[256]={ + {0x1000,0x1000},{0x1001,0x1001}, /* 1000 */ + {0x1002,0x1002},{0x1003,0x1003}, /* 1002 */ + {0x1004,0x1004},{0x1005,0x1005}, /* 1004 */ + {0x1006,0x1006},{0x1007,0x1007}, /* 1006 */ + {0x1008,0x1008},{0x1009,0x1009}, /* 1008 */ + {0x100A,0x100A},{0x100B,0x100B}, /* 100A */ + {0x100C,0x100C},{0x100D,0x100D}, /* 100C */ + {0x100E,0x100E},{0x100F,0x100F}, /* 100E */ + {0x1010,0x1010},{0x1011,0x1011}, /* 1010 */ + {0x1012,0x1012},{0x1013,0x1013}, /* 1012 */ + {0x1014,0x1014},{0x1015,0x1015}, /* 1014 */ + {0x1016,0x1016},{0x1017,0x1017}, /* 1016 */ + {0x1018,0x1018},{0x1019,0x1019}, /* 1018 */ + {0x101A,0x101A},{0x101B,0x101B}, /* 101A */ + {0x101C,0x101C},{0x101D,0x101D}, /* 101C */ + {0x101E,0x101E},{0x101F,0x101F}, /* 101E */ + {0x1020,0x1020},{0x1021,0x1021}, /* 1020 */ + {0x1022,0x1022},{0x1023,0x1023}, /* 1022 */ + {0x1024,0x1024},{0x1025,0x1025}, /* 1024 */ + {0x1026,0x1026},{0x1027,0x1027}, /* 1026 */ + {0x1028,0x1028},{0x1029,0x1029}, /* 1028 */ + {0x102A,0x102A},{0x102B,0x102B}, /* 102A */ + {0x102C,0x102C},{0x102D,0x102D}, /* 102C */ + {0x102E,0x102E},{0x102F,0x102F}, /* 102E */ + {0x1030,0x1030},{0x1031,0x1031}, /* 1030 */ + {0x1032,0x1032},{0x1033,0x1033}, /* 1032 */ + {0x1034,0x1034},{0x1035,0x1035}, /* 1034 */ + {0x1036,0x1036},{0x1037,0x1037}, /* 1036 */ + {0x1038,0x1038},{0x1039,0x1039}, /* 1038 */ + {0x103A,0x103A},{0x103B,0x103B}, /* 103A */ + {0x103C,0x103C},{0x103D,0x103D}, /* 103C */ + {0x103E,0x103E},{0x103F,0x103F}, /* 103E */ + {0x1040,0x1040},{0x1041,0x1041}, /* 1040 */ + {0x1042,0x1042},{0x1043,0x1043}, /* 1042 */ + {0x1044,0x1044},{0x1045,0x1045}, /* 1044 */ + {0x1046,0x1046},{0x1047,0x1047}, /* 1046 */ + {0x1048,0x1048},{0x1049,0x1049}, /* 1048 */ + {0x104A,0x104A},{0x104B,0x104B}, /* 104A */ + {0x104C,0x104C},{0x104D,0x104D}, /* 104C */ + {0x104E,0x104E},{0x104F,0x104F}, /* 104E */ + {0x1050,0x1050},{0x1051,0x1051}, /* 1050 */ + {0x1052,0x1052},{0x1053,0x1053}, /* 1052 */ + {0x1054,0x1054},{0x1055,0x1055}, /* 1054 */ + {0x1056,0x1056},{0x1057,0x1057}, /* 1056 */ + {0x1058,0x1058},{0x1059,0x1059}, /* 1058 */ + {0x105A,0x105A},{0x105B,0x105B}, /* 105A */ + {0x105C,0x105C},{0x105D,0x105D}, /* 105C */ + {0x105E,0x105E},{0x105F,0x105F}, /* 105E */ + {0x1060,0x1060},{0x1061,0x1061}, /* 1060 */ + {0x1062,0x1062},{0x1063,0x1063}, /* 1062 */ + {0x1064,0x1064},{0x1065,0x1065}, /* 1064 */ + {0x1066,0x1066},{0x1067,0x1067}, /* 1066 */ + {0x1068,0x1068},{0x1069,0x1069}, /* 1068 */ + {0x106A,0x106A},{0x106B,0x106B}, /* 106A */ + {0x106C,0x106C},{0x106D,0x106D}, /* 106C */ + {0x106E,0x106E},{0x106F,0x106F}, /* 106E */ + {0x1070,0x1070},{0x1071,0x1071}, /* 1070 */ + {0x1072,0x1072},{0x1073,0x1073}, /* 1072 */ + {0x1074,0x1074},{0x1075,0x1075}, /* 1074 */ + {0x1076,0x1076},{0x1077,0x1077}, /* 1076 */ + {0x1078,0x1078},{0x1079,0x1079}, /* 1078 */ + {0x107A,0x107A},{0x107B,0x107B}, /* 107A */ + {0x107C,0x107C},{0x107D,0x107D}, /* 107C */ + {0x107E,0x107E},{0x107F,0x107F}, /* 107E */ + {0x1080,0x1080},{0x1081,0x1081}, /* 1080 */ + {0x1082,0x1082},{0x1083,0x1083}, /* 1082 */ + {0x1084,0x1084},{0x1085,0x1085}, /* 1084 */ + {0x1086,0x1086},{0x1087,0x1087}, /* 1086 */ + {0x1088,0x1088},{0x1089,0x1089}, /* 1088 */ + {0x108A,0x108A},{0x108B,0x108B}, /* 108A */ + {0x108C,0x108C},{0x108D,0x108D}, /* 108C */ + {0x108E,0x108E},{0x108F,0x108F}, /* 108E */ + {0x1090,0x1090},{0x1091,0x1091}, /* 1090 */ + {0x1092,0x1092},{0x1093,0x1093}, /* 1092 */ + {0x1094,0x1094},{0x1095,0x1095}, /* 1094 */ + {0x1096,0x1096},{0x1097,0x1097}, /* 1096 */ + {0x1098,0x1098},{0x1099,0x1099}, /* 1098 */ + {0x109A,0x109A},{0x109B,0x109B}, /* 109A */ + {0x109C,0x109C},{0x109D,0x109D}, /* 109C */ + {0x109E,0x109E},{0x109F,0x109F}, /* 109E */ + {0x10A0,0x2D00},{0x10A1,0x2D01}, /* 10A0 */ + {0x10A2,0x2D02},{0x10A3,0x2D03}, /* 10A2 */ + {0x10A4,0x2D04},{0x10A5,0x2D05}, /* 10A4 */ + {0x10A6,0x2D06},{0x10A7,0x2D07}, /* 10A6 */ + {0x10A8,0x2D08},{0x10A9,0x2D09}, /* 10A8 */ + {0x10AA,0x2D0A},{0x10AB,0x2D0B}, /* 10AA */ + {0x10AC,0x2D0C},{0x10AD,0x2D0D}, /* 10AC */ + {0x10AE,0x2D0E},{0x10AF,0x2D0F}, /* 10AE */ + {0x10B0,0x2D10},{0x10B1,0x2D11}, /* 10B0 */ + {0x10B2,0x2D12},{0x10B3,0x2D13}, /* 10B2 */ + {0x10B4,0x2D14},{0x10B5,0x2D15}, /* 10B4 */ + {0x10B6,0x2D16},{0x10B7,0x2D17}, /* 10B6 */ + {0x10B8,0x2D18},{0x10B9,0x2D19}, /* 10B8 */ + {0x10BA,0x2D1A},{0x10BB,0x2D1B}, /* 10BA */ + {0x10BC,0x2D1C},{0x10BD,0x2D1D}, /* 10BC */ + {0x10BE,0x2D1E},{0x10BF,0x2D1F}, /* 10BE */ + {0x10C0,0x2D20},{0x10C1,0x2D21}, /* 10C0 */ + {0x10C2,0x2D22},{0x10C3,0x2D23}, /* 10C2 */ + {0x10C4,0x2D24},{0x10C5,0x2D25}, /* 10C4 */ + {0x10C6,0x10C6},{0x10C7,0x2D27}, /* 10C6 */ + {0x10C8,0x10C8},{0x10C9,0x10C9}, /* 10C8 */ + {0x10CA,0x10CA},{0x10CB,0x10CB}, /* 10CA */ + {0x10CC,0x10CC},{0x10CD,0x2D2D}, /* 10CC */ + {0x10CE,0x10CE},{0x10CF,0x10CF}, /* 10CE */ + {0x1C90,0x10D0},{0x1C91,0x10D1}, /* 10D0 */ + {0x1C92,0x10D2},{0x1C93,0x10D3}, /* 10D2 */ + {0x1C94,0x10D4},{0x1C95,0x10D5}, /* 10D4 */ + {0x1C96,0x10D6},{0x1C97,0x10D7}, /* 10D6 */ + {0x1C98,0x10D8},{0x1C99,0x10D9}, /* 10D8 */ + {0x1C9A,0x10DA},{0x1C9B,0x10DB}, /* 10DA */ + {0x1C9C,0x10DC},{0x1C9D,0x10DD}, /* 10DC */ + {0x1C9E,0x10DE},{0x1C9F,0x10DF}, /* 10DE */ + {0x1CA0,0x10E0},{0x1CA1,0x10E1}, /* 10E0 */ + {0x1CA2,0x10E2},{0x1CA3,0x10E3}, /* 10E2 */ + {0x1CA4,0x10E4},{0x1CA5,0x10E5}, /* 10E4 */ + {0x1CA6,0x10E6},{0x1CA7,0x10E7}, /* 10E6 */ + {0x1CA8,0x10E8},{0x1CA9,0x10E9}, /* 10E8 */ + {0x1CAA,0x10EA},{0x1CAB,0x10EB}, /* 10EA */ + {0x1CAC,0x10EC},{0x1CAD,0x10ED}, /* 10EC */ + {0x1CAE,0x10EE},{0x1CAF,0x10EF}, /* 10EE */ + {0x1CB0,0x10F0},{0x1CB1,0x10F1}, /* 10F0 */ + {0x1CB2,0x10F2},{0x1CB3,0x10F3}, /* 10F2 */ + {0x1CB4,0x10F4},{0x1CB5,0x10F5}, /* 10F4 */ + {0x1CB6,0x10F6},{0x1CB7,0x10F7}, /* 10F6 */ + {0x1CB8,0x10F8},{0x1CB9,0x10F9}, /* 10F8 */ + {0x1CBA,0x10FA},{0x10FB,0x10FB}, /* 10FA */ + {0x10FC,0x10FC},{0x1CBD,0x10FD}, /* 10FC */ + {0x1CBE,0x10FE},{0x1CBF,0x10FF} /* 10FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page13[256]={ + {0x1300,0x1300},{0x1301,0x1301}, /* 1300 */ + {0x1302,0x1302},{0x1303,0x1303}, /* 1302 */ + {0x1304,0x1304},{0x1305,0x1305}, /* 1304 */ + {0x1306,0x1306},{0x1307,0x1307}, /* 1306 */ + {0x1308,0x1308},{0x1309,0x1309}, /* 1308 */ + {0x130A,0x130A},{0x130B,0x130B}, /* 130A */ + {0x130C,0x130C},{0x130D,0x130D}, /* 130C */ + {0x130E,0x130E},{0x130F,0x130F}, /* 130E */ + {0x1310,0x1310},{0x1311,0x1311}, /* 1310 */ + {0x1312,0x1312},{0x1313,0x1313}, /* 1312 */ + {0x1314,0x1314},{0x1315,0x1315}, /* 1314 */ + {0x1316,0x1316},{0x1317,0x1317}, /* 1316 */ + {0x1318,0x1318},{0x1319,0x1319}, /* 1318 */ + {0x131A,0x131A},{0x131B,0x131B}, /* 131A */ + {0x131C,0x131C},{0x131D,0x131D}, /* 131C */ + {0x131E,0x131E},{0x131F,0x131F}, /* 131E */ + {0x1320,0x1320},{0x1321,0x1321}, /* 1320 */ + {0x1322,0x1322},{0x1323,0x1323}, /* 1322 */ + {0x1324,0x1324},{0x1325,0x1325}, /* 1324 */ + {0x1326,0x1326},{0x1327,0x1327}, /* 1326 */ + {0x1328,0x1328},{0x1329,0x1329}, /* 1328 */ + {0x132A,0x132A},{0x132B,0x132B}, /* 132A */ + {0x132C,0x132C},{0x132D,0x132D}, /* 132C */ + {0x132E,0x132E},{0x132F,0x132F}, /* 132E */ + {0x1330,0x1330},{0x1331,0x1331}, /* 1330 */ + {0x1332,0x1332},{0x1333,0x1333}, /* 1332 */ + {0x1334,0x1334},{0x1335,0x1335}, /* 1334 */ + {0x1336,0x1336},{0x1337,0x1337}, /* 1336 */ + {0x1338,0x1338},{0x1339,0x1339}, /* 1338 */ + {0x133A,0x133A},{0x133B,0x133B}, /* 133A */ + {0x133C,0x133C},{0x133D,0x133D}, /* 133C */ + {0x133E,0x133E},{0x133F,0x133F}, /* 133E */ + {0x1340,0x1340},{0x1341,0x1341}, /* 1340 */ + {0x1342,0x1342},{0x1343,0x1343}, /* 1342 */ + {0x1344,0x1344},{0x1345,0x1345}, /* 1344 */ + {0x1346,0x1346},{0x1347,0x1347}, /* 1346 */ + {0x1348,0x1348},{0x1349,0x1349}, /* 1348 */ + {0x134A,0x134A},{0x134B,0x134B}, /* 134A */ + {0x134C,0x134C},{0x134D,0x134D}, /* 134C */ + {0x134E,0x134E},{0x134F,0x134F}, /* 134E */ + {0x1350,0x1350},{0x1351,0x1351}, /* 1350 */ + {0x1352,0x1352},{0x1353,0x1353}, /* 1352 */ + {0x1354,0x1354},{0x1355,0x1355}, /* 1354 */ + {0x1356,0x1356},{0x1357,0x1357}, /* 1356 */ + {0x1358,0x1358},{0x1359,0x1359}, /* 1358 */ + {0x135A,0x135A},{0x135B,0x135B}, /* 135A */ + {0x135C,0x135C},{0x135D,0x135D}, /* 135C */ + {0x135E,0x135E},{0x135F,0x135F}, /* 135E */ + {0x1360,0x1360},{0x1361,0x1361}, /* 1360 */ + {0x1362,0x1362},{0x1363,0x1363}, /* 1362 */ + {0x1364,0x1364},{0x1365,0x1365}, /* 1364 */ + {0x1366,0x1366},{0x1367,0x1367}, /* 1366 */ + {0x1368,0x1368},{0x1369,0x1369}, /* 1368 */ + {0x136A,0x136A},{0x136B,0x136B}, /* 136A */ + {0x136C,0x136C},{0x136D,0x136D}, /* 136C */ + {0x136E,0x136E},{0x136F,0x136F}, /* 136E */ + {0x1370,0x1370},{0x1371,0x1371}, /* 1370 */ + {0x1372,0x1372},{0x1373,0x1373}, /* 1372 */ + {0x1374,0x1374},{0x1375,0x1375}, /* 1374 */ + {0x1376,0x1376},{0x1377,0x1377}, /* 1376 */ + {0x1378,0x1378},{0x1379,0x1379}, /* 1378 */ + {0x137A,0x137A},{0x137B,0x137B}, /* 137A */ + {0x137C,0x137C},{0x137D,0x137D}, /* 137C */ + {0x137E,0x137E},{0x137F,0x137F}, /* 137E */ + {0x1380,0x1380},{0x1381,0x1381}, /* 1380 */ + {0x1382,0x1382},{0x1383,0x1383}, /* 1382 */ + {0x1384,0x1384},{0x1385,0x1385}, /* 1384 */ + {0x1386,0x1386},{0x1387,0x1387}, /* 1386 */ + {0x1388,0x1388},{0x1389,0x1389}, /* 1388 */ + {0x138A,0x138A},{0x138B,0x138B}, /* 138A */ + {0x138C,0x138C},{0x138D,0x138D}, /* 138C */ + {0x138E,0x138E},{0x138F,0x138F}, /* 138E */ + {0x1390,0x1390},{0x1391,0x1391}, /* 1390 */ + {0x1392,0x1392},{0x1393,0x1393}, /* 1392 */ + {0x1394,0x1394},{0x1395,0x1395}, /* 1394 */ + {0x1396,0x1396},{0x1397,0x1397}, /* 1396 */ + {0x1398,0x1398},{0x1399,0x1399}, /* 1398 */ + {0x139A,0x139A},{0x139B,0x139B}, /* 139A */ + {0x139C,0x139C},{0x139D,0x139D}, /* 139C */ + {0x139E,0x139E},{0x139F,0x139F}, /* 139E */ + {0x13A0,0xAB70},{0x13A1,0xAB71}, /* 13A0 */ + {0x13A2,0xAB72},{0x13A3,0xAB73}, /* 13A2 */ + {0x13A4,0xAB74},{0x13A5,0xAB75}, /* 13A4 */ + {0x13A6,0xAB76},{0x13A7,0xAB77}, /* 13A6 */ + {0x13A8,0xAB78},{0x13A9,0xAB79}, /* 13A8 */ + {0x13AA,0xAB7A},{0x13AB,0xAB7B}, /* 13AA */ + {0x13AC,0xAB7C},{0x13AD,0xAB7D}, /* 13AC */ + {0x13AE,0xAB7E},{0x13AF,0xAB7F}, /* 13AE */ + {0x13B0,0xAB80},{0x13B1,0xAB81}, /* 13B0 */ + {0x13B2,0xAB82},{0x13B3,0xAB83}, /* 13B2 */ + {0x13B4,0xAB84},{0x13B5,0xAB85}, /* 13B4 */ + {0x13B6,0xAB86},{0x13B7,0xAB87}, /* 13B6 */ + {0x13B8,0xAB88},{0x13B9,0xAB89}, /* 13B8 */ + {0x13BA,0xAB8A},{0x13BB,0xAB8B}, /* 13BA */ + {0x13BC,0xAB8C},{0x13BD,0xAB8D}, /* 13BC */ + {0x13BE,0xAB8E},{0x13BF,0xAB8F}, /* 13BE */ + {0x13C0,0xAB90},{0x13C1,0xAB91}, /* 13C0 */ + {0x13C2,0xAB92},{0x13C3,0xAB93}, /* 13C2 */ + {0x13C4,0xAB94},{0x13C5,0xAB95}, /* 13C4 */ + {0x13C6,0xAB96},{0x13C7,0xAB97}, /* 13C6 */ + {0x13C8,0xAB98},{0x13C9,0xAB99}, /* 13C8 */ + {0x13CA,0xAB9A},{0x13CB,0xAB9B}, /* 13CA */ + {0x13CC,0xAB9C},{0x13CD,0xAB9D}, /* 13CC */ + {0x13CE,0xAB9E},{0x13CF,0xAB9F}, /* 13CE */ + {0x13D0,0xABA0},{0x13D1,0xABA1}, /* 13D0 */ + {0x13D2,0xABA2},{0x13D3,0xABA3}, /* 13D2 */ + {0x13D4,0xABA4},{0x13D5,0xABA5}, /* 13D4 */ + {0x13D6,0xABA6},{0x13D7,0xABA7}, /* 13D6 */ + {0x13D8,0xABA8},{0x13D9,0xABA9}, /* 13D8 */ + {0x13DA,0xABAA},{0x13DB,0xABAB}, /* 13DA */ + {0x13DC,0xABAC},{0x13DD,0xABAD}, /* 13DC */ + {0x13DE,0xABAE},{0x13DF,0xABAF}, /* 13DE */ + {0x13E0,0xABB0},{0x13E1,0xABB1}, /* 13E0 */ + {0x13E2,0xABB2},{0x13E3,0xABB3}, /* 13E2 */ + {0x13E4,0xABB4},{0x13E5,0xABB5}, /* 13E4 */ + {0x13E6,0xABB6},{0x13E7,0xABB7}, /* 13E6 */ + {0x13E8,0xABB8},{0x13E9,0xABB9}, /* 13E8 */ + {0x13EA,0xABBA},{0x13EB,0xABBB}, /* 13EA */ + {0x13EC,0xABBC},{0x13ED,0xABBD}, /* 13EC */ + {0x13EE,0xABBE},{0x13EF,0xABBF}, /* 13EE */ + {0x13F0,0x13F8},{0x13F1,0x13F9}, /* 13F0 */ + {0x13F2,0x13FA},{0x13F3,0x13FB}, /* 13F2 */ + {0x13F4,0x13FC},{0x13F5,0x13FD}, /* 13F4 */ + {0x13F6,0x13F6},{0x13F7,0x13F7}, /* 13F6 */ + {0x13F0,0x13F8},{0x13F1,0x13F9}, /* 13F8 */ + {0x13F2,0x13FA},{0x13F3,0x13FB}, /* 13FA */ + {0x13F4,0x13FC},{0x13F5,0x13FD}, /* 13FC */ + {0x13FE,0x13FE},{0x13FF,0x13FF} /* 13FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page1C[256]={ + {0x1C00,0x1C00},{0x1C01,0x1C01}, /* 1C00 */ + {0x1C02,0x1C02},{0x1C03,0x1C03}, /* 1C02 */ + {0x1C04,0x1C04},{0x1C05,0x1C05}, /* 1C04 */ + {0x1C06,0x1C06},{0x1C07,0x1C07}, /* 1C06 */ + {0x1C08,0x1C08},{0x1C09,0x1C09}, /* 1C08 */ + {0x1C0A,0x1C0A},{0x1C0B,0x1C0B}, /* 1C0A */ + {0x1C0C,0x1C0C},{0x1C0D,0x1C0D}, /* 1C0C */ + {0x1C0E,0x1C0E},{0x1C0F,0x1C0F}, /* 1C0E */ + {0x1C10,0x1C10},{0x1C11,0x1C11}, /* 1C10 */ + {0x1C12,0x1C12},{0x1C13,0x1C13}, /* 1C12 */ + {0x1C14,0x1C14},{0x1C15,0x1C15}, /* 1C14 */ + {0x1C16,0x1C16},{0x1C17,0x1C17}, /* 1C16 */ + {0x1C18,0x1C18},{0x1C19,0x1C19}, /* 1C18 */ + {0x1C1A,0x1C1A},{0x1C1B,0x1C1B}, /* 1C1A */ + {0x1C1C,0x1C1C},{0x1C1D,0x1C1D}, /* 1C1C */ + {0x1C1E,0x1C1E},{0x1C1F,0x1C1F}, /* 1C1E */ + {0x1C20,0x1C20},{0x1C21,0x1C21}, /* 1C20 */ + {0x1C22,0x1C22},{0x1C23,0x1C23}, /* 1C22 */ + {0x1C24,0x1C24},{0x1C25,0x1C25}, /* 1C24 */ + {0x1C26,0x1C26},{0x1C27,0x1C27}, /* 1C26 */ + {0x1C28,0x1C28},{0x1C29,0x1C29}, /* 1C28 */ + {0x1C2A,0x1C2A},{0x1C2B,0x1C2B}, /* 1C2A */ + {0x1C2C,0x1C2C},{0x1C2D,0x1C2D}, /* 1C2C */ + {0x1C2E,0x1C2E},{0x1C2F,0x1C2F}, /* 1C2E */ + {0x1C30,0x1C30},{0x1C31,0x1C31}, /* 1C30 */ + {0x1C32,0x1C32},{0x1C33,0x1C33}, /* 1C32 */ + {0x1C34,0x1C34},{0x1C35,0x1C35}, /* 1C34 */ + {0x1C36,0x1C36},{0x1C37,0x1C37}, /* 1C36 */ + {0x1C38,0x1C38},{0x1C39,0x1C39}, /* 1C38 */ + {0x1C3A,0x1C3A},{0x1C3B,0x1C3B}, /* 1C3A */ + {0x1C3C,0x1C3C},{0x1C3D,0x1C3D}, /* 1C3C */ + {0x1C3E,0x1C3E},{0x1C3F,0x1C3F}, /* 1C3E */ + {0x1C40,0x1C40},{0x1C41,0x1C41}, /* 1C40 */ + {0x1C42,0x1C42},{0x1C43,0x1C43}, /* 1C42 */ + {0x1C44,0x1C44},{0x1C45,0x1C45}, /* 1C44 */ + {0x1C46,0x1C46},{0x1C47,0x1C47}, /* 1C46 */ + {0x1C48,0x1C48},{0x1C49,0x1C49}, /* 1C48 */ + {0x1C4A,0x1C4A},{0x1C4B,0x1C4B}, /* 1C4A */ + {0x1C4C,0x1C4C},{0x1C4D,0x1C4D}, /* 1C4C */ + {0x1C4E,0x1C4E},{0x1C4F,0x1C4F}, /* 1C4E */ + {0x1C50,0x1C50},{0x1C51,0x1C51}, /* 1C50 */ + {0x1C52,0x1C52},{0x1C53,0x1C53}, /* 1C52 */ + {0x1C54,0x1C54},{0x1C55,0x1C55}, /* 1C54 */ + {0x1C56,0x1C56},{0x1C57,0x1C57}, /* 1C56 */ + {0x1C58,0x1C58},{0x1C59,0x1C59}, /* 1C58 */ + {0x1C5A,0x1C5A},{0x1C5B,0x1C5B}, /* 1C5A */ + {0x1C5C,0x1C5C},{0x1C5D,0x1C5D}, /* 1C5C */ + {0x1C5E,0x1C5E},{0x1C5F,0x1C5F}, /* 1C5E */ + {0x1C60,0x1C60},{0x1C61,0x1C61}, /* 1C60 */ + {0x1C62,0x1C62},{0x1C63,0x1C63}, /* 1C62 */ + {0x1C64,0x1C64},{0x1C65,0x1C65}, /* 1C64 */ + {0x1C66,0x1C66},{0x1C67,0x1C67}, /* 1C66 */ + {0x1C68,0x1C68},{0x1C69,0x1C69}, /* 1C68 */ + {0x1C6A,0x1C6A},{0x1C6B,0x1C6B}, /* 1C6A */ + {0x1C6C,0x1C6C},{0x1C6D,0x1C6D}, /* 1C6C */ + {0x1C6E,0x1C6E},{0x1C6F,0x1C6F}, /* 1C6E */ + {0x1C70,0x1C70},{0x1C71,0x1C71}, /* 1C70 */ + {0x1C72,0x1C72},{0x1C73,0x1C73}, /* 1C72 */ + {0x1C74,0x1C74},{0x1C75,0x1C75}, /* 1C74 */ + {0x1C76,0x1C76},{0x1C77,0x1C77}, /* 1C76 */ + {0x1C78,0x1C78},{0x1C79,0x1C79}, /* 1C78 */ + {0x1C7A,0x1C7A},{0x1C7B,0x1C7B}, /* 1C7A */ + {0x1C7C,0x1C7C},{0x1C7D,0x1C7D}, /* 1C7C */ + {0x1C7E,0x1C7E},{0x1C7F,0x1C7F}, /* 1C7E */ + {0x0412,0x1C80},{0x0414,0x1C81}, /* 1C80 */ + {0x041E,0x1C82},{0x0421,0x1C83}, /* 1C82 */ + {0x0422,0x1C84},{0x0422,0x1C85}, /* 1C84 */ + {0x042A,0x1C86},{0x0462,0x1C87}, /* 1C86 */ + {0xA64A,0x1C88},{0x1C89,0x1C89}, /* 1C88 */ + {0x1C8A,0x1C8A},{0x1C8B,0x1C8B}, /* 1C8A */ + {0x1C8C,0x1C8C},{0x1C8D,0x1C8D}, /* 1C8C */ + {0x1C8E,0x1C8E},{0x1C8F,0x1C8F}, /* 1C8E */ + {0x1C90,0x10D0},{0x1C91,0x10D1}, /* 1C90 */ + {0x1C92,0x10D2},{0x1C93,0x10D3}, /* 1C92 */ + {0x1C94,0x10D4},{0x1C95,0x10D5}, /* 1C94 */ + {0x1C96,0x10D6},{0x1C97,0x10D7}, /* 1C96 */ + {0x1C98,0x10D8},{0x1C99,0x10D9}, /* 1C98 */ + {0x1C9A,0x10DA},{0x1C9B,0x10DB}, /* 1C9A */ + {0x1C9C,0x10DC},{0x1C9D,0x10DD}, /* 1C9C */ + {0x1C9E,0x10DE},{0x1C9F,0x10DF}, /* 1C9E */ + {0x1CA0,0x10E0},{0x1CA1,0x10E1}, /* 1CA0 */ + {0x1CA2,0x10E2},{0x1CA3,0x10E3}, /* 1CA2 */ + {0x1CA4,0x10E4},{0x1CA5,0x10E5}, /* 1CA4 */ + {0x1CA6,0x10E6},{0x1CA7,0x10E7}, /* 1CA6 */ + {0x1CA8,0x10E8},{0x1CA9,0x10E9}, /* 1CA8 */ + {0x1CAA,0x10EA},{0x1CAB,0x10EB}, /* 1CAA */ + {0x1CAC,0x10EC},{0x1CAD,0x10ED}, /* 1CAC */ + {0x1CAE,0x10EE},{0x1CAF,0x10EF}, /* 1CAE */ + {0x1CB0,0x10F0},{0x1CB1,0x10F1}, /* 1CB0 */ + {0x1CB2,0x10F2},{0x1CB3,0x10F3}, /* 1CB2 */ + {0x1CB4,0x10F4},{0x1CB5,0x10F5}, /* 1CB4 */ + {0x1CB6,0x10F6},{0x1CB7,0x10F7}, /* 1CB6 */ + {0x1CB8,0x10F8},{0x1CB9,0x10F9}, /* 1CB8 */ + {0x1CBA,0x10FA},{0x1CBB,0x1CBB}, /* 1CBA */ + {0x1CBC,0x1CBC},{0x1CBD,0x10FD}, /* 1CBC */ + {0x1CBE,0x10FE},{0x1CBF,0x10FF}, /* 1CBE */ + {0x1CC0,0x1CC0},{0x1CC1,0x1CC1}, /* 1CC0 */ + {0x1CC2,0x1CC2},{0x1CC3,0x1CC3}, /* 1CC2 */ + {0x1CC4,0x1CC4},{0x1CC5,0x1CC5}, /* 1CC4 */ + {0x1CC6,0x1CC6},{0x1CC7,0x1CC7}, /* 1CC6 */ + {0x1CC8,0x1CC8},{0x1CC9,0x1CC9}, /* 1CC8 */ + {0x1CCA,0x1CCA},{0x1CCB,0x1CCB}, /* 1CCA */ + {0x1CCC,0x1CCC},{0x1CCD,0x1CCD}, /* 1CCC */ + {0x1CCE,0x1CCE},{0x1CCF,0x1CCF}, /* 1CCE */ + {0x1CD0,0x1CD0},{0x1CD1,0x1CD1}, /* 1CD0 */ + {0x1CD2,0x1CD2},{0x1CD3,0x1CD3}, /* 1CD2 */ + {0x1CD4,0x1CD4},{0x1CD5,0x1CD5}, /* 1CD4 */ + {0x1CD6,0x1CD6},{0x1CD7,0x1CD7}, /* 1CD6 */ + {0x1CD8,0x1CD8},{0x1CD9,0x1CD9}, /* 1CD8 */ + {0x1CDA,0x1CDA},{0x1CDB,0x1CDB}, /* 1CDA */ + {0x1CDC,0x1CDC},{0x1CDD,0x1CDD}, /* 1CDC */ + {0x1CDE,0x1CDE},{0x1CDF,0x1CDF}, /* 1CDE */ + {0x1CE0,0x1CE0},{0x1CE1,0x1CE1}, /* 1CE0 */ + {0x1CE2,0x1CE2},{0x1CE3,0x1CE3}, /* 1CE2 */ + {0x1CE4,0x1CE4},{0x1CE5,0x1CE5}, /* 1CE4 */ + {0x1CE6,0x1CE6},{0x1CE7,0x1CE7}, /* 1CE6 */ + {0x1CE8,0x1CE8},{0x1CE9,0x1CE9}, /* 1CE8 */ + {0x1CEA,0x1CEA},{0x1CEB,0x1CEB}, /* 1CEA */ + {0x1CEC,0x1CEC},{0x1CED,0x1CED}, /* 1CEC */ + {0x1CEE,0x1CEE},{0x1CEF,0x1CEF}, /* 1CEE */ + {0x1CF0,0x1CF0},{0x1CF1,0x1CF1}, /* 1CF0 */ + {0x1CF2,0x1CF2},{0x1CF3,0x1CF3}, /* 1CF2 */ + {0x1CF4,0x1CF4},{0x1CF5,0x1CF5}, /* 1CF4 */ + {0x1CF6,0x1CF6},{0x1CF7,0x1CF7}, /* 1CF6 */ + {0x1CF8,0x1CF8},{0x1CF9,0x1CF9}, /* 1CF8 */ + {0x1CFA,0x1CFA},{0x1CFB,0x1CFB}, /* 1CFA */ + {0x1CFC,0x1CFC},{0x1CFD,0x1CFD}, /* 1CFC */ + {0x1CFE,0x1CFE},{0x1CFF,0x1CFF} /* 1CFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page1D[256]={ + {0x1D00,0x1D00},{0x1D01,0x1D01}, /* 1D00 */ + {0x1D02,0x1D02},{0x1D03,0x1D03}, /* 1D02 */ + {0x1D04,0x1D04},{0x1D05,0x1D05}, /* 1D04 */ + {0x1D06,0x1D06},{0x1D07,0x1D07}, /* 1D06 */ + {0x1D08,0x1D08},{0x1D09,0x1D09}, /* 1D08 */ + {0x1D0A,0x1D0A},{0x1D0B,0x1D0B}, /* 1D0A */ + {0x1D0C,0x1D0C},{0x1D0D,0x1D0D}, /* 1D0C */ + {0x1D0E,0x1D0E},{0x1D0F,0x1D0F}, /* 1D0E */ + {0x1D10,0x1D10},{0x1D11,0x1D11}, /* 1D10 */ + {0x1D12,0x1D12},{0x1D13,0x1D13}, /* 1D12 */ + {0x1D14,0x1D14},{0x1D15,0x1D15}, /* 1D14 */ + {0x1D16,0x1D16},{0x1D17,0x1D17}, /* 1D16 */ + {0x1D18,0x1D18},{0x1D19,0x1D19}, /* 1D18 */ + {0x1D1A,0x1D1A},{0x1D1B,0x1D1B}, /* 1D1A */ + {0x1D1C,0x1D1C},{0x1D1D,0x1D1D}, /* 1D1C */ + {0x1D1E,0x1D1E},{0x1D1F,0x1D1F}, /* 1D1E */ + {0x1D20,0x1D20},{0x1D21,0x1D21}, /* 1D20 */ + {0x1D22,0x1D22},{0x1D23,0x1D23}, /* 1D22 */ + {0x1D24,0x1D24},{0x1D25,0x1D25}, /* 1D24 */ + {0x1D26,0x1D26},{0x1D27,0x1D27}, /* 1D26 */ + {0x1D28,0x1D28},{0x1D29,0x1D29}, /* 1D28 */ + {0x1D2A,0x1D2A},{0x1D2B,0x1D2B}, /* 1D2A */ + {0x1D2C,0x1D2C},{0x1D2D,0x1D2D}, /* 1D2C */ + {0x1D2E,0x1D2E},{0x1D2F,0x1D2F}, /* 1D2E */ + {0x1D30,0x1D30},{0x1D31,0x1D31}, /* 1D30 */ + {0x1D32,0x1D32},{0x1D33,0x1D33}, /* 1D32 */ + {0x1D34,0x1D34},{0x1D35,0x1D35}, /* 1D34 */ + {0x1D36,0x1D36},{0x1D37,0x1D37}, /* 1D36 */ + {0x1D38,0x1D38},{0x1D39,0x1D39}, /* 1D38 */ + {0x1D3A,0x1D3A},{0x1D3B,0x1D3B}, /* 1D3A */ + {0x1D3C,0x1D3C},{0x1D3D,0x1D3D}, /* 1D3C */ + {0x1D3E,0x1D3E},{0x1D3F,0x1D3F}, /* 1D3E */ + {0x1D40,0x1D40},{0x1D41,0x1D41}, /* 1D40 */ + {0x1D42,0x1D42},{0x1D43,0x1D43}, /* 1D42 */ + {0x1D44,0x1D44},{0x1D45,0x1D45}, /* 1D44 */ + {0x1D46,0x1D46},{0x1D47,0x1D47}, /* 1D46 */ + {0x1D48,0x1D48},{0x1D49,0x1D49}, /* 1D48 */ + {0x1D4A,0x1D4A},{0x1D4B,0x1D4B}, /* 1D4A */ + {0x1D4C,0x1D4C},{0x1D4D,0x1D4D}, /* 1D4C */ + {0x1D4E,0x1D4E},{0x1D4F,0x1D4F}, /* 1D4E */ + {0x1D50,0x1D50},{0x1D51,0x1D51}, /* 1D50 */ + {0x1D52,0x1D52},{0x1D53,0x1D53}, /* 1D52 */ + {0x1D54,0x1D54},{0x1D55,0x1D55}, /* 1D54 */ + {0x1D56,0x1D56},{0x1D57,0x1D57}, /* 1D56 */ + {0x1D58,0x1D58},{0x1D59,0x1D59}, /* 1D58 */ + {0x1D5A,0x1D5A},{0x1D5B,0x1D5B}, /* 1D5A */ + {0x1D5C,0x1D5C},{0x1D5D,0x1D5D}, /* 1D5C */ + {0x1D5E,0x1D5E},{0x1D5F,0x1D5F}, /* 1D5E */ + {0x1D60,0x1D60},{0x1D61,0x1D61}, /* 1D60 */ + {0x1D62,0x1D62},{0x1D63,0x1D63}, /* 1D62 */ + {0x1D64,0x1D64},{0x1D65,0x1D65}, /* 1D64 */ + {0x1D66,0x1D66},{0x1D67,0x1D67}, /* 1D66 */ + {0x1D68,0x1D68},{0x1D69,0x1D69}, /* 1D68 */ + {0x1D6A,0x1D6A},{0x1D6B,0x1D6B}, /* 1D6A */ + {0x1D6C,0x1D6C},{0x1D6D,0x1D6D}, /* 1D6C */ + {0x1D6E,0x1D6E},{0x1D6F,0x1D6F}, /* 1D6E */ + {0x1D70,0x1D70},{0x1D71,0x1D71}, /* 1D70 */ + {0x1D72,0x1D72},{0x1D73,0x1D73}, /* 1D72 */ + {0x1D74,0x1D74},{0x1D75,0x1D75}, /* 1D74 */ + {0x1D76,0x1D76},{0x1D77,0x1D77}, /* 1D76 */ + {0x1D78,0x1D78},{0xA77D,0x1D79}, /* 1D78 */ + {0x1D7A,0x1D7A},{0x1D7B,0x1D7B}, /* 1D7A */ + {0x1D7C,0x1D7C},{0x2C63,0x1D7D}, /* 1D7C */ + {0x1D7E,0x1D7E},{0x1D7F,0x1D7F}, /* 1D7E */ + {0x1D80,0x1D80},{0x1D81,0x1D81}, /* 1D80 */ + {0x1D82,0x1D82},{0x1D83,0x1D83}, /* 1D82 */ + {0x1D84,0x1D84},{0x1D85,0x1D85}, /* 1D84 */ + {0x1D86,0x1D86},{0x1D87,0x1D87}, /* 1D86 */ + {0x1D88,0x1D88},{0x1D89,0x1D89}, /* 1D88 */ + {0x1D8A,0x1D8A},{0x1D8B,0x1D8B}, /* 1D8A */ + {0x1D8C,0x1D8C},{0x1D8D,0x1D8D}, /* 1D8C */ + {0xA7C6,0x1D8E},{0x1D8F,0x1D8F}, /* 1D8E */ + {0x1D90,0x1D90},{0x1D91,0x1D91}, /* 1D90 */ + {0x1D92,0x1D92},{0x1D93,0x1D93}, /* 1D92 */ + {0x1D94,0x1D94},{0x1D95,0x1D95}, /* 1D94 */ + {0x1D96,0x1D96},{0x1D97,0x1D97}, /* 1D96 */ + {0x1D98,0x1D98},{0x1D99,0x1D99}, /* 1D98 */ + {0x1D9A,0x1D9A},{0x1D9B,0x1D9B}, /* 1D9A */ + {0x1D9C,0x1D9C},{0x1D9D,0x1D9D}, /* 1D9C */ + {0x1D9E,0x1D9E},{0x1D9F,0x1D9F}, /* 1D9E */ + {0x1DA0,0x1DA0},{0x1DA1,0x1DA1}, /* 1DA0 */ + {0x1DA2,0x1DA2},{0x1DA3,0x1DA3}, /* 1DA2 */ + {0x1DA4,0x1DA4},{0x1DA5,0x1DA5}, /* 1DA4 */ + {0x1DA6,0x1DA6},{0x1DA7,0x1DA7}, /* 1DA6 */ + {0x1DA8,0x1DA8},{0x1DA9,0x1DA9}, /* 1DA8 */ + {0x1DAA,0x1DAA},{0x1DAB,0x1DAB}, /* 1DAA */ + {0x1DAC,0x1DAC},{0x1DAD,0x1DAD}, /* 1DAC */ + {0x1DAE,0x1DAE},{0x1DAF,0x1DAF}, /* 1DAE */ + {0x1DB0,0x1DB0},{0x1DB1,0x1DB1}, /* 1DB0 */ + {0x1DB2,0x1DB2},{0x1DB3,0x1DB3}, /* 1DB2 */ + {0x1DB4,0x1DB4},{0x1DB5,0x1DB5}, /* 1DB4 */ + {0x1DB6,0x1DB6},{0x1DB7,0x1DB7}, /* 1DB6 */ + {0x1DB8,0x1DB8},{0x1DB9,0x1DB9}, /* 1DB8 */ + {0x1DBA,0x1DBA},{0x1DBB,0x1DBB}, /* 1DBA */ + {0x1DBC,0x1DBC},{0x1DBD,0x1DBD}, /* 1DBC */ + {0x1DBE,0x1DBE},{0x1DBF,0x1DBF}, /* 1DBE */ + {0x1DC0,0x1DC0},{0x1DC1,0x1DC1}, /* 1DC0 */ + {0x1DC2,0x1DC2},{0x1DC3,0x1DC3}, /* 1DC2 */ + {0x1DC4,0x1DC4},{0x1DC5,0x1DC5}, /* 1DC4 */ + {0x1DC6,0x1DC6},{0x1DC7,0x1DC7}, /* 1DC6 */ + {0x1DC8,0x1DC8},{0x1DC9,0x1DC9}, /* 1DC8 */ + {0x1DCA,0x1DCA},{0x1DCB,0x1DCB}, /* 1DCA */ + {0x1DCC,0x1DCC},{0x1DCD,0x1DCD}, /* 1DCC */ + {0x1DCE,0x1DCE},{0x1DCF,0x1DCF}, /* 1DCE */ + {0x1DD0,0x1DD0},{0x1DD1,0x1DD1}, /* 1DD0 */ + {0x1DD2,0x1DD2},{0x1DD3,0x1DD3}, /* 1DD2 */ + {0x1DD4,0x1DD4},{0x1DD5,0x1DD5}, /* 1DD4 */ + {0x1DD6,0x1DD6},{0x1DD7,0x1DD7}, /* 1DD6 */ + {0x1DD8,0x1DD8},{0x1DD9,0x1DD9}, /* 1DD8 */ + {0x1DDA,0x1DDA},{0x1DDB,0x1DDB}, /* 1DDA */ + {0x1DDC,0x1DDC},{0x1DDD,0x1DDD}, /* 1DDC */ + {0x1DDE,0x1DDE},{0x1DDF,0x1DDF}, /* 1DDE */ + {0x1DE0,0x1DE0},{0x1DE1,0x1DE1}, /* 1DE0 */ + {0x1DE2,0x1DE2},{0x1DE3,0x1DE3}, /* 1DE2 */ + {0x1DE4,0x1DE4},{0x1DE5,0x1DE5}, /* 1DE4 */ + {0x1DE6,0x1DE6},{0x1DE7,0x1DE7}, /* 1DE6 */ + {0x1DE8,0x1DE8},{0x1DE9,0x1DE9}, /* 1DE8 */ + {0x1DEA,0x1DEA},{0x1DEB,0x1DEB}, /* 1DEA */ + {0x1DEC,0x1DEC},{0x1DED,0x1DED}, /* 1DEC */ + {0x1DEE,0x1DEE},{0x1DEF,0x1DEF}, /* 1DEE */ + {0x1DF0,0x1DF0},{0x1DF1,0x1DF1}, /* 1DF0 */ + {0x1DF2,0x1DF2},{0x1DF3,0x1DF3}, /* 1DF2 */ + {0x1DF4,0x1DF4},{0x1DF5,0x1DF5}, /* 1DF4 */ + {0x1DF6,0x1DF6},{0x1DF7,0x1DF7}, /* 1DF6 */ + {0x1DF8,0x1DF8},{0x1DF9,0x1DF9}, /* 1DF8 */ + {0x1DFA,0x1DFA},{0x1DFB,0x1DFB}, /* 1DFA */ + {0x1DFC,0x1DFC},{0x1DFD,0x1DFD}, /* 1DFC */ + {0x1DFE,0x1DFE},{0x1DFF,0x1DFF} /* 1DFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page1E[256]={ + {0x1E00,0x1E01},{0x1E00,0x1E01}, /* 1E00 */ + {0x1E02,0x1E03},{0x1E02,0x1E03}, /* 1E02 */ + {0x1E04,0x1E05},{0x1E04,0x1E05}, /* 1E04 */ + {0x1E06,0x1E07},{0x1E06,0x1E07}, /* 1E06 */ + {0x1E08,0x1E09},{0x1E08,0x1E09}, /* 1E08 */ + {0x1E0A,0x1E0B},{0x1E0A,0x1E0B}, /* 1E0A */ + {0x1E0C,0x1E0D},{0x1E0C,0x1E0D}, /* 1E0C */ + {0x1E0E,0x1E0F},{0x1E0E,0x1E0F}, /* 1E0E */ + {0x1E10,0x1E11},{0x1E10,0x1E11}, /* 1E10 */ + {0x1E12,0x1E13},{0x1E12,0x1E13}, /* 1E12 */ + {0x1E14,0x1E15},{0x1E14,0x1E15}, /* 1E14 */ + {0x1E16,0x1E17},{0x1E16,0x1E17}, /* 1E16 */ + {0x1E18,0x1E19},{0x1E18,0x1E19}, /* 1E18 */ + {0x1E1A,0x1E1B},{0x1E1A,0x1E1B}, /* 1E1A */ + {0x1E1C,0x1E1D},{0x1E1C,0x1E1D}, /* 1E1C */ + {0x1E1E,0x1E1F},{0x1E1E,0x1E1F}, /* 1E1E */ + {0x1E20,0x1E21},{0x1E20,0x1E21}, /* 1E20 */ + {0x1E22,0x1E23},{0x1E22,0x1E23}, /* 1E22 */ + {0x1E24,0x1E25},{0x1E24,0x1E25}, /* 1E24 */ + {0x1E26,0x1E27},{0x1E26,0x1E27}, /* 1E26 */ + {0x1E28,0x1E29},{0x1E28,0x1E29}, /* 1E28 */ + {0x1E2A,0x1E2B},{0x1E2A,0x1E2B}, /* 1E2A */ + {0x1E2C,0x1E2D},{0x1E2C,0x1E2D}, /* 1E2C */ + {0x1E2E,0x1E2F},{0x1E2E,0x1E2F}, /* 1E2E */ + {0x1E30,0x1E31},{0x1E30,0x1E31}, /* 1E30 */ + {0x1E32,0x1E33},{0x1E32,0x1E33}, /* 1E32 */ + {0x1E34,0x1E35},{0x1E34,0x1E35}, /* 1E34 */ + {0x1E36,0x1E37},{0x1E36,0x1E37}, /* 1E36 */ + {0x1E38,0x1E39},{0x1E38,0x1E39}, /* 1E38 */ + {0x1E3A,0x1E3B},{0x1E3A,0x1E3B}, /* 1E3A */ + {0x1E3C,0x1E3D},{0x1E3C,0x1E3D}, /* 1E3C */ + {0x1E3E,0x1E3F},{0x1E3E,0x1E3F}, /* 1E3E */ + {0x1E40,0x1E41},{0x1E40,0x1E41}, /* 1E40 */ + {0x1E42,0x1E43},{0x1E42,0x1E43}, /* 1E42 */ + {0x1E44,0x1E45},{0x1E44,0x1E45}, /* 1E44 */ + {0x1E46,0x1E47},{0x1E46,0x1E47}, /* 1E46 */ + {0x1E48,0x1E49},{0x1E48,0x1E49}, /* 1E48 */ + {0x1E4A,0x1E4B},{0x1E4A,0x1E4B}, /* 1E4A */ + {0x1E4C,0x1E4D},{0x1E4C,0x1E4D}, /* 1E4C */ + {0x1E4E,0x1E4F},{0x1E4E,0x1E4F}, /* 1E4E */ + {0x1E50,0x1E51},{0x1E50,0x1E51}, /* 1E50 */ + {0x1E52,0x1E53},{0x1E52,0x1E53}, /* 1E52 */ + {0x1E54,0x1E55},{0x1E54,0x1E55}, /* 1E54 */ + {0x1E56,0x1E57},{0x1E56,0x1E57}, /* 1E56 */ + {0x1E58,0x1E59},{0x1E58,0x1E59}, /* 1E58 */ + {0x1E5A,0x1E5B},{0x1E5A,0x1E5B}, /* 1E5A */ + {0x1E5C,0x1E5D},{0x1E5C,0x1E5D}, /* 1E5C */ + {0x1E5E,0x1E5F},{0x1E5E,0x1E5F}, /* 1E5E */ + {0x1E60,0x1E61},{0x1E60,0x1E61}, /* 1E60 */ + {0x1E62,0x1E63},{0x1E62,0x1E63}, /* 1E62 */ + {0x1E64,0x1E65},{0x1E64,0x1E65}, /* 1E64 */ + {0x1E66,0x1E67},{0x1E66,0x1E67}, /* 1E66 */ + {0x1E68,0x1E69},{0x1E68,0x1E69}, /* 1E68 */ + {0x1E6A,0x1E6B},{0x1E6A,0x1E6B}, /* 1E6A */ + {0x1E6C,0x1E6D},{0x1E6C,0x1E6D}, /* 1E6C */ + {0x1E6E,0x1E6F},{0x1E6E,0x1E6F}, /* 1E6E */ + {0x1E70,0x1E71},{0x1E70,0x1E71}, /* 1E70 */ + {0x1E72,0x1E73},{0x1E72,0x1E73}, /* 1E72 */ + {0x1E74,0x1E75},{0x1E74,0x1E75}, /* 1E74 */ + {0x1E76,0x1E77},{0x1E76,0x1E77}, /* 1E76 */ + {0x1E78,0x1E79},{0x1E78,0x1E79}, /* 1E78 */ + {0x1E7A,0x1E7B},{0x1E7A,0x1E7B}, /* 1E7A */ + {0x1E7C,0x1E7D},{0x1E7C,0x1E7D}, /* 1E7C */ + {0x1E7E,0x1E7F},{0x1E7E,0x1E7F}, /* 1E7E */ + {0x1E80,0x1E81},{0x1E80,0x1E81}, /* 1E80 */ + {0x1E82,0x1E83},{0x1E82,0x1E83}, /* 1E82 */ + {0x1E84,0x1E85},{0x1E84,0x1E85}, /* 1E84 */ + {0x1E86,0x1E87},{0x1E86,0x1E87}, /* 1E86 */ + {0x1E88,0x1E89},{0x1E88,0x1E89}, /* 1E88 */ + {0x1E8A,0x1E8B},{0x1E8A,0x1E8B}, /* 1E8A */ + {0x1E8C,0x1E8D},{0x1E8C,0x1E8D}, /* 1E8C */ + {0x1E8E,0x1E8F},{0x1E8E,0x1E8F}, /* 1E8E */ + {0x1E90,0x1E91},{0x1E90,0x1E91}, /* 1E90 */ + {0x1E92,0x1E93},{0x1E92,0x1E93}, /* 1E92 */ + {0x1E94,0x1E95},{0x1E94,0x1E95}, /* 1E94 */ + {0x1E96,0x1E96},{0x1E97,0x1E97}, /* 1E96 */ + {0x1E98,0x1E98},{0x1E99,0x1E99}, /* 1E98 */ + {0x1E9A,0x1E9A},{0x1E60,0x1E9B}, /* 1E9A */ + {0x1E9C,0x1E9C},{0x1E9D,0x1E9D}, /* 1E9C */ + {0x1E9E,0x00DF},{0x1E9F,0x1E9F}, /* 1E9E */ + {0x1EA0,0x1EA1},{0x1EA0,0x1EA1}, /* 1EA0 */ + {0x1EA2,0x1EA3},{0x1EA2,0x1EA3}, /* 1EA2 */ + {0x1EA4,0x1EA5},{0x1EA4,0x1EA5}, /* 1EA4 */ + {0x1EA6,0x1EA7},{0x1EA6,0x1EA7}, /* 1EA6 */ + {0x1EA8,0x1EA9},{0x1EA8,0x1EA9}, /* 1EA8 */ + {0x1EAA,0x1EAB},{0x1EAA,0x1EAB}, /* 1EAA */ + {0x1EAC,0x1EAD},{0x1EAC,0x1EAD}, /* 1EAC */ + {0x1EAE,0x1EAF},{0x1EAE,0x1EAF}, /* 1EAE */ + {0x1EB0,0x1EB1},{0x1EB0,0x1EB1}, /* 1EB0 */ + {0x1EB2,0x1EB3},{0x1EB2,0x1EB3}, /* 1EB2 */ + {0x1EB4,0x1EB5},{0x1EB4,0x1EB5}, /* 1EB4 */ + {0x1EB6,0x1EB7},{0x1EB6,0x1EB7}, /* 1EB6 */ + {0x1EB8,0x1EB9},{0x1EB8,0x1EB9}, /* 1EB8 */ + {0x1EBA,0x1EBB},{0x1EBA,0x1EBB}, /* 1EBA */ + {0x1EBC,0x1EBD},{0x1EBC,0x1EBD}, /* 1EBC */ + {0x1EBE,0x1EBF},{0x1EBE,0x1EBF}, /* 1EBE */ + {0x1EC0,0x1EC1},{0x1EC0,0x1EC1}, /* 1EC0 */ + {0x1EC2,0x1EC3},{0x1EC2,0x1EC3}, /* 1EC2 */ + {0x1EC4,0x1EC5},{0x1EC4,0x1EC5}, /* 1EC4 */ + {0x1EC6,0x1EC7},{0x1EC6,0x1EC7}, /* 1EC6 */ + {0x1EC8,0x1EC9},{0x1EC8,0x1EC9}, /* 1EC8 */ + {0x1ECA,0x1ECB},{0x1ECA,0x1ECB}, /* 1ECA */ + {0x1ECC,0x1ECD},{0x1ECC,0x1ECD}, /* 1ECC */ + {0x1ECE,0x1ECF},{0x1ECE,0x1ECF}, /* 1ECE */ + {0x1ED0,0x1ED1},{0x1ED0,0x1ED1}, /* 1ED0 */ + {0x1ED2,0x1ED3},{0x1ED2,0x1ED3}, /* 1ED2 */ + {0x1ED4,0x1ED5},{0x1ED4,0x1ED5}, /* 1ED4 */ + {0x1ED6,0x1ED7},{0x1ED6,0x1ED7}, /* 1ED6 */ + {0x1ED8,0x1ED9},{0x1ED8,0x1ED9}, /* 1ED8 */ + {0x1EDA,0x1EDB},{0x1EDA,0x1EDB}, /* 1EDA */ + {0x1EDC,0x1EDD},{0x1EDC,0x1EDD}, /* 1EDC */ + {0x1EDE,0x1EDF},{0x1EDE,0x1EDF}, /* 1EDE */ + {0x1EE0,0x1EE1},{0x1EE0,0x1EE1}, /* 1EE0 */ + {0x1EE2,0x1EE3},{0x1EE2,0x1EE3}, /* 1EE2 */ + {0x1EE4,0x1EE5},{0x1EE4,0x1EE5}, /* 1EE4 */ + {0x1EE6,0x1EE7},{0x1EE6,0x1EE7}, /* 1EE6 */ + {0x1EE8,0x1EE9},{0x1EE8,0x1EE9}, /* 1EE8 */ + {0x1EEA,0x1EEB},{0x1EEA,0x1EEB}, /* 1EEA */ + {0x1EEC,0x1EED},{0x1EEC,0x1EED}, /* 1EEC */ + {0x1EEE,0x1EEF},{0x1EEE,0x1EEF}, /* 1EEE */ + {0x1EF0,0x1EF1},{0x1EF0,0x1EF1}, /* 1EF0 */ + {0x1EF2,0x1EF3},{0x1EF2,0x1EF3}, /* 1EF2 */ + {0x1EF4,0x1EF5},{0x1EF4,0x1EF5}, /* 1EF4 */ + {0x1EF6,0x1EF7},{0x1EF6,0x1EF7}, /* 1EF6 */ + {0x1EF8,0x1EF9},{0x1EF8,0x1EF9}, /* 1EF8 */ + {0x1EFA,0x1EFB},{0x1EFA,0x1EFB}, /* 1EFA */ + {0x1EFC,0x1EFD},{0x1EFC,0x1EFD}, /* 1EFC */ + {0x1EFE,0x1EFF},{0x1EFE,0x1EFF} /* 1EFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page1F[256]={ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F00 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F02 */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F04 */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F06 */ + {0x1F08,0x1F00},{0x1F09,0x1F01}, /* 1F08 */ + {0x1F0A,0x1F02},{0x1F0B,0x1F03}, /* 1F0A */ + {0x1F0C,0x1F04},{0x1F0D,0x1F05}, /* 1F0C */ + {0x1F0E,0x1F06},{0x1F0F,0x1F07}, /* 1F0E */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F10 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F12 */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F14 */ + {0x1F16,0x1F16},{0x1F17,0x1F17}, /* 1F16 */ + {0x1F18,0x1F10},{0x1F19,0x1F11}, /* 1F18 */ + {0x1F1A,0x1F12},{0x1F1B,0x1F13}, /* 1F1A */ + {0x1F1C,0x1F14},{0x1F1D,0x1F15}, /* 1F1C */ + {0x1F1E,0x1F1E},{0x1F1F,0x1F1F}, /* 1F1E */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F20 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F22 */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F24 */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F26 */ + {0x1F28,0x1F20},{0x1F29,0x1F21}, /* 1F28 */ + {0x1F2A,0x1F22},{0x1F2B,0x1F23}, /* 1F2A */ + {0x1F2C,0x1F24},{0x1F2D,0x1F25}, /* 1F2C */ + {0x1F2E,0x1F26},{0x1F2F,0x1F27}, /* 1F2E */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F30 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F32 */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F34 */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F36 */ + {0x1F38,0x1F30},{0x1F39,0x1F31}, /* 1F38 */ + {0x1F3A,0x1F32},{0x1F3B,0x1F33}, /* 1F3A */ + {0x1F3C,0x1F34},{0x1F3D,0x1F35}, /* 1F3C */ + {0x1F3E,0x1F36},{0x1F3F,0x1F37}, /* 1F3E */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F40 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F42 */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F44 */ + {0x1F46,0x1F46},{0x1F47,0x1F47}, /* 1F46 */ + {0x1F48,0x1F40},{0x1F49,0x1F41}, /* 1F48 */ + {0x1F4A,0x1F42},{0x1F4B,0x1F43}, /* 1F4A */ + {0x1F4C,0x1F44},{0x1F4D,0x1F45}, /* 1F4C */ + {0x1F4E,0x1F4E},{0x1F4F,0x1F4F}, /* 1F4E */ + {0x1F50,0x1F50},{0x1F59,0x1F51}, /* 1F50 */ + {0x1F52,0x1F52},{0x1F5B,0x1F53}, /* 1F52 */ + {0x1F54,0x1F54},{0x1F5D,0x1F55}, /* 1F54 */ + {0x1F56,0x1F56},{0x1F5F,0x1F57}, /* 1F56 */ + {0x1F58,0x1F58},{0x1F59,0x1F51}, /* 1F58 */ + {0x1F5A,0x1F5A},{0x1F5B,0x1F53}, /* 1F5A */ + {0x1F5C,0x1F5C},{0x1F5D,0x1F55}, /* 1F5C */ + {0x1F5E,0x1F5E},{0x1F5F,0x1F57}, /* 1F5E */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F60 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F62 */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F64 */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F66 */ + {0x1F68,0x1F60},{0x1F69,0x1F61}, /* 1F68 */ + {0x1F6A,0x1F62},{0x1F6B,0x1F63}, /* 1F6A */ + {0x1F6C,0x1F64},{0x1F6D,0x1F65}, /* 1F6C */ + {0x1F6E,0x1F66},{0x1F6F,0x1F67}, /* 1F6E */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1F70 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1F72 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1F74 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1F76 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1F78 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1F7A */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1F7C */ + {0x1F7E,0x1F7E},{0x1F7F,0x1F7F}, /* 1F7E */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F80 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F82 */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F84 */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F86 */ + {0x1F88,0x1F80},{0x1F89,0x1F81}, /* 1F88 */ + {0x1F8A,0x1F82},{0x1F8B,0x1F83}, /* 1F8A */ + {0x1F8C,0x1F84},{0x1F8D,0x1F85}, /* 1F8C */ + {0x1F8E,0x1F86},{0x1F8F,0x1F87}, /* 1F8E */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F90 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F92 */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F94 */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F96 */ + {0x1F98,0x1F90},{0x1F99,0x1F91}, /* 1F98 */ + {0x1F9A,0x1F92},{0x1F9B,0x1F93}, /* 1F9A */ + {0x1F9C,0x1F94},{0x1F9D,0x1F95}, /* 1F9C */ + {0x1F9E,0x1F96},{0x1F9F,0x1F97}, /* 1F9E */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA0 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FA2 */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FA4 */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FA6 */ + {0x1FA8,0x1FA0},{0x1FA9,0x1FA1}, /* 1FA8 */ + {0x1FAA,0x1FA2},{0x1FAB,0x1FA3}, /* 1FAA */ + {0x1FAC,0x1FA4},{0x1FAD,0x1FA5}, /* 1FAC */ + {0x1FAE,0x1FA6},{0x1FAF,0x1FA7}, /* 1FAE */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB0 */ + {0x1FB2,0x1FB2},{0x1FBC,0x1FB3}, /* 1FB2 */ + {0x1FB4,0x1FB4},{0x1FB5,0x1FB5}, /* 1FB4 */ + {0x1FB6,0x1FB6},{0x1FB7,0x1FB7}, /* 1FB6 */ + {0x1FB8,0x1FB0},{0x1FB9,0x1FB1}, /* 1FB8 */ + {0x1FBA,0x1F70},{0x1FBB,0x1F71}, /* 1FBA */ + {0x1FBC,0x1FB3},{0x1FBD,0x1FBD}, /* 1FBC */ + {0x0399,0x1FBE},{0x1FBF,0x1FBF}, /* 1FBE */ + {0x1FC0,0x1FC0},{0x1FC1,0x1FC1}, /* 1FC0 */ + {0x1FC2,0x1FC2},{0x1FCC,0x1FC3}, /* 1FC2 */ + {0x1FC4,0x1FC4},{0x1FC5,0x1FC5}, /* 1FC4 */ + {0x1FC6,0x1FC6},{0x1FC7,0x1FC7}, /* 1FC6 */ + {0x1FC8,0x1F72},{0x1FC9,0x1F73}, /* 1FC8 */ + {0x1FCA,0x1F74},{0x1FCB,0x1F75}, /* 1FCA */ + {0x1FCC,0x1FC3},{0x1FCD,0x1FCD}, /* 1FCC */ + {0x1FCE,0x1FCE},{0x1FCF,0x1FCF}, /* 1FCE */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD0 */ + {0x1FD2,0x1FD2},{0x1FD3,0x1FD3}, /* 1FD2 */ + {0x1FD4,0x1FD4},{0x1FD5,0x1FD5}, /* 1FD4 */ + {0x1FD6,0x1FD6},{0x1FD7,0x1FD7}, /* 1FD6 */ + {0x1FD8,0x1FD0},{0x1FD9,0x1FD1}, /* 1FD8 */ + {0x1FDA,0x1F76},{0x1FDB,0x1F77}, /* 1FDA */ + {0x1FDC,0x1FDC},{0x1FDD,0x1FDD}, /* 1FDC */ + {0x1FDE,0x1FDE},{0x1FDF,0x1FDF}, /* 1FDE */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE0 */ + {0x1FE2,0x1FE2},{0x1FE3,0x1FE3}, /* 1FE2 */ + {0x1FE4,0x1FE4},{0x1FEC,0x1FE5}, /* 1FE4 */ + {0x1FE6,0x1FE6},{0x1FE7,0x1FE7}, /* 1FE6 */ + {0x1FE8,0x1FE0},{0x1FE9,0x1FE1}, /* 1FE8 */ + {0x1FEA,0x1F7A},{0x1FEB,0x1F7B}, /* 1FEA */ + {0x1FEC,0x1FE5},{0x1FED,0x1FED}, /* 1FEC */ + {0x1FEE,0x1FEE},{0x1FEF,0x1FEF}, /* 1FEE */ + {0x1FF0,0x1FF0},{0x1FF1,0x1FF1}, /* 1FF0 */ + {0x1FF2,0x1FF2},{0x1FFC,0x1FF3}, /* 1FF2 */ + {0x1FF4,0x1FF4},{0x1FF5,0x1FF5}, /* 1FF4 */ + {0x1FF6,0x1FF6},{0x1FF7,0x1FF7}, /* 1FF6 */ + {0x1FF8,0x1F78},{0x1FF9,0x1F79}, /* 1FF8 */ + {0x1FFA,0x1F7C},{0x1FFB,0x1F7D}, /* 1FFA */ + {0x1FFC,0x1FF3},{0x1FFD,0x1FFD}, /* 1FFC */ + {0x1FFE,0x1FFE},{0x1FFF,0x1FFF} /* 1FFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page21[256]={ + {0x2100,0x2100},{0x2101,0x2101}, /* 2100 */ + {0x2102,0x2102},{0x2103,0x2103}, /* 2102 */ + {0x2104,0x2104},{0x2105,0x2105}, /* 2104 */ + {0x2106,0x2106},{0x2107,0x2107}, /* 2106 */ + {0x2108,0x2108},{0x2109,0x2109}, /* 2108 */ + {0x210A,0x210A},{0x210B,0x210B}, /* 210A */ + {0x210C,0x210C},{0x210D,0x210D}, /* 210C */ + {0x210E,0x210E},{0x210F,0x210F}, /* 210E */ + {0x2110,0x2110},{0x2111,0x2111}, /* 2110 */ + {0x2112,0x2112},{0x2113,0x2113}, /* 2112 */ + {0x2114,0x2114},{0x2115,0x2115}, /* 2114 */ + {0x2116,0x2116},{0x2117,0x2117}, /* 2116 */ + {0x2118,0x2118},{0x2119,0x2119}, /* 2118 */ + {0x211A,0x211A},{0x211B,0x211B}, /* 211A */ + {0x211C,0x211C},{0x211D,0x211D}, /* 211C */ + {0x211E,0x211E},{0x211F,0x211F}, /* 211E */ + {0x2120,0x2120},{0x2121,0x2121}, /* 2120 */ + {0x2122,0x2122},{0x2123,0x2123}, /* 2122 */ + {0x2124,0x2124},{0x2125,0x2125}, /* 2124 */ + {0x2126,0x03C9},{0x2127,0x2127}, /* 2126 */ + {0x2128,0x2128},{0x2129,0x2129}, /* 2128 */ + {0x212A,0x006B},{0x212B,0x00E5}, /* 212A */ + {0x212C,0x212C},{0x212D,0x212D}, /* 212C */ + {0x212E,0x212E},{0x212F,0x212F}, /* 212E */ + {0x2130,0x2130},{0x2131,0x2131}, /* 2130 */ + {0x2132,0x214E},{0x2133,0x2133}, /* 2132 */ + {0x2134,0x2134},{0x2135,0x2135}, /* 2134 */ + {0x2136,0x2136},{0x2137,0x2137}, /* 2136 */ + {0x2138,0x2138},{0x2139,0x2139}, /* 2138 */ + {0x213A,0x213A},{0x213B,0x213B}, /* 213A */ + {0x213C,0x213C},{0x213D,0x213D}, /* 213C */ + {0x213E,0x213E},{0x213F,0x213F}, /* 213E */ + {0x2140,0x2140},{0x2141,0x2141}, /* 2140 */ + {0x2142,0x2142},{0x2143,0x2143}, /* 2142 */ + {0x2144,0x2144},{0x2145,0x2145}, /* 2144 */ + {0x2146,0x2146},{0x2147,0x2147}, /* 2146 */ + {0x2148,0x2148},{0x2149,0x2149}, /* 2148 */ + {0x214A,0x214A},{0x214B,0x214B}, /* 214A */ + {0x214C,0x214C},{0x214D,0x214D}, /* 214C */ + {0x2132,0x214E},{0x214F,0x214F}, /* 214E */ + {0x2150,0x2150},{0x2151,0x2151}, /* 2150 */ + {0x2152,0x2152},{0x2153,0x2153}, /* 2152 */ + {0x2154,0x2154},{0x2155,0x2155}, /* 2154 */ + {0x2156,0x2156},{0x2157,0x2157}, /* 2156 */ + {0x2158,0x2158},{0x2159,0x2159}, /* 2158 */ + {0x215A,0x215A},{0x215B,0x215B}, /* 215A */ + {0x215C,0x215C},{0x215D,0x215D}, /* 215C */ + {0x215E,0x215E},{0x215F,0x215F}, /* 215E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2160 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2162 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2164 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2166 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2168 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 216A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 216C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 216E */ + {0x2160,0x2170},{0x2161,0x2171}, /* 2170 */ + {0x2162,0x2172},{0x2163,0x2173}, /* 2172 */ + {0x2164,0x2174},{0x2165,0x2175}, /* 2174 */ + {0x2166,0x2176},{0x2167,0x2177}, /* 2176 */ + {0x2168,0x2178},{0x2169,0x2179}, /* 2178 */ + {0x216A,0x217A},{0x216B,0x217B}, /* 217A */ + {0x216C,0x217C},{0x216D,0x217D}, /* 217C */ + {0x216E,0x217E},{0x216F,0x217F}, /* 217E */ + {0x2180,0x2180},{0x2181,0x2181}, /* 2180 */ + {0x2182,0x2182},{0x2183,0x2184}, /* 2182 */ + {0x2183,0x2184},{0x2185,0x2185}, /* 2184 */ + {0x2186,0x2186},{0x2187,0x2187}, /* 2186 */ + {0x2188,0x2188},{0x2189,0x2189}, /* 2188 */ + {0x218A,0x218A},{0x218B,0x218B}, /* 218A */ + {0x218C,0x218C},{0x218D,0x218D}, /* 218C */ + {0x218E,0x218E},{0x218F,0x218F}, /* 218E */ + {0x2190,0x2190},{0x2191,0x2191}, /* 2190 */ + {0x2192,0x2192},{0x2193,0x2193}, /* 2192 */ + {0x2194,0x2194},{0x2195,0x2195}, /* 2194 */ + {0x2196,0x2196},{0x2197,0x2197}, /* 2196 */ + {0x2198,0x2198},{0x2199,0x2199}, /* 2198 */ + {0x219A,0x219A},{0x219B,0x219B}, /* 219A */ + {0x219C,0x219C},{0x219D,0x219D}, /* 219C */ + {0x219E,0x219E},{0x219F,0x219F}, /* 219E */ + {0x21A0,0x21A0},{0x21A1,0x21A1}, /* 21A0 */ + {0x21A2,0x21A2},{0x21A3,0x21A3}, /* 21A2 */ + {0x21A4,0x21A4},{0x21A5,0x21A5}, /* 21A4 */ + {0x21A6,0x21A6},{0x21A7,0x21A7}, /* 21A6 */ + {0x21A8,0x21A8},{0x21A9,0x21A9}, /* 21A8 */ + {0x21AA,0x21AA},{0x21AB,0x21AB}, /* 21AA */ + {0x21AC,0x21AC},{0x21AD,0x21AD}, /* 21AC */ + {0x21AE,0x21AE},{0x21AF,0x21AF}, /* 21AE */ + {0x21B0,0x21B0},{0x21B1,0x21B1}, /* 21B0 */ + {0x21B2,0x21B2},{0x21B3,0x21B3}, /* 21B2 */ + {0x21B4,0x21B4},{0x21B5,0x21B5}, /* 21B4 */ + {0x21B6,0x21B6},{0x21B7,0x21B7}, /* 21B6 */ + {0x21B8,0x21B8},{0x21B9,0x21B9}, /* 21B8 */ + {0x21BA,0x21BA},{0x21BB,0x21BB}, /* 21BA */ + {0x21BC,0x21BC},{0x21BD,0x21BD}, /* 21BC */ + {0x21BE,0x21BE},{0x21BF,0x21BF}, /* 21BE */ + {0x21C0,0x21C0},{0x21C1,0x21C1}, /* 21C0 */ + {0x21C2,0x21C2},{0x21C3,0x21C3}, /* 21C2 */ + {0x21C4,0x21C4},{0x21C5,0x21C5}, /* 21C4 */ + {0x21C6,0x21C6},{0x21C7,0x21C7}, /* 21C6 */ + {0x21C8,0x21C8},{0x21C9,0x21C9}, /* 21C8 */ + {0x21CA,0x21CA},{0x21CB,0x21CB}, /* 21CA */ + {0x21CC,0x21CC},{0x21CD,0x21CD}, /* 21CC */ + {0x21CE,0x21CE},{0x21CF,0x21CF}, /* 21CE */ + {0x21D0,0x21D0},{0x21D1,0x21D1}, /* 21D0 */ + {0x21D2,0x21D2},{0x21D3,0x21D3}, /* 21D2 */ + {0x21D4,0x21D4},{0x21D5,0x21D5}, /* 21D4 */ + {0x21D6,0x21D6},{0x21D7,0x21D7}, /* 21D6 */ + {0x21D8,0x21D8},{0x21D9,0x21D9}, /* 21D8 */ + {0x21DA,0x21DA},{0x21DB,0x21DB}, /* 21DA */ + {0x21DC,0x21DC},{0x21DD,0x21DD}, /* 21DC */ + {0x21DE,0x21DE},{0x21DF,0x21DF}, /* 21DE */ + {0x21E0,0x21E0},{0x21E1,0x21E1}, /* 21E0 */ + {0x21E2,0x21E2},{0x21E3,0x21E3}, /* 21E2 */ + {0x21E4,0x21E4},{0x21E5,0x21E5}, /* 21E4 */ + {0x21E6,0x21E6},{0x21E7,0x21E7}, /* 21E6 */ + {0x21E8,0x21E8},{0x21E9,0x21E9}, /* 21E8 */ + {0x21EA,0x21EA},{0x21EB,0x21EB}, /* 21EA */ + {0x21EC,0x21EC},{0x21ED,0x21ED}, /* 21EC */ + {0x21EE,0x21EE},{0x21EF,0x21EF}, /* 21EE */ + {0x21F0,0x21F0},{0x21F1,0x21F1}, /* 21F0 */ + {0x21F2,0x21F2},{0x21F3,0x21F3}, /* 21F2 */ + {0x21F4,0x21F4},{0x21F5,0x21F5}, /* 21F4 */ + {0x21F6,0x21F6},{0x21F7,0x21F7}, /* 21F6 */ + {0x21F8,0x21F8},{0x21F9,0x21F9}, /* 21F8 */ + {0x21FA,0x21FA},{0x21FB,0x21FB}, /* 21FA */ + {0x21FC,0x21FC},{0x21FD,0x21FD}, /* 21FC */ + {0x21FE,0x21FE},{0x21FF,0x21FF} /* 21FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page24[256]={ + {0x2400,0x2400},{0x2401,0x2401}, /* 2400 */ + {0x2402,0x2402},{0x2403,0x2403}, /* 2402 */ + {0x2404,0x2404},{0x2405,0x2405}, /* 2404 */ + {0x2406,0x2406},{0x2407,0x2407}, /* 2406 */ + {0x2408,0x2408},{0x2409,0x2409}, /* 2408 */ + {0x240A,0x240A},{0x240B,0x240B}, /* 240A */ + {0x240C,0x240C},{0x240D,0x240D}, /* 240C */ + {0x240E,0x240E},{0x240F,0x240F}, /* 240E */ + {0x2410,0x2410},{0x2411,0x2411}, /* 2410 */ + {0x2412,0x2412},{0x2413,0x2413}, /* 2412 */ + {0x2414,0x2414},{0x2415,0x2415}, /* 2414 */ + {0x2416,0x2416},{0x2417,0x2417}, /* 2416 */ + {0x2418,0x2418},{0x2419,0x2419}, /* 2418 */ + {0x241A,0x241A},{0x241B,0x241B}, /* 241A */ + {0x241C,0x241C},{0x241D,0x241D}, /* 241C */ + {0x241E,0x241E},{0x241F,0x241F}, /* 241E */ + {0x2420,0x2420},{0x2421,0x2421}, /* 2420 */ + {0x2422,0x2422},{0x2423,0x2423}, /* 2422 */ + {0x2424,0x2424},{0x2425,0x2425}, /* 2424 */ + {0x2426,0x2426},{0x2427,0x2427}, /* 2426 */ + {0x2428,0x2428},{0x2429,0x2429}, /* 2428 */ + {0x242A,0x242A},{0x242B,0x242B}, /* 242A */ + {0x242C,0x242C},{0x242D,0x242D}, /* 242C */ + {0x242E,0x242E},{0x242F,0x242F}, /* 242E */ + {0x2430,0x2430},{0x2431,0x2431}, /* 2430 */ + {0x2432,0x2432},{0x2433,0x2433}, /* 2432 */ + {0x2434,0x2434},{0x2435,0x2435}, /* 2434 */ + {0x2436,0x2436},{0x2437,0x2437}, /* 2436 */ + {0x2438,0x2438},{0x2439,0x2439}, /* 2438 */ + {0x243A,0x243A},{0x243B,0x243B}, /* 243A */ + {0x243C,0x243C},{0x243D,0x243D}, /* 243C */ + {0x243E,0x243E},{0x243F,0x243F}, /* 243E */ + {0x2440,0x2440},{0x2441,0x2441}, /* 2440 */ + {0x2442,0x2442},{0x2443,0x2443}, /* 2442 */ + {0x2444,0x2444},{0x2445,0x2445}, /* 2444 */ + {0x2446,0x2446},{0x2447,0x2447}, /* 2446 */ + {0x2448,0x2448},{0x2449,0x2449}, /* 2448 */ + {0x244A,0x244A},{0x244B,0x244B}, /* 244A */ + {0x244C,0x244C},{0x244D,0x244D}, /* 244C */ + {0x244E,0x244E},{0x244F,0x244F}, /* 244E */ + {0x2450,0x2450},{0x2451,0x2451}, /* 2450 */ + {0x2452,0x2452},{0x2453,0x2453}, /* 2452 */ + {0x2454,0x2454},{0x2455,0x2455}, /* 2454 */ + {0x2456,0x2456},{0x2457,0x2457}, /* 2456 */ + {0x2458,0x2458},{0x2459,0x2459}, /* 2458 */ + {0x245A,0x245A},{0x245B,0x245B}, /* 245A */ + {0x245C,0x245C},{0x245D,0x245D}, /* 245C */ + {0x245E,0x245E},{0x245F,0x245F}, /* 245E */ + {0x2460,0x2460},{0x2461,0x2461}, /* 2460 */ + {0x2462,0x2462},{0x2463,0x2463}, /* 2462 */ + {0x2464,0x2464},{0x2465,0x2465}, /* 2464 */ + {0x2466,0x2466},{0x2467,0x2467}, /* 2466 */ + {0x2468,0x2468},{0x2469,0x2469}, /* 2468 */ + {0x246A,0x246A},{0x246B,0x246B}, /* 246A */ + {0x246C,0x246C},{0x246D,0x246D}, /* 246C */ + {0x246E,0x246E},{0x246F,0x246F}, /* 246E */ + {0x2470,0x2470},{0x2471,0x2471}, /* 2470 */ + {0x2472,0x2472},{0x2473,0x2473}, /* 2472 */ + {0x2474,0x2474},{0x2475,0x2475}, /* 2474 */ + {0x2476,0x2476},{0x2477,0x2477}, /* 2476 */ + {0x2478,0x2478},{0x2479,0x2479}, /* 2478 */ + {0x247A,0x247A},{0x247B,0x247B}, /* 247A */ + {0x247C,0x247C},{0x247D,0x247D}, /* 247C */ + {0x247E,0x247E},{0x247F,0x247F}, /* 247E */ + {0x2480,0x2480},{0x2481,0x2481}, /* 2480 */ + {0x2482,0x2482},{0x2483,0x2483}, /* 2482 */ + {0x2484,0x2484},{0x2485,0x2485}, /* 2484 */ + {0x2486,0x2486},{0x2487,0x2487}, /* 2486 */ + {0x2488,0x2488},{0x2489,0x2489}, /* 2488 */ + {0x248A,0x248A},{0x248B,0x248B}, /* 248A */ + {0x248C,0x248C},{0x248D,0x248D}, /* 248C */ + {0x248E,0x248E},{0x248F,0x248F}, /* 248E */ + {0x2490,0x2490},{0x2491,0x2491}, /* 2490 */ + {0x2492,0x2492},{0x2493,0x2493}, /* 2492 */ + {0x2494,0x2494},{0x2495,0x2495}, /* 2494 */ + {0x2496,0x2496},{0x2497,0x2497}, /* 2496 */ + {0x2498,0x2498},{0x2499,0x2499}, /* 2498 */ + {0x249A,0x249A},{0x249B,0x249B}, /* 249A */ + {0x249C,0x249C},{0x249D,0x249D}, /* 249C */ + {0x249E,0x249E},{0x249F,0x249F}, /* 249E */ + {0x24A0,0x24A0},{0x24A1,0x24A1}, /* 24A0 */ + {0x24A2,0x24A2},{0x24A3,0x24A3}, /* 24A2 */ + {0x24A4,0x24A4},{0x24A5,0x24A5}, /* 24A4 */ + {0x24A6,0x24A6},{0x24A7,0x24A7}, /* 24A6 */ + {0x24A8,0x24A8},{0x24A9,0x24A9}, /* 24A8 */ + {0x24AA,0x24AA},{0x24AB,0x24AB}, /* 24AA */ + {0x24AC,0x24AC},{0x24AD,0x24AD}, /* 24AC */ + {0x24AE,0x24AE},{0x24AF,0x24AF}, /* 24AE */ + {0x24B0,0x24B0},{0x24B1,0x24B1}, /* 24B0 */ + {0x24B2,0x24B2},{0x24B3,0x24B3}, /* 24B2 */ + {0x24B4,0x24B4},{0x24B5,0x24B5}, /* 24B4 */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24B6 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24B8 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24BA */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24BC */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24BE */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24C0 */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24C2 */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24C4 */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24C6 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24C8 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24CA */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24CC */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24CE */ + {0x24B6,0x24D0},{0x24B7,0x24D1}, /* 24D0 */ + {0x24B8,0x24D2},{0x24B9,0x24D3}, /* 24D2 */ + {0x24BA,0x24D4},{0x24BB,0x24D5}, /* 24D4 */ + {0x24BC,0x24D6},{0x24BD,0x24D7}, /* 24D6 */ + {0x24BE,0x24D8},{0x24BF,0x24D9}, /* 24D8 */ + {0x24C0,0x24DA},{0x24C1,0x24DB}, /* 24DA */ + {0x24C2,0x24DC},{0x24C3,0x24DD}, /* 24DC */ + {0x24C4,0x24DE},{0x24C5,0x24DF}, /* 24DE */ + {0x24C6,0x24E0},{0x24C7,0x24E1}, /* 24E0 */ + {0x24C8,0x24E2},{0x24C9,0x24E3}, /* 24E2 */ + {0x24CA,0x24E4},{0x24CB,0x24E5}, /* 24E4 */ + {0x24CC,0x24E6},{0x24CD,0x24E7}, /* 24E6 */ + {0x24CE,0x24E8},{0x24CF,0x24E9}, /* 24E8 */ + {0x24EA,0x24EA},{0x24EB,0x24EB}, /* 24EA */ + {0x24EC,0x24EC},{0x24ED,0x24ED}, /* 24EC */ + {0x24EE,0x24EE},{0x24EF,0x24EF}, /* 24EE */ + {0x24F0,0x24F0},{0x24F1,0x24F1}, /* 24F0 */ + {0x24F2,0x24F2},{0x24F3,0x24F3}, /* 24F2 */ + {0x24F4,0x24F4},{0x24F5,0x24F5}, /* 24F4 */ + {0x24F6,0x24F6},{0x24F7,0x24F7}, /* 24F6 */ + {0x24F8,0x24F8},{0x24F9,0x24F9}, /* 24F8 */ + {0x24FA,0x24FA},{0x24FB,0x24FB}, /* 24FA */ + {0x24FC,0x24FC},{0x24FD,0x24FD}, /* 24FC */ + {0x24FE,0x24FE},{0x24FF,0x24FF} /* 24FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page2C[256]={ + {0x2C00,0x2C30},{0x2C01,0x2C31}, /* 2C00 */ + {0x2C02,0x2C32},{0x2C03,0x2C33}, /* 2C02 */ + {0x2C04,0x2C34},{0x2C05,0x2C35}, /* 2C04 */ + {0x2C06,0x2C36},{0x2C07,0x2C37}, /* 2C06 */ + {0x2C08,0x2C38},{0x2C09,0x2C39}, /* 2C08 */ + {0x2C0A,0x2C3A},{0x2C0B,0x2C3B}, /* 2C0A */ + {0x2C0C,0x2C3C},{0x2C0D,0x2C3D}, /* 2C0C */ + {0x2C0E,0x2C3E},{0x2C0F,0x2C3F}, /* 2C0E */ + {0x2C10,0x2C40},{0x2C11,0x2C41}, /* 2C10 */ + {0x2C12,0x2C42},{0x2C13,0x2C43}, /* 2C12 */ + {0x2C14,0x2C44},{0x2C15,0x2C45}, /* 2C14 */ + {0x2C16,0x2C46},{0x2C17,0x2C47}, /* 2C16 */ + {0x2C18,0x2C48},{0x2C19,0x2C49}, /* 2C18 */ + {0x2C1A,0x2C4A},{0x2C1B,0x2C4B}, /* 2C1A */ + {0x2C1C,0x2C4C},{0x2C1D,0x2C4D}, /* 2C1C */ + {0x2C1E,0x2C4E},{0x2C1F,0x2C4F}, /* 2C1E */ + {0x2C20,0x2C50},{0x2C21,0x2C51}, /* 2C20 */ + {0x2C22,0x2C52},{0x2C23,0x2C53}, /* 2C22 */ + {0x2C24,0x2C54},{0x2C25,0x2C55}, /* 2C24 */ + {0x2C26,0x2C56},{0x2C27,0x2C57}, /* 2C26 */ + {0x2C28,0x2C58},{0x2C29,0x2C59}, /* 2C28 */ + {0x2C2A,0x2C5A},{0x2C2B,0x2C5B}, /* 2C2A */ + {0x2C2C,0x2C5C},{0x2C2D,0x2C5D}, /* 2C2C */ + {0x2C2E,0x2C5E},{0x2C2F,0x2C5F}, /* 2C2E */ + {0x2C00,0x2C30},{0x2C01,0x2C31}, /* 2C30 */ + {0x2C02,0x2C32},{0x2C03,0x2C33}, /* 2C32 */ + {0x2C04,0x2C34},{0x2C05,0x2C35}, /* 2C34 */ + {0x2C06,0x2C36},{0x2C07,0x2C37}, /* 2C36 */ + {0x2C08,0x2C38},{0x2C09,0x2C39}, /* 2C38 */ + {0x2C0A,0x2C3A},{0x2C0B,0x2C3B}, /* 2C3A */ + {0x2C0C,0x2C3C},{0x2C0D,0x2C3D}, /* 2C3C */ + {0x2C0E,0x2C3E},{0x2C0F,0x2C3F}, /* 2C3E */ + {0x2C10,0x2C40},{0x2C11,0x2C41}, /* 2C40 */ + {0x2C12,0x2C42},{0x2C13,0x2C43}, /* 2C42 */ + {0x2C14,0x2C44},{0x2C15,0x2C45}, /* 2C44 */ + {0x2C16,0x2C46},{0x2C17,0x2C47}, /* 2C46 */ + {0x2C18,0x2C48},{0x2C19,0x2C49}, /* 2C48 */ + {0x2C1A,0x2C4A},{0x2C1B,0x2C4B}, /* 2C4A */ + {0x2C1C,0x2C4C},{0x2C1D,0x2C4D}, /* 2C4C */ + {0x2C1E,0x2C4E},{0x2C1F,0x2C4F}, /* 2C4E */ + {0x2C20,0x2C50},{0x2C21,0x2C51}, /* 2C50 */ + {0x2C22,0x2C52},{0x2C23,0x2C53}, /* 2C52 */ + {0x2C24,0x2C54},{0x2C25,0x2C55}, /* 2C54 */ + {0x2C26,0x2C56},{0x2C27,0x2C57}, /* 2C56 */ + {0x2C28,0x2C58},{0x2C29,0x2C59}, /* 2C58 */ + {0x2C2A,0x2C5A},{0x2C2B,0x2C5B}, /* 2C5A */ + {0x2C2C,0x2C5C},{0x2C2D,0x2C5D}, /* 2C5C */ + {0x2C2E,0x2C5E},{0x2C2F,0x2C5F}, /* 2C5E */ + {0x2C60,0x2C61},{0x2C60,0x2C61}, /* 2C60 */ + {0x2C62,0x026B},{0x2C63,0x1D7D}, /* 2C62 */ + {0x2C64,0x027D},{0x023A,0x2C65}, /* 2C64 */ + {0x023E,0x2C66},{0x2C67,0x2C68}, /* 2C66 */ + {0x2C67,0x2C68},{0x2C69,0x2C6A}, /* 2C68 */ + {0x2C69,0x2C6A},{0x2C6B,0x2C6C}, /* 2C6A */ + {0x2C6B,0x2C6C},{0x2C6D,0x0251}, /* 2C6C */ + {0x2C6E,0x0271},{0x2C6F,0x0250}, /* 2C6E */ + {0x2C70,0x0252},{0x2C71,0x2C71}, /* 2C70 */ + {0x2C72,0x2C73},{0x2C72,0x2C73}, /* 2C72 */ + {0x2C74,0x2C74},{0x2C75,0x2C76}, /* 2C74 */ + {0x2C75,0x2C76},{0x2C77,0x2C77}, /* 2C76 */ + {0x2C78,0x2C78},{0x2C79,0x2C79}, /* 2C78 */ + {0x2C7A,0x2C7A},{0x2C7B,0x2C7B}, /* 2C7A */ + {0x2C7C,0x2C7C},{0x2C7D,0x2C7D}, /* 2C7C */ + {0x2C7E,0x023F},{0x2C7F,0x0240}, /* 2C7E */ + {0x2C80,0x2C81},{0x2C80,0x2C81}, /* 2C80 */ + {0x2C82,0x2C83},{0x2C82,0x2C83}, /* 2C82 */ + {0x2C84,0x2C85},{0x2C84,0x2C85}, /* 2C84 */ + {0x2C86,0x2C87},{0x2C86,0x2C87}, /* 2C86 */ + {0x2C88,0x2C89},{0x2C88,0x2C89}, /* 2C88 */ + {0x2C8A,0x2C8B},{0x2C8A,0x2C8B}, /* 2C8A */ + {0x2C8C,0x2C8D},{0x2C8C,0x2C8D}, /* 2C8C */ + {0x2C8E,0x2C8F},{0x2C8E,0x2C8F}, /* 2C8E */ + {0x2C90,0x2C91},{0x2C90,0x2C91}, /* 2C90 */ + {0x2C92,0x2C93},{0x2C92,0x2C93}, /* 2C92 */ + {0x2C94,0x2C95},{0x2C94,0x2C95}, /* 2C94 */ + {0x2C96,0x2C97},{0x2C96,0x2C97}, /* 2C96 */ + {0x2C98,0x2C99},{0x2C98,0x2C99}, /* 2C98 */ + {0x2C9A,0x2C9B},{0x2C9A,0x2C9B}, /* 2C9A */ + {0x2C9C,0x2C9D},{0x2C9C,0x2C9D}, /* 2C9C */ + {0x2C9E,0x2C9F},{0x2C9E,0x2C9F}, /* 2C9E */ + {0x2CA0,0x2CA1},{0x2CA0,0x2CA1}, /* 2CA0 */ + {0x2CA2,0x2CA3},{0x2CA2,0x2CA3}, /* 2CA2 */ + {0x2CA4,0x2CA5},{0x2CA4,0x2CA5}, /* 2CA4 */ + {0x2CA6,0x2CA7},{0x2CA6,0x2CA7}, /* 2CA6 */ + {0x2CA8,0x2CA9},{0x2CA8,0x2CA9}, /* 2CA8 */ + {0x2CAA,0x2CAB},{0x2CAA,0x2CAB}, /* 2CAA */ + {0x2CAC,0x2CAD},{0x2CAC,0x2CAD}, /* 2CAC */ + {0x2CAE,0x2CAF},{0x2CAE,0x2CAF}, /* 2CAE */ + {0x2CB0,0x2CB1},{0x2CB0,0x2CB1}, /* 2CB0 */ + {0x2CB2,0x2CB3},{0x2CB2,0x2CB3}, /* 2CB2 */ + {0x2CB4,0x2CB5},{0x2CB4,0x2CB5}, /* 2CB4 */ + {0x2CB6,0x2CB7},{0x2CB6,0x2CB7}, /* 2CB6 */ + {0x2CB8,0x2CB9},{0x2CB8,0x2CB9}, /* 2CB8 */ + {0x2CBA,0x2CBB},{0x2CBA,0x2CBB}, /* 2CBA */ + {0x2CBC,0x2CBD},{0x2CBC,0x2CBD}, /* 2CBC */ + {0x2CBE,0x2CBF},{0x2CBE,0x2CBF}, /* 2CBE */ + {0x2CC0,0x2CC1},{0x2CC0,0x2CC1}, /* 2CC0 */ + {0x2CC2,0x2CC3},{0x2CC2,0x2CC3}, /* 2CC2 */ + {0x2CC4,0x2CC5},{0x2CC4,0x2CC5}, /* 2CC4 */ + {0x2CC6,0x2CC7},{0x2CC6,0x2CC7}, /* 2CC6 */ + {0x2CC8,0x2CC9},{0x2CC8,0x2CC9}, /* 2CC8 */ + {0x2CCA,0x2CCB},{0x2CCA,0x2CCB}, /* 2CCA */ + {0x2CCC,0x2CCD},{0x2CCC,0x2CCD}, /* 2CCC */ + {0x2CCE,0x2CCF},{0x2CCE,0x2CCF}, /* 2CCE */ + {0x2CD0,0x2CD1},{0x2CD0,0x2CD1}, /* 2CD0 */ + {0x2CD2,0x2CD3},{0x2CD2,0x2CD3}, /* 2CD2 */ + {0x2CD4,0x2CD5},{0x2CD4,0x2CD5}, /* 2CD4 */ + {0x2CD6,0x2CD7},{0x2CD6,0x2CD7}, /* 2CD6 */ + {0x2CD8,0x2CD9},{0x2CD8,0x2CD9}, /* 2CD8 */ + {0x2CDA,0x2CDB},{0x2CDA,0x2CDB}, /* 2CDA */ + {0x2CDC,0x2CDD},{0x2CDC,0x2CDD}, /* 2CDC */ + {0x2CDE,0x2CDF},{0x2CDE,0x2CDF}, /* 2CDE */ + {0x2CE0,0x2CE1},{0x2CE0,0x2CE1}, /* 2CE0 */ + {0x2CE2,0x2CE3},{0x2CE2,0x2CE3}, /* 2CE2 */ + {0x2CE4,0x2CE4},{0x2CE5,0x2CE5}, /* 2CE4 */ + {0x2CE6,0x2CE6},{0x2CE7,0x2CE7}, /* 2CE6 */ + {0x2CE8,0x2CE8},{0x2CE9,0x2CE9}, /* 2CE8 */ + {0x2CEA,0x2CEA},{0x2CEB,0x2CEC}, /* 2CEA */ + {0x2CEB,0x2CEC},{0x2CED,0x2CEE}, /* 2CEC */ + {0x2CED,0x2CEE},{0x2CEF,0x2CEF}, /* 2CEE */ + {0x2CF0,0x2CF0},{0x2CF1,0x2CF1}, /* 2CF0 */ + {0x2CF2,0x2CF3},{0x2CF2,0x2CF3}, /* 2CF2 */ + {0x2CF4,0x2CF4},{0x2CF5,0x2CF5}, /* 2CF4 */ + {0x2CF6,0x2CF6},{0x2CF7,0x2CF7}, /* 2CF6 */ + {0x2CF8,0x2CF8},{0x2CF9,0x2CF9}, /* 2CF8 */ + {0x2CFA,0x2CFA},{0x2CFB,0x2CFB}, /* 2CFA */ + {0x2CFC,0x2CFC},{0x2CFD,0x2CFD}, /* 2CFC */ + {0x2CFE,0x2CFE},{0x2CFF,0x2CFF} /* 2CFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page2D[256]={ + {0x10A0,0x2D00},{0x10A1,0x2D01}, /* 2D00 */ + {0x10A2,0x2D02},{0x10A3,0x2D03}, /* 2D02 */ + {0x10A4,0x2D04},{0x10A5,0x2D05}, /* 2D04 */ + {0x10A6,0x2D06},{0x10A7,0x2D07}, /* 2D06 */ + {0x10A8,0x2D08},{0x10A9,0x2D09}, /* 2D08 */ + {0x10AA,0x2D0A},{0x10AB,0x2D0B}, /* 2D0A */ + {0x10AC,0x2D0C},{0x10AD,0x2D0D}, /* 2D0C */ + {0x10AE,0x2D0E},{0x10AF,0x2D0F}, /* 2D0E */ + {0x10B0,0x2D10},{0x10B1,0x2D11}, /* 2D10 */ + {0x10B2,0x2D12},{0x10B3,0x2D13}, /* 2D12 */ + {0x10B4,0x2D14},{0x10B5,0x2D15}, /* 2D14 */ + {0x10B6,0x2D16},{0x10B7,0x2D17}, /* 2D16 */ + {0x10B8,0x2D18},{0x10B9,0x2D19}, /* 2D18 */ + {0x10BA,0x2D1A},{0x10BB,0x2D1B}, /* 2D1A */ + {0x10BC,0x2D1C},{0x10BD,0x2D1D}, /* 2D1C */ + {0x10BE,0x2D1E},{0x10BF,0x2D1F}, /* 2D1E */ + {0x10C0,0x2D20},{0x10C1,0x2D21}, /* 2D20 */ + {0x10C2,0x2D22},{0x10C3,0x2D23}, /* 2D22 */ + {0x10C4,0x2D24},{0x10C5,0x2D25}, /* 2D24 */ + {0x2D26,0x2D26},{0x10C7,0x2D27}, /* 2D26 */ + {0x2D28,0x2D28},{0x2D29,0x2D29}, /* 2D28 */ + {0x2D2A,0x2D2A},{0x2D2B,0x2D2B}, /* 2D2A */ + {0x2D2C,0x2D2C},{0x10CD,0x2D2D}, /* 2D2C */ + {0x2D2E,0x2D2E},{0x2D2F,0x2D2F}, /* 2D2E */ + {0x2D30,0x2D30},{0x2D31,0x2D31}, /* 2D30 */ + {0x2D32,0x2D32},{0x2D33,0x2D33}, /* 2D32 */ + {0x2D34,0x2D34},{0x2D35,0x2D35}, /* 2D34 */ + {0x2D36,0x2D36},{0x2D37,0x2D37}, /* 2D36 */ + {0x2D38,0x2D38},{0x2D39,0x2D39}, /* 2D38 */ + {0x2D3A,0x2D3A},{0x2D3B,0x2D3B}, /* 2D3A */ + {0x2D3C,0x2D3C},{0x2D3D,0x2D3D}, /* 2D3C */ + {0x2D3E,0x2D3E},{0x2D3F,0x2D3F}, /* 2D3E */ + {0x2D40,0x2D40},{0x2D41,0x2D41}, /* 2D40 */ + {0x2D42,0x2D42},{0x2D43,0x2D43}, /* 2D42 */ + {0x2D44,0x2D44},{0x2D45,0x2D45}, /* 2D44 */ + {0x2D46,0x2D46},{0x2D47,0x2D47}, /* 2D46 */ + {0x2D48,0x2D48},{0x2D49,0x2D49}, /* 2D48 */ + {0x2D4A,0x2D4A},{0x2D4B,0x2D4B}, /* 2D4A */ + {0x2D4C,0x2D4C},{0x2D4D,0x2D4D}, /* 2D4C */ + {0x2D4E,0x2D4E},{0x2D4F,0x2D4F}, /* 2D4E */ + {0x2D50,0x2D50},{0x2D51,0x2D51}, /* 2D50 */ + {0x2D52,0x2D52},{0x2D53,0x2D53}, /* 2D52 */ + {0x2D54,0x2D54},{0x2D55,0x2D55}, /* 2D54 */ + {0x2D56,0x2D56},{0x2D57,0x2D57}, /* 2D56 */ + {0x2D58,0x2D58},{0x2D59,0x2D59}, /* 2D58 */ + {0x2D5A,0x2D5A},{0x2D5B,0x2D5B}, /* 2D5A */ + {0x2D5C,0x2D5C},{0x2D5D,0x2D5D}, /* 2D5C */ + {0x2D5E,0x2D5E},{0x2D5F,0x2D5F}, /* 2D5E */ + {0x2D60,0x2D60},{0x2D61,0x2D61}, /* 2D60 */ + {0x2D62,0x2D62},{0x2D63,0x2D63}, /* 2D62 */ + {0x2D64,0x2D64},{0x2D65,0x2D65}, /* 2D64 */ + {0x2D66,0x2D66},{0x2D67,0x2D67}, /* 2D66 */ + {0x2D68,0x2D68},{0x2D69,0x2D69}, /* 2D68 */ + {0x2D6A,0x2D6A},{0x2D6B,0x2D6B}, /* 2D6A */ + {0x2D6C,0x2D6C},{0x2D6D,0x2D6D}, /* 2D6C */ + {0x2D6E,0x2D6E},{0x2D6F,0x2D6F}, /* 2D6E */ + {0x2D70,0x2D70},{0x2D71,0x2D71}, /* 2D70 */ + {0x2D72,0x2D72},{0x2D73,0x2D73}, /* 2D72 */ + {0x2D74,0x2D74},{0x2D75,0x2D75}, /* 2D74 */ + {0x2D76,0x2D76},{0x2D77,0x2D77}, /* 2D76 */ + {0x2D78,0x2D78},{0x2D79,0x2D79}, /* 2D78 */ + {0x2D7A,0x2D7A},{0x2D7B,0x2D7B}, /* 2D7A */ + {0x2D7C,0x2D7C},{0x2D7D,0x2D7D}, /* 2D7C */ + {0x2D7E,0x2D7E},{0x2D7F,0x2D7F}, /* 2D7E */ + {0x2D80,0x2D80},{0x2D81,0x2D81}, /* 2D80 */ + {0x2D82,0x2D82},{0x2D83,0x2D83}, /* 2D82 */ + {0x2D84,0x2D84},{0x2D85,0x2D85}, /* 2D84 */ + {0x2D86,0x2D86},{0x2D87,0x2D87}, /* 2D86 */ + {0x2D88,0x2D88},{0x2D89,0x2D89}, /* 2D88 */ + {0x2D8A,0x2D8A},{0x2D8B,0x2D8B}, /* 2D8A */ + {0x2D8C,0x2D8C},{0x2D8D,0x2D8D}, /* 2D8C */ + {0x2D8E,0x2D8E},{0x2D8F,0x2D8F}, /* 2D8E */ + {0x2D90,0x2D90},{0x2D91,0x2D91}, /* 2D90 */ + {0x2D92,0x2D92},{0x2D93,0x2D93}, /* 2D92 */ + {0x2D94,0x2D94},{0x2D95,0x2D95}, /* 2D94 */ + {0x2D96,0x2D96},{0x2D97,0x2D97}, /* 2D96 */ + {0x2D98,0x2D98},{0x2D99,0x2D99}, /* 2D98 */ + {0x2D9A,0x2D9A},{0x2D9B,0x2D9B}, /* 2D9A */ + {0x2D9C,0x2D9C},{0x2D9D,0x2D9D}, /* 2D9C */ + {0x2D9E,0x2D9E},{0x2D9F,0x2D9F}, /* 2D9E */ + {0x2DA0,0x2DA0},{0x2DA1,0x2DA1}, /* 2DA0 */ + {0x2DA2,0x2DA2},{0x2DA3,0x2DA3}, /* 2DA2 */ + {0x2DA4,0x2DA4},{0x2DA5,0x2DA5}, /* 2DA4 */ + {0x2DA6,0x2DA6},{0x2DA7,0x2DA7}, /* 2DA6 */ + {0x2DA8,0x2DA8},{0x2DA9,0x2DA9}, /* 2DA8 */ + {0x2DAA,0x2DAA},{0x2DAB,0x2DAB}, /* 2DAA */ + {0x2DAC,0x2DAC},{0x2DAD,0x2DAD}, /* 2DAC */ + {0x2DAE,0x2DAE},{0x2DAF,0x2DAF}, /* 2DAE */ + {0x2DB0,0x2DB0},{0x2DB1,0x2DB1}, /* 2DB0 */ + {0x2DB2,0x2DB2},{0x2DB3,0x2DB3}, /* 2DB2 */ + {0x2DB4,0x2DB4},{0x2DB5,0x2DB5}, /* 2DB4 */ + {0x2DB6,0x2DB6},{0x2DB7,0x2DB7}, /* 2DB6 */ + {0x2DB8,0x2DB8},{0x2DB9,0x2DB9}, /* 2DB8 */ + {0x2DBA,0x2DBA},{0x2DBB,0x2DBB}, /* 2DBA */ + {0x2DBC,0x2DBC},{0x2DBD,0x2DBD}, /* 2DBC */ + {0x2DBE,0x2DBE},{0x2DBF,0x2DBF}, /* 2DBE */ + {0x2DC0,0x2DC0},{0x2DC1,0x2DC1}, /* 2DC0 */ + {0x2DC2,0x2DC2},{0x2DC3,0x2DC3}, /* 2DC2 */ + {0x2DC4,0x2DC4},{0x2DC5,0x2DC5}, /* 2DC4 */ + {0x2DC6,0x2DC6},{0x2DC7,0x2DC7}, /* 2DC6 */ + {0x2DC8,0x2DC8},{0x2DC9,0x2DC9}, /* 2DC8 */ + {0x2DCA,0x2DCA},{0x2DCB,0x2DCB}, /* 2DCA */ + {0x2DCC,0x2DCC},{0x2DCD,0x2DCD}, /* 2DCC */ + {0x2DCE,0x2DCE},{0x2DCF,0x2DCF}, /* 2DCE */ + {0x2DD0,0x2DD0},{0x2DD1,0x2DD1}, /* 2DD0 */ + {0x2DD2,0x2DD2},{0x2DD3,0x2DD3}, /* 2DD2 */ + {0x2DD4,0x2DD4},{0x2DD5,0x2DD5}, /* 2DD4 */ + {0x2DD6,0x2DD6},{0x2DD7,0x2DD7}, /* 2DD6 */ + {0x2DD8,0x2DD8},{0x2DD9,0x2DD9}, /* 2DD8 */ + {0x2DDA,0x2DDA},{0x2DDB,0x2DDB}, /* 2DDA */ + {0x2DDC,0x2DDC},{0x2DDD,0x2DDD}, /* 2DDC */ + {0x2DDE,0x2DDE},{0x2DDF,0x2DDF}, /* 2DDE */ + {0x2DE0,0x2DE0},{0x2DE1,0x2DE1}, /* 2DE0 */ + {0x2DE2,0x2DE2},{0x2DE3,0x2DE3}, /* 2DE2 */ + {0x2DE4,0x2DE4},{0x2DE5,0x2DE5}, /* 2DE4 */ + {0x2DE6,0x2DE6},{0x2DE7,0x2DE7}, /* 2DE6 */ + {0x2DE8,0x2DE8},{0x2DE9,0x2DE9}, /* 2DE8 */ + {0x2DEA,0x2DEA},{0x2DEB,0x2DEB}, /* 2DEA */ + {0x2DEC,0x2DEC},{0x2DED,0x2DED}, /* 2DEC */ + {0x2DEE,0x2DEE},{0x2DEF,0x2DEF}, /* 2DEE */ + {0x2DF0,0x2DF0},{0x2DF1,0x2DF1}, /* 2DF0 */ + {0x2DF2,0x2DF2},{0x2DF3,0x2DF3}, /* 2DF2 */ + {0x2DF4,0x2DF4},{0x2DF5,0x2DF5}, /* 2DF4 */ + {0x2DF6,0x2DF6},{0x2DF7,0x2DF7}, /* 2DF6 */ + {0x2DF8,0x2DF8},{0x2DF9,0x2DF9}, /* 2DF8 */ + {0x2DFA,0x2DFA},{0x2DFB,0x2DFB}, /* 2DFA */ + {0x2DFC,0x2DFC},{0x2DFD,0x2DFD}, /* 2DFC */ + {0x2DFE,0x2DFE},{0x2DFF,0x2DFF} /* 2DFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_pageA6[256]={ + {0xA600,0xA600},{0xA601,0xA601}, /* A600 */ + {0xA602,0xA602},{0xA603,0xA603}, /* A602 */ + {0xA604,0xA604},{0xA605,0xA605}, /* A604 */ + {0xA606,0xA606},{0xA607,0xA607}, /* A606 */ + {0xA608,0xA608},{0xA609,0xA609}, /* A608 */ + {0xA60A,0xA60A},{0xA60B,0xA60B}, /* A60A */ + {0xA60C,0xA60C},{0xA60D,0xA60D}, /* A60C */ + {0xA60E,0xA60E},{0xA60F,0xA60F}, /* A60E */ + {0xA610,0xA610},{0xA611,0xA611}, /* A610 */ + {0xA612,0xA612},{0xA613,0xA613}, /* A612 */ + {0xA614,0xA614},{0xA615,0xA615}, /* A614 */ + {0xA616,0xA616},{0xA617,0xA617}, /* A616 */ + {0xA618,0xA618},{0xA619,0xA619}, /* A618 */ + {0xA61A,0xA61A},{0xA61B,0xA61B}, /* A61A */ + {0xA61C,0xA61C},{0xA61D,0xA61D}, /* A61C */ + {0xA61E,0xA61E},{0xA61F,0xA61F}, /* A61E */ + {0xA620,0xA620},{0xA621,0xA621}, /* A620 */ + {0xA622,0xA622},{0xA623,0xA623}, /* A622 */ + {0xA624,0xA624},{0xA625,0xA625}, /* A624 */ + {0xA626,0xA626},{0xA627,0xA627}, /* A626 */ + {0xA628,0xA628},{0xA629,0xA629}, /* A628 */ + {0xA62A,0xA62A},{0xA62B,0xA62B}, /* A62A */ + {0xA62C,0xA62C},{0xA62D,0xA62D}, /* A62C */ + {0xA62E,0xA62E},{0xA62F,0xA62F}, /* A62E */ + {0xA630,0xA630},{0xA631,0xA631}, /* A630 */ + {0xA632,0xA632},{0xA633,0xA633}, /* A632 */ + {0xA634,0xA634},{0xA635,0xA635}, /* A634 */ + {0xA636,0xA636},{0xA637,0xA637}, /* A636 */ + {0xA638,0xA638},{0xA639,0xA639}, /* A638 */ + {0xA63A,0xA63A},{0xA63B,0xA63B}, /* A63A */ + {0xA63C,0xA63C},{0xA63D,0xA63D}, /* A63C */ + {0xA63E,0xA63E},{0xA63F,0xA63F}, /* A63E */ + {0xA640,0xA641},{0xA640,0xA641}, /* A640 */ + {0xA642,0xA643},{0xA642,0xA643}, /* A642 */ + {0xA644,0xA645},{0xA644,0xA645}, /* A644 */ + {0xA646,0xA647},{0xA646,0xA647}, /* A646 */ + {0xA648,0xA649},{0xA648,0xA649}, /* A648 */ + {0xA64A,0xA64B},{0xA64A,0xA64B}, /* A64A */ + {0xA64C,0xA64D},{0xA64C,0xA64D}, /* A64C */ + {0xA64E,0xA64F},{0xA64E,0xA64F}, /* A64E */ + {0xA650,0xA651},{0xA650,0xA651}, /* A650 */ + {0xA652,0xA653},{0xA652,0xA653}, /* A652 */ + {0xA654,0xA655},{0xA654,0xA655}, /* A654 */ + {0xA656,0xA657},{0xA656,0xA657}, /* A656 */ + {0xA658,0xA659},{0xA658,0xA659}, /* A658 */ + {0xA65A,0xA65B},{0xA65A,0xA65B}, /* A65A */ + {0xA65C,0xA65D},{0xA65C,0xA65D}, /* A65C */ + {0xA65E,0xA65F},{0xA65E,0xA65F}, /* A65E */ + {0xA660,0xA661},{0xA660,0xA661}, /* A660 */ + {0xA662,0xA663},{0xA662,0xA663}, /* A662 */ + {0xA664,0xA665},{0xA664,0xA665}, /* A664 */ + {0xA666,0xA667},{0xA666,0xA667}, /* A666 */ + {0xA668,0xA669},{0xA668,0xA669}, /* A668 */ + {0xA66A,0xA66B},{0xA66A,0xA66B}, /* A66A */ + {0xA66C,0xA66D},{0xA66C,0xA66D}, /* A66C */ + {0xA66E,0xA66E},{0xA66F,0xA66F}, /* A66E */ + {0xA670,0xA670},{0xA671,0xA671}, /* A670 */ + {0xA672,0xA672},{0xA673,0xA673}, /* A672 */ + {0xA674,0xA674},{0xA675,0xA675}, /* A674 */ + {0xA676,0xA676},{0xA677,0xA677}, /* A676 */ + {0xA678,0xA678},{0xA679,0xA679}, /* A678 */ + {0xA67A,0xA67A},{0xA67B,0xA67B}, /* A67A */ + {0xA67C,0xA67C},{0xA67D,0xA67D}, /* A67C */ + {0xA67E,0xA67E},{0xA67F,0xA67F}, /* A67E */ + {0xA680,0xA681},{0xA680,0xA681}, /* A680 */ + {0xA682,0xA683},{0xA682,0xA683}, /* A682 */ + {0xA684,0xA685},{0xA684,0xA685}, /* A684 */ + {0xA686,0xA687},{0xA686,0xA687}, /* A686 */ + {0xA688,0xA689},{0xA688,0xA689}, /* A688 */ + {0xA68A,0xA68B},{0xA68A,0xA68B}, /* A68A */ + {0xA68C,0xA68D},{0xA68C,0xA68D}, /* A68C */ + {0xA68E,0xA68F},{0xA68E,0xA68F}, /* A68E */ + {0xA690,0xA691},{0xA690,0xA691}, /* A690 */ + {0xA692,0xA693},{0xA692,0xA693}, /* A692 */ + {0xA694,0xA695},{0xA694,0xA695}, /* A694 */ + {0xA696,0xA697},{0xA696,0xA697}, /* A696 */ + {0xA698,0xA699},{0xA698,0xA699}, /* A698 */ + {0xA69A,0xA69B},{0xA69A,0xA69B}, /* A69A */ + {0xA69C,0xA69C},{0xA69D,0xA69D}, /* A69C */ + {0xA69E,0xA69E},{0xA69F,0xA69F}, /* A69E */ + {0xA6A0,0xA6A0},{0xA6A1,0xA6A1}, /* A6A0 */ + {0xA6A2,0xA6A2},{0xA6A3,0xA6A3}, /* A6A2 */ + {0xA6A4,0xA6A4},{0xA6A5,0xA6A5}, /* A6A4 */ + {0xA6A6,0xA6A6},{0xA6A7,0xA6A7}, /* A6A6 */ + {0xA6A8,0xA6A8},{0xA6A9,0xA6A9}, /* A6A8 */ + {0xA6AA,0xA6AA},{0xA6AB,0xA6AB}, /* A6AA */ + {0xA6AC,0xA6AC},{0xA6AD,0xA6AD}, /* A6AC */ + {0xA6AE,0xA6AE},{0xA6AF,0xA6AF}, /* A6AE */ + {0xA6B0,0xA6B0},{0xA6B1,0xA6B1}, /* A6B0 */ + {0xA6B2,0xA6B2},{0xA6B3,0xA6B3}, /* A6B2 */ + {0xA6B4,0xA6B4},{0xA6B5,0xA6B5}, /* A6B4 */ + {0xA6B6,0xA6B6},{0xA6B7,0xA6B7}, /* A6B6 */ + {0xA6B8,0xA6B8},{0xA6B9,0xA6B9}, /* A6B8 */ + {0xA6BA,0xA6BA},{0xA6BB,0xA6BB}, /* A6BA */ + {0xA6BC,0xA6BC},{0xA6BD,0xA6BD}, /* A6BC */ + {0xA6BE,0xA6BE},{0xA6BF,0xA6BF}, /* A6BE */ + {0xA6C0,0xA6C0},{0xA6C1,0xA6C1}, /* A6C0 */ + {0xA6C2,0xA6C2},{0xA6C3,0xA6C3}, /* A6C2 */ + {0xA6C4,0xA6C4},{0xA6C5,0xA6C5}, /* A6C4 */ + {0xA6C6,0xA6C6},{0xA6C7,0xA6C7}, /* A6C6 */ + {0xA6C8,0xA6C8},{0xA6C9,0xA6C9}, /* A6C8 */ + {0xA6CA,0xA6CA},{0xA6CB,0xA6CB}, /* A6CA */ + {0xA6CC,0xA6CC},{0xA6CD,0xA6CD}, /* A6CC */ + {0xA6CE,0xA6CE},{0xA6CF,0xA6CF}, /* A6CE */ + {0xA6D0,0xA6D0},{0xA6D1,0xA6D1}, /* A6D0 */ + {0xA6D2,0xA6D2},{0xA6D3,0xA6D3}, /* A6D2 */ + {0xA6D4,0xA6D4},{0xA6D5,0xA6D5}, /* A6D4 */ + {0xA6D6,0xA6D6},{0xA6D7,0xA6D7}, /* A6D6 */ + {0xA6D8,0xA6D8},{0xA6D9,0xA6D9}, /* A6D8 */ + {0xA6DA,0xA6DA},{0xA6DB,0xA6DB}, /* A6DA */ + {0xA6DC,0xA6DC},{0xA6DD,0xA6DD}, /* A6DC */ + {0xA6DE,0xA6DE},{0xA6DF,0xA6DF}, /* A6DE */ + {0xA6E0,0xA6E0},{0xA6E1,0xA6E1}, /* A6E0 */ + {0xA6E2,0xA6E2},{0xA6E3,0xA6E3}, /* A6E2 */ + {0xA6E4,0xA6E4},{0xA6E5,0xA6E5}, /* A6E4 */ + {0xA6E6,0xA6E6},{0xA6E7,0xA6E7}, /* A6E6 */ + {0xA6E8,0xA6E8},{0xA6E9,0xA6E9}, /* A6E8 */ + {0xA6EA,0xA6EA},{0xA6EB,0xA6EB}, /* A6EA */ + {0xA6EC,0xA6EC},{0xA6ED,0xA6ED}, /* A6EC */ + {0xA6EE,0xA6EE},{0xA6EF,0xA6EF}, /* A6EE */ + {0xA6F0,0xA6F0},{0xA6F1,0xA6F1}, /* A6F0 */ + {0xA6F2,0xA6F2},{0xA6F3,0xA6F3}, /* A6F2 */ + {0xA6F4,0xA6F4},{0xA6F5,0xA6F5}, /* A6F4 */ + {0xA6F6,0xA6F6},{0xA6F7,0xA6F7}, /* A6F6 */ + {0xA6F8,0xA6F8},{0xA6F9,0xA6F9}, /* A6F8 */ + {0xA6FA,0xA6FA},{0xA6FB,0xA6FB}, /* A6FA */ + {0xA6FC,0xA6FC},{0xA6FD,0xA6FD}, /* A6FC */ + {0xA6FE,0xA6FE},{0xA6FF,0xA6FF} /* A6FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_pageA7[256]={ + {0xA700,0xA700},{0xA701,0xA701}, /* A700 */ + {0xA702,0xA702},{0xA703,0xA703}, /* A702 */ + {0xA704,0xA704},{0xA705,0xA705}, /* A704 */ + {0xA706,0xA706},{0xA707,0xA707}, /* A706 */ + {0xA708,0xA708},{0xA709,0xA709}, /* A708 */ + {0xA70A,0xA70A},{0xA70B,0xA70B}, /* A70A */ + {0xA70C,0xA70C},{0xA70D,0xA70D}, /* A70C */ + {0xA70E,0xA70E},{0xA70F,0xA70F}, /* A70E */ + {0xA710,0xA710},{0xA711,0xA711}, /* A710 */ + {0xA712,0xA712},{0xA713,0xA713}, /* A712 */ + {0xA714,0xA714},{0xA715,0xA715}, /* A714 */ + {0xA716,0xA716},{0xA717,0xA717}, /* A716 */ + {0xA718,0xA718},{0xA719,0xA719}, /* A718 */ + {0xA71A,0xA71A},{0xA71B,0xA71B}, /* A71A */ + {0xA71C,0xA71C},{0xA71D,0xA71D}, /* A71C */ + {0xA71E,0xA71E},{0xA71F,0xA71F}, /* A71E */ + {0xA720,0xA720},{0xA721,0xA721}, /* A720 */ + {0xA722,0xA723},{0xA722,0xA723}, /* A722 */ + {0xA724,0xA725},{0xA724,0xA725}, /* A724 */ + {0xA726,0xA727},{0xA726,0xA727}, /* A726 */ + {0xA728,0xA729},{0xA728,0xA729}, /* A728 */ + {0xA72A,0xA72B},{0xA72A,0xA72B}, /* A72A */ + {0xA72C,0xA72D},{0xA72C,0xA72D}, /* A72C */ + {0xA72E,0xA72F},{0xA72E,0xA72F}, /* A72E */ + {0xA730,0xA730},{0xA731,0xA731}, /* A730 */ + {0xA732,0xA733},{0xA732,0xA733}, /* A732 */ + {0xA734,0xA735},{0xA734,0xA735}, /* A734 */ + {0xA736,0xA737},{0xA736,0xA737}, /* A736 */ + {0xA738,0xA739},{0xA738,0xA739}, /* A738 */ + {0xA73A,0xA73B},{0xA73A,0xA73B}, /* A73A */ + {0xA73C,0xA73D},{0xA73C,0xA73D}, /* A73C */ + {0xA73E,0xA73F},{0xA73E,0xA73F}, /* A73E */ + {0xA740,0xA741},{0xA740,0xA741}, /* A740 */ + {0xA742,0xA743},{0xA742,0xA743}, /* A742 */ + {0xA744,0xA745},{0xA744,0xA745}, /* A744 */ + {0xA746,0xA747},{0xA746,0xA747}, /* A746 */ + {0xA748,0xA749},{0xA748,0xA749}, /* A748 */ + {0xA74A,0xA74B},{0xA74A,0xA74B}, /* A74A */ + {0xA74C,0xA74D},{0xA74C,0xA74D}, /* A74C */ + {0xA74E,0xA74F},{0xA74E,0xA74F}, /* A74E */ + {0xA750,0xA751},{0xA750,0xA751}, /* A750 */ + {0xA752,0xA753},{0xA752,0xA753}, /* A752 */ + {0xA754,0xA755},{0xA754,0xA755}, /* A754 */ + {0xA756,0xA757},{0xA756,0xA757}, /* A756 */ + {0xA758,0xA759},{0xA758,0xA759}, /* A758 */ + {0xA75A,0xA75B},{0xA75A,0xA75B}, /* A75A */ + {0xA75C,0xA75D},{0xA75C,0xA75D}, /* A75C */ + {0xA75E,0xA75F},{0xA75E,0xA75F}, /* A75E */ + {0xA760,0xA761},{0xA760,0xA761}, /* A760 */ + {0xA762,0xA763},{0xA762,0xA763}, /* A762 */ + {0xA764,0xA765},{0xA764,0xA765}, /* A764 */ + {0xA766,0xA767},{0xA766,0xA767}, /* A766 */ + {0xA768,0xA769},{0xA768,0xA769}, /* A768 */ + {0xA76A,0xA76B},{0xA76A,0xA76B}, /* A76A */ + {0xA76C,0xA76D},{0xA76C,0xA76D}, /* A76C */ + {0xA76E,0xA76F},{0xA76E,0xA76F}, /* A76E */ + {0xA770,0xA770},{0xA771,0xA771}, /* A770 */ + {0xA772,0xA772},{0xA773,0xA773}, /* A772 */ + {0xA774,0xA774},{0xA775,0xA775}, /* A774 */ + {0xA776,0xA776},{0xA777,0xA777}, /* A776 */ + {0xA778,0xA778},{0xA779,0xA77A}, /* A778 */ + {0xA779,0xA77A},{0xA77B,0xA77C}, /* A77A */ + {0xA77B,0xA77C},{0xA77D,0x1D79}, /* A77C */ + {0xA77E,0xA77F},{0xA77E,0xA77F}, /* A77E */ + {0xA780,0xA781},{0xA780,0xA781}, /* A780 */ + {0xA782,0xA783},{0xA782,0xA783}, /* A782 */ + {0xA784,0xA785},{0xA784,0xA785}, /* A784 */ + {0xA786,0xA787},{0xA786,0xA787}, /* A786 */ + {0xA788,0xA788},{0xA789,0xA789}, /* A788 */ + {0xA78A,0xA78A},{0xA78B,0xA78C}, /* A78A */ + {0xA78B,0xA78C},{0xA78D,0x0265}, /* A78C */ + {0xA78E,0xA78E},{0xA78F,0xA78F}, /* A78E */ + {0xA790,0xA791},{0xA790,0xA791}, /* A790 */ + {0xA792,0xA793},{0xA792,0xA793}, /* A792 */ + {0xA7C4,0xA794},{0xA795,0xA795}, /* A794 */ + {0xA796,0xA797},{0xA796,0xA797}, /* A796 */ + {0xA798,0xA799},{0xA798,0xA799}, /* A798 */ + {0xA79A,0xA79B},{0xA79A,0xA79B}, /* A79A */ + {0xA79C,0xA79D},{0xA79C,0xA79D}, /* A79C */ + {0xA79E,0xA79F},{0xA79E,0xA79F}, /* A79E */ + {0xA7A0,0xA7A1},{0xA7A0,0xA7A1}, /* A7A0 */ + {0xA7A2,0xA7A3},{0xA7A2,0xA7A3}, /* A7A2 */ + {0xA7A4,0xA7A5},{0xA7A4,0xA7A5}, /* A7A4 */ + {0xA7A6,0xA7A7},{0xA7A6,0xA7A7}, /* A7A6 */ + {0xA7A8,0xA7A9},{0xA7A8,0xA7A9}, /* A7A8 */ + {0xA7AA,0x0266},{0xA7AB,0x025C}, /* A7AA */ + {0xA7AC,0x0261},{0xA7AD,0x026C}, /* A7AC */ + {0xA7AE,0x026A},{0xA7AF,0xA7AF}, /* A7AE */ + {0xA7B0,0x029E},{0xA7B1,0x0287}, /* A7B0 */ + {0xA7B2,0x029D},{0xA7B3,0xAB53}, /* A7B2 */ + {0xA7B4,0xA7B5},{0xA7B4,0xA7B5}, /* A7B4 */ + {0xA7B6,0xA7B7},{0xA7B6,0xA7B7}, /* A7B6 */ + {0xA7B8,0xA7B9},{0xA7B8,0xA7B9}, /* A7B8 */ + {0xA7BA,0xA7BB},{0xA7BA,0xA7BB}, /* A7BA */ + {0xA7BC,0xA7BD},{0xA7BC,0xA7BD}, /* A7BC */ + {0xA7BE,0xA7BF},{0xA7BE,0xA7BF}, /* A7BE */ + {0xA7C0,0xA7C1},{0xA7C0,0xA7C1}, /* A7C0 */ + {0xA7C2,0xA7C3},{0xA7C2,0xA7C3}, /* A7C2 */ + {0xA7C4,0xA794},{0xA7C5,0x0282}, /* A7C4 */ + {0xA7C6,0x1D8E},{0xA7C7,0xA7C8}, /* A7C6 */ + {0xA7C7,0xA7C8},{0xA7C9,0xA7CA}, /* A7C8 */ + {0xA7C9,0xA7CA},{0xA7CB,0xA7CB}, /* A7CA */ + {0xA7CC,0xA7CC},{0xA7CD,0xA7CD}, /* A7CC */ + {0xA7CE,0xA7CE},{0xA7CF,0xA7CF}, /* A7CE */ + {0xA7D0,0xA7D1},{0xA7D0,0xA7D1}, /* A7D0 */ + {0xA7D2,0xA7D2},{0xA7D3,0xA7D3}, /* A7D2 */ + {0xA7D4,0xA7D4},{0xA7D5,0xA7D5}, /* A7D4 */ + {0xA7D6,0xA7D7},{0xA7D6,0xA7D7}, /* A7D6 */ + {0xA7D8,0xA7D9},{0xA7D8,0xA7D9}, /* A7D8 */ + {0xA7DA,0xA7DA},{0xA7DB,0xA7DB}, /* A7DA */ + {0xA7DC,0xA7DC},{0xA7DD,0xA7DD}, /* A7DC */ + {0xA7DE,0xA7DE},{0xA7DF,0xA7DF}, /* A7DE */ + {0xA7E0,0xA7E0},{0xA7E1,0xA7E1}, /* A7E0 */ + {0xA7E2,0xA7E2},{0xA7E3,0xA7E3}, /* A7E2 */ + {0xA7E4,0xA7E4},{0xA7E5,0xA7E5}, /* A7E4 */ + {0xA7E6,0xA7E6},{0xA7E7,0xA7E7}, /* A7E6 */ + {0xA7E8,0xA7E8},{0xA7E9,0xA7E9}, /* A7E8 */ + {0xA7EA,0xA7EA},{0xA7EB,0xA7EB}, /* A7EA */ + {0xA7EC,0xA7EC},{0xA7ED,0xA7ED}, /* A7EC */ + {0xA7EE,0xA7EE},{0xA7EF,0xA7EF}, /* A7EE */ + {0xA7F0,0xA7F0},{0xA7F1,0xA7F1}, /* A7F0 */ + {0xA7F2,0xA7F2},{0xA7F3,0xA7F3}, /* A7F2 */ + {0xA7F4,0xA7F4},{0xA7F5,0xA7F6}, /* A7F4 */ + {0xA7F5,0xA7F6},{0xA7F7,0xA7F7}, /* A7F6 */ + {0xA7F8,0xA7F8},{0xA7F9,0xA7F9}, /* A7F8 */ + {0xA7FA,0xA7FA},{0xA7FB,0xA7FB}, /* A7FA */ + {0xA7FC,0xA7FC},{0xA7FD,0xA7FD}, /* A7FC */ + {0xA7FE,0xA7FE},{0xA7FF,0xA7FF} /* A7FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_pageAB[256]={ + {0xAB00,0xAB00},{0xAB01,0xAB01}, /* AB00 */ + {0xAB02,0xAB02},{0xAB03,0xAB03}, /* AB02 */ + {0xAB04,0xAB04},{0xAB05,0xAB05}, /* AB04 */ + {0xAB06,0xAB06},{0xAB07,0xAB07}, /* AB06 */ + {0xAB08,0xAB08},{0xAB09,0xAB09}, /* AB08 */ + {0xAB0A,0xAB0A},{0xAB0B,0xAB0B}, /* AB0A */ + {0xAB0C,0xAB0C},{0xAB0D,0xAB0D}, /* AB0C */ + {0xAB0E,0xAB0E},{0xAB0F,0xAB0F}, /* AB0E */ + {0xAB10,0xAB10},{0xAB11,0xAB11}, /* AB10 */ + {0xAB12,0xAB12},{0xAB13,0xAB13}, /* AB12 */ + {0xAB14,0xAB14},{0xAB15,0xAB15}, /* AB14 */ + {0xAB16,0xAB16},{0xAB17,0xAB17}, /* AB16 */ + {0xAB18,0xAB18},{0xAB19,0xAB19}, /* AB18 */ + {0xAB1A,0xAB1A},{0xAB1B,0xAB1B}, /* AB1A */ + {0xAB1C,0xAB1C},{0xAB1D,0xAB1D}, /* AB1C */ + {0xAB1E,0xAB1E},{0xAB1F,0xAB1F}, /* AB1E */ + {0xAB20,0xAB20},{0xAB21,0xAB21}, /* AB20 */ + {0xAB22,0xAB22},{0xAB23,0xAB23}, /* AB22 */ + {0xAB24,0xAB24},{0xAB25,0xAB25}, /* AB24 */ + {0xAB26,0xAB26},{0xAB27,0xAB27}, /* AB26 */ + {0xAB28,0xAB28},{0xAB29,0xAB29}, /* AB28 */ + {0xAB2A,0xAB2A},{0xAB2B,0xAB2B}, /* AB2A */ + {0xAB2C,0xAB2C},{0xAB2D,0xAB2D}, /* AB2C */ + {0xAB2E,0xAB2E},{0xAB2F,0xAB2F}, /* AB2E */ + {0xAB30,0xAB30},{0xAB31,0xAB31}, /* AB30 */ + {0xAB32,0xAB32},{0xAB33,0xAB33}, /* AB32 */ + {0xAB34,0xAB34},{0xAB35,0xAB35}, /* AB34 */ + {0xAB36,0xAB36},{0xAB37,0xAB37}, /* AB36 */ + {0xAB38,0xAB38},{0xAB39,0xAB39}, /* AB38 */ + {0xAB3A,0xAB3A},{0xAB3B,0xAB3B}, /* AB3A */ + {0xAB3C,0xAB3C},{0xAB3D,0xAB3D}, /* AB3C */ + {0xAB3E,0xAB3E},{0xAB3F,0xAB3F}, /* AB3E */ + {0xAB40,0xAB40},{0xAB41,0xAB41}, /* AB40 */ + {0xAB42,0xAB42},{0xAB43,0xAB43}, /* AB42 */ + {0xAB44,0xAB44},{0xAB45,0xAB45}, /* AB44 */ + {0xAB46,0xAB46},{0xAB47,0xAB47}, /* AB46 */ + {0xAB48,0xAB48},{0xAB49,0xAB49}, /* AB48 */ + {0xAB4A,0xAB4A},{0xAB4B,0xAB4B}, /* AB4A */ + {0xAB4C,0xAB4C},{0xAB4D,0xAB4D}, /* AB4C */ + {0xAB4E,0xAB4E},{0xAB4F,0xAB4F}, /* AB4E */ + {0xAB50,0xAB50},{0xAB51,0xAB51}, /* AB50 */ + {0xAB52,0xAB52},{0xA7B3,0xAB53}, /* AB52 */ + {0xAB54,0xAB54},{0xAB55,0xAB55}, /* AB54 */ + {0xAB56,0xAB56},{0xAB57,0xAB57}, /* AB56 */ + {0xAB58,0xAB58},{0xAB59,0xAB59}, /* AB58 */ + {0xAB5A,0xAB5A},{0xAB5B,0xAB5B}, /* AB5A */ + {0xAB5C,0xAB5C},{0xAB5D,0xAB5D}, /* AB5C */ + {0xAB5E,0xAB5E},{0xAB5F,0xAB5F}, /* AB5E */ + {0xAB60,0xAB60},{0xAB61,0xAB61}, /* AB60 */ + {0xAB62,0xAB62},{0xAB63,0xAB63}, /* AB62 */ + {0xAB64,0xAB64},{0xAB65,0xAB65}, /* AB64 */ + {0xAB66,0xAB66},{0xAB67,0xAB67}, /* AB66 */ + {0xAB68,0xAB68},{0xAB69,0xAB69}, /* AB68 */ + {0xAB6A,0xAB6A},{0xAB6B,0xAB6B}, /* AB6A */ + {0xAB6C,0xAB6C},{0xAB6D,0xAB6D}, /* AB6C */ + {0xAB6E,0xAB6E},{0xAB6F,0xAB6F}, /* AB6E */ + {0x13A0,0xAB70},{0x13A1,0xAB71}, /* AB70 */ + {0x13A2,0xAB72},{0x13A3,0xAB73}, /* AB72 */ + {0x13A4,0xAB74},{0x13A5,0xAB75}, /* AB74 */ + {0x13A6,0xAB76},{0x13A7,0xAB77}, /* AB76 */ + {0x13A8,0xAB78},{0x13A9,0xAB79}, /* AB78 */ + {0x13AA,0xAB7A},{0x13AB,0xAB7B}, /* AB7A */ + {0x13AC,0xAB7C},{0x13AD,0xAB7D}, /* AB7C */ + {0x13AE,0xAB7E},{0x13AF,0xAB7F}, /* AB7E */ + {0x13B0,0xAB80},{0x13B1,0xAB81}, /* AB80 */ + {0x13B2,0xAB82},{0x13B3,0xAB83}, /* AB82 */ + {0x13B4,0xAB84},{0x13B5,0xAB85}, /* AB84 */ + {0x13B6,0xAB86},{0x13B7,0xAB87}, /* AB86 */ + {0x13B8,0xAB88},{0x13B9,0xAB89}, /* AB88 */ + {0x13BA,0xAB8A},{0x13BB,0xAB8B}, /* AB8A */ + {0x13BC,0xAB8C},{0x13BD,0xAB8D}, /* AB8C */ + {0x13BE,0xAB8E},{0x13BF,0xAB8F}, /* AB8E */ + {0x13C0,0xAB90},{0x13C1,0xAB91}, /* AB90 */ + {0x13C2,0xAB92},{0x13C3,0xAB93}, /* AB92 */ + {0x13C4,0xAB94},{0x13C5,0xAB95}, /* AB94 */ + {0x13C6,0xAB96},{0x13C7,0xAB97}, /* AB96 */ + {0x13C8,0xAB98},{0x13C9,0xAB99}, /* AB98 */ + {0x13CA,0xAB9A},{0x13CB,0xAB9B}, /* AB9A */ + {0x13CC,0xAB9C},{0x13CD,0xAB9D}, /* AB9C */ + {0x13CE,0xAB9E},{0x13CF,0xAB9F}, /* AB9E */ + {0x13D0,0xABA0},{0x13D1,0xABA1}, /* ABA0 */ + {0x13D2,0xABA2},{0x13D3,0xABA3}, /* ABA2 */ + {0x13D4,0xABA4},{0x13D5,0xABA5}, /* ABA4 */ + {0x13D6,0xABA6},{0x13D7,0xABA7}, /* ABA6 */ + {0x13D8,0xABA8},{0x13D9,0xABA9}, /* ABA8 */ + {0x13DA,0xABAA},{0x13DB,0xABAB}, /* ABAA */ + {0x13DC,0xABAC},{0x13DD,0xABAD}, /* ABAC */ + {0x13DE,0xABAE},{0x13DF,0xABAF}, /* ABAE */ + {0x13E0,0xABB0},{0x13E1,0xABB1}, /* ABB0 */ + {0x13E2,0xABB2},{0x13E3,0xABB3}, /* ABB2 */ + {0x13E4,0xABB4},{0x13E5,0xABB5}, /* ABB4 */ + {0x13E6,0xABB6},{0x13E7,0xABB7}, /* ABB6 */ + {0x13E8,0xABB8},{0x13E9,0xABB9}, /* ABB8 */ + {0x13EA,0xABBA},{0x13EB,0xABBB}, /* ABBA */ + {0x13EC,0xABBC},{0x13ED,0xABBD}, /* ABBC */ + {0x13EE,0xABBE},{0x13EF,0xABBF}, /* ABBE */ + {0xABC0,0xABC0},{0xABC1,0xABC1}, /* ABC0 */ + {0xABC2,0xABC2},{0xABC3,0xABC3}, /* ABC2 */ + {0xABC4,0xABC4},{0xABC5,0xABC5}, /* ABC4 */ + {0xABC6,0xABC6},{0xABC7,0xABC7}, /* ABC6 */ + {0xABC8,0xABC8},{0xABC9,0xABC9}, /* ABC8 */ + {0xABCA,0xABCA},{0xABCB,0xABCB}, /* ABCA */ + {0xABCC,0xABCC},{0xABCD,0xABCD}, /* ABCC */ + {0xABCE,0xABCE},{0xABCF,0xABCF}, /* ABCE */ + {0xABD0,0xABD0},{0xABD1,0xABD1}, /* ABD0 */ + {0xABD2,0xABD2},{0xABD3,0xABD3}, /* ABD2 */ + {0xABD4,0xABD4},{0xABD5,0xABD5}, /* ABD4 */ + {0xABD6,0xABD6},{0xABD7,0xABD7}, /* ABD6 */ + {0xABD8,0xABD8},{0xABD9,0xABD9}, /* ABD8 */ + {0xABDA,0xABDA},{0xABDB,0xABDB}, /* ABDA */ + {0xABDC,0xABDC},{0xABDD,0xABDD}, /* ABDC */ + {0xABDE,0xABDE},{0xABDF,0xABDF}, /* ABDE */ + {0xABE0,0xABE0},{0xABE1,0xABE1}, /* ABE0 */ + {0xABE2,0xABE2},{0xABE3,0xABE3}, /* ABE2 */ + {0xABE4,0xABE4},{0xABE5,0xABE5}, /* ABE4 */ + {0xABE6,0xABE6},{0xABE7,0xABE7}, /* ABE6 */ + {0xABE8,0xABE8},{0xABE9,0xABE9}, /* ABE8 */ + {0xABEA,0xABEA},{0xABEB,0xABEB}, /* ABEA */ + {0xABEC,0xABEC},{0xABED,0xABED}, /* ABEC */ + {0xABEE,0xABEE},{0xABEF,0xABEF}, /* ABEE */ + {0xABF0,0xABF0},{0xABF1,0xABF1}, /* ABF0 */ + {0xABF2,0xABF2},{0xABF3,0xABF3}, /* ABF2 */ + {0xABF4,0xABF4},{0xABF5,0xABF5}, /* ABF4 */ + {0xABF6,0xABF6},{0xABF7,0xABF7}, /* ABF6 */ + {0xABF8,0xABF8},{0xABF9,0xABF9}, /* ABF8 */ + {0xABFA,0xABFA},{0xABFB,0xABFB}, /* ABFA */ + {0xABFC,0xABFC},{0xABFD,0xABFD}, /* ABFC */ + {0xABFE,0xABFE},{0xABFF,0xABFF} /* ABFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_pageFF[256]={ + {0xFF00,0xFF00},{0xFF01,0xFF01}, /* FF00 */ + {0xFF02,0xFF02},{0xFF03,0xFF03}, /* FF02 */ + {0xFF04,0xFF04},{0xFF05,0xFF05}, /* FF04 */ + {0xFF06,0xFF06},{0xFF07,0xFF07}, /* FF06 */ + {0xFF08,0xFF08},{0xFF09,0xFF09}, /* FF08 */ + {0xFF0A,0xFF0A},{0xFF0B,0xFF0B}, /* FF0A */ + {0xFF0C,0xFF0C},{0xFF0D,0xFF0D}, /* FF0C */ + {0xFF0E,0xFF0E},{0xFF0F,0xFF0F}, /* FF0E */ + {0xFF10,0xFF10},{0xFF11,0xFF11}, /* FF10 */ + {0xFF12,0xFF12},{0xFF13,0xFF13}, /* FF12 */ + {0xFF14,0xFF14},{0xFF15,0xFF15}, /* FF14 */ + {0xFF16,0xFF16},{0xFF17,0xFF17}, /* FF16 */ + {0xFF18,0xFF18},{0xFF19,0xFF19}, /* FF18 */ + {0xFF1A,0xFF1A},{0xFF1B,0xFF1B}, /* FF1A */ + {0xFF1C,0xFF1C},{0xFF1D,0xFF1D}, /* FF1C */ + {0xFF1E,0xFF1E},{0xFF1F,0xFF1F}, /* FF1E */ + {0xFF20,0xFF20},{0xFF21,0xFF41}, /* FF20 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF22 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF24 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF26 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF28 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF2A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF2C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF2E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF30 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF32 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF34 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF36 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF38 */ + {0xFF3A,0xFF5A},{0xFF3B,0xFF3B}, /* FF3A */ + {0xFF3C,0xFF3C},{0xFF3D,0xFF3D}, /* FF3C */ + {0xFF3E,0xFF3E},{0xFF3F,0xFF3F}, /* FF3E */ + {0xFF40,0xFF40},{0xFF21,0xFF41}, /* FF40 */ + {0xFF22,0xFF42},{0xFF23,0xFF43}, /* FF42 */ + {0xFF24,0xFF44},{0xFF25,0xFF45}, /* FF44 */ + {0xFF26,0xFF46},{0xFF27,0xFF47}, /* FF46 */ + {0xFF28,0xFF48},{0xFF29,0xFF49}, /* FF48 */ + {0xFF2A,0xFF4A},{0xFF2B,0xFF4B}, /* FF4A */ + {0xFF2C,0xFF4C},{0xFF2D,0xFF4D}, /* FF4C */ + {0xFF2E,0xFF4E},{0xFF2F,0xFF4F}, /* FF4E */ + {0xFF30,0xFF50},{0xFF31,0xFF51}, /* FF50 */ + {0xFF32,0xFF52},{0xFF33,0xFF53}, /* FF52 */ + {0xFF34,0xFF54},{0xFF35,0xFF55}, /* FF54 */ + {0xFF36,0xFF56},{0xFF37,0xFF57}, /* FF56 */ + {0xFF38,0xFF58},{0xFF39,0xFF59}, /* FF58 */ + {0xFF3A,0xFF5A},{0xFF5B,0xFF5B}, /* FF5A */ + {0xFF5C,0xFF5C},{0xFF5D,0xFF5D}, /* FF5C */ + {0xFF5E,0xFF5E},{0xFF5F,0xFF5F}, /* FF5E */ + {0xFF60,0xFF60},{0xFF61,0xFF61}, /* FF60 */ + {0xFF62,0xFF62},{0xFF63,0xFF63}, /* FF62 */ + {0xFF64,0xFF64},{0xFF65,0xFF65}, /* FF64 */ + {0xFF66,0xFF66},{0xFF67,0xFF67}, /* FF66 */ + {0xFF68,0xFF68},{0xFF69,0xFF69}, /* FF68 */ + {0xFF6A,0xFF6A},{0xFF6B,0xFF6B}, /* FF6A */ + {0xFF6C,0xFF6C},{0xFF6D,0xFF6D}, /* FF6C */ + {0xFF6E,0xFF6E},{0xFF6F,0xFF6F}, /* FF6E */ + {0xFF70,0xFF70},{0xFF71,0xFF71}, /* FF70 */ + {0xFF72,0xFF72},{0xFF73,0xFF73}, /* FF72 */ + {0xFF74,0xFF74},{0xFF75,0xFF75}, /* FF74 */ + {0xFF76,0xFF76},{0xFF77,0xFF77}, /* FF76 */ + {0xFF78,0xFF78},{0xFF79,0xFF79}, /* FF78 */ + {0xFF7A,0xFF7A},{0xFF7B,0xFF7B}, /* FF7A */ + {0xFF7C,0xFF7C},{0xFF7D,0xFF7D}, /* FF7C */ + {0xFF7E,0xFF7E},{0xFF7F,0xFF7F}, /* FF7E */ + {0xFF80,0xFF80},{0xFF81,0xFF81}, /* FF80 */ + {0xFF82,0xFF82},{0xFF83,0xFF83}, /* FF82 */ + {0xFF84,0xFF84},{0xFF85,0xFF85}, /* FF84 */ + {0xFF86,0xFF86},{0xFF87,0xFF87}, /* FF86 */ + {0xFF88,0xFF88},{0xFF89,0xFF89}, /* FF88 */ + {0xFF8A,0xFF8A},{0xFF8B,0xFF8B}, /* FF8A */ + {0xFF8C,0xFF8C},{0xFF8D,0xFF8D}, /* FF8C */ + {0xFF8E,0xFF8E},{0xFF8F,0xFF8F}, /* FF8E */ + {0xFF90,0xFF90},{0xFF91,0xFF91}, /* FF90 */ + {0xFF92,0xFF92},{0xFF93,0xFF93}, /* FF92 */ + {0xFF94,0xFF94},{0xFF95,0xFF95}, /* FF94 */ + {0xFF96,0xFF96},{0xFF97,0xFF97}, /* FF96 */ + {0xFF98,0xFF98},{0xFF99,0xFF99}, /* FF98 */ + {0xFF9A,0xFF9A},{0xFF9B,0xFF9B}, /* FF9A */ + {0xFF9C,0xFF9C},{0xFF9D,0xFF9D}, /* FF9C */ + {0xFF9E,0xFF9E},{0xFF9F,0xFF9F}, /* FF9E */ + {0xFFA0,0xFFA0},{0xFFA1,0xFFA1}, /* FFA0 */ + {0xFFA2,0xFFA2},{0xFFA3,0xFFA3}, /* FFA2 */ + {0xFFA4,0xFFA4},{0xFFA5,0xFFA5}, /* FFA4 */ + {0xFFA6,0xFFA6},{0xFFA7,0xFFA7}, /* FFA6 */ + {0xFFA8,0xFFA8},{0xFFA9,0xFFA9}, /* FFA8 */ + {0xFFAA,0xFFAA},{0xFFAB,0xFFAB}, /* FFAA */ + {0xFFAC,0xFFAC},{0xFFAD,0xFFAD}, /* FFAC */ + {0xFFAE,0xFFAE},{0xFFAF,0xFFAF}, /* FFAE */ + {0xFFB0,0xFFB0},{0xFFB1,0xFFB1}, /* FFB0 */ + {0xFFB2,0xFFB2},{0xFFB3,0xFFB3}, /* FFB2 */ + {0xFFB4,0xFFB4},{0xFFB5,0xFFB5}, /* FFB4 */ + {0xFFB6,0xFFB6},{0xFFB7,0xFFB7}, /* FFB6 */ + {0xFFB8,0xFFB8},{0xFFB9,0xFFB9}, /* FFB8 */ + {0xFFBA,0xFFBA},{0xFFBB,0xFFBB}, /* FFBA */ + {0xFFBC,0xFFBC},{0xFFBD,0xFFBD}, /* FFBC */ + {0xFFBE,0xFFBE},{0xFFBF,0xFFBF}, /* FFBE */ + {0xFFC0,0xFFC0},{0xFFC1,0xFFC1}, /* FFC0 */ + {0xFFC2,0xFFC2},{0xFFC3,0xFFC3}, /* FFC2 */ + {0xFFC4,0xFFC4},{0xFFC5,0xFFC5}, /* FFC4 */ + {0xFFC6,0xFFC6},{0xFFC7,0xFFC7}, /* FFC6 */ + {0xFFC8,0xFFC8},{0xFFC9,0xFFC9}, /* FFC8 */ + {0xFFCA,0xFFCA},{0xFFCB,0xFFCB}, /* FFCA */ + {0xFFCC,0xFFCC},{0xFFCD,0xFFCD}, /* FFCC */ + {0xFFCE,0xFFCE},{0xFFCF,0xFFCF}, /* FFCE */ + {0xFFD0,0xFFD0},{0xFFD1,0xFFD1}, /* FFD0 */ + {0xFFD2,0xFFD2},{0xFFD3,0xFFD3}, /* FFD2 */ + {0xFFD4,0xFFD4},{0xFFD5,0xFFD5}, /* FFD4 */ + {0xFFD6,0xFFD6},{0xFFD7,0xFFD7}, /* FFD6 */ + {0xFFD8,0xFFD8},{0xFFD9,0xFFD9}, /* FFD8 */ + {0xFFDA,0xFFDA},{0xFFDB,0xFFDB}, /* FFDA */ + {0xFFDC,0xFFDC},{0xFFDD,0xFFDD}, /* FFDC */ + {0xFFDE,0xFFDE},{0xFFDF,0xFFDF}, /* FFDE */ + {0xFFE0,0xFFE0},{0xFFE1,0xFFE1}, /* FFE0 */ + {0xFFE2,0xFFE2},{0xFFE3,0xFFE3}, /* FFE2 */ + {0xFFE4,0xFFE4},{0xFFE5,0xFFE5}, /* FFE4 */ + {0xFFE6,0xFFE6},{0xFFE7,0xFFE7}, /* FFE6 */ + {0xFFE8,0xFFE8},{0xFFE9,0xFFE9}, /* FFE8 */ + {0xFFEA,0xFFEA},{0xFFEB,0xFFEB}, /* FFEA */ + {0xFFEC,0xFFEC},{0xFFED,0xFFED}, /* FFEC */ + {0xFFEE,0xFFEE},{0xFFEF,0xFFEF}, /* FFEE */ + {0xFFF0,0xFFF0},{0xFFF1,0xFFF1}, /* FFF0 */ + {0xFFF2,0xFFF2},{0xFFF3,0xFFF3}, /* FFF2 */ + {0xFFF4,0xFFF4},{0xFFF5,0xFFF5}, /* FFF4 */ + {0xFFF6,0xFFF6},{0xFFF7,0xFFF7}, /* FFF6 */ + {0xFFF8,0xFFF8},{0xFFF9,0xFFF9}, /* FFF8 */ + {0xFFFA,0xFFFA},{0xFFFB,0xFFFB}, /* FFFA */ + {0xFFFC,0xFFFC},{0xFFFD,0xFFFD}, /* FFFC */ + {0xFFFE,0xFFFE},{0xFFFF,0xFFFF} /* FFFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page104[256]={ + {0x10400,0x10428},{0x10401,0x10429}, /* 10400 */ + {0x10402,0x1042A},{0x10403,0x1042B}, /* 10402 */ + {0x10404,0x1042C},{0x10405,0x1042D}, /* 10404 */ + {0x10406,0x1042E},{0x10407,0x1042F}, /* 10406 */ + {0x10408,0x10430},{0x10409,0x10431}, /* 10408 */ + {0x1040A,0x10432},{0x1040B,0x10433}, /* 1040A */ + {0x1040C,0x10434},{0x1040D,0x10435}, /* 1040C */ + {0x1040E,0x10436},{0x1040F,0x10437}, /* 1040E */ + {0x10410,0x10438},{0x10411,0x10439}, /* 10410 */ + {0x10412,0x1043A},{0x10413,0x1043B}, /* 10412 */ + {0x10414,0x1043C},{0x10415,0x1043D}, /* 10414 */ + {0x10416,0x1043E},{0x10417,0x1043F}, /* 10416 */ + {0x10418,0x10440},{0x10419,0x10441}, /* 10418 */ + {0x1041A,0x10442},{0x1041B,0x10443}, /* 1041A */ + {0x1041C,0x10444},{0x1041D,0x10445}, /* 1041C */ + {0x1041E,0x10446},{0x1041F,0x10447}, /* 1041E */ + {0x10420,0x10448},{0x10421,0x10449}, /* 10420 */ + {0x10422,0x1044A},{0x10423,0x1044B}, /* 10422 */ + {0x10424,0x1044C},{0x10425,0x1044D}, /* 10424 */ + {0x10426,0x1044E},{0x10427,0x1044F}, /* 10426 */ + {0x10400,0x10428},{0x10401,0x10429}, /* 10428 */ + {0x10402,0x1042A},{0x10403,0x1042B}, /* 1042A */ + {0x10404,0x1042C},{0x10405,0x1042D}, /* 1042C */ + {0x10406,0x1042E},{0x10407,0x1042F}, /* 1042E */ + {0x10408,0x10430},{0x10409,0x10431}, /* 10430 */ + {0x1040A,0x10432},{0x1040B,0x10433}, /* 10432 */ + {0x1040C,0x10434},{0x1040D,0x10435}, /* 10434 */ + {0x1040E,0x10436},{0x1040F,0x10437}, /* 10436 */ + {0x10410,0x10438},{0x10411,0x10439}, /* 10438 */ + {0x10412,0x1043A},{0x10413,0x1043B}, /* 1043A */ + {0x10414,0x1043C},{0x10415,0x1043D}, /* 1043C */ + {0x10416,0x1043E},{0x10417,0x1043F}, /* 1043E */ + {0x10418,0x10440},{0x10419,0x10441}, /* 10440 */ + {0x1041A,0x10442},{0x1041B,0x10443}, /* 10442 */ + {0x1041C,0x10444},{0x1041D,0x10445}, /* 10444 */ + {0x1041E,0x10446},{0x1041F,0x10447}, /* 10446 */ + {0x10420,0x10448},{0x10421,0x10449}, /* 10448 */ + {0x10422,0x1044A},{0x10423,0x1044B}, /* 1044A */ + {0x10424,0x1044C},{0x10425,0x1044D}, /* 1044C */ + {0x10426,0x1044E},{0x10427,0x1044F}, /* 1044E */ + {0x10450,0x10450},{0x10451,0x10451}, /* 10450 */ + {0x10452,0x10452},{0x10453,0x10453}, /* 10452 */ + {0x10454,0x10454},{0x10455,0x10455}, /* 10454 */ + {0x10456,0x10456},{0x10457,0x10457}, /* 10456 */ + {0x10458,0x10458},{0x10459,0x10459}, /* 10458 */ + {0x1045A,0x1045A},{0x1045B,0x1045B}, /* 1045A */ + {0x1045C,0x1045C},{0x1045D,0x1045D}, /* 1045C */ + {0x1045E,0x1045E},{0x1045F,0x1045F}, /* 1045E */ + {0x10460,0x10460},{0x10461,0x10461}, /* 10460 */ + {0x10462,0x10462},{0x10463,0x10463}, /* 10462 */ + {0x10464,0x10464},{0x10465,0x10465}, /* 10464 */ + {0x10466,0x10466},{0x10467,0x10467}, /* 10466 */ + {0x10468,0x10468},{0x10469,0x10469}, /* 10468 */ + {0x1046A,0x1046A},{0x1046B,0x1046B}, /* 1046A */ + {0x1046C,0x1046C},{0x1046D,0x1046D}, /* 1046C */ + {0x1046E,0x1046E},{0x1046F,0x1046F}, /* 1046E */ + {0x10470,0x10470},{0x10471,0x10471}, /* 10470 */ + {0x10472,0x10472},{0x10473,0x10473}, /* 10472 */ + {0x10474,0x10474},{0x10475,0x10475}, /* 10474 */ + {0x10476,0x10476},{0x10477,0x10477}, /* 10476 */ + {0x10478,0x10478},{0x10479,0x10479}, /* 10478 */ + {0x1047A,0x1047A},{0x1047B,0x1047B}, /* 1047A */ + {0x1047C,0x1047C},{0x1047D,0x1047D}, /* 1047C */ + {0x1047E,0x1047E},{0x1047F,0x1047F}, /* 1047E */ + {0x10480,0x10480},{0x10481,0x10481}, /* 10480 */ + {0x10482,0x10482},{0x10483,0x10483}, /* 10482 */ + {0x10484,0x10484},{0x10485,0x10485}, /* 10484 */ + {0x10486,0x10486},{0x10487,0x10487}, /* 10486 */ + {0x10488,0x10488},{0x10489,0x10489}, /* 10488 */ + {0x1048A,0x1048A},{0x1048B,0x1048B}, /* 1048A */ + {0x1048C,0x1048C},{0x1048D,0x1048D}, /* 1048C */ + {0x1048E,0x1048E},{0x1048F,0x1048F}, /* 1048E */ + {0x10490,0x10490},{0x10491,0x10491}, /* 10490 */ + {0x10492,0x10492},{0x10493,0x10493}, /* 10492 */ + {0x10494,0x10494},{0x10495,0x10495}, /* 10494 */ + {0x10496,0x10496},{0x10497,0x10497}, /* 10496 */ + {0x10498,0x10498},{0x10499,0x10499}, /* 10498 */ + {0x1049A,0x1049A},{0x1049B,0x1049B}, /* 1049A */ + {0x1049C,0x1049C},{0x1049D,0x1049D}, /* 1049C */ + {0x1049E,0x1049E},{0x1049F,0x1049F}, /* 1049E */ + {0x104A0,0x104A0},{0x104A1,0x104A1}, /* 104A0 */ + {0x104A2,0x104A2},{0x104A3,0x104A3}, /* 104A2 */ + {0x104A4,0x104A4},{0x104A5,0x104A5}, /* 104A4 */ + {0x104A6,0x104A6},{0x104A7,0x104A7}, /* 104A6 */ + {0x104A8,0x104A8},{0x104A9,0x104A9}, /* 104A8 */ + {0x104AA,0x104AA},{0x104AB,0x104AB}, /* 104AA */ + {0x104AC,0x104AC},{0x104AD,0x104AD}, /* 104AC */ + {0x104AE,0x104AE},{0x104AF,0x104AF}, /* 104AE */ + {0x104B0,0x104D8},{0x104B1,0x104D9}, /* 104B0 */ + {0x104B2,0x104DA},{0x104B3,0x104DB}, /* 104B2 */ + {0x104B4,0x104DC},{0x104B5,0x104DD}, /* 104B4 */ + {0x104B6,0x104DE},{0x104B7,0x104DF}, /* 104B6 */ + {0x104B8,0x104E0},{0x104B9,0x104E1}, /* 104B8 */ + {0x104BA,0x104E2},{0x104BB,0x104E3}, /* 104BA */ + {0x104BC,0x104E4},{0x104BD,0x104E5}, /* 104BC */ + {0x104BE,0x104E6},{0x104BF,0x104E7}, /* 104BE */ + {0x104C0,0x104E8},{0x104C1,0x104E9}, /* 104C0 */ + {0x104C2,0x104EA},{0x104C3,0x104EB}, /* 104C2 */ + {0x104C4,0x104EC},{0x104C5,0x104ED}, /* 104C4 */ + {0x104C6,0x104EE},{0x104C7,0x104EF}, /* 104C6 */ + {0x104C8,0x104F0},{0x104C9,0x104F1}, /* 104C8 */ + {0x104CA,0x104F2},{0x104CB,0x104F3}, /* 104CA */ + {0x104CC,0x104F4},{0x104CD,0x104F5}, /* 104CC */ + {0x104CE,0x104F6},{0x104CF,0x104F7}, /* 104CE */ + {0x104D0,0x104F8},{0x104D1,0x104F9}, /* 104D0 */ + {0x104D2,0x104FA},{0x104D3,0x104FB}, /* 104D2 */ + {0x104D4,0x104D4},{0x104D5,0x104D5}, /* 104D4 */ + {0x104D6,0x104D6},{0x104D7,0x104D7}, /* 104D6 */ + {0x104B0,0x104D8},{0x104B1,0x104D9}, /* 104D8 */ + {0x104B2,0x104DA},{0x104B3,0x104DB}, /* 104DA */ + {0x104B4,0x104DC},{0x104B5,0x104DD}, /* 104DC */ + {0x104B6,0x104DE},{0x104B7,0x104DF}, /* 104DE */ + {0x104B8,0x104E0},{0x104B9,0x104E1}, /* 104E0 */ + {0x104BA,0x104E2},{0x104BB,0x104E3}, /* 104E2 */ + {0x104BC,0x104E4},{0x104BD,0x104E5}, /* 104E4 */ + {0x104BE,0x104E6},{0x104BF,0x104E7}, /* 104E6 */ + {0x104C0,0x104E8},{0x104C1,0x104E9}, /* 104E8 */ + {0x104C2,0x104EA},{0x104C3,0x104EB}, /* 104EA */ + {0x104C4,0x104EC},{0x104C5,0x104ED}, /* 104EC */ + {0x104C6,0x104EE},{0x104C7,0x104EF}, /* 104EE */ + {0x104C8,0x104F0},{0x104C9,0x104F1}, /* 104F0 */ + {0x104CA,0x104F2},{0x104CB,0x104F3}, /* 104F2 */ + {0x104CC,0x104F4},{0x104CD,0x104F5}, /* 104F4 */ + {0x104CE,0x104F6},{0x104CF,0x104F7}, /* 104F6 */ + {0x104D0,0x104F8},{0x104D1,0x104F9}, /* 104F8 */ + {0x104D2,0x104FA},{0x104D3,0x104FB}, /* 104FA */ + {0x104FC,0x104FC},{0x104FD,0x104FD}, /* 104FC */ + {0x104FE,0x104FE},{0x104FF,0x104FF} /* 104FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page105[256]={ + {0x10500,0x10500},{0x10501,0x10501}, /* 10500 */ + {0x10502,0x10502},{0x10503,0x10503}, /* 10502 */ + {0x10504,0x10504},{0x10505,0x10505}, /* 10504 */ + {0x10506,0x10506},{0x10507,0x10507}, /* 10506 */ + {0x10508,0x10508},{0x10509,0x10509}, /* 10508 */ + {0x1050A,0x1050A},{0x1050B,0x1050B}, /* 1050A */ + {0x1050C,0x1050C},{0x1050D,0x1050D}, /* 1050C */ + {0x1050E,0x1050E},{0x1050F,0x1050F}, /* 1050E */ + {0x10510,0x10510},{0x10511,0x10511}, /* 10510 */ + {0x10512,0x10512},{0x10513,0x10513}, /* 10512 */ + {0x10514,0x10514},{0x10515,0x10515}, /* 10514 */ + {0x10516,0x10516},{0x10517,0x10517}, /* 10516 */ + {0x10518,0x10518},{0x10519,0x10519}, /* 10518 */ + {0x1051A,0x1051A},{0x1051B,0x1051B}, /* 1051A */ + {0x1051C,0x1051C},{0x1051D,0x1051D}, /* 1051C */ + {0x1051E,0x1051E},{0x1051F,0x1051F}, /* 1051E */ + {0x10520,0x10520},{0x10521,0x10521}, /* 10520 */ + {0x10522,0x10522},{0x10523,0x10523}, /* 10522 */ + {0x10524,0x10524},{0x10525,0x10525}, /* 10524 */ + {0x10526,0x10526},{0x10527,0x10527}, /* 10526 */ + {0x10528,0x10528},{0x10529,0x10529}, /* 10528 */ + {0x1052A,0x1052A},{0x1052B,0x1052B}, /* 1052A */ + {0x1052C,0x1052C},{0x1052D,0x1052D}, /* 1052C */ + {0x1052E,0x1052E},{0x1052F,0x1052F}, /* 1052E */ + {0x10530,0x10530},{0x10531,0x10531}, /* 10530 */ + {0x10532,0x10532},{0x10533,0x10533}, /* 10532 */ + {0x10534,0x10534},{0x10535,0x10535}, /* 10534 */ + {0x10536,0x10536},{0x10537,0x10537}, /* 10536 */ + {0x10538,0x10538},{0x10539,0x10539}, /* 10538 */ + {0x1053A,0x1053A},{0x1053B,0x1053B}, /* 1053A */ + {0x1053C,0x1053C},{0x1053D,0x1053D}, /* 1053C */ + {0x1053E,0x1053E},{0x1053F,0x1053F}, /* 1053E */ + {0x10540,0x10540},{0x10541,0x10541}, /* 10540 */ + {0x10542,0x10542},{0x10543,0x10543}, /* 10542 */ + {0x10544,0x10544},{0x10545,0x10545}, /* 10544 */ + {0x10546,0x10546},{0x10547,0x10547}, /* 10546 */ + {0x10548,0x10548},{0x10549,0x10549}, /* 10548 */ + {0x1054A,0x1054A},{0x1054B,0x1054B}, /* 1054A */ + {0x1054C,0x1054C},{0x1054D,0x1054D}, /* 1054C */ + {0x1054E,0x1054E},{0x1054F,0x1054F}, /* 1054E */ + {0x10550,0x10550},{0x10551,0x10551}, /* 10550 */ + {0x10552,0x10552},{0x10553,0x10553}, /* 10552 */ + {0x10554,0x10554},{0x10555,0x10555}, /* 10554 */ + {0x10556,0x10556},{0x10557,0x10557}, /* 10556 */ + {0x10558,0x10558},{0x10559,0x10559}, /* 10558 */ + {0x1055A,0x1055A},{0x1055B,0x1055B}, /* 1055A */ + {0x1055C,0x1055C},{0x1055D,0x1055D}, /* 1055C */ + {0x1055E,0x1055E},{0x1055F,0x1055F}, /* 1055E */ + {0x10560,0x10560},{0x10561,0x10561}, /* 10560 */ + {0x10562,0x10562},{0x10563,0x10563}, /* 10562 */ + {0x10564,0x10564},{0x10565,0x10565}, /* 10564 */ + {0x10566,0x10566},{0x10567,0x10567}, /* 10566 */ + {0x10568,0x10568},{0x10569,0x10569}, /* 10568 */ + {0x1056A,0x1056A},{0x1056B,0x1056B}, /* 1056A */ + {0x1056C,0x1056C},{0x1056D,0x1056D}, /* 1056C */ + {0x1056E,0x1056E},{0x1056F,0x1056F}, /* 1056E */ + {0x10570,0x10597},{0x10571,0x10598}, /* 10570 */ + {0x10572,0x10599},{0x10573,0x1059A}, /* 10572 */ + {0x10574,0x1059B},{0x10575,0x1059C}, /* 10574 */ + {0x10576,0x1059D},{0x10577,0x1059E}, /* 10576 */ + {0x10578,0x1059F},{0x10579,0x105A0}, /* 10578 */ + {0x1057A,0x105A1},{0x1057B,0x1057B}, /* 1057A */ + {0x1057C,0x105A3},{0x1057D,0x105A4}, /* 1057C */ + {0x1057E,0x105A5},{0x1057F,0x105A6}, /* 1057E */ + {0x10580,0x105A7},{0x10581,0x105A8}, /* 10580 */ + {0x10582,0x105A9},{0x10583,0x105AA}, /* 10582 */ + {0x10584,0x105AB},{0x10585,0x105AC}, /* 10584 */ + {0x10586,0x105AD},{0x10587,0x105AE}, /* 10586 */ + {0x10588,0x105AF},{0x10589,0x105B0}, /* 10588 */ + {0x1058A,0x105B1},{0x1058B,0x1058B}, /* 1058A */ + {0x1058C,0x105B3},{0x1058D,0x105B4}, /* 1058C */ + {0x1058E,0x105B5},{0x1058F,0x105B6}, /* 1058E */ + {0x10590,0x105B7},{0x10591,0x105B8}, /* 10590 */ + {0x10592,0x105B9},{0x10593,0x10593}, /* 10592 */ + {0x10594,0x105BB},{0x10595,0x105BC}, /* 10594 */ + {0x10596,0x10596},{0x10570,0x10597}, /* 10596 */ + {0x10571,0x10598},{0x10572,0x10599}, /* 10598 */ + {0x10573,0x1059A},{0x10574,0x1059B}, /* 1059A */ + {0x10575,0x1059C},{0x10576,0x1059D}, /* 1059C */ + {0x10577,0x1059E},{0x10578,0x1059F}, /* 1059E */ + {0x10579,0x105A0},{0x1057A,0x105A1}, /* 105A0 */ + {0x105A2,0x105A2},{0x1057C,0x105A3}, /* 105A2 */ + {0x1057D,0x105A4},{0x1057E,0x105A5}, /* 105A4 */ + {0x1057F,0x105A6},{0x10580,0x105A7}, /* 105A6 */ + {0x10581,0x105A8},{0x10582,0x105A9}, /* 105A8 */ + {0x10583,0x105AA},{0x10584,0x105AB}, /* 105AA */ + {0x10585,0x105AC},{0x10586,0x105AD}, /* 105AC */ + {0x10587,0x105AE},{0x10588,0x105AF}, /* 105AE */ + {0x10589,0x105B0},{0x1058A,0x105B1}, /* 105B0 */ + {0x105B2,0x105B2},{0x1058C,0x105B3}, /* 105B2 */ + {0x1058D,0x105B4},{0x1058E,0x105B5}, /* 105B4 */ + {0x1058F,0x105B6},{0x10590,0x105B7}, /* 105B6 */ + {0x10591,0x105B8},{0x10592,0x105B9}, /* 105B8 */ + {0x105BA,0x105BA},{0x10594,0x105BB}, /* 105BA */ + {0x10595,0x105BC},{0x105BD,0x105BD}, /* 105BC */ + {0x105BE,0x105BE},{0x105BF,0x105BF}, /* 105BE */ + {0x105C0,0x105C0},{0x105C1,0x105C1}, /* 105C0 */ + {0x105C2,0x105C2},{0x105C3,0x105C3}, /* 105C2 */ + {0x105C4,0x105C4},{0x105C5,0x105C5}, /* 105C4 */ + {0x105C6,0x105C6},{0x105C7,0x105C7}, /* 105C6 */ + {0x105C8,0x105C8},{0x105C9,0x105C9}, /* 105C8 */ + {0x105CA,0x105CA},{0x105CB,0x105CB}, /* 105CA */ + {0x105CC,0x105CC},{0x105CD,0x105CD}, /* 105CC */ + {0x105CE,0x105CE},{0x105CF,0x105CF}, /* 105CE */ + {0x105D0,0x105D0},{0x105D1,0x105D1}, /* 105D0 */ + {0x105D2,0x105D2},{0x105D3,0x105D3}, /* 105D2 */ + {0x105D4,0x105D4},{0x105D5,0x105D5}, /* 105D4 */ + {0x105D6,0x105D6},{0x105D7,0x105D7}, /* 105D6 */ + {0x105D8,0x105D8},{0x105D9,0x105D9}, /* 105D8 */ + {0x105DA,0x105DA},{0x105DB,0x105DB}, /* 105DA */ + {0x105DC,0x105DC},{0x105DD,0x105DD}, /* 105DC */ + {0x105DE,0x105DE},{0x105DF,0x105DF}, /* 105DE */ + {0x105E0,0x105E0},{0x105E1,0x105E1}, /* 105E0 */ + {0x105E2,0x105E2},{0x105E3,0x105E3}, /* 105E2 */ + {0x105E4,0x105E4},{0x105E5,0x105E5}, /* 105E4 */ + {0x105E6,0x105E6},{0x105E7,0x105E7}, /* 105E6 */ + {0x105E8,0x105E8},{0x105E9,0x105E9}, /* 105E8 */ + {0x105EA,0x105EA},{0x105EB,0x105EB}, /* 105EA */ + {0x105EC,0x105EC},{0x105ED,0x105ED}, /* 105EC */ + {0x105EE,0x105EE},{0x105EF,0x105EF}, /* 105EE */ + {0x105F0,0x105F0},{0x105F1,0x105F1}, /* 105F0 */ + {0x105F2,0x105F2},{0x105F3,0x105F3}, /* 105F2 */ + {0x105F4,0x105F4},{0x105F5,0x105F5}, /* 105F4 */ + {0x105F6,0x105F6},{0x105F7,0x105F7}, /* 105F6 */ + {0x105F8,0x105F8},{0x105F9,0x105F9}, /* 105F8 */ + {0x105FA,0x105FA},{0x105FB,0x105FB}, /* 105FA */ + {0x105FC,0x105FC},{0x105FD,0x105FD}, /* 105FC */ + {0x105FE,0x105FE},{0x105FF,0x105FF} /* 105FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page10C[256]={ + {0x10C00,0x10C00},{0x10C01,0x10C01}, /* 10C00 */ + {0x10C02,0x10C02},{0x10C03,0x10C03}, /* 10C02 */ + {0x10C04,0x10C04},{0x10C05,0x10C05}, /* 10C04 */ + {0x10C06,0x10C06},{0x10C07,0x10C07}, /* 10C06 */ + {0x10C08,0x10C08},{0x10C09,0x10C09}, /* 10C08 */ + {0x10C0A,0x10C0A},{0x10C0B,0x10C0B}, /* 10C0A */ + {0x10C0C,0x10C0C},{0x10C0D,0x10C0D}, /* 10C0C */ + {0x10C0E,0x10C0E},{0x10C0F,0x10C0F}, /* 10C0E */ + {0x10C10,0x10C10},{0x10C11,0x10C11}, /* 10C10 */ + {0x10C12,0x10C12},{0x10C13,0x10C13}, /* 10C12 */ + {0x10C14,0x10C14},{0x10C15,0x10C15}, /* 10C14 */ + {0x10C16,0x10C16},{0x10C17,0x10C17}, /* 10C16 */ + {0x10C18,0x10C18},{0x10C19,0x10C19}, /* 10C18 */ + {0x10C1A,0x10C1A},{0x10C1B,0x10C1B}, /* 10C1A */ + {0x10C1C,0x10C1C},{0x10C1D,0x10C1D}, /* 10C1C */ + {0x10C1E,0x10C1E},{0x10C1F,0x10C1F}, /* 10C1E */ + {0x10C20,0x10C20},{0x10C21,0x10C21}, /* 10C20 */ + {0x10C22,0x10C22},{0x10C23,0x10C23}, /* 10C22 */ + {0x10C24,0x10C24},{0x10C25,0x10C25}, /* 10C24 */ + {0x10C26,0x10C26},{0x10C27,0x10C27}, /* 10C26 */ + {0x10C28,0x10C28},{0x10C29,0x10C29}, /* 10C28 */ + {0x10C2A,0x10C2A},{0x10C2B,0x10C2B}, /* 10C2A */ + {0x10C2C,0x10C2C},{0x10C2D,0x10C2D}, /* 10C2C */ + {0x10C2E,0x10C2E},{0x10C2F,0x10C2F}, /* 10C2E */ + {0x10C30,0x10C30},{0x10C31,0x10C31}, /* 10C30 */ + {0x10C32,0x10C32},{0x10C33,0x10C33}, /* 10C32 */ + {0x10C34,0x10C34},{0x10C35,0x10C35}, /* 10C34 */ + {0x10C36,0x10C36},{0x10C37,0x10C37}, /* 10C36 */ + {0x10C38,0x10C38},{0x10C39,0x10C39}, /* 10C38 */ + {0x10C3A,0x10C3A},{0x10C3B,0x10C3B}, /* 10C3A */ + {0x10C3C,0x10C3C},{0x10C3D,0x10C3D}, /* 10C3C */ + {0x10C3E,0x10C3E},{0x10C3F,0x10C3F}, /* 10C3E */ + {0x10C40,0x10C40},{0x10C41,0x10C41}, /* 10C40 */ + {0x10C42,0x10C42},{0x10C43,0x10C43}, /* 10C42 */ + {0x10C44,0x10C44},{0x10C45,0x10C45}, /* 10C44 */ + {0x10C46,0x10C46},{0x10C47,0x10C47}, /* 10C46 */ + {0x10C48,0x10C48},{0x10C49,0x10C49}, /* 10C48 */ + {0x10C4A,0x10C4A},{0x10C4B,0x10C4B}, /* 10C4A */ + {0x10C4C,0x10C4C},{0x10C4D,0x10C4D}, /* 10C4C */ + {0x10C4E,0x10C4E},{0x10C4F,0x10C4F}, /* 10C4E */ + {0x10C50,0x10C50},{0x10C51,0x10C51}, /* 10C50 */ + {0x10C52,0x10C52},{0x10C53,0x10C53}, /* 10C52 */ + {0x10C54,0x10C54},{0x10C55,0x10C55}, /* 10C54 */ + {0x10C56,0x10C56},{0x10C57,0x10C57}, /* 10C56 */ + {0x10C58,0x10C58},{0x10C59,0x10C59}, /* 10C58 */ + {0x10C5A,0x10C5A},{0x10C5B,0x10C5B}, /* 10C5A */ + {0x10C5C,0x10C5C},{0x10C5D,0x10C5D}, /* 10C5C */ + {0x10C5E,0x10C5E},{0x10C5F,0x10C5F}, /* 10C5E */ + {0x10C60,0x10C60},{0x10C61,0x10C61}, /* 10C60 */ + {0x10C62,0x10C62},{0x10C63,0x10C63}, /* 10C62 */ + {0x10C64,0x10C64},{0x10C65,0x10C65}, /* 10C64 */ + {0x10C66,0x10C66},{0x10C67,0x10C67}, /* 10C66 */ + {0x10C68,0x10C68},{0x10C69,0x10C69}, /* 10C68 */ + {0x10C6A,0x10C6A},{0x10C6B,0x10C6B}, /* 10C6A */ + {0x10C6C,0x10C6C},{0x10C6D,0x10C6D}, /* 10C6C */ + {0x10C6E,0x10C6E},{0x10C6F,0x10C6F}, /* 10C6E */ + {0x10C70,0x10C70},{0x10C71,0x10C71}, /* 10C70 */ + {0x10C72,0x10C72},{0x10C73,0x10C73}, /* 10C72 */ + {0x10C74,0x10C74},{0x10C75,0x10C75}, /* 10C74 */ + {0x10C76,0x10C76},{0x10C77,0x10C77}, /* 10C76 */ + {0x10C78,0x10C78},{0x10C79,0x10C79}, /* 10C78 */ + {0x10C7A,0x10C7A},{0x10C7B,0x10C7B}, /* 10C7A */ + {0x10C7C,0x10C7C},{0x10C7D,0x10C7D}, /* 10C7C */ + {0x10C7E,0x10C7E},{0x10C7F,0x10C7F}, /* 10C7E */ + {0x10C80,0x10CC0},{0x10C81,0x10CC1}, /* 10C80 */ + {0x10C82,0x10CC2},{0x10C83,0x10CC3}, /* 10C82 */ + {0x10C84,0x10CC4},{0x10C85,0x10CC5}, /* 10C84 */ + {0x10C86,0x10CC6},{0x10C87,0x10CC7}, /* 10C86 */ + {0x10C88,0x10CC8},{0x10C89,0x10CC9}, /* 10C88 */ + {0x10C8A,0x10CCA},{0x10C8B,0x10CCB}, /* 10C8A */ + {0x10C8C,0x10CCC},{0x10C8D,0x10CCD}, /* 10C8C */ + {0x10C8E,0x10CCE},{0x10C8F,0x10CCF}, /* 10C8E */ + {0x10C90,0x10CD0},{0x10C91,0x10CD1}, /* 10C90 */ + {0x10C92,0x10CD2},{0x10C93,0x10CD3}, /* 10C92 */ + {0x10C94,0x10CD4},{0x10C95,0x10CD5}, /* 10C94 */ + {0x10C96,0x10CD6},{0x10C97,0x10CD7}, /* 10C96 */ + {0x10C98,0x10CD8},{0x10C99,0x10CD9}, /* 10C98 */ + {0x10C9A,0x10CDA},{0x10C9B,0x10CDB}, /* 10C9A */ + {0x10C9C,0x10CDC},{0x10C9D,0x10CDD}, /* 10C9C */ + {0x10C9E,0x10CDE},{0x10C9F,0x10CDF}, /* 10C9E */ + {0x10CA0,0x10CE0},{0x10CA1,0x10CE1}, /* 10CA0 */ + {0x10CA2,0x10CE2},{0x10CA3,0x10CE3}, /* 10CA2 */ + {0x10CA4,0x10CE4},{0x10CA5,0x10CE5}, /* 10CA4 */ + {0x10CA6,0x10CE6},{0x10CA7,0x10CE7}, /* 10CA6 */ + {0x10CA8,0x10CE8},{0x10CA9,0x10CE9}, /* 10CA8 */ + {0x10CAA,0x10CEA},{0x10CAB,0x10CEB}, /* 10CAA */ + {0x10CAC,0x10CEC},{0x10CAD,0x10CED}, /* 10CAC */ + {0x10CAE,0x10CEE},{0x10CAF,0x10CEF}, /* 10CAE */ + {0x10CB0,0x10CF0},{0x10CB1,0x10CF1}, /* 10CB0 */ + {0x10CB2,0x10CF2},{0x10CB3,0x10CB3}, /* 10CB2 */ + {0x10CB4,0x10CB4},{0x10CB5,0x10CB5}, /* 10CB4 */ + {0x10CB6,0x10CB6},{0x10CB7,0x10CB7}, /* 10CB6 */ + {0x10CB8,0x10CB8},{0x10CB9,0x10CB9}, /* 10CB8 */ + {0x10CBA,0x10CBA},{0x10CBB,0x10CBB}, /* 10CBA */ + {0x10CBC,0x10CBC},{0x10CBD,0x10CBD}, /* 10CBC */ + {0x10CBE,0x10CBE},{0x10CBF,0x10CBF}, /* 10CBE */ + {0x10C80,0x10CC0},{0x10C81,0x10CC1}, /* 10CC0 */ + {0x10C82,0x10CC2},{0x10C83,0x10CC3}, /* 10CC2 */ + {0x10C84,0x10CC4},{0x10C85,0x10CC5}, /* 10CC4 */ + {0x10C86,0x10CC6},{0x10C87,0x10CC7}, /* 10CC6 */ + {0x10C88,0x10CC8},{0x10C89,0x10CC9}, /* 10CC8 */ + {0x10C8A,0x10CCA},{0x10C8B,0x10CCB}, /* 10CCA */ + {0x10C8C,0x10CCC},{0x10C8D,0x10CCD}, /* 10CCC */ + {0x10C8E,0x10CCE},{0x10C8F,0x10CCF}, /* 10CCE */ + {0x10C90,0x10CD0},{0x10C91,0x10CD1}, /* 10CD0 */ + {0x10C92,0x10CD2},{0x10C93,0x10CD3}, /* 10CD2 */ + {0x10C94,0x10CD4},{0x10C95,0x10CD5}, /* 10CD4 */ + {0x10C96,0x10CD6},{0x10C97,0x10CD7}, /* 10CD6 */ + {0x10C98,0x10CD8},{0x10C99,0x10CD9}, /* 10CD8 */ + {0x10C9A,0x10CDA},{0x10C9B,0x10CDB}, /* 10CDA */ + {0x10C9C,0x10CDC},{0x10C9D,0x10CDD}, /* 10CDC */ + {0x10C9E,0x10CDE},{0x10C9F,0x10CDF}, /* 10CDE */ + {0x10CA0,0x10CE0},{0x10CA1,0x10CE1}, /* 10CE0 */ + {0x10CA2,0x10CE2},{0x10CA3,0x10CE3}, /* 10CE2 */ + {0x10CA4,0x10CE4},{0x10CA5,0x10CE5}, /* 10CE4 */ + {0x10CA6,0x10CE6},{0x10CA7,0x10CE7}, /* 10CE6 */ + {0x10CA8,0x10CE8},{0x10CA9,0x10CE9}, /* 10CE8 */ + {0x10CAA,0x10CEA},{0x10CAB,0x10CEB}, /* 10CEA */ + {0x10CAC,0x10CEC},{0x10CAD,0x10CED}, /* 10CEC */ + {0x10CAE,0x10CEE},{0x10CAF,0x10CEF}, /* 10CEE */ + {0x10CB0,0x10CF0},{0x10CB1,0x10CF1}, /* 10CF0 */ + {0x10CB2,0x10CF2},{0x10CF3,0x10CF3}, /* 10CF2 */ + {0x10CF4,0x10CF4},{0x10CF5,0x10CF5}, /* 10CF4 */ + {0x10CF6,0x10CF6},{0x10CF7,0x10CF7}, /* 10CF6 */ + {0x10CF8,0x10CF8},{0x10CF9,0x10CF9}, /* 10CF8 */ + {0x10CFA,0x10CFA},{0x10CFB,0x10CFB}, /* 10CFA */ + {0x10CFC,0x10CFC},{0x10CFD,0x10CFD}, /* 10CFC */ + {0x10CFE,0x10CFE},{0x10CFF,0x10CFF} /* 10CFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page118[256]={ + {0x11800,0x11800},{0x11801,0x11801}, /* 11800 */ + {0x11802,0x11802},{0x11803,0x11803}, /* 11802 */ + {0x11804,0x11804},{0x11805,0x11805}, /* 11804 */ + {0x11806,0x11806},{0x11807,0x11807}, /* 11806 */ + {0x11808,0x11808},{0x11809,0x11809}, /* 11808 */ + {0x1180A,0x1180A},{0x1180B,0x1180B}, /* 1180A */ + {0x1180C,0x1180C},{0x1180D,0x1180D}, /* 1180C */ + {0x1180E,0x1180E},{0x1180F,0x1180F}, /* 1180E */ + {0x11810,0x11810},{0x11811,0x11811}, /* 11810 */ + {0x11812,0x11812},{0x11813,0x11813}, /* 11812 */ + {0x11814,0x11814},{0x11815,0x11815}, /* 11814 */ + {0x11816,0x11816},{0x11817,0x11817}, /* 11816 */ + {0x11818,0x11818},{0x11819,0x11819}, /* 11818 */ + {0x1181A,0x1181A},{0x1181B,0x1181B}, /* 1181A */ + {0x1181C,0x1181C},{0x1181D,0x1181D}, /* 1181C */ + {0x1181E,0x1181E},{0x1181F,0x1181F}, /* 1181E */ + {0x11820,0x11820},{0x11821,0x11821}, /* 11820 */ + {0x11822,0x11822},{0x11823,0x11823}, /* 11822 */ + {0x11824,0x11824},{0x11825,0x11825}, /* 11824 */ + {0x11826,0x11826},{0x11827,0x11827}, /* 11826 */ + {0x11828,0x11828},{0x11829,0x11829}, /* 11828 */ + {0x1182A,0x1182A},{0x1182B,0x1182B}, /* 1182A */ + {0x1182C,0x1182C},{0x1182D,0x1182D}, /* 1182C */ + {0x1182E,0x1182E},{0x1182F,0x1182F}, /* 1182E */ + {0x11830,0x11830},{0x11831,0x11831}, /* 11830 */ + {0x11832,0x11832},{0x11833,0x11833}, /* 11832 */ + {0x11834,0x11834},{0x11835,0x11835}, /* 11834 */ + {0x11836,0x11836},{0x11837,0x11837}, /* 11836 */ + {0x11838,0x11838},{0x11839,0x11839}, /* 11838 */ + {0x1183A,0x1183A},{0x1183B,0x1183B}, /* 1183A */ + {0x1183C,0x1183C},{0x1183D,0x1183D}, /* 1183C */ + {0x1183E,0x1183E},{0x1183F,0x1183F}, /* 1183E */ + {0x11840,0x11840},{0x11841,0x11841}, /* 11840 */ + {0x11842,0x11842},{0x11843,0x11843}, /* 11842 */ + {0x11844,0x11844},{0x11845,0x11845}, /* 11844 */ + {0x11846,0x11846},{0x11847,0x11847}, /* 11846 */ + {0x11848,0x11848},{0x11849,0x11849}, /* 11848 */ + {0x1184A,0x1184A},{0x1184B,0x1184B}, /* 1184A */ + {0x1184C,0x1184C},{0x1184D,0x1184D}, /* 1184C */ + {0x1184E,0x1184E},{0x1184F,0x1184F}, /* 1184E */ + {0x11850,0x11850},{0x11851,0x11851}, /* 11850 */ + {0x11852,0x11852},{0x11853,0x11853}, /* 11852 */ + {0x11854,0x11854},{0x11855,0x11855}, /* 11854 */ + {0x11856,0x11856},{0x11857,0x11857}, /* 11856 */ + {0x11858,0x11858},{0x11859,0x11859}, /* 11858 */ + {0x1185A,0x1185A},{0x1185B,0x1185B}, /* 1185A */ + {0x1185C,0x1185C},{0x1185D,0x1185D}, /* 1185C */ + {0x1185E,0x1185E},{0x1185F,0x1185F}, /* 1185E */ + {0x11860,0x11860},{0x11861,0x11861}, /* 11860 */ + {0x11862,0x11862},{0x11863,0x11863}, /* 11862 */ + {0x11864,0x11864},{0x11865,0x11865}, /* 11864 */ + {0x11866,0x11866},{0x11867,0x11867}, /* 11866 */ + {0x11868,0x11868},{0x11869,0x11869}, /* 11868 */ + {0x1186A,0x1186A},{0x1186B,0x1186B}, /* 1186A */ + {0x1186C,0x1186C},{0x1186D,0x1186D}, /* 1186C */ + {0x1186E,0x1186E},{0x1186F,0x1186F}, /* 1186E */ + {0x11870,0x11870},{0x11871,0x11871}, /* 11870 */ + {0x11872,0x11872},{0x11873,0x11873}, /* 11872 */ + {0x11874,0x11874},{0x11875,0x11875}, /* 11874 */ + {0x11876,0x11876},{0x11877,0x11877}, /* 11876 */ + {0x11878,0x11878},{0x11879,0x11879}, /* 11878 */ + {0x1187A,0x1187A},{0x1187B,0x1187B}, /* 1187A */ + {0x1187C,0x1187C},{0x1187D,0x1187D}, /* 1187C */ + {0x1187E,0x1187E},{0x1187F,0x1187F}, /* 1187E */ + {0x11880,0x11880},{0x11881,0x11881}, /* 11880 */ + {0x11882,0x11882},{0x11883,0x11883}, /* 11882 */ + {0x11884,0x11884},{0x11885,0x11885}, /* 11884 */ + {0x11886,0x11886},{0x11887,0x11887}, /* 11886 */ + {0x11888,0x11888},{0x11889,0x11889}, /* 11888 */ + {0x1188A,0x1188A},{0x1188B,0x1188B}, /* 1188A */ + {0x1188C,0x1188C},{0x1188D,0x1188D}, /* 1188C */ + {0x1188E,0x1188E},{0x1188F,0x1188F}, /* 1188E */ + {0x11890,0x11890},{0x11891,0x11891}, /* 11890 */ + {0x11892,0x11892},{0x11893,0x11893}, /* 11892 */ + {0x11894,0x11894},{0x11895,0x11895}, /* 11894 */ + {0x11896,0x11896},{0x11897,0x11897}, /* 11896 */ + {0x11898,0x11898},{0x11899,0x11899}, /* 11898 */ + {0x1189A,0x1189A},{0x1189B,0x1189B}, /* 1189A */ + {0x1189C,0x1189C},{0x1189D,0x1189D}, /* 1189C */ + {0x1189E,0x1189E},{0x1189F,0x1189F}, /* 1189E */ + {0x118A0,0x118C0},{0x118A1,0x118C1}, /* 118A0 */ + {0x118A2,0x118C2},{0x118A3,0x118C3}, /* 118A2 */ + {0x118A4,0x118C4},{0x118A5,0x118C5}, /* 118A4 */ + {0x118A6,0x118C6},{0x118A7,0x118C7}, /* 118A6 */ + {0x118A8,0x118C8},{0x118A9,0x118C9}, /* 118A8 */ + {0x118AA,0x118CA},{0x118AB,0x118CB}, /* 118AA */ + {0x118AC,0x118CC},{0x118AD,0x118CD}, /* 118AC */ + {0x118AE,0x118CE},{0x118AF,0x118CF}, /* 118AE */ + {0x118B0,0x118D0},{0x118B1,0x118D1}, /* 118B0 */ + {0x118B2,0x118D2},{0x118B3,0x118D3}, /* 118B2 */ + {0x118B4,0x118D4},{0x118B5,0x118D5}, /* 118B4 */ + {0x118B6,0x118D6},{0x118B7,0x118D7}, /* 118B6 */ + {0x118B8,0x118D8},{0x118B9,0x118D9}, /* 118B8 */ + {0x118BA,0x118DA},{0x118BB,0x118DB}, /* 118BA */ + {0x118BC,0x118DC},{0x118BD,0x118DD}, /* 118BC */ + {0x118BE,0x118DE},{0x118BF,0x118DF}, /* 118BE */ + {0x118A0,0x118C0},{0x118A1,0x118C1}, /* 118C0 */ + {0x118A2,0x118C2},{0x118A3,0x118C3}, /* 118C2 */ + {0x118A4,0x118C4},{0x118A5,0x118C5}, /* 118C4 */ + {0x118A6,0x118C6},{0x118A7,0x118C7}, /* 118C6 */ + {0x118A8,0x118C8},{0x118A9,0x118C9}, /* 118C8 */ + {0x118AA,0x118CA},{0x118AB,0x118CB}, /* 118CA */ + {0x118AC,0x118CC},{0x118AD,0x118CD}, /* 118CC */ + {0x118AE,0x118CE},{0x118AF,0x118CF}, /* 118CE */ + {0x118B0,0x118D0},{0x118B1,0x118D1}, /* 118D0 */ + {0x118B2,0x118D2},{0x118B3,0x118D3}, /* 118D2 */ + {0x118B4,0x118D4},{0x118B5,0x118D5}, /* 118D4 */ + {0x118B6,0x118D6},{0x118B7,0x118D7}, /* 118D6 */ + {0x118B8,0x118D8},{0x118B9,0x118D9}, /* 118D8 */ + {0x118BA,0x118DA},{0x118BB,0x118DB}, /* 118DA */ + {0x118BC,0x118DC},{0x118BD,0x118DD}, /* 118DC */ + {0x118BE,0x118DE},{0x118BF,0x118DF}, /* 118DE */ + {0x118E0,0x118E0},{0x118E1,0x118E1}, /* 118E0 */ + {0x118E2,0x118E2},{0x118E3,0x118E3}, /* 118E2 */ + {0x118E4,0x118E4},{0x118E5,0x118E5}, /* 118E4 */ + {0x118E6,0x118E6},{0x118E7,0x118E7}, /* 118E6 */ + {0x118E8,0x118E8},{0x118E9,0x118E9}, /* 118E8 */ + {0x118EA,0x118EA},{0x118EB,0x118EB}, /* 118EA */ + {0x118EC,0x118EC},{0x118ED,0x118ED}, /* 118EC */ + {0x118EE,0x118EE},{0x118EF,0x118EF}, /* 118EE */ + {0x118F0,0x118F0},{0x118F1,0x118F1}, /* 118F0 */ + {0x118F2,0x118F2},{0x118F3,0x118F3}, /* 118F2 */ + {0x118F4,0x118F4},{0x118F5,0x118F5}, /* 118F4 */ + {0x118F6,0x118F6},{0x118F7,0x118F7}, /* 118F6 */ + {0x118F8,0x118F8},{0x118F9,0x118F9}, /* 118F8 */ + {0x118FA,0x118FA},{0x118FB,0x118FB}, /* 118FA */ + {0x118FC,0x118FC},{0x118FD,0x118FD}, /* 118FC */ + {0x118FE,0x118FE},{0x118FF,0x118FF} /* 118FE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page16E[256]={ + {0x16E00,0x16E00},{0x16E01,0x16E01}, /* 16E00 */ + {0x16E02,0x16E02},{0x16E03,0x16E03}, /* 16E02 */ + {0x16E04,0x16E04},{0x16E05,0x16E05}, /* 16E04 */ + {0x16E06,0x16E06},{0x16E07,0x16E07}, /* 16E06 */ + {0x16E08,0x16E08},{0x16E09,0x16E09}, /* 16E08 */ + {0x16E0A,0x16E0A},{0x16E0B,0x16E0B}, /* 16E0A */ + {0x16E0C,0x16E0C},{0x16E0D,0x16E0D}, /* 16E0C */ + {0x16E0E,0x16E0E},{0x16E0F,0x16E0F}, /* 16E0E */ + {0x16E10,0x16E10},{0x16E11,0x16E11}, /* 16E10 */ + {0x16E12,0x16E12},{0x16E13,0x16E13}, /* 16E12 */ + {0x16E14,0x16E14},{0x16E15,0x16E15}, /* 16E14 */ + {0x16E16,0x16E16},{0x16E17,0x16E17}, /* 16E16 */ + {0x16E18,0x16E18},{0x16E19,0x16E19}, /* 16E18 */ + {0x16E1A,0x16E1A},{0x16E1B,0x16E1B}, /* 16E1A */ + {0x16E1C,0x16E1C},{0x16E1D,0x16E1D}, /* 16E1C */ + {0x16E1E,0x16E1E},{0x16E1F,0x16E1F}, /* 16E1E */ + {0x16E20,0x16E20},{0x16E21,0x16E21}, /* 16E20 */ + {0x16E22,0x16E22},{0x16E23,0x16E23}, /* 16E22 */ + {0x16E24,0x16E24},{0x16E25,0x16E25}, /* 16E24 */ + {0x16E26,0x16E26},{0x16E27,0x16E27}, /* 16E26 */ + {0x16E28,0x16E28},{0x16E29,0x16E29}, /* 16E28 */ + {0x16E2A,0x16E2A},{0x16E2B,0x16E2B}, /* 16E2A */ + {0x16E2C,0x16E2C},{0x16E2D,0x16E2D}, /* 16E2C */ + {0x16E2E,0x16E2E},{0x16E2F,0x16E2F}, /* 16E2E */ + {0x16E30,0x16E30},{0x16E31,0x16E31}, /* 16E30 */ + {0x16E32,0x16E32},{0x16E33,0x16E33}, /* 16E32 */ + {0x16E34,0x16E34},{0x16E35,0x16E35}, /* 16E34 */ + {0x16E36,0x16E36},{0x16E37,0x16E37}, /* 16E36 */ + {0x16E38,0x16E38},{0x16E39,0x16E39}, /* 16E38 */ + {0x16E3A,0x16E3A},{0x16E3B,0x16E3B}, /* 16E3A */ + {0x16E3C,0x16E3C},{0x16E3D,0x16E3D}, /* 16E3C */ + {0x16E3E,0x16E3E},{0x16E3F,0x16E3F}, /* 16E3E */ + {0x16E40,0x16E60},{0x16E41,0x16E61}, /* 16E40 */ + {0x16E42,0x16E62},{0x16E43,0x16E63}, /* 16E42 */ + {0x16E44,0x16E64},{0x16E45,0x16E65}, /* 16E44 */ + {0x16E46,0x16E66},{0x16E47,0x16E67}, /* 16E46 */ + {0x16E48,0x16E68},{0x16E49,0x16E69}, /* 16E48 */ + {0x16E4A,0x16E6A},{0x16E4B,0x16E6B}, /* 16E4A */ + {0x16E4C,0x16E6C},{0x16E4D,0x16E6D}, /* 16E4C */ + {0x16E4E,0x16E6E},{0x16E4F,0x16E6F}, /* 16E4E */ + {0x16E50,0x16E70},{0x16E51,0x16E71}, /* 16E50 */ + {0x16E52,0x16E72},{0x16E53,0x16E73}, /* 16E52 */ + {0x16E54,0x16E74},{0x16E55,0x16E75}, /* 16E54 */ + {0x16E56,0x16E76},{0x16E57,0x16E77}, /* 16E56 */ + {0x16E58,0x16E78},{0x16E59,0x16E79}, /* 16E58 */ + {0x16E5A,0x16E7A},{0x16E5B,0x16E7B}, /* 16E5A */ + {0x16E5C,0x16E7C},{0x16E5D,0x16E7D}, /* 16E5C */ + {0x16E5E,0x16E7E},{0x16E5F,0x16E7F}, /* 16E5E */ + {0x16E40,0x16E60},{0x16E41,0x16E61}, /* 16E60 */ + {0x16E42,0x16E62},{0x16E43,0x16E63}, /* 16E62 */ + {0x16E44,0x16E64},{0x16E45,0x16E65}, /* 16E64 */ + {0x16E46,0x16E66},{0x16E47,0x16E67}, /* 16E66 */ + {0x16E48,0x16E68},{0x16E49,0x16E69}, /* 16E68 */ + {0x16E4A,0x16E6A},{0x16E4B,0x16E6B}, /* 16E6A */ + {0x16E4C,0x16E6C},{0x16E4D,0x16E6D}, /* 16E6C */ + {0x16E4E,0x16E6E},{0x16E4F,0x16E6F}, /* 16E6E */ + {0x16E50,0x16E70},{0x16E51,0x16E71}, /* 16E70 */ + {0x16E52,0x16E72},{0x16E53,0x16E73}, /* 16E72 */ + {0x16E54,0x16E74},{0x16E55,0x16E75}, /* 16E74 */ + {0x16E56,0x16E76},{0x16E57,0x16E77}, /* 16E76 */ + {0x16E58,0x16E78},{0x16E59,0x16E79}, /* 16E78 */ + {0x16E5A,0x16E7A},{0x16E5B,0x16E7B}, /* 16E7A */ + {0x16E5C,0x16E7C},{0x16E5D,0x16E7D}, /* 16E7C */ + {0x16E5E,0x16E7E},{0x16E5F,0x16E7F}, /* 16E7E */ + {0x16E80,0x16E80},{0x16E81,0x16E81}, /* 16E80 */ + {0x16E82,0x16E82},{0x16E83,0x16E83}, /* 16E82 */ + {0x16E84,0x16E84},{0x16E85,0x16E85}, /* 16E84 */ + {0x16E86,0x16E86},{0x16E87,0x16E87}, /* 16E86 */ + {0x16E88,0x16E88},{0x16E89,0x16E89}, /* 16E88 */ + {0x16E8A,0x16E8A},{0x16E8B,0x16E8B}, /* 16E8A */ + {0x16E8C,0x16E8C},{0x16E8D,0x16E8D}, /* 16E8C */ + {0x16E8E,0x16E8E},{0x16E8F,0x16E8F}, /* 16E8E */ + {0x16E90,0x16E90},{0x16E91,0x16E91}, /* 16E90 */ + {0x16E92,0x16E92},{0x16E93,0x16E93}, /* 16E92 */ + {0x16E94,0x16E94},{0x16E95,0x16E95}, /* 16E94 */ + {0x16E96,0x16E96},{0x16E97,0x16E97}, /* 16E96 */ + {0x16E98,0x16E98},{0x16E99,0x16E99}, /* 16E98 */ + {0x16E9A,0x16E9A},{0x16E9B,0x16E9B}, /* 16E9A */ + {0x16E9C,0x16E9C},{0x16E9D,0x16E9D}, /* 16E9C */ + {0x16E9E,0x16E9E},{0x16E9F,0x16E9F}, /* 16E9E */ + {0x16EA0,0x16EA0},{0x16EA1,0x16EA1}, /* 16EA0 */ + {0x16EA2,0x16EA2},{0x16EA3,0x16EA3}, /* 16EA2 */ + {0x16EA4,0x16EA4},{0x16EA5,0x16EA5}, /* 16EA4 */ + {0x16EA6,0x16EA6},{0x16EA7,0x16EA7}, /* 16EA6 */ + {0x16EA8,0x16EA8},{0x16EA9,0x16EA9}, /* 16EA8 */ + {0x16EAA,0x16EAA},{0x16EAB,0x16EAB}, /* 16EAA */ + {0x16EAC,0x16EAC},{0x16EAD,0x16EAD}, /* 16EAC */ + {0x16EAE,0x16EAE},{0x16EAF,0x16EAF}, /* 16EAE */ + {0x16EB0,0x16EB0},{0x16EB1,0x16EB1}, /* 16EB0 */ + {0x16EB2,0x16EB2},{0x16EB3,0x16EB3}, /* 16EB2 */ + {0x16EB4,0x16EB4},{0x16EB5,0x16EB5}, /* 16EB4 */ + {0x16EB6,0x16EB6},{0x16EB7,0x16EB7}, /* 16EB6 */ + {0x16EB8,0x16EB8},{0x16EB9,0x16EB9}, /* 16EB8 */ + {0x16EBA,0x16EBA},{0x16EBB,0x16EBB}, /* 16EBA */ + {0x16EBC,0x16EBC},{0x16EBD,0x16EBD}, /* 16EBC */ + {0x16EBE,0x16EBE},{0x16EBF,0x16EBF}, /* 16EBE */ + {0x16EC0,0x16EC0},{0x16EC1,0x16EC1}, /* 16EC0 */ + {0x16EC2,0x16EC2},{0x16EC3,0x16EC3}, /* 16EC2 */ + {0x16EC4,0x16EC4},{0x16EC5,0x16EC5}, /* 16EC4 */ + {0x16EC6,0x16EC6},{0x16EC7,0x16EC7}, /* 16EC6 */ + {0x16EC8,0x16EC8},{0x16EC9,0x16EC9}, /* 16EC8 */ + {0x16ECA,0x16ECA},{0x16ECB,0x16ECB}, /* 16ECA */ + {0x16ECC,0x16ECC},{0x16ECD,0x16ECD}, /* 16ECC */ + {0x16ECE,0x16ECE},{0x16ECF,0x16ECF}, /* 16ECE */ + {0x16ED0,0x16ED0},{0x16ED1,0x16ED1}, /* 16ED0 */ + {0x16ED2,0x16ED2},{0x16ED3,0x16ED3}, /* 16ED2 */ + {0x16ED4,0x16ED4},{0x16ED5,0x16ED5}, /* 16ED4 */ + {0x16ED6,0x16ED6},{0x16ED7,0x16ED7}, /* 16ED6 */ + {0x16ED8,0x16ED8},{0x16ED9,0x16ED9}, /* 16ED8 */ + {0x16EDA,0x16EDA},{0x16EDB,0x16EDB}, /* 16EDA */ + {0x16EDC,0x16EDC},{0x16EDD,0x16EDD}, /* 16EDC */ + {0x16EDE,0x16EDE},{0x16EDF,0x16EDF}, /* 16EDE */ + {0x16EE0,0x16EE0},{0x16EE1,0x16EE1}, /* 16EE0 */ + {0x16EE2,0x16EE2},{0x16EE3,0x16EE3}, /* 16EE2 */ + {0x16EE4,0x16EE4},{0x16EE5,0x16EE5}, /* 16EE4 */ + {0x16EE6,0x16EE6},{0x16EE7,0x16EE7}, /* 16EE6 */ + {0x16EE8,0x16EE8},{0x16EE9,0x16EE9}, /* 16EE8 */ + {0x16EEA,0x16EEA},{0x16EEB,0x16EEB}, /* 16EEA */ + {0x16EEC,0x16EEC},{0x16EED,0x16EED}, /* 16EEC */ + {0x16EEE,0x16EEE},{0x16EEF,0x16EEF}, /* 16EEE */ + {0x16EF0,0x16EF0},{0x16EF1,0x16EF1}, /* 16EF0 */ + {0x16EF2,0x16EF2},{0x16EF3,0x16EF3}, /* 16EF2 */ + {0x16EF4,0x16EF4},{0x16EF5,0x16EF5}, /* 16EF4 */ + {0x16EF6,0x16EF6},{0x16EF7,0x16EF7}, /* 16EF6 */ + {0x16EF8,0x16EF8},{0x16EF9,0x16EF9}, /* 16EF8 */ + {0x16EFA,0x16EFA},{0x16EFB,0x16EFB}, /* 16EFA */ + {0x16EFC,0x16EFC},{0x16EFD,0x16EFD}, /* 16EFC */ + {0x16EFE,0x16EFE},{0x16EFF,0x16EFF} /* 16EFE */ +}; + +static const MY_CASEFOLD_CHARACTER u1400_casefold_page1E9[256]={ + {0x1E900,0x1E922},{0x1E901,0x1E923}, /* 1E900 */ + {0x1E902,0x1E924},{0x1E903,0x1E925}, /* 1E902 */ + {0x1E904,0x1E926},{0x1E905,0x1E927}, /* 1E904 */ + {0x1E906,0x1E928},{0x1E907,0x1E929}, /* 1E906 */ + {0x1E908,0x1E92A},{0x1E909,0x1E92B}, /* 1E908 */ + {0x1E90A,0x1E92C},{0x1E90B,0x1E92D}, /* 1E90A */ + {0x1E90C,0x1E92E},{0x1E90D,0x1E92F}, /* 1E90C */ + {0x1E90E,0x1E930},{0x1E90F,0x1E931}, /* 1E90E */ + {0x1E910,0x1E932},{0x1E911,0x1E933}, /* 1E910 */ + {0x1E912,0x1E934},{0x1E913,0x1E935}, /* 1E912 */ + {0x1E914,0x1E936},{0x1E915,0x1E937}, /* 1E914 */ + {0x1E916,0x1E938},{0x1E917,0x1E939}, /* 1E916 */ + {0x1E918,0x1E93A},{0x1E919,0x1E93B}, /* 1E918 */ + {0x1E91A,0x1E93C},{0x1E91B,0x1E93D}, /* 1E91A */ + {0x1E91C,0x1E93E},{0x1E91D,0x1E93F}, /* 1E91C */ + {0x1E91E,0x1E940},{0x1E91F,0x1E941}, /* 1E91E */ + {0x1E920,0x1E942},{0x1E921,0x1E943}, /* 1E920 */ + {0x1E900,0x1E922},{0x1E901,0x1E923}, /* 1E922 */ + {0x1E902,0x1E924},{0x1E903,0x1E925}, /* 1E924 */ + {0x1E904,0x1E926},{0x1E905,0x1E927}, /* 1E926 */ + {0x1E906,0x1E928},{0x1E907,0x1E929}, /* 1E928 */ + {0x1E908,0x1E92A},{0x1E909,0x1E92B}, /* 1E92A */ + {0x1E90A,0x1E92C},{0x1E90B,0x1E92D}, /* 1E92C */ + {0x1E90C,0x1E92E},{0x1E90D,0x1E92F}, /* 1E92E */ + {0x1E90E,0x1E930},{0x1E90F,0x1E931}, /* 1E930 */ + {0x1E910,0x1E932},{0x1E911,0x1E933}, /* 1E932 */ + {0x1E912,0x1E934},{0x1E913,0x1E935}, /* 1E934 */ + {0x1E914,0x1E936},{0x1E915,0x1E937}, /* 1E936 */ + {0x1E916,0x1E938},{0x1E917,0x1E939}, /* 1E938 */ + {0x1E918,0x1E93A},{0x1E919,0x1E93B}, /* 1E93A */ + {0x1E91A,0x1E93C},{0x1E91B,0x1E93D}, /* 1E93C */ + {0x1E91C,0x1E93E},{0x1E91D,0x1E93F}, /* 1E93E */ + {0x1E91E,0x1E940},{0x1E91F,0x1E941}, /* 1E940 */ + {0x1E920,0x1E942},{0x1E921,0x1E943}, /* 1E942 */ + {0x1E944,0x1E944},{0x1E945,0x1E945}, /* 1E944 */ + {0x1E946,0x1E946},{0x1E947,0x1E947}, /* 1E946 */ + {0x1E948,0x1E948},{0x1E949,0x1E949}, /* 1E948 */ + {0x1E94A,0x1E94A},{0x1E94B,0x1E94B}, /* 1E94A */ + {0x1E94C,0x1E94C},{0x1E94D,0x1E94D}, /* 1E94C */ + {0x1E94E,0x1E94E},{0x1E94F,0x1E94F}, /* 1E94E */ + {0x1E950,0x1E950},{0x1E951,0x1E951}, /* 1E950 */ + {0x1E952,0x1E952},{0x1E953,0x1E953}, /* 1E952 */ + {0x1E954,0x1E954},{0x1E955,0x1E955}, /* 1E954 */ + {0x1E956,0x1E956},{0x1E957,0x1E957}, /* 1E956 */ + {0x1E958,0x1E958},{0x1E959,0x1E959}, /* 1E958 */ + {0x1E95A,0x1E95A},{0x1E95B,0x1E95B}, /* 1E95A */ + {0x1E95C,0x1E95C},{0x1E95D,0x1E95D}, /* 1E95C */ + {0x1E95E,0x1E95E},{0x1E95F,0x1E95F}, /* 1E95E */ + {0x1E960,0x1E960},{0x1E961,0x1E961}, /* 1E960 */ + {0x1E962,0x1E962},{0x1E963,0x1E963}, /* 1E962 */ + {0x1E964,0x1E964},{0x1E965,0x1E965}, /* 1E964 */ + {0x1E966,0x1E966},{0x1E967,0x1E967}, /* 1E966 */ + {0x1E968,0x1E968},{0x1E969,0x1E969}, /* 1E968 */ + {0x1E96A,0x1E96A},{0x1E96B,0x1E96B}, /* 1E96A */ + {0x1E96C,0x1E96C},{0x1E96D,0x1E96D}, /* 1E96C */ + {0x1E96E,0x1E96E},{0x1E96F,0x1E96F}, /* 1E96E */ + {0x1E970,0x1E970},{0x1E971,0x1E971}, /* 1E970 */ + {0x1E972,0x1E972},{0x1E973,0x1E973}, /* 1E972 */ + {0x1E974,0x1E974},{0x1E975,0x1E975}, /* 1E974 */ + {0x1E976,0x1E976},{0x1E977,0x1E977}, /* 1E976 */ + {0x1E978,0x1E978},{0x1E979,0x1E979}, /* 1E978 */ + {0x1E97A,0x1E97A},{0x1E97B,0x1E97B}, /* 1E97A */ + {0x1E97C,0x1E97C},{0x1E97D,0x1E97D}, /* 1E97C */ + {0x1E97E,0x1E97E},{0x1E97F,0x1E97F}, /* 1E97E */ + {0x1E980,0x1E980},{0x1E981,0x1E981}, /* 1E980 */ + {0x1E982,0x1E982},{0x1E983,0x1E983}, /* 1E982 */ + {0x1E984,0x1E984},{0x1E985,0x1E985}, /* 1E984 */ + {0x1E986,0x1E986},{0x1E987,0x1E987}, /* 1E986 */ + {0x1E988,0x1E988},{0x1E989,0x1E989}, /* 1E988 */ + {0x1E98A,0x1E98A},{0x1E98B,0x1E98B}, /* 1E98A */ + {0x1E98C,0x1E98C},{0x1E98D,0x1E98D}, /* 1E98C */ + {0x1E98E,0x1E98E},{0x1E98F,0x1E98F}, /* 1E98E */ + {0x1E990,0x1E990},{0x1E991,0x1E991}, /* 1E990 */ + {0x1E992,0x1E992},{0x1E993,0x1E993}, /* 1E992 */ + {0x1E994,0x1E994},{0x1E995,0x1E995}, /* 1E994 */ + {0x1E996,0x1E996},{0x1E997,0x1E997}, /* 1E996 */ + {0x1E998,0x1E998},{0x1E999,0x1E999}, /* 1E998 */ + {0x1E99A,0x1E99A},{0x1E99B,0x1E99B}, /* 1E99A */ + {0x1E99C,0x1E99C},{0x1E99D,0x1E99D}, /* 1E99C */ + {0x1E99E,0x1E99E},{0x1E99F,0x1E99F}, /* 1E99E */ + {0x1E9A0,0x1E9A0},{0x1E9A1,0x1E9A1}, /* 1E9A0 */ + {0x1E9A2,0x1E9A2},{0x1E9A3,0x1E9A3}, /* 1E9A2 */ + {0x1E9A4,0x1E9A4},{0x1E9A5,0x1E9A5}, /* 1E9A4 */ + {0x1E9A6,0x1E9A6},{0x1E9A7,0x1E9A7}, /* 1E9A6 */ + {0x1E9A8,0x1E9A8},{0x1E9A9,0x1E9A9}, /* 1E9A8 */ + {0x1E9AA,0x1E9AA},{0x1E9AB,0x1E9AB}, /* 1E9AA */ + {0x1E9AC,0x1E9AC},{0x1E9AD,0x1E9AD}, /* 1E9AC */ + {0x1E9AE,0x1E9AE},{0x1E9AF,0x1E9AF}, /* 1E9AE */ + {0x1E9B0,0x1E9B0},{0x1E9B1,0x1E9B1}, /* 1E9B0 */ + {0x1E9B2,0x1E9B2},{0x1E9B3,0x1E9B3}, /* 1E9B2 */ + {0x1E9B4,0x1E9B4},{0x1E9B5,0x1E9B5}, /* 1E9B4 */ + {0x1E9B6,0x1E9B6},{0x1E9B7,0x1E9B7}, /* 1E9B6 */ + {0x1E9B8,0x1E9B8},{0x1E9B9,0x1E9B9}, /* 1E9B8 */ + {0x1E9BA,0x1E9BA},{0x1E9BB,0x1E9BB}, /* 1E9BA */ + {0x1E9BC,0x1E9BC},{0x1E9BD,0x1E9BD}, /* 1E9BC */ + {0x1E9BE,0x1E9BE},{0x1E9BF,0x1E9BF}, /* 1E9BE */ + {0x1E9C0,0x1E9C0},{0x1E9C1,0x1E9C1}, /* 1E9C0 */ + {0x1E9C2,0x1E9C2},{0x1E9C3,0x1E9C3}, /* 1E9C2 */ + {0x1E9C4,0x1E9C4},{0x1E9C5,0x1E9C5}, /* 1E9C4 */ + {0x1E9C6,0x1E9C6},{0x1E9C7,0x1E9C7}, /* 1E9C6 */ + {0x1E9C8,0x1E9C8},{0x1E9C9,0x1E9C9}, /* 1E9C8 */ + {0x1E9CA,0x1E9CA},{0x1E9CB,0x1E9CB}, /* 1E9CA */ + {0x1E9CC,0x1E9CC},{0x1E9CD,0x1E9CD}, /* 1E9CC */ + {0x1E9CE,0x1E9CE},{0x1E9CF,0x1E9CF}, /* 1E9CE */ + {0x1E9D0,0x1E9D0},{0x1E9D1,0x1E9D1}, /* 1E9D0 */ + {0x1E9D2,0x1E9D2},{0x1E9D3,0x1E9D3}, /* 1E9D2 */ + {0x1E9D4,0x1E9D4},{0x1E9D5,0x1E9D5}, /* 1E9D4 */ + {0x1E9D6,0x1E9D6},{0x1E9D7,0x1E9D7}, /* 1E9D6 */ + {0x1E9D8,0x1E9D8},{0x1E9D9,0x1E9D9}, /* 1E9D8 */ + {0x1E9DA,0x1E9DA},{0x1E9DB,0x1E9DB}, /* 1E9DA */ + {0x1E9DC,0x1E9DC},{0x1E9DD,0x1E9DD}, /* 1E9DC */ + {0x1E9DE,0x1E9DE},{0x1E9DF,0x1E9DF}, /* 1E9DE */ + {0x1E9E0,0x1E9E0},{0x1E9E1,0x1E9E1}, /* 1E9E0 */ + {0x1E9E2,0x1E9E2},{0x1E9E3,0x1E9E3}, /* 1E9E2 */ + {0x1E9E4,0x1E9E4},{0x1E9E5,0x1E9E5}, /* 1E9E4 */ + {0x1E9E6,0x1E9E6},{0x1E9E7,0x1E9E7}, /* 1E9E6 */ + {0x1E9E8,0x1E9E8},{0x1E9E9,0x1E9E9}, /* 1E9E8 */ + {0x1E9EA,0x1E9EA},{0x1E9EB,0x1E9EB}, /* 1E9EA */ + {0x1E9EC,0x1E9EC},{0x1E9ED,0x1E9ED}, /* 1E9EC */ + {0x1E9EE,0x1E9EE},{0x1E9EF,0x1E9EF}, /* 1E9EE */ + {0x1E9F0,0x1E9F0},{0x1E9F1,0x1E9F1}, /* 1E9F0 */ + {0x1E9F2,0x1E9F2},{0x1E9F3,0x1E9F3}, /* 1E9F2 */ + {0x1E9F4,0x1E9F4},{0x1E9F5,0x1E9F5}, /* 1E9F4 */ + {0x1E9F6,0x1E9F6},{0x1E9F7,0x1E9F7}, /* 1E9F6 */ + {0x1E9F8,0x1E9F8},{0x1E9F9,0x1E9F9}, /* 1E9F8 */ + {0x1E9FA,0x1E9FA},{0x1E9FB,0x1E9FB}, /* 1E9FA */ + {0x1E9FC,0x1E9FC},{0x1E9FD,0x1E9FD}, /* 1E9FC */ + {0x1E9FE,0x1E9FE},{0x1E9FF,0x1E9FF} /* 1E9FE */ +}; + +const MY_CASEFOLD_CHARACTER * my_u1400_casefold_index[4352]={ + u1400_casefold_page00, u1400_casefold_page01, u1400_casefold_page02, u1400_casefold_page03, u1400_casefold_page04, u1400_casefold_page05, u1400_casefold_page06, u1400_casefold_page07, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u1400_casefold_page10, NULL, NULL, u1400_casefold_page13, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page1C, u1400_casefold_page1D, u1400_casefold_page1E, u1400_casefold_page1F, + NULL, u1400_casefold_page21, NULL, NULL, u1400_casefold_page24, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page2C, u1400_casefold_page2D, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_pageA6, u1400_casefold_pageA7, + NULL, NULL, NULL, u1400_casefold_pageAB, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_pageFF, + NULL, NULL, NULL, NULL, u1400_casefold_page104, u1400_casefold_page105, NULL, NULL, + NULL, NULL, NULL, NULL, u1400_casefold_page10C, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u1400_casefold_page118, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u1400_casefold_page16E, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, u1400_casefold_page1E9, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; diff --git a/strings/ctype-unidata.c b/strings/ctype-unidata.c index 58a823d69704a..77bec5418c493 100644 --- a/strings/ctype-unidata.c +++ b/strings/ctype-unidata.c @@ -31,6 +31,8 @@ #include "ctype-unicode300-casefold.h" #include "ctype-unicode300-casefold-tr.h" #include "ctype-unicode520-casefold.h" +#include "ctype-unicode1400-casefold.h" +#include "ctype-unicode1400-casefold-tr.h" @@ -77,3 +79,19 @@ MY_CASEFOLD_INFO my_casefold_unicode520= my_u520_casefold_index, NULL }; + + +MY_CASEFOLD_INFO my_casefold_unicode1400= +{ + 0x10FFFF, + my_u1400_casefold_index, + NULL +}; + + +MY_CASEFOLD_INFO my_casefold_unicode1400tr= +{ + 0x10FFFF, + my_u1400tr_casefold_index, + NULL +}; diff --git a/strings/ctype-unidata.h b/strings/ctype-unidata.h index ba3235e47e592..0bcf96c09a007 100644 --- a/strings/ctype-unidata.h +++ b/strings/ctype-unidata.h @@ -136,6 +136,8 @@ extern MY_CASEFOLD_INFO my_casefold_default; extern MY_CASEFOLD_INFO my_casefold_turkish; extern MY_CASEFOLD_INFO my_casefold_mysql500; extern MY_CASEFOLD_INFO my_casefold_unicode520; +extern MY_CASEFOLD_INFO my_casefold_unicode1400; +extern MY_CASEFOLD_INFO my_casefold_unicode1400tr; size_t my_strxfrm_pad_nweights_unicode(uchar *str, uchar *strend, size_t nweights); diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 8656f1f059369..121a3f945f6a1 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -118,7 +118,9 @@ static uint my_casefold_multiply_utf8mbx(CHARSET_INFO *cs) { DBUG_ASSERT(cs->mbminlen == 1 && cs->mbmaxlen >= 3); - if (cs->casefold == &my_casefold_unicode520) + if (cs->casefold == &my_casefold_unicode520 || + cs->casefold == &my_casefold_unicode1400 || + cs->casefold == &my_casefold_unicode1400tr) return 2; if (cs->casefold == &my_casefold_turkish) return 2; From bc3bfcf943b817b19a41e4f599b4f2e9a259b263 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Mon, 20 Mar 2023 15:20:32 +0100 Subject: [PATCH 32/70] MDEV-30862 Assertion `mode_ == m_high_priority' failed CREATE TABLE AS SELECT is not supported in combination with streaming replication. --- .../suite/galera_sr/r/MDEV-30862.result | 11 +++++++++ mysql-test/suite/galera_sr/t/MDEV-30862.test | 24 +++++++++++++++++++ sql/sql_table.cc | 13 ++++++++++ 3 files changed, 48 insertions(+) create mode 100644 mysql-test/suite/galera_sr/r/MDEV-30862.result create mode 100644 mysql-test/suite/galera_sr/t/MDEV-30862.test diff --git a/mysql-test/suite/galera_sr/r/MDEV-30862.result b/mysql-test/suite/galera_sr/r/MDEV-30862.result new file mode 100644 index 0000000000000..43da77f24df20 --- /dev/null +++ b/mysql-test/suite/galera_sr/r/MDEV-30862.result @@ -0,0 +1,11 @@ +connection node_2; +connection node_1; +SET autocommit=0; +SET SESSION wsrep_trx_fragment_size=1; +CREATE TABLE t2 SELECT seq FROM seq_1_to_50; +ERROR 42000: CREATE TABLE AS SELECT is not supported with streaming replication +CREATE TABLE t1 (f1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); +INSERT INTO t1 VALUES(DEFAULT); +CREATE TABLE t2 SELECT * FROM t1; +ERROR 42000: CREATE TABLE AS SELECT is not supported with streaming replication +DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/t/MDEV-30862.test b/mysql-test/suite/galera_sr/t/MDEV-30862.test new file mode 100644 index 0000000000000..6be77b4d71b40 --- /dev/null +++ b/mysql-test/suite/galera_sr/t/MDEV-30862.test @@ -0,0 +1,24 @@ +# +# MDEV-30862 Assertion `mode_ == m_high_priority' failed in +# void wsrep::client_state::after_applying() +# + +--source include/galera_cluster.inc +--source include/have_sequence.inc + +SET autocommit=0; +SET SESSION wsrep_trx_fragment_size=1; +--error ER_NOT_ALLOWED_COMMAND +CREATE TABLE t2 SELECT seq FROM seq_1_to_50; + + +# +# Same test without using seq +# +CREATE TABLE t1 (f1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); +INSERT INTO t1 VALUES(DEFAULT); +--error ER_NOT_ALLOWED_COMMAND +CREATE TABLE t2 SELECT * FROM t1; + + +DROP TABLE t1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 9f13dcde40f43..1e88e7722e3f1 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -11569,6 +11569,19 @@ bool Sql_cmd_create_table_like::execute(THD *thd) } #endif +#ifdef WITH_WSREP + if (select_lex->item_list.elements && // With SELECT + WSREP(thd) && thd->variables.wsrep_trx_fragment_size > 0) + { + my_message( + ER_NOT_ALLOWED_COMMAND, + "CREATE TABLE AS SELECT is not supported with streaming replication", + MYF(0)); + res= 1; + goto end_with_restore_list; + } +#endif /* WITH_WSREP */ + if (select_lex->item_list.elements || select_lex->tvc) // With select or TVC { select_result *result; From be7ef6566fab6088b5222eae184226ed6b5994d3 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Tue, 28 Mar 2023 10:25:59 +0300 Subject: [PATCH 33/70] MDEV-30605: Wrong result while using index for group-by A GROUP BY query which uses "MIN(pk)" and has "pk<>const" in the WHERE clause would produce wrong result when handled with "Using index for group-by". Here "pk" column is the table's primary key. The problem was introduced by fix for MDEV-23634. It made the range optimizer to not produce ranges for conditions in form "pk != const". However, LooseScan code requires that the optimizer is able to convert the condition on the MIN/MAX column into an equivalent range. The range is used to locate the row that has the MIN/MAX value. LooseScan checks this in check_group_min_max_predicates(). This fix makes the code in that function to take into account that "pk != const" does not produce a range. --- mysql-test/main/group_min_max.result | 12 ++++++++ mysql-test/main/group_min_max.test | 11 +++++++ sql/opt_range.cc | 46 +++++++++++++++++----------- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/mysql-test/main/group_min_max.result b/mysql-test/main/group_min_max.result index d1bd4d8cedb7e..a87a79fbc56de 100644 --- a/mysql-test/main/group_min_max.result +++ b/mysql-test/main/group_min_max.result @@ -4083,5 +4083,17 @@ MIN(pk) 1 DROP TABLE t1, t2; # +# MDEV-30605 Wrong result while using index for group-by +# +CREATE TABLE t1 (pk INT primary key, a int, key(a)) engine=innodb; +INSERT INTO t1 VALUES (1,-1),(2,8),(3,5),(4,-1),(5,10), (6,-1); +SELECT MIN(pk), a FROM t1 WHERE pk <> 1 GROUP BY a; +MIN(pk) a +4 -1 +3 5 +2 8 +5 10 +DROP TABLE t1; +# # End of 10.5 tests # diff --git a/mysql-test/main/group_min_max.test b/mysql-test/main/group_min_max.test index 7de57d75d36f1..5f7981b8b3075 100644 --- a/mysql-test/main/group_min_max.test +++ b/mysql-test/main/group_min_max.test @@ -1737,6 +1737,17 @@ SELECT SQL_BUFFER_RESULT MIN(pk) FROM t1, t2; SELECT MIN(pk) FROM t1, t2; DROP TABLE t1, t2; +--echo # +--echo # MDEV-30605 Wrong result while using index for group-by +--echo # + +CREATE TABLE t1 (pk INT primary key, a int, key(a)) engine=innodb; +INSERT INTO t1 VALUES (1,-1),(2,8),(3,5),(4,-1),(5,10), (6,-1); + +SELECT MIN(pk), a FROM t1 WHERE pk <> 1 GROUP BY a; + +DROP TABLE t1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 223799a3235f6..82b19e23fd402 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -461,7 +461,7 @@ void print_range_for_non_indexed_field(String *out, Field *field, static void print_min_range_operator(String *out, const ha_rkey_function flag); static void print_max_range_operator(String *out, const ha_rkey_function flag); -static bool is_field_an_unique_index(RANGE_OPT_PARAM *param, Field *field); +static bool is_field_an_unique_index(Field *field); /* SEL_IMERGE is a list of possible ways to do index merge, i.e. it is @@ -7752,8 +7752,13 @@ SEL_TREE *Item_func_ne::get_func_mm_tree(RANGE_OPT_PARAM *param, If this condition is a "col1<>...", where there is a UNIQUE KEY(col1), do not construct a SEL_TREE from it. A condition that excludes just one row in the table is not selective (unless there are only a few rows) + + Note: this logic must be in sync with code in + check_group_min_max_predicates(). That function walks an Item* condition + and checks if the range optimizer would produce an equivalent range for + it. */ - if (is_field_an_unique_index(param, field)) + if (param->using_real_indexes && is_field_an_unique_index(field)) DBUG_RETURN(NULL); DBUG_RETURN(get_ne_mm_tree(param, field, value, value)); } @@ -7865,7 +7870,7 @@ SEL_TREE *Item_func_in::get_func_mm_tree(RANGE_OPT_PARAM *param, - if there are a lot of constants, the overhead of building and processing enormous range list is not worth it. */ - if (is_field_an_unique_index(param, field)) + if (param->using_real_indexes && is_field_an_unique_index(field)) DBUG_RETURN(0); /* Get a SEL_TREE for "(-inf|NULL) < X < c_0" interval. */ @@ -8574,24 +8579,18 @@ SEL_TREE *Item_equal::get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) In the future we could also add "almost unique" indexes where any value is present only in a few rows (but necessarily exactly one row) */ -static bool is_field_an_unique_index(RANGE_OPT_PARAM *param, Field *field) +static bool is_field_an_unique_index(Field *field) { DBUG_ENTER("is_field_an_unique_index"); - - // The check for using_real_indexes is there because of the heuristics - // this function is used for. - if (param->using_real_indexes) + key_map::Iterator it(field->key_start); + uint key_no; + while ((key_no= it++) != key_map::Iterator::BITMAP_END) { - key_map::Iterator it(field->key_start); - uint key_no; - while ((key_no= it++) != key_map::Iterator::BITMAP_END) + KEY *key_info= &field->table->key_info[key_no]; + if (key_info->user_defined_key_parts == 1 && + (key_info->flags & HA_NOSAME)) { - KEY *key_info= &field->table->key_info[key_no]; - if (key_info->user_defined_key_parts == 1 && - (key_info->flags & HA_NOSAME)) - { - DBUG_RETURN(true); - } + DBUG_RETURN(true); } } DBUG_RETURN(false); @@ -13475,7 +13474,7 @@ cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts, - (C between const_i and const_j) - C IS NULL - C IS NOT NULL - - C != const + - C != const (unless C is the primary key) SA4. If Q has a GROUP BY clause, there are no other aggregate functions except MIN and MAX. For queries with DISTINCT, aggregate functions are allowed. @@ -14358,6 +14357,17 @@ check_group_min_max_predicates(Item *cond, Item_field *min_max_arg_item, if (!simple_pred(pred, args, &inv)) DBUG_RETURN(FALSE); + /* + Follow the logic in Item_func_ne::get_func_mm_tree(): condition + in form "tbl.primary_key <> const" is not used to produce intervals. + + If the condition doesn't have an equivalent interval, this means we + fail LooseScan's condition SA3. Return FALSE to indicate this. + */ + if (pred_type == Item_func::NE_FUNC && + is_field_an_unique_index(min_max_arg_item->field)) + DBUG_RETURN(FALSE); + if (args[0] && args[1]) // this is a binary function or BETWEEN { DBUG_ASSERT(pred->fixed_type_handler()); From 485a1b1f116f0c5e73fce3a97ffdac84c861b3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 18 Apr 2023 14:54:40 +0300 Subject: [PATCH 34/70] MDEV-30863 Server freeze, all threads in trx_assign_rseg_low() trx_assign_rseg_low(): Simplify the debug check. trx_rseg_t::reinit(): Reset the skip_allocation() flag. This logic was broken in the merge commit 3e2ad0e918d5d38322994ec9e08fc5dda3a80707 of commit 0de3be8cfdfc26f5c236eaefe12d03c7b4af22c8 (that is, innodb_undo_log_truncate=ON would never be "completed"). Tested by: Matthias Leich --- storage/innobase/include/trx0rseg.h | 3 ++- storage/innobase/trx/trx0rseg.cc | 1 + storage/innobase/trx/trx0trx.cc | 20 +++++--------------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/storage/innobase/include/trx0rseg.h b/storage/innobase/include/trx0rseg.h index 8b7eacbbc18a5..1d95b7d2e7a73 100644 --- a/storage/innobase/include/trx0rseg.h +++ b/storage/innobase/include/trx0rseg.h @@ -129,7 +129,8 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) trx_rseg_t #endif } /** @return whether the segment is marked for undo truncation */ - bool skip_allocation() const { return ref_load() & SKIP; } + bool skip_allocation() const + { return ref.load(std::memory_order_acquire) & SKIP; } /** Increment the reference count */ void acquire() { ut_d(auto r=) ref.fetch_add(REF); ut_ad(!(r & SKIP)); } diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index d30300d70a765..6d95dcf06f1b1 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -403,6 +403,7 @@ void trx_rseg_t::reinit(uint32_t page) last_commit_and_offset= 0; last_page_no= FIL_NULL; curr_size= 1; + ref.store(0, std::memory_order_release); } /** Read the undo log lists. diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index d7ab02844bfd1..ed1187e179b9b 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -811,30 +811,20 @@ static void trx_assign_rseg_low(trx_t *trx) static Atomic_counter rseg_slot; unsigned slot = rseg_slot++ % TRX_SYS_N_RSEGS; ut_d(if (trx_rseg_n_slots_debug) slot = 0); + ut_d(const auto start_scan_slot = slot); trx_rseg_t* rseg; -#ifdef UNIV_DEBUG - ulint start_scan_slot = slot; - bool look_for_rollover = false; -#endif /* UNIV_DEBUG */ - bool allocated; do { for (;;) { rseg = &trx_sys.rseg_array[slot]; -#ifdef UNIV_DEBUG - /* Ensure that we are not revisiting the same - slot that we have already inspected. */ - if (look_for_rollover) { + do { + ut_d(if (!trx_rseg_n_slots_debug) continue); + slot = (slot + 1) % TRX_SYS_N_RSEGS; ut_ad(start_scan_slot != slot); - } - look_for_rollover = true; -#endif /* UNIV_DEBUG */ - - ut_d(if (!trx_rseg_n_slots_debug)) - slot = (slot + 1) % TRX_SYS_N_RSEGS; + } while (0); if (!rseg->space) { continue; From feeeacc4d747868c234425dc12c157c6e5fa8fbb Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 29 Mar 2023 13:55:30 +0200 Subject: [PATCH 35/70] MDEV-30955 Explicit locks released too early in rollback path Assertion `thd->mdl_context.is_lock_owner()` fires when a client is disconnected, while transaction and and a table is opened through `HANDLER` interface. Reason for the assertion is that when a connection closes, its ongoing transaction is eventually rolled back in `Wsrep_client_state::bf_rollback()`. This method also releases explicit which are expected to survive beyond the transaction lifetime. This patch also removes calls to `mysql_ull_cleanup()`. User level locks are not supported in combination with Galera, making these calls unnecessary. --- mysql-test/suite/galera/r/MDEV-30955.result | 26 ++++++++ mysql-test/suite/galera/t/MDEV-30955.test | 70 +++++++++++++++++++++ sql/sql_parse.cc | 2 +- sql/wsrep_client_service.cc | 2 - sql/wsrep_high_priority_service.cc | 2 - 5 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 mysql-test/suite/galera/r/MDEV-30955.result create mode 100644 mysql-test/suite/galera/t/MDEV-30955.test diff --git a/mysql-test/suite/galera/r/MDEV-30955.result b/mysql-test/suite/galera/r/MDEV-30955.result new file mode 100644 index 0000000000000..2a090cb58bca2 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-30955.result @@ -0,0 +1,26 @@ +connection node_2; +connection node_1; +CREATE TABLE t (a CHAR(1) KEY); +START TRANSACTION; +HANDLER t OPEN; +disconnect node_1; +connect node_1, 127.0.0.1, root, , test, $NODE_MYPORT_1; +DROP TABLE t; +BACKUP STAGE START; +START TRANSACTION; +disconnect node_1; +connect node_1, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +START TRANSACTION; +INSERT INTO t1 VALUES(1); +HANDLER t2 OPEN; +connection node_2; +INSERT INTO t1 VALUES(1); +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1a; +connection node_1; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +DROP TABLE t1,t2; diff --git a/mysql-test/suite/galera/t/MDEV-30955.test b/mysql-test/suite/galera/t/MDEV-30955.test new file mode 100644 index 0000000000000..18577120e8354 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-30955.test @@ -0,0 +1,70 @@ +# +# MDEV-30955 +# Assertion `thd->mdl_context.is_lock_owner(MDL_key::TABLE, +# table->s->db.str, table->s->table_name.str, MDL_SHARED)' +# failed in close_thread_table() +# + +--source include/galera_cluster.inc + +# +# Test 1: Assertion thd->mdl_context.is_lock_owner() +# failed in close_thread_table() +# +CREATE TABLE t (a CHAR(1) KEY); +START TRANSACTION; +HANDLER t OPEN; + +# +# If bug is present the transaction will be aborted +# through Wsrep_client_service::bf_rollback() and +# release explicit locks too early. Later, during +# THD::cleanup(), table t will be closed and the +# THD is expected to be owner of the MDL lock that +# was just released. +# +--disconnect node_1 + +--connect node_1, 127.0.0.1, root, , test, $NODE_MYPORT_1 +DROP TABLE t; + + +# +# Test 2: Similar issue reproduces also with BACKUP STAGE locks. +# See comments in MDEV-25037 +# + +BACKUP STAGE START; +START TRANSACTION; +--disconnect node_1 +--connect node_1, 127.0.0.1, root, , test, $NODE_MYPORT_1 + + +# +# Test 3: Assertion `!thd->mdl_context.has_locks()' failed +# in do_command() +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); + +--let $bf_count = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.global_status WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +START TRANSACTION; +INSERT INTO t1 VALUES(1); +HANDLER t2 OPEN; + +--connection node_2 +INSERT INTO t1 VALUES(1); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $bf_count + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts' +--source include/wait_condition.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1,t2; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c495ae2d6c4a6..c95993e160499 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1309,7 +1309,7 @@ bool do_command(THD *thd) in wsrep_before_command(). */ WSREP_LOG_THD(thd, "enter found BF aborted"); - DBUG_ASSERT(!thd->mdl_context.has_locks()); + DBUG_ASSERT(!thd->mdl_context.has_transactional_locks()); DBUG_ASSERT(!thd->get_stmt_da()->is_set()); /* We let COM_QUIT and COM_STMT_CLOSE to execute even if wsrep aborted. */ if (command == COM_STMT_EXECUTE) diff --git a/sql/wsrep_client_service.cc b/sql/wsrep_client_service.cc index f00dfccf274b3..0399cf4f44250 100644 --- a/sql/wsrep_client_service.cc +++ b/sql/wsrep_client_service.cc @@ -362,8 +362,6 @@ int Wsrep_client_service::bf_rollback() m_thd->global_read_lock.unlock_global_read_lock(m_thd); } m_thd->release_transactional_locks(); - mysql_ull_cleanup(m_thd); - m_thd->mdl_context.release_explicit_locks(); DBUG_RETURN(ret); } diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index 96269481559a0..3c6524b7ddfbc 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -357,8 +357,6 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle, m_thd->wsrep_cs().prepare_for_ordering(ws_handle, ws_meta, false); int ret= (trans_rollback_stmt(m_thd) || trans_rollback(m_thd)); m_thd->release_transactional_locks(); - mysql_ull_cleanup(m_thd); - m_thd->mdl_context.release_explicit_locks(); free_root(m_thd->mem_root, MYF(MY_KEEP_PREALLOC)); From 75063d128812347228873e2dce4ae7799f348ebf Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Tue, 4 Apr 2023 15:54:26 +1000 Subject: [PATCH 36/70] MDEV-30542 Add multilength spider self-reference detection test --- .../bugfix/r/self_reference_multi.result | 21 ++++++++++++++ .../spider/bugfix/t/self_reference_multi.test | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result b/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result new file mode 100644 index 0000000000000..c4399ddf9d286 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result @@ -0,0 +1,21 @@ +for master_1 +for child2 +for child3 + +MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever + +CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +create table t0 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +alter table t2 ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t0"'; +select * from t0; +ERROR HY000: An infinite loop is detected when opening table test.t0 +select * from t1; +ERROR HY000: An infinite loop is detected when opening table test.t0 +select * from t2; +ERROR HY000: An infinite loop is detected when opening table test.t0 +drop table t0, t1, t2; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test new file mode 100644 index 0000000000000..8b6f070d167b6 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test @@ -0,0 +1,29 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--echo +--echo MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever +--echo + +--replace_regex /SOCKET ".*"/SOCKET "$MASTER_1_MYSOCK"/ +eval CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +create table t0 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +alter table t2 ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t0"'; +--error 12719 +select * from t0; +--error 12719 +select * from t1; +--error 12719 +select * from t2; +drop table t0, t1, t2; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log From d6651864773afc2b7534285ee0d50d4fd6b47e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 14:08:53 +0300 Subject: [PATCH 37/70] MDEV-28976: mtr must wait for server to actually die do_shutdown_server(): Call wait_until_dead() also when we are forcibly killing the process (timeout=0). We have evidence that killing the process may take some time and cause mystery failures in crash recovery tests. For InnoDB, several failures were observed between commit da094188f60bf67e3d90227304a4ea256fe2630f and commit 0ee1082bd2e7e7049c4f0e686bad53cf7ba053ab when no advisory file locking was being used by default. --- client/mysqltest.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 6330d4f881d7b..9e9b122c5fedf 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -5191,7 +5191,7 @@ void do_shutdown_server(struct st_command *command) if (timeout) (void) my_kill(pid, SIGABRT); /* Give server a few seconds to die in all cases */ - if (!timeout || wait_until_dead(pid, timeout < 5 ? 5 : timeout)) + if (wait_until_dead(pid, timeout < 5 ? 5 : timeout)) { (void) my_kill(pid, SIGKILL); } From b2bbc66a41a7b3b622fbcd477e777c45e3248886 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Mon, 10 Apr 2023 11:57:39 +0530 Subject: [PATCH 38/70] MDEV-24011 InnoDB: Failing assertion: index_cache->words == NULL in fts0fts.cc line 551 This issue happens when race condition happens when DDL and fts optimize thread. DDL adds the new index to fts cache. At the same time, fts optimize thread clears the cache and reinitialize it. Take cache init lock before reinitializing the cache. fts_sync_commit() should take dict_sys mutex to avoid the deadlock with create index. --- storage/innobase/fts/fts0fts.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 224fc9593b7f1..8ce6fee0b76d1 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -851,7 +851,7 @@ fts_drop_index( dberr_t err = DB_SUCCESS; ut_a(indexes); - + ut_d(dict_sys.assert_locked()); if ((ib_vector_size(indexes) == 1 && (index == static_cast( ib_vector_getp(table->fts->indexes, 0))) @@ -873,7 +873,9 @@ fts_drop_index( current_doc_id = table->fts->cache->next_doc_id; first_doc_id = table->fts->cache->first_doc_id; + rw_lock_x_lock(&table->fts->cache->init_lock); fts_cache_clear(table->fts->cache); + rw_lock_x_unlock(&table->fts->cache->init_lock); fts_cache_destroy(table->fts->cache); table->fts->cache = fts_cache_create(table); table->fts->cache->next_doc_id = current_doc_id; @@ -4192,9 +4194,15 @@ fts_sync_commit( /* We need to do this within the deleted lock since fts_delete() can attempt to add a deleted doc id to the cache deleted id array. */ + mutex_enter(&dict_sys.mutex); + sync->table->fts->dict_locked = true; + rw_lock_x_lock(&cache->init_lock); fts_cache_clear(cache); DEBUG_SYNC_C("fts_deleted_doc_ids_clear"); fts_cache_init(cache); + rw_lock_x_unlock(&cache->init_lock); + sync->table->fts->dict_locked = false; + mutex_exit(&dict_sys.mutex); rw_lock_x_unlock(&cache->lock); if (UNIV_LIKELY(error == DB_SUCCESS)) { From 2bfd04e3145b238df5f31143b98b1df501f43d1e Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 11 Apr 2023 18:36:55 +0530 Subject: [PATCH 39/70] MDEV-31025 Redundant table alter fails when fixed column stored externally row_merge_buf_add(): Has strict assert that fixed length mismatch shouldn't happen while rebuilding the redundant row format table btr_index_rec_validate(): Fixed size column can be stored externally. So sum of inline stored length and external stored length of the column should be equal to total column length --- .../innodb/r/default_row_format_alter.result | 20 +++++++++++++++++++ .../innodb/t/default_row_format_alter.test | 17 ++++++++++++++++ storage/innobase/btr/btr0btr.cc | 2 +- storage/innobase/row/row0merge.cc | 5 ----- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/mysql-test/suite/innodb/r/default_row_format_alter.result b/mysql-test/suite/innodb/r/default_row_format_alter.result index 42cbab8a5f2a2..33936b5900398 100644 --- a/mysql-test/suite/innodb/r/default_row_format_alter.result +++ b/mysql-test/suite/innodb/r/default_row_format_alter.result @@ -129,5 +129,25 @@ SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; ROW_FORMAT Dynamic DROP TABLE t1; +# +# MDEV-31025 Redundant table alter fails when fixed column +# stored externally +# +set @old_sql_mode = @@sql_mode; +SET @@sql_mode=''; +CREATE TABLE t1(pk INT,c CHAR(255),c2 CHAR(255),c3 CHAR(255), +c4 char(255), c5 char(255), c6 char(255), +c7 char(255), c8 char(255), primary key(pk) +)Engine=InnoDB character set utf32 ROW_FORMAT=REDUNDANT; +INSERT INTO t1(pk, c) VALUES (1, repeat('a', 255)); +ALTER TABLE t1 FORCE; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SELECT LENGTH(c) FROM t1; +LENGTH(c) +1020 +DROP TABLE t1; +set @@sql_mode = @old_sql_mode; # End of 10.4 tests SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/t/default_row_format_alter.test b/mysql-test/suite/innodb/t/default_row_format_alter.test index f5dd246efb5ab..5f2170454f36f 100644 --- a/mysql-test/suite/innodb/t/default_row_format_alter.test +++ b/mysql-test/suite/innodb/t/default_row_format_alter.test @@ -150,6 +150,23 @@ ALTER TABLE t1 DROP b; SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; DROP TABLE t1; +--echo # +--echo # MDEV-31025 Redundant table alter fails when fixed column +--echo # stored externally +--echo # +set @old_sql_mode = @@sql_mode; +SET @@sql_mode=''; +CREATE TABLE t1(pk INT,c CHAR(255),c2 CHAR(255),c3 CHAR(255), + c4 char(255), c5 char(255), c6 char(255), + c7 char(255), c8 char(255), primary key(pk) + )Engine=InnoDB character set utf32 ROW_FORMAT=REDUNDANT; +INSERT INTO t1(pk, c) VALUES (1, repeat('a', 255)); +ALTER TABLE t1 FORCE; +CHECK TABLE t1; +SELECT LENGTH(c) FROM t1; +DROP TABLE t1; +set @@sql_mode = @old_sql_mode; + --echo # End of 10.4 tests SET GLOBAL innodb_default_row_format = @row_format; diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index f54a8e1125a8d..2df947157504b 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -4713,7 +4713,7 @@ btr_index_rec_validate( len -= BTR_EXTERN_FIELD_REF_SIZE; ulint extern_len = mach_read_from_4( data + len + BTR_EXTERN_LEN + 4); - if (fixed_size == extern_len) { + if (fixed_size == extern_len + len) { goto next_field; } } diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 9d755ce6f1e62..f0aed489f2257 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -681,11 +681,6 @@ row_merge_buf_add( row_field, field, col->len, old_table->space->zip_size(), conv_heap); - } else { - /* Field length mismatch should not - happen when rebuilding redundant row - format table. */ - ut_ad(index->table->not_redundant()); } } } From 660afb1e9c11d4fe1ba806557c60cda3f62b1be1 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 13 Apr 2023 16:26:03 +0530 Subject: [PATCH 40/70] MDEV-30076 ibuf_insert tries to insert the entry for uncommitted index - Change buffer should not buffer the changes for uncommitted index --- storage/innobase/ibuf/ibuf0ibuf.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 3fe74c3a270ca..d611c7793f7f7 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -3577,6 +3577,10 @@ ibuf_insert( ulint zip_size, que_thr_t* thr) { + if (!index->is_committed()) { + return false; + } + dberr_t err; ulint entry_size; ibool no_counter; From 1892f5d8fcb73350973f93b1a89cdc1482a5c116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 14:46:49 +0300 Subject: [PATCH 41/70] MDEV-30863 fixup: Hang in a debug build trx_assign_rseg_low(): Correct a debug injection condition. --- storage/innobase/trx/trx0trx.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index ed1187e179b9b..a84ae220839ef 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -821,7 +821,7 @@ static void trx_assign_rseg_low(trx_t *trx) rseg = &trx_sys.rseg_array[slot]; do { - ut_d(if (!trx_rseg_n_slots_debug) continue); + ut_d(if (trx_rseg_n_slots_debug) continue); slot = (slot + 1) % TRX_SYS_N_RSEGS; ut_ad(start_scan_slot != slot); } while (0); From 210db2935cb3802f6806ba3b23c32263611e3e2f Mon Sep 17 00:00:00 2001 From: Denis Protivensky Date: Tue, 14 Mar 2023 14:08:12 +0300 Subject: [PATCH 42/70] MDEV-30804 Rollback multi-engine transaction requiring 2PC but committing in one phase Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/MDEV-30804.result | 11 +++++++++++ mysql-test/suite/galera/t/MDEV-30804.cnf | 7 +++++++ mysql-test/suite/galera/t/MDEV-30804.test | 21 +++++++++++++++++++++ sql/handler.cc | 14 +++++++++++++- 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/galera/r/MDEV-30804.result create mode 100644 mysql-test/suite/galera/t/MDEV-30804.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-30804.test diff --git a/mysql-test/suite/galera/r/MDEV-30804.result b/mysql-test/suite/galera/r/MDEV-30804.result new file mode 100644 index 0000000000000..2bf323d19f84e --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-30804.result @@ -0,0 +1,11 @@ +connection node_2; +connection node_1; +CREATE TABLE t (a INT) ENGINE=Aria; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +START TRANSACTION; +INSERT INTO t VALUES ('1'); +INSERT INTO t1 VALUES ('1'); +COMMIT; +ERROR HY000: Transactional commit not supported by involved engine(s) +DROP TABLE t; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-30804.cnf b/mysql-test/suite/galera/t/MDEV-30804.cnf new file mode 100644 index 0000000000000..9dbd81f758d0d --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-30804.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin + +[mysqld.2] +log-bin diff --git a/mysql-test/suite/galera/t/MDEV-30804.test b/mysql-test/suite/galera/t/MDEV-30804.test new file mode 100644 index 0000000000000..561953a0578a2 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-30804.test @@ -0,0 +1,21 @@ +# +# Test that transaction requiring two-phase commit and involving +# storage engines not supporting it rolls back with a message. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_aria.inc + +CREATE TABLE t (a INT) ENGINE=Aria; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +START TRANSACTION; +INSERT INTO t VALUES ('1'); +INSERT INTO t1 VALUES ('1'); + +--error ER_ERROR_DURING_COMMIT +COMMIT; + +DROP TABLE t; +DROP TABLE t1; diff --git a/sql/handler.cc b/sql/handler.cc index 4afd30021eece..e0dd51376ad05 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1733,7 +1733,19 @@ int ha_commit_trans(THD *thd, bool all) ordering is normally done. Commit ordering must be done here. */ if (run_wsrep_hooks) - error= wsrep_before_commit(thd, all); + { + // This commit involves more than one storage engine and requires + // two phases, but some engines don't support it. + // Issue a message to the client and roll back the transaction. + if (trans->no_2pc && rw_ha_count > 1) + { + my_message(ER_ERROR_DURING_COMMIT, "Transactional commit not supported " + "by involved engine(s)", MYF(0)); + error= 1; + } + else + error= wsrep_before_commit(thd, all); + } if (error) { ha_rollback_trans(thd, FALSE); From 78368e5866383333407a4e2752c8b62df8fb8c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 15:52:11 +0300 Subject: [PATCH 43/70] MDEV-30863 fixup: Assertion failure when using innodb_undo_tablespaces=0 trx_assign_rseg_low(): Let us restore the debug variable look_for_rollover to avoid assertion failures when a server that was created with multiple undo tablespaces is being started with innodb_undo_tablespaces=0. --- storage/innobase/trx/trx0trx.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index a84ae220839ef..88e42b2ebadbf 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -812,6 +812,7 @@ static void trx_assign_rseg_low(trx_t *trx) unsigned slot = rseg_slot++ % TRX_SYS_N_RSEGS; ut_d(if (trx_rseg_n_slots_debug) slot = 0); ut_d(const auto start_scan_slot = slot); + ut_d(bool look_for_rollover = false); trx_rseg_t* rseg; bool allocated; @@ -819,12 +820,10 @@ static void trx_assign_rseg_low(trx_t *trx) do { for (;;) { rseg = &trx_sys.rseg_array[slot]; - - do { - ut_d(if (trx_rseg_n_slots_debug) continue); - slot = (slot + 1) % TRX_SYS_N_RSEGS; - ut_ad(start_scan_slot != slot); - } while (0); + ut_ad(!look_for_rollover || start_scan_slot != slot); + ut_d(look_for_rollover = true); + ut_d(if (!trx_rseg_n_slots_debug)) + slot = (slot + 1) % TRX_SYS_N_RSEGS; if (!rseg->space) { continue; From 854e8b189e422e2d2e61e66380a18b9f8e33646d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 15:53:26 +0300 Subject: [PATCH 44/70] MDEV-28976 fixup: A better fix do_shutdown_server(): After sending SIGKILL, invoke wait_until_dead(). Thanks to Sergei Golubchik for pointing out that the previous fix does not actually work. --- client/mysqltest.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 9e9b122c5fedf..e745f8a3d2ff0 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -5191,9 +5191,10 @@ void do_shutdown_server(struct st_command *command) if (timeout) (void) my_kill(pid, SIGABRT); /* Give server a few seconds to die in all cases */ - if (wait_until_dead(pid, timeout < 5 ? 5 : timeout)) + if (!timeout || wait_until_dead(pid, timeout < 5 ? 5 : timeout)) { (void) my_kill(pid, SIGKILL); + wait_until_dead(pid, 5); } } DBUG_VOID_RETURN; From 0cda0e4e150864c0bd0062d45d554508bc77fc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 18:56:58 +0300 Subject: [PATCH 45/70] MDEV-31080 fil_validate() failures during deferred tablespace recovery fil_space_t::create(), fil_space_t::add(): Expect the caller to acquire and release fil_system.mutex. In this way, creating a tablespace and adding the first (usually only) data file will be atomic. recv_sys_t::recover_deferred(): Correctly protect some changes by holding fil_system.mutex. Tested by: Matthias Leich --- extra/mariabackup/xtrabackup.cc | 17 +++++++++------- storage/innobase/fil/fil0fil.cc | 29 ++++++++++++++++++---------- storage/innobase/fsp/fsp0space.cc | 24 ++++++++++++----------- storage/innobase/fsp/fsp0sysspace.cc | 10 ++++++---- storage/innobase/log/log0recv.cc | 18 +++++++++++------ storage/innobase/srv/srv0start.cc | 6 ++---- 6 files changed, 62 insertions(+), 42 deletions(-) diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 9de1ef853b99b..0a0ba9cd98e7c 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -3454,20 +3454,20 @@ static void xb_load_single_table_tablespace(const char *dirname, bool is_empty_file = file->exists() && file->is_empty_file(); if (err == DB_SUCCESS && file->space_id() != SRV_TMP_SPACE_ID) { + mysql_mutex_lock(&fil_system.mutex); space = fil_space_t::create( file->space_id(), file->flags(), FIL_TYPE_TABLESPACE, nullptr/* TODO: crypt_data */, FIL_ENCRYPTION_DEFAULT, file->handle() != OS_FILE_CLOSED); - - ut_a(space != NULL); + ut_ad(space); fil_node_t* node= space->add( file->filepath(), skip_node_page0 ? file->detach() : pfs_os_file_t(), 0, false, false); node->deferred= defer; - mysql_mutex_lock(&fil_system.mutex); - space->read_page0(); + if (!space->read_page0()) + err = DB_CANNOT_OPEN_FILE; mysql_mutex_unlock(&fil_system.mutex); if (srv_operation == SRV_OPERATION_RESTORE_DELTA @@ -5324,9 +5324,12 @@ xb_delta_open_matching_space( ut_ad(fil_space_t::zip_size(flags) == info.zip_size); ut_ad(fil_space_t::physical_size(flags) == info.page_size); - if (fil_space_t::create(info.space_id, flags, - FIL_TYPE_TABLESPACE, 0, FIL_ENCRYPTION_DEFAULT, - true)) { + mysql_mutex_lock(&fil_system.mutex); + fil_space_t* space = fil_space_t::create(info.space_id, flags, + FIL_TYPE_TABLESPACE, 0, + FIL_ENCRYPTION_DEFAULT, true); + mysql_mutex_unlock(&fil_system.mutex); + if (space) { *success = xb_space_create_file(real_name, info.space_id, flags, &file); } else { diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 19ebdc8d67ebf..48d205f428ad5 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -311,6 +311,8 @@ fil_node_t* fil_space_t::add(const char* name, pfs_os_file_t handle, uint32_t size, bool is_raw, bool atomic_write, uint32_t max_pages) { + mysql_mutex_assert_owner(&fil_system.mutex); + fil_node_t* node; ut_ad(name != NULL); @@ -335,7 +337,6 @@ fil_node_t* fil_space_t::add(const char* name, pfs_os_file_t handle, node->atomic_write = atomic_write; - mysql_mutex_lock(&fil_system.mutex); this->size += size; UT_LIST_ADD_LAST(chain, node); if (node->is_open()) { @@ -346,7 +347,6 @@ fil_node_t* fil_space_t::add(const char* name, pfs_os_file_t handle, release(); } } - mysql_mutex_unlock(&fil_system.mutex); return node; } @@ -946,6 +946,7 @@ fil_space_t *fil_space_t::create(ulint id, ulint flags, { fil_space_t* space; + mysql_mutex_assert_owner(&fil_system.mutex); ut_ad(fil_system.is_initialised()); ut_ad(fil_space_t::is_valid_flags(flags & ~FSP_FLAGS_MEM_MASK, id)); ut_ad(srv_page_size == UNIV_PAGE_SIZE_ORIG || flags != 0); @@ -978,8 +979,6 @@ fil_space_t *fil_space_t::create(ulint id, ulint flags, space->latch.SRW_LOCK_INIT(fil_space_latch_key); - mysql_mutex_lock(&fil_system.mutex); - if (const fil_space_t *old_space = fil_space_get_by_id(id)) { ib::error() << "Trying to add tablespace with id " << id << " to the cache, but tablespace '" @@ -987,7 +986,6 @@ fil_space_t *fil_space_t::create(ulint id, ulint flags, ? old_space->chain.start->name : "") << "' already exists in the cache!"; - mysql_mutex_unlock(&fil_system.mutex); space->~fil_space_t(); ut_free(space); return(NULL); @@ -1034,12 +1032,12 @@ fil_space_t *fil_space_t::create(ulint id, ulint flags, if (rotate) { fil_system.default_encrypt_tables.push_back(*space); space->is_in_default_encrypt = true; - } - mysql_mutex_unlock(&fil_system.mutex); - - if (rotate && srv_n_fil_crypt_threads_started) { - fil_crypt_threads_signal(); + if (srv_n_fil_crypt_threads_started) { + mysql_mutex_unlock(&fil_system.mutex); + fil_crypt_threads_signal(); + mysql_mutex_lock(&fil_system.mutex); + } } return(space); @@ -1998,16 +1996,20 @@ fil_ibd_create( DBUG_EXECUTE_IF("checkpoint_after_file_create", log_make_checkpoint();); + mysql_mutex_lock(&fil_system.mutex); if (fil_space_t* space = fil_space_t::create(space_id, flags, FIL_TYPE_TABLESPACE, crypt_data, mode, true)) { fil_node_t* node = space->add(path, file, size, false, true); + mysql_mutex_unlock(&fil_system.mutex); IF_WIN(node->find_metadata(), node->find_metadata(file, true)); mtr.start(); mtr.set_named_space(space); ut_a(fsp_header_init(space, size, &mtr) == DB_SUCCESS); mtr.commit(); return space; + } else { + mysql_mutex_unlock(&fil_system.mutex); } if (space_name.data()) { @@ -2267,8 +2269,10 @@ fil_ibd_open( first_page) : NULL; + mysql_mutex_lock(&fil_system.mutex); space = fil_space_t::create(id, flags, purpose, crypt_data); if (!space) { + mysql_mutex_unlock(&fil_system.mutex); goto error; } @@ -2278,6 +2282,7 @@ fil_ibd_open( space->add( df_remote.is_open() ? df_remote.filepath() : df_default.filepath(), OS_FILE_CLOSED, 0, false, true); + mysql_mutex_unlock(&fil_system.mutex); if (must_validate && !srv_read_only_mode) { df_remote.close(); @@ -2566,10 +2571,13 @@ fil_ibd_load( return FIL_LOAD_INVALID; } + mysql_mutex_lock(&fil_system.mutex); + space = fil_space_t::create( space_id, flags, FIL_TYPE_TABLESPACE, crypt_data); if (space == NULL) { + mysql_mutex_unlock(&fil_system.mutex); return(FIL_LOAD_INVALID); } @@ -2581,6 +2589,7 @@ fil_ibd_load( let fil_node_open() do that task. */ space->add(file.filepath(), OS_FILE_CLOSED, 0, false, false); + mysql_mutex_unlock(&fil_system.mutex); return(FIL_LOAD_OK); } diff --git a/storage/innobase/fsp/fsp0space.cc b/storage/innobase/fsp/fsp0space.cc index b069250ff9fec..8c6344946a47d 100644 --- a/storage/innobase/fsp/fsp0space.cc +++ b/storage/innobase/fsp/fsp0space.cc @@ -88,25 +88,25 @@ Tablespace::open_or_create(bool is_temp) ut_ad(!m_files.empty()); for (iterator it = begin(); it != end(); ++it) { - if (it->m_exists) { err = it->open_or_create( m_ignore_read_only ? false : srv_read_only_mode); + if (err != DB_SUCCESS) { + return err; + } } else { err = it->open_or_create( m_ignore_read_only ? false : srv_read_only_mode); - /* Set the correct open flags now that we have - successfully created the file. */ - if (err == DB_SUCCESS) { - file_found(*it); + if (err != DB_SUCCESS) { + return err; } - } - if (err != DB_SUCCESS) { - break; + /* Set the correct open flags now that we have + successfully created the file. */ + file_found(*it); } /* We can close the handle now and open the tablespace @@ -130,20 +130,22 @@ Tablespace::open_or_create(bool is_temp) fsp_flags = FSP_FLAGS_PAGE_SSIZE(); } + mysql_mutex_lock(&fil_system.mutex); space = fil_space_t::create( m_space_id, fsp_flags, is_temp ? FIL_TYPE_TEMPORARY : FIL_TYPE_TABLESPACE, NULL); if (!space) { + mysql_mutex_unlock(&fil_system.mutex); return DB_ERROR; } + } else { + mysql_mutex_lock(&fil_system.mutex); } - - ut_a(fil_validate()); - space->add(it->m_filepath, OS_FILE_CLOSED, it->m_size, false, true); + mysql_mutex_unlock(&fil_system.mutex); } return(err); diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc index 497e410055773..577db8eb9f2dd 100644 --- a/storage/innobase/fsp/fsp0sysspace.cc +++ b/storage/innobase/fsp/fsp0sysspace.cc @@ -921,6 +921,7 @@ SysTablespace::open_or_create( /* Close the curent handles, add space and file info to the fil_system cache and the Data Dictionary, and re-open them in file_system cache so that they stay open until shutdown. */ + mysql_mutex_lock(&fil_system.mutex); ulint node_counter = 0; for (files_t::iterator it = begin; it != end; ++it) { it->close(); @@ -934,7 +935,8 @@ SysTablespace::open_or_create( FIL_TYPE_TEMPORARY, NULL); ut_ad(space == fil_system.temp_space); if (!space) { - return DB_ERROR; + err = DB_ERROR; + break; } ut_ad(!space->is_compressed()); ut_ad(space->full_crc32()); @@ -945,12 +947,11 @@ SysTablespace::open_or_create( FIL_TYPE_TABLESPACE, NULL); ut_ad(space == fil_system.sys_space); if (!space) { - return DB_ERROR; + err = DB_ERROR; + break; } } - ut_a(fil_validate()); - uint32_t max_size = (++node_counter == m_files.size() ? (m_last_file_size_max == 0 ? UINT32_MAX @@ -961,6 +962,7 @@ SysTablespace::open_or_create( it->m_type != SRV_NOT_RAW, true, max_size); } + mysql_mutex_unlock(&fil_system.mutex); return(err); } diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 3b6e3008a9569..f87ff15c3938c 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -785,9 +785,10 @@ static struct if (!os_file_status(name->c_str(), &exists, &ftype) || !exists) goto processed; } - create(it, *name, static_cast - (1U << FSP_FLAGS_FCRC32_POS_MARKER | - FSP_FLAGS_FCRC32_PAGE_SSIZE()), nullptr, 0); + if (create(it, *name, static_cast + (1U << FSP_FLAGS_FCRC32_POS_MARKER | + FSP_FLAGS_FCRC32_PAGE_SSIZE()), nullptr, 0)) + mysql_mutex_unlock(&fil_system.mutex); } } else @@ -816,7 +817,7 @@ static struct @param flags FSP_SPACE_FLAGS @param crypt_data encryption metadata @param size tablespace size in pages - @return tablespace + @return tablespace; the caller must release fil_system.mutex @retval nullptr if crypt_data is invalid */ static fil_space_t *create(const recv_spaces_t::const_iterator &it, const std::string &name, uint32_t flags, @@ -828,6 +829,7 @@ static struct ut_free(crypt_data); return nullptr; } + mysql_mutex_lock(&fil_system.mutex); fil_space_t *space= fil_space_t::create(it->first, flags, FIL_TYPE_TABLESPACE, crypt_data); ut_ad(space); @@ -900,12 +902,13 @@ static struct space->free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT); space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page); fil_node_t *node= UT_LIST_GET_FIRST(space->chain); + mysql_mutex_unlock(&fil_system.mutex); if (!space->acquire()) - { + { free_space: fil_space_free(it->first, false); goto next_item; - } + } if (os_file_write(IORequestWrite, node->name, node->handle, page, 0, fil_space_t::physical_size(flags)) != DB_SUCCESS) @@ -975,6 +978,7 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p, space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page); fil_node_t *node= UT_LIST_GET_FIRST(space->chain); node->deferred= true; + mysql_mutex_unlock(&fil_system.mutex); if (!space->acquire()) goto release_and_fail; fil_names_dirty(space); @@ -998,8 +1002,10 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p, uint32_t(file_size / fil_space_t::physical_size(flags)); if (n_pages > size) { + mysql_mutex_lock(&fil_system.mutex); space->size= node->size= n_pages; space->set_committed_size(); + mysql_mutex_unlock(&fil_system.mutex); goto size_set; } } diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index a1368c5146cc0..707804f22065e 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -559,14 +559,12 @@ static ulint srv_undo_tablespace_open(bool create, const char* name, ulint i) fil_set_max_space_id_if_bigger(space_id); + mysql_mutex_lock(&fil_system.mutex); fil_space_t *space= fil_space_t::create(space_id, fsp_flags, FIL_TYPE_TABLESPACE, nullptr, FIL_ENCRYPTION_DEFAULT, true); - ut_a(fil_validate()); - ut_a(space); - + ut_ad(space); fil_node_t *file= space->add(name, fh, 0, false, true); - mysql_mutex_lock(&fil_system.mutex); if (create) { From 27ff972be22880a4046652bc94c2f97fffb456c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 19 Apr 2023 18:57:18 +0300 Subject: [PATCH 46/70] MDEV-26827 fixup: Do not hog buf_pool.mutex buf_flush_LRU_list_batch(): When evicting clean pages, release and reacquire the buf_pool.mutex after every 32 pages. Also, eliminate some conditional branches. --- storage/innobase/buf/buf0flu.cc | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 5a9e3cbb34ec3..3ef70741da135 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1255,6 +1255,11 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, ++n->evicted; /* fall through */ case 1: + if (UNIV_LIKELY(scanned & 31)) + continue; + mysql_mutex_unlock(&buf_pool.mutex); + reacquire_mutex: + mysql_mutex_lock(&buf_pool.mutex); continue; } @@ -1290,32 +1295,37 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, auto p= buf_flush_space(space_id); space= p.first; last_space_id= space_id; + if (!space) + { + mysql_mutex_lock(&buf_pool.mutex); + goto no_space; + } mysql_mutex_lock(&buf_pool.mutex); - if (p.second) - buf_pool.stat.n_pages_written+= p.second; + buf_pool.stat.n_pages_written+= p.second; } else + { ut_ad(!space); + goto no_space; + } } else if (space->is_stopping()) { space->release(); space= nullptr; - } - - if (!space) - { + no_space: mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_discard_page(bpage); + continue; } - else if (neighbors && space->is_rotational()) + + if (neighbors && space->is_rotational()) { mysql_mutex_unlock(&buf_pool.mutex); n->flushed+= buf_flush_try_neighbors(space, page_id, bpage, neighbors == 1, do_evict, n->flushed, max); -reacquire_mutex: - mysql_mutex_lock(&buf_pool.mutex); + goto reacquire_mutex; } else if (n->flushed >= max && !recv_recovery_is_on()) { From f7791cc7cbedfb29b7cdd68df000108988f77fd3 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 20 Apr 2023 10:10:23 +1000 Subject: [PATCH 47/70] Revert "MDEV-30186 Use of uninitialized value in substitution" This reverts commit 0e737f78980fcfe83b05c27215eb3f5ede1ea473. As noted by Andrew, this introduces race conditions in the setting and using of the global $test_name_for_report. --- mysql-test/mariadb-test-run.pl | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/mysql-test/mariadb-test-run.pl b/mysql-test/mariadb-test-run.pl index 670f63a990fb7..46a51d2fa58b1 100755 --- a/mysql-test/mariadb-test-run.pl +++ b/mysql-test/mariadb-test-run.pl @@ -145,7 +145,6 @@ BEGIN my $start_only; my $file_wsrep_provider; my $num_saved_cores= 0; # Number of core files saved in vardir/log/ so far. -my $test_name_for_report; our @global_suppressions; @@ -516,13 +515,13 @@ sub main { } if ( not @$completed ) { - if ($test_name_for_report) - { - my $tinfo = My::Test->new(name => $test_name_for_report); - $tinfo->{result}= 'MTR_RES_FAILED'; - $tinfo->{comment}=' '; - mtr_report_test($tinfo); - } + my $test_name= mtr_grab_file($path_testlog); + $test_name =~ s/^CURRENT_TEST:\s//; + chomp($test_name); + my $tinfo = My::Test->new(name => $test_name); + $tinfo->{result}= 'MTR_RES_FAILED'; + $tinfo->{comment}=' '; + mtr_report_test($tinfo); mtr_error("Test suite aborted"); } @@ -3741,8 +3740,8 @@ ($) sub run_testcase ($$) { my ($tinfo, $server_socket)= @_; my $print_freq=20; - $test_name_for_report= $tinfo->{name}; - mtr_verbose("Running test:", $test_name_for_report); + + mtr_verbose("Running test:", $tinfo->{name}); $ENV{'MTR_TEST_NAME'} = $tinfo->{name}; resfile_report_test($tinfo) if $opt_resfile; @@ -5131,10 +5130,12 @@ ($$) if (!$rc) { # Report failure about the last test case before exit - my $tinfo = My::Test->new(name => $test_name_for_report); + my $test_name= mtr_grab_file($path_current_testlog); + $test_name =~ s/^CURRENT_TEST:\s//; + my $tinfo = My::Test->new(name => $test_name); $tinfo->{result}= 'MTR_RES_FAILED'; $tinfo->{failures}= 1; - $tinfo->{logfile}=get_log_from_proc($mysqld->{'proc'}, $test_name_for_report); + $tinfo->{logfile}=get_log_from_proc($mysqld->{'proc'}, $tinfo->{name}); report_option('verbose', 1); mtr_report_test($tinfo); } From c21bc17a51f6eef6158ef80e7deeb5a280598c1d Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 20 Apr 2023 10:13:12 +1000 Subject: [PATCH 48/70] MDEV-30186: mtr: Use of uninitialized value $test_name in substitution There is an assumption that when there are are no completed tests, that means they are still running and then an attempt is made to identify these tests as stalled. The other possibility is however there are no tests that where run. Test this early and then exit quickly and no later misunderstandings need to be made. --- mysql-test/mariadb-test-run.pl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mysql-test/mariadb-test-run.pl b/mysql-test/mariadb-test-run.pl index 46a51d2fa58b1..4fc4d9f050e89 100755 --- a/mysql-test/mariadb-test-run.pl +++ b/mysql-test/mariadb-test-run.pl @@ -401,6 +401,11 @@ sub main { mtr_report("Collecting tests..."); my $tests= collect_test_cases($opt_reorder, $opt_suites, \@opt_cases, \@opt_skip_test_list); + if (@$tests == 0) { + mtr_report("No tests to run..."); + exit 0; + } + mark_time_used('collect'); mysql_install_db(default_mysqld(), "$opt_vardir/install.db") unless using_extern(); From 7e31a8e7fa97a87fc164381588d172bf0e76abb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 20 Apr 2023 14:08:48 +0300 Subject: [PATCH 49/70] MDEV-26827 fixup: Fix os_aio_wait_until_no_pending_writes() io_callback(): Process the request before releasing the write slot. Before commit a091d6ac4e7d2d7873749e685943b3032ccfda57 when we had a duplicated counter for writes, either ordering was fine. Now, correctness depends on os_aio_wait_until_no_pending_writes(). --- storage/innobase/os/os0file.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index d366c784b96b9..e816f6ef7b15e 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -3457,9 +3457,8 @@ static void io_callback(tpool::aiocb *cb) else { ut_ad(write_slots->contains(cb)); - const IORequest req{request}; + fil_aio_callback(request); write_slots->release(cb); - fil_aio_callback(req); } } From fc6e8a3d3264078bed28632a289130b1dc24daea Mon Sep 17 00:00:00 2001 From: Mikhail Chalov Date: Tue, 31 Jan 2023 14:14:55 -0800 Subject: [PATCH 50/70] Minimize unsafe C functions usage - replace strcat() and strcpy() Similar to 567b6812 continue to replace use of strcat() and strcpy() with safer options strncat() and strncpy(). All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services --- storage/connect/reldef.cpp | 26 ++++++++-------- storage/connect/tabbson.cpp | 47 ++++++++++++++-------------- storage/connect/tabdos.cpp | 61 ++++++++++++++++++++----------------- storage/connect/tabext.cpp | 55 ++++++++++++++++++++------------- storage/connect/tabfmt.cpp | 38 +++++++++++++---------- storage/connect/tabjdbc.cpp | 45 ++++++++++++++------------- storage/connect/tabjson.cpp | 54 ++++++++++++++++---------------- 7 files changed, 178 insertions(+), 148 deletions(-) diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 144d31735d630..786a53db5a2f6 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -91,11 +91,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) /* directories are used (to make this even remotely secure). */ /*********************************************************************/ if (check_valid_path(module, strlen(module))) { - strcpy(g->Message, "Module cannot contain a path"); + safe_strcpy(g->Message, sizeof(g->Message), "Module cannot contain a path"); return NULL; } else if (strlen(subtype)+1+3 >= sizeof(getname)) { - strcpy(g->Message, "Subtype string too long"); + safe_strcpy(g->Message, sizeof(g->Message), "Subtype string too long"); return NULL; } else @@ -118,7 +118,8 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, (LPTSTR)buf, sizeof(buf), NULL); - strcat(strcat(g->Message, ": "), buf); + safe_strcat(g->Message, sizeof(g->Message), ": "); + safe_strcat(g->Message, sizeof(g->Message), buf); return NULL; } // endif hDll @@ -281,7 +282,7 @@ char *RELDEF::GetStringCatInfo(PGLOBAL g, PCSZ what, PCSZ sdef) if (IsFileType(GetTypeID(ftype))) { name= Hc->GetPartName(); sval= (char*)PlugSubAlloc(g, NULL, strlen(name) + 12); - strcat(strcpy(sval, name), "."); + snprintf(sval, strlen(name) + 12, "%s.", name); n= strlen(sval); // Fold ftype to lower case @@ -622,12 +623,11 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) /* directories are used (to make this even remotely secure). */ /*********************************************************************/ if (check_valid_path(Module, strlen(Module))) { - strcpy(g->Message, "Module cannot contain a path"); + safe_strcpy(g->Message, sizeof(g->Message), "Module cannot contain a path"); return NULL; } else // PlugSetPath(soname, Module, GetPluginDir()); // Crashes on Fedora - strncat(strcpy(soname, GetPluginDir()), Module, - sizeof(soname) - strlen(soname) - 1); + snprintf(soname, sizeof(soname), "%s%s", GetPluginDir(), Module); #if defined(_WIN32) // Is the DLL already loaded? @@ -641,7 +641,8 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, (LPTSTR)buf, sizeof(buf), NULL); - strcat(strcat(g->Message, ": "), buf); + safe_strcat(g->Message, sizeof(g->Message), ": "); + safe_strcat(g->Message, sizeof(g->Message), buf); return NULL; } // endif hDll @@ -661,7 +662,8 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, (LPTSTR)buf, sizeof(buf), NULL); - strcat(strcat(g->Message, ": "), buf); + safe_strcat(g->Message, sizeof(g->Message), ": "); + safe_strcat(g->Message, sizeof(g->Message), buf); FreeLibrary((HMODULE)Hdll); return NULL; } // endif getdef @@ -810,7 +812,7 @@ PTDB OEMDEF::GetTable(PGLOBAL g, MODE mode) else txfp = new(g) ZLBFAM(defp); #else // !GZ_SUPPORT - strcpy(g->Message, "Compress not supported"); + safe_strcpy(g->Message, sizeof(g->Message), "Compress not supported"); return NULL; #endif // !GZ_SUPPORT } else if (rfm == RECFM_VAR) { @@ -833,7 +835,7 @@ PTDB OEMDEF::GetTable(PGLOBAL g, MODE mode) else txfp = new(g) VCTFAM((PVCTDEF)defp); #else // !VCT_SUPPORT - strcpy(g->Message, "VCT no more supported"); + safe_strcpy(g->Message, sizeof(g->Message), "VCT no more supported"); return NULL; #endif // !VCT_SUPPORT } // endif's @@ -924,7 +926,7 @@ int COLDEF::Define(PGLOBAL g, void *, PCOLINFO cfp, int poff) return -1; } // endswitch - strcpy(F.Type, GetFormatType(Buf_Type)); + safe_strcpy(F.Type, sizeof(F.Type), GetFormatType(Buf_Type)); F.Length = cfp->Length; F.Prec = cfp->Scale; Offset = (cfp->Offset < 0) ? poff : cfp->Offset; diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index 22d8648d7c01a..2ea74da94b002 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -39,6 +39,7 @@ #include "checklvl.h" #include "resource.h" #include "mycat.h" // for FNC_COL +#include "m_string.h" /***********************************************************************/ /* This should be an option. */ @@ -80,7 +81,7 @@ PQRYRES BSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) } // endif info if (GetIntegerTableOption(g, topt, "Multiple", 0)) { - strcpy(g->Message, "Cannot find column definition for multiple table"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot find column definition for multiple table"); return NULL; } // endif Multiple @@ -206,7 +207,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) tdp->Uri = (dsn && *dsn ? dsn : NULL); if (!tdp->Fn && !tdp->Uri) { - strcpy(g->Message, MSG(MISSING_FNAME)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return 0; } else topt->subtype = NULL; @@ -318,7 +319,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) switch (tjnp->ReadDB(g)) { case RC_EF: - strcpy(g->Message, "Void json table"); + safe_strcpy(g->Message, sizeof(g->Message), "Void json table"); case RC_FX: goto err; default: @@ -328,7 +329,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) } // endif pretty if (!(row = (jsp) ? bp->GetObject(jsp) : NULL)) { - strcpy(g->Message, "Can only retrieve columns from object rows"); + safe_strcpy(g->Message, sizeof(g->Message), "Can only retrieve columns from object rows"); goto err; } // endif row @@ -405,7 +406,7 @@ bool BSONDISC::Find(PGLOBAL g, PBVAL jvp, PCSZ key, int j) if (jvp && !bp->IsJson(jvp)) { if (JsonAllPath() && !fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); jcol.Type = (JTYP)jvp->Type; @@ -439,7 +440,7 @@ bool BSONDISC::Find(PGLOBAL g, PBVAL jvp, PCSZ key, int j) jcol.Cbn = true; } else if (j < lvl && !Stringified(strfy, colname)) { if (!fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); p = fmt + strlen(fmt); jsp = jvp; @@ -510,11 +511,11 @@ bool BSONDISC::Find(PGLOBAL g, PBVAL jvp, PCSZ key, int j) } else if (lvl >= 0) { if (Stringified(strfy, colname)) { if (!fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); - strcat(fmt, ".*"); + safe_strcat(fmt, sizeof(fmt), ".*"); } else if (JsonAllPath() && !fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); jcol.Type = TYPE_STRG; jcol.Len = sz; @@ -961,7 +962,7 @@ PVAL BCUTIL::ExpandArray(PGLOBAL g, PBVAL arp, int n) } // endif ars if (!(bvp = GetArrayValue(arp, (nodes[n].Rx = nodes[n].Nx)))) { - strcpy(g->Message, "Logical error expanding array"); + safe_strcpy(g->Message, sizeof(g->Message), "Logical error expanding array"); throw 666; } // endif jvp @@ -1146,7 +1147,7 @@ PBVAL BCUTIL::GetRow(PGLOBAL g) } else if (row->Type == TYPE_JAR) { AddArrayValue(row, (nwr = NewVal(type))); } else { - strcpy(g->Message, "Wrong type when writing new row"); + safe_strcpy(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -1255,7 +1256,7 @@ PTDB BSONDEF::GetTable(PGLOBAL g, MODE m) // Allocate the parse work memory G = PlugInit(NULL, (size_t)Lrecl * (Pretty < 0 ? 3 : 5)); } else { - strcpy(g->Message, "LRECL is not defined"); + safe_strcpy(g->Message, sizeof(g->Message), "LRECL is not defined"); return NULL; } // endif Lrecl @@ -1295,7 +1296,7 @@ PTDB BSONDEF::GetTable(PGLOBAL g, MODE m) } else if (m == MODE_INSERT) { txfp = new(g) ZIPFAM(this); } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's m #else // !ZIP_SUPPORT @@ -1325,10 +1326,10 @@ PTDB BSONDEF::GetTable(PGLOBAL g, MODE m) if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (m == MODE_INSERT) { - strcpy(g->Message, "INSERT supported only for zipped JSON when pretty=0"); + safe_strcpy(g->Message, sizeof(g->Message), "INSERT supported only for zipped JSON when pretty=0"); return NULL; } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's m #else // !ZIP_SUPPORT @@ -1661,7 +1662,7 @@ bool TDBBSN::PrepareWriting(PGLOBAL g) strcat(s, ","); if ((signed)strlen(s) > Lrecl) { - strncpy(To_Line, s, Lrecl); + safe_strcpy(To_Line, Lrecl, s); snprintf(g->Message, sizeof(g->Message), "Line truncated (lrecl=%d)", Lrecl); return PushWarning(g, this); } else @@ -1764,7 +1765,7 @@ bool BSONCOL::CheckExpand(PGLOBAL g, int i, PSZ nm, bool b) Xpd = true; // Expandable object Nodes[i].Op = OP_EXP; } else if (b) { - strcpy(g->Message, "Cannot expand more than one branch"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot expand more than one branch"); return true; } // endif Xcol @@ -1975,7 +1976,7 @@ bool BSONCOL::ParseJpath(PGLOBAL g) if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) return true; else if (Xpd && Tbp->Mode == MODE_DELETE) { - strcpy(g->Message, "Cannot delete expanded columns"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot delete expanded columns"); return true; } // endif Xpd @@ -2096,7 +2097,7 @@ void BSONCOL::ReadColumn(PGLOBAL g) void BSONCOL::WriteColumn(PGLOBAL g) { if (Xpd && Tbp->Pretty < 2) { - strcpy(g->Message, "Cannot write expanded column when Pretty is not 2"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot write expanded column when Pretty is not 2"); throw 666; } // endif Xpd @@ -2126,7 +2127,7 @@ void BSONCOL::WriteColumn(PGLOBAL g) char *s = Value->GetCharValue(); if (!(jsp = Cp->ParseJson(g, s, strlen(s)))) { - strcpy(g->Message, s); + safe_strcpy(g->Message, sizeof(g->Message), s); throw 666; } // endif jsp @@ -2312,7 +2313,7 @@ int TDBBSON::MakeDocument(PGLOBAL g) if (!a && *p && *p != '[' && !IsNum(p)) { // obj is a key if (jsp->Type != TYPE_JOB) { - strcpy(g->Message, "Table path does not match the json file"); + safe_strcpy(g->Message, sizeof(g->Message), "Table path does not match the json file"); return RC_FX; } // endif Type @@ -2338,7 +2339,7 @@ int TDBBSON::MakeDocument(PGLOBAL g) } // endif p if (jsp->Type != TYPE_JAR) { - strcpy(g->Message, "Table path does not match the json file"); + safe_strcpy(g->Message, sizeof(g->Message), "Table path does not match the json file"); return RC_FX; } // endif Type @@ -2432,7 +2433,7 @@ void TDBBSON::ResetSize(void) int TDBBSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool) { if (pxdf) { - strcpy(g->Message, "JSON not indexable when pretty = 2"); + safe_strcpy(g->Message, sizeof(g->Message), "JSON not indexable when pretty = 2"); return RC_FX; } else return RC_OK; diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index 797b988b30966..4b50af0954e7a 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -62,6 +62,7 @@ #include "tabmul.h" #include "array.h" #include "blkfil.h" +#include "m_string.h" /***********************************************************************/ /* DB static variables. */ @@ -258,7 +259,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) sep = GetBoolCatInfo("SepIndex", false); if (!sep && pxdf) { - strcpy(g->Message, MSG(NO_RECOV_SPACE)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(NO_RECOV_SPACE)); return true; } // endif sep @@ -293,7 +294,8 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) for (; pxdf; pxdf = pxdf->GetNext()) { _splitpath(Ofn, drive, direc, fname, NULL); - strcat(strcat(fname, "_"), pxdf->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), pxdf->GetName()); _makepath(filename, drive, direc, fname, ftype); PlugSetPath(filename, filename, GetPath()); #if defined(_WIN32) @@ -312,7 +314,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) } else { // !sep // Drop all indexes, delete the common file PlugSetPath(filename, Ofn, GetPath()); - strcat(PlugRemoveType(filename, filename), ftype); + safe_strcat(PlugRemoveType(filename, filename), sizeof(filename), ftype); #if defined(_WIN32) if (!DeleteFile(filename)) rc = (GetLastError() != ERROR_FILE_NOT_FOUND); @@ -365,7 +367,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) { txfp = new(g) UZDFAM(this); } else { - strcpy(g->Message, "Zipped DBF tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "Zipped DBF tables are read only"); return NULL; } // endif's mode @@ -386,7 +388,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) } else if (mode == MODE_INSERT) { txfp = new(g) ZIPFAM(this); } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's mode @@ -397,7 +399,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) } else if (mode == MODE_INSERT) { txfp = new(g) ZPXFAM(this); } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's mode @@ -654,7 +656,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) if ((nrec = defp->GetElemt()) < 2) { if (!To_Def->Partitioned()) { // This may be wrong to do in some cases - strcpy(g->Message, MSG(TABLE_NOT_OPT)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(TABLE_NOT_OPT)); return RC_INFO; // Not to be optimized } else return RC_OK; @@ -674,7 +676,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) if ((block = (int)((MaxSize + (int)nrec - 1) / (int)nrec)) < 2) { // This may be wrong to do in some cases defp->RemoveOptValues(g); - strcpy(g->Message, MSG(TABLE_NOT_OPT)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(TABLE_NOT_OPT)); return RC_INFO; // Not to be optimized } // endif block @@ -757,7 +759,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) // No optimised columns. Still useful for blocked variable tables. if (!colp && defp->Recfm != RECFM_VAR) { - strcpy(g->Message, "No optimised columns"); + safe_strcpy(g->Message, sizeof(g->Message), "No optimised columns"); return RC_INFO; } // endif colp @@ -787,7 +789,8 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) /*********************************************************************/ char *p = (char *)PlugSubAlloc(g, NULL, 24 + strlen(Name)); - dup->Step = strcat(strcpy(p, MSG(OPTIMIZING)), Name); + snprintf(p, 24 + strlen(Name), "%s%s", MSG(OPTIMIZING), Name); + dup->Step = p; dup->ProgMax = GetProgMax(g); dup->ProgCur = 0; #endif // SOCKET_MODE || THREAD @@ -804,7 +807,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) } else { if (++curnum >= nrec) { if (++curblk >= block) { - strcpy(g->Message, MSG(BAD_BLK_ESTIM)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(BAD_BLK_ESTIM)); goto err; } else curnum = 0; @@ -832,7 +835,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) #if defined(PROG_INFO) if (!dup->Step) { - strcpy(g->Message, MSG(OPT_CANCELLED)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(OPT_CANCELLED)); goto err; } else dup->ProgCur = GetProgCur(); @@ -912,7 +915,8 @@ bool TDBDOS::SaveBlockValues(PGLOBAL g) if (!(opfile = fopen(filename, "wb"))) { snprintf(g->Message, sizeof(g->Message), MSG(OPEN_MODE_ERROR), "wb", (int)errno, filename); - strcat(strcat(g->Message, ": "), strerror(errno)); + safe_strcat(g->Message, sizeof(g->Message), ": "); + safe_strcat(g->Message, sizeof(g->Message), strerror(errno)); if (trace(1)) htrc("%s\n", g->Message); @@ -1227,7 +1231,8 @@ bool TDBDOS::GetDistinctColumnValues(PGLOBAL g, int nrec) /* Initialize progress information */ /*********************************************************************/ p = (char *)PlugSubAlloc(g, NULL, 48 + strlen(Name)); - dup->Step = strcat(strcpy(p, MSG(GET_DIST_VALS)), Name); + snprintf(p, 48 + strlen(Name), "%s%s", MSG(GET_DIST_VALS), Name); + dup->Step = p; dup->ProgMax = GetProgMax(g); dup->ProgCur = 0; @@ -1239,12 +1244,12 @@ bool TDBDOS::GetDistinctColumnValues(PGLOBAL g, int nrec) #if defined(SOCKET_MODE) if (SendProgress(dup)) { - strcpy(g->Message, MSG(OPT_CANCELLED)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(OPT_CANCELLED)); return true; } else #elif defined(THREAD) if (!dup->Step) { - strcpy(g->Message, MSG(OPT_CANCELLED)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(OPT_CANCELLED)); return true; } else #endif // THREAD @@ -1525,7 +1530,7 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv) } else if (n == 8 || n == 14) { if (n == 8 && ctype != TYPE_LIST) { // Should never happen - strcpy(g->Message, "Block opt: bad constant"); + safe_strcpy(g->Message, sizeof(g->Message), "Block opt: bad constant"); throw 99; } // endif Conv @@ -1683,7 +1688,7 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) // Are we are called from CreateTable or CreateIndex? if (pxdf) { if (!add && dfp->GetIndx()) { - strcpy(g->Message, MSG(INDX_EXIST_YET)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(INDX_EXIST_YET)); return RC_FX; } // endif To_Indx @@ -1795,7 +1800,7 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) htrc("Exception %d: %s\n", n, g->Message); rc = RC_FX; } catch (const char *msg) { - strcpy(g->Message, msg); + safe_strcpy(g->Message, sizeof(g->Message), msg); rc = RC_FX; } // end catch @@ -1829,7 +1834,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) PKPDEF kdp; if (!xdp && !(xdp = To_Xdp)) { - strcpy(g->Message, "NULL dynamic index"); + safe_strcpy(g->Message, sizeof(g->Message), "NULL dynamic index"); return true; } else dynamic = To_Filter && xdp->IsUnique() && xdp->IsDynamic(); @@ -1918,7 +1923,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) htrc("Exception %d: %s\n", n, g->Message); brc = true; } catch (const char *msg) { - strcpy(g->Message, msg); + safe_strcpy(g->Message, sizeof(g->Message), msg); brc = true; } // end catch @@ -2679,38 +2684,38 @@ void DOSCOL::WriteColumn(PGLOBAL g) if (Ldz || Nod || Dcm >= 0) { switch (Buf_Type) { case TYPE_SHORT: - strcpy(fmt, (Ldz) ? "%0*hd" : "%*.hd"); + safe_strcpy(fmt, sizeof(fmt), (Ldz) ? "%0*hd" : "%*.hd"); i = 0; if (Nod) for (; i < Dcm; i++) - strcat(fmt, "0"); + safe_strcat(fmt, sizeof(fmt), "0"); len = sprintf(Buf, fmt, field - i, Value->GetShortValue()); break; case TYPE_INT: - strcpy(fmt, (Ldz) ? "%0*d" : "%*.d"); + safe_strcpy(fmt, sizeof(fmt), (Ldz) ? "%0*d" : "%*.d"); i = 0; if (Nod) for (; i < Dcm; i++) - strcat(fmt, "0"); + safe_strcat(fmt,sizeof(fmt), "0"); len = sprintf(Buf, fmt, field - i, Value->GetIntValue()); break; case TYPE_TINY: - strcpy(fmt, (Ldz) ? "%0*d" : "%*.d"); + safe_strcpy(fmt, sizeof(fmt), (Ldz) ? "%0*d" : "%*.d"); i = 0; if (Nod) for (; i < Dcm; i++) - strcat(fmt, "0"); + safe_strcat(fmt, sizeof(fmt), "0"); len = sprintf(Buf, fmt, field - i, Value->GetTinyValue()); break; case TYPE_DOUBLE: case TYPE_DECIM: - strcpy(fmt, (Ldz) ? "%0*.*lf" : "%*.*lf"); + safe_strcpy(fmt, sizeof(fmt), (Ldz) ? "%0*.*lf" : "%*.*lf"); len = field + ((Nod && Dcm) ? 1 : 0); snprintf(Buf, len + 1, fmt, len, Dcm, Value->GetFloatValue()); len = strlen(Buf); diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp index 01c55cca1cd1a..9d8a4aca077d3 100644 --- a/storage/connect/tabext.cpp +++ b/storage/connect/tabext.cpp @@ -65,7 +65,7 @@ int CONDFIL::Init(PGLOBAL g, PHC hc) while (alt) { if (!(p = strchr(alt, '='))) { - strcpy(g->Message, "Invalid alias list"); + safe_strcpy(g->Message, sizeof(g->Message), "Invalid alias list"); rc = RC_FX; break; } // endif !p @@ -126,7 +126,7 @@ EXTDEF::EXTDEF(void) bool EXTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { if (g->Createas) { - strcpy(g->Message, + safe_strcpy(g->Message, sizeof(g->Message), "Multiple-table UPDATE/DELETE commands are not supported"); return true; } // endif multi @@ -349,7 +349,7 @@ bool TDBEXT::MakeSrcdef(PGLOBAL g) int n_placeholders = count_placeholders(Srcdef); if (n_placeholders < 0) { - strcpy(g->Message, "MakeSQL: Wrong place holders specification"); + safe_strcpy(g->Message, sizeof(g->Message), "MakeSQL: Wrong place holders specification"); return true; } @@ -372,7 +372,7 @@ bool TDBEXT::MakeSrcdef(PGLOBAL g) Query = new(g)STRING(g, strlen(Srcdef) + strlen(fil1) + strlen(fil2)); Query->SetLength(sprintf(Query->GetStr(), Srcdef, fil2, fil1)); } else { - strcpy(g->Message, "MakeSQL: Wrong place holders specification"); + safe_strcpy(g->Message, sizeof(g->Message), "MakeSQL: Wrong place holders specification"); return true; } // endif's ph @@ -513,7 +513,7 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) len += ((Mode == MODE_READX) ? 256 : 1); if (Query->IsTruncated()) { - strcpy(g->Message, "MakeSQL: Out of memory"); + safe_strcpy(g->Message, sizeof(g->Message), "MakeSQL: Out of memory"); return true; } else Query->Resize(len); @@ -574,6 +574,7 @@ bool TDBEXT::MakeCommand(PGLOBAL g) bool qtd = Quoted > 0; char q = qtd ? *Quote : ' '; int i = 0, k = 0; + size_t stmt_sz = 0; // Make a lower case copy of the originale query and change // back ticks to the data source identifier quoting character @@ -585,26 +586,30 @@ bool TDBEXT::MakeCommand(PGLOBAL g) p[7] = 0; // Remove where clause Qrystr[(p - qrystr) + 7] = 0; body = To_CondFil->Body; - stmt = (char*)PlugSubAlloc(g, NULL, strlen(qrystr) - + strlen(body) + 64); + stmt_sz = strlen(qrystr) + strlen(body) + 64; } else - stmt = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 64); + stmt_sz = strlen(Qrystr) + 64; + stmt = (char*)PlugSubAlloc(g, NULL, stmt_sz); // Check whether the table name is equal to a keyword // If so, it must be quoted in the original query - strlwr(strcat(strcat(strcpy(name, " "), Name), " ")); + snprintf(name, sizeof(name), " %s ", Name); + strlwr(name); if (strstr(" update delete low_priority ignore quick from ", name)) { if (Quote) { - strlwr(strcat(strcat(strcpy(name, Quote), Name), Quote)); + snprintf(name, sizeof(name), "%s%s%s", Quote, Name, Quote); + strlwr(name); k += 2; } else { - strcpy(g->Message, "Quoted must be specified"); + safe_strcpy(g->Message, sizeof(g->Message), "Quoted must be specified"); return true; } // endif Quote - } else - strlwr(strcpy(name, Name)); // Not a keyword + } else { + safe_strcpy(name, sizeof(name), Name); // Not a keyword + strlwr(name); + } if ((p = strstr(qrystr, name))) { for (i = 0; i < p - qrystr; i++) @@ -618,21 +623,29 @@ bool TDBEXT::MakeCommand(PGLOBAL g) schmp = Schema; if (qtd && *(p - 1) == ' ') { - if (schmp) - strcat(strcat(stmt, schmp), "."); + if (schmp) { + safe_strcat(stmt, stmt_sz, schmp); + safe_strcat(stmt, stmt_sz, "."); + } - strcat(strcat(strcat(stmt, Quote), TableName), Quote); + safe_strcat(stmt, stmt_sz, Quote); + safe_strcat(stmt, stmt_sz, TableName); + safe_strcat(stmt, stmt_sz, Quote); } else { if (schmp) { if (qtd && *(p - 1) != ' ') { stmt[i - 1] = 0; - strcat(strcat(strcat(stmt, schmp), "."), Quote); - } else - strcat(strcat(stmt, schmp), "."); + safe_strcat(stmt, stmt_sz, schmp); + safe_strcat(stmt, stmt_sz, "."); + safe_strcat(stmt, stmt_sz, Quote); + } else { + safe_strcat(stmt, stmt_sz, schmp); + safe_strcat(stmt, stmt_sz, "."); + } } // endif schmp - strcat(stmt, TableName); + safe_strcat(stmt, stmt_sz, TableName); } // endif's i = (int)strlen(stmt); @@ -644,7 +657,7 @@ bool TDBEXT::MakeCommand(PGLOBAL g) RemoveConst(g, stmt); if (body) - strcat(stmt, body); + safe_strcat(stmt, stmt_sz, body); } else { snprintf(g->Message, sizeof(g->Message), "Cannot use this %s command", diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index f20d9afb95941..b93b7d8dc8b4d 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -62,6 +62,7 @@ #define NO_FUNC #include "plgcnx.h" // For DB types #include "resource.h" +#include "m_string.h" /***********************************************************************/ /* This should be an option. */ @@ -137,7 +138,7 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) ? strchr(tdp->Entry, '*') || strchr(tdp->Entry, '?') : GetBooleanTableOption(g, topt, "Mulentries", false); #else // !ZIP_SUPPORT - strcpy(g->Message, "ZIP not supported by this version"); + safe_strcpy(g->Message, sizeof(g->Message), "ZIP not supported by this version"); return NULL; #endif // !ZIP_SUPPORT } // endif // Zipped @@ -145,7 +146,7 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) fn = tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL); if (!tdp->Fn) { - strcpy(g->Message, MSG(MISSING_FNAME)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return NULL; } // endif Fn @@ -472,7 +473,7 @@ bool CSVDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) if (Catfunc == FNC_NO) for (PCOLDEF cdp = To_Cols; cdp; cdp = cdp->GetNext()) if (cdp->GetOffset() < 1 && !cdp->IsSpecial()) { - strcpy(g->Message, MSG(BAD_OFFSET_VAL)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(BAD_OFFSET_VAL)); return true; } // endif Offset @@ -528,11 +529,11 @@ PTDB CSVDEF::GetTable(PGLOBAL g, MODE mode) } else if (mode == MODE_INSERT) { txfp = new(g) ZIPFAM(this); } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's mode #else // !ZIP_SUPPORT - strcpy(g->Message, "ZIP not supported"); + safe_strcpy(g->Message, sizeof(g->Message), "ZIP not supported"); return NULL; #endif // !ZIP_SUPPORT } else if (map) { @@ -546,7 +547,7 @@ PTDB CSVDEF::GetTable(PGLOBAL g, MODE mode) txfp = new(g) ZLBFAM(this); #else // !GZ_SUPPORT - strcpy(g->Message, "Compress not supported"); + safe_strcpy(g->Message, sizeof(g->Message), "Compress not supported"); return NULL; #endif // !GZ_SUPPORT } else @@ -879,7 +880,7 @@ bool TDBCSV::SkipHeader(PGLOBAL g) if (q) To_Line[strlen(To_Line)] = Qot; - strcat(To_Line, cdp->GetName()); + safe_strcat(To_Line, Lrecl, cdp->GetName()); if (q) To_Line[strlen(To_Line)] = Qot; @@ -1049,14 +1050,16 @@ bool TDBCSV::PrepareWriting(PGLOBAL g) for (i = 0; i < Fields; i++) { if (i) - strcat(To_Line, sep); + safe_strcat(To_Line, Lrecl, sep); if (Field[i]) { if (!strlen(Field[i])) { // Generally null fields are not quoted - if (Quoted > 2) + if (Quoted > 2) { // Except if explicitly required - strcat(strcat(To_Line, qot), qot); + safe_strcat(To_Line, Lrecl, qot); + safe_strcat(To_Line, Lrecl, qot); + } } else if (Qot && (strchr(Field[i], Sep) || *Field[i] == Qot || Quoted > 1 || (Quoted == 1 && !Fldtyp[i]))) { @@ -1075,12 +1078,15 @@ bool TDBCSV::PrepareWriting(PGLOBAL g) To_Line[k++] = Qot; To_Line[k] = '\0'; - } else - strcat(strcat(strcat(To_Line, qot), Field[i]), qot); + } else { + safe_strcat(To_Line, Lrecl, qot); + safe_strcat(To_Line, Lrecl, Field[i]); + safe_strcat(To_Line, Lrecl, qot); + } } else - strcat(To_Line, Field[i]); + safe_strcat(To_Line, Lrecl, Field[i]); } } // endfor i @@ -1157,7 +1163,7 @@ int TDBCSV::CheckWrite(PGLOBAL g) } // endif } if ((nlen += n) > maxlen) { - strcpy(g->Message, MSG(LINE_TOO_LONG)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(LINE_TOO_LONG)); return -1; } // endif nlen @@ -1267,7 +1273,7 @@ bool TDBFMT::OpenDB(PGLOBAL g) } // endif n FldFormat[i] = (PSZ)PlugSubAlloc(g, NULL, n + 5); - strcpy(FldFormat[i], pfm); + safe_strcpy(FldFormat[i], n + 5, pfm); if (!strcmp(pfm + n, "%m")) { // This is a field that can be missing. Flag it so it can @@ -1277,7 +1283,7 @@ bool TDBFMT::OpenDB(PGLOBAL g) } else if (i+1 < Fields && strcmp(pfm + n, "%n")) { // There are trailing characters after the field contents // add a marker for the next field start position. - strcat(FldFormat[i], "%n"); + safe_strcat(FldFormat[i], n + 5, "%n"); FmtTest[i] = 1; } // endif's diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index dc1f5e2fe5bbd..fe7609a1cac00 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -277,7 +277,7 @@ PTDB JDBCDEF::GetTable(PGLOBAL g, MODE m) if (Multiple == 1) tdbp = new(g)TDBMUL(tdbp); else if (Multiple == 2) - strcpy(g->Message, "NO_JDBC_MUL"); + safe_strcpy(g->Message, sizeof(g->Message), "NO_JDBC_MUL"); } // endswitch Catfunc @@ -386,7 +386,7 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) for (colp = Columns; colp; colp = colp->GetNext()) if (colp->IsSpecial()) { - strcpy(g->Message, "No JDBC special columns"); + safe_strcpy(g->Message, sizeof(g->Message), "No JDBC special columns"); return true; } else { // Column name can be encoded in UTF-8 @@ -460,7 +460,7 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) } // endfor colp if ((Query->Append(") VALUES ("))) { - strcpy(g->Message, "MakeInsert: Out of memory"); + safe_strcpy(g->Message, sizeof(g->Message), "MakeInsert: Out of memory"); return true; } else // in case prepared statement fails pos = Query->GetLength(); @@ -470,7 +470,7 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) Query->Append("?,"); if (Query->IsTruncated()) { - strcpy(g->Message, "MakeInsert: Out of memory"); + safe_strcpy(g->Message, sizeof(g->Message), "MakeInsert: Out of memory"); return true; } else Query->RepLast(')'); @@ -532,12 +532,15 @@ int TDBJDBC::Cardinality(PGLOBAL g) // Table name can be encoded in UTF-8 Decode(TableName, tbn, sizeof(tbn)); - strcpy(qry, "SELECT COUNT(*) FROM "); + safe_strcpy(qry, sizeof(qry), "SELECT COUNT(*) FROM "); - if (Quote) - strcat(strcat(strcat(qry, Quote), tbn), Quote); + if (Quote) { + safe_strcat(qry, sizeof(qry), Quote); + safe_strcat(qry, sizeof(qry), tbn); + safe_strcat(qry, sizeof(qry), Quote); + } else - strcat(qry, tbn); + safe_strcat(qry, sizeof(qry), tbn); // Allocate a Count(*) column (must not use the default constructor) Cnp = new(g)JDBCCOL; @@ -654,7 +657,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) if ((Qrp = Jcp->AllocateResult(g, this))) Memory = 2; // Must be filled else { - strcpy(g->Message, "Result set memory allocation failed"); + safe_strcpy(g->Message, sizeof(g->Message), "Result set memory allocation failed"); return true; } // endif n @@ -681,7 +684,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) #if 0 if (!(rc = MakeInsert(g))) { if (Nparm != Jcp->PrepareSQL(Query->GetStr())) { - strcpy(g->Message, MSG(PARM_CNT_MISS)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(PARM_CNT_MISS)); rc = true; } else rc = BindParameters(g); @@ -733,12 +736,12 @@ bool TDBJDBC::SetRecpos(PGLOBAL g, int recpos) CurNum = recpos; Fpos = recpos; } else { - strcpy(g->Message, "Scrolling out of row set NIY"); + safe_strcpy(g->Message, sizeof(g->Message), "Scrolling out of row set NIY"); return true; } // endif recpos } else { - strcpy(g->Message, "This action requires a scrollable cursor"); + safe_strcpy(g->Message, sizeof(g->Message), "This action requires a scrollable cursor"); return true; } // endif's @@ -784,7 +787,7 @@ bool TDBJDBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) if (To_CondFil) if (Query->Append(" AND ") || Query->Append(To_CondFil->Body)) { - strcpy(g->Message, "Readkey: Out of memory"); + safe_strcpy(g->Message, sizeof(g->Message), "Readkey: Out of memory"); return true; } // endif Append @@ -917,7 +920,7 @@ int TDBJDBC::WriteDB(PGLOBAL g) } // endfor colp if (unlikely(Query->IsTruncated())) { - strcpy(g->Message, "WriteDB: Out of memory"); + safe_strcpy(g->Message, sizeof(g->Message), "WriteDB: Out of memory"); return RC_FX; } // endif Query @@ -1110,13 +1113,13 @@ PCMD TDBXJDC::MakeCMD(PGLOBAL g) (To_CondFil->Op == OP_EQ || To_CondFil->Op == OP_IN)) { xcmd = To_CondFil->Cmds; } else - strcpy(g->Message, "Invalid command specification filter"); + safe_strcpy(g->Message, sizeof(g->Message), "Invalid command specification filter"); } else - strcpy(g->Message, "No command column in select list"); + safe_strcpy(g->Message, sizeof(g->Message), "No command column in select list"); } else if (!Srcdef) - strcpy(g->Message, "No Srcdef default command"); + safe_strcpy(g->Message, sizeof(g->Message), "No Srcdef default command"); else xcmd = new(g) CMD(g, Srcdef); @@ -1149,7 +1152,7 @@ bool TDBXJDC::OpenDB(PGLOBAL g) this, Tdb_No, Use, Mode); if (Use == USE_OPEN) { - strcpy(g->Message, "Multiple execution is not allowed"); + safe_strcpy(g->Message, sizeof(g->Message), "Multiple execution is not allowed"); return true; } // endif use @@ -1171,7 +1174,7 @@ bool TDBXJDC::OpenDB(PGLOBAL g) Use = USE_OPEN; // Do it now in case we are recursively called if (Mode != MODE_READ && Mode != MODE_READX) { - strcpy(g->Message, "No INSERT/DELETE/UPDATE of XJDBC tables"); + safe_strcpy(g->Message, sizeof(g->Message), "No INSERT/DELETE/UPDATE of XJDBC tables"); return true; } // endif Mode @@ -1224,7 +1227,7 @@ int TDBXJDC::ReadDB(PGLOBAL g) /***********************************************************************/ int TDBXJDC::WriteDB(PGLOBAL g) { - strcpy(g->Message, "Execsrc tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "Execsrc tables are read only"); return RC_FX; } // end of DeleteDB @@ -1233,7 +1236,7 @@ int TDBXJDC::WriteDB(PGLOBAL g) /***********************************************************************/ int TDBXJDC::DeleteDB(PGLOBAL g, int irc) { - strcpy(g->Message, "NO_XJDBC_DELETE"); + safe_strcpy(g->Message, sizeof(g->Message), "NO_XJDBC_DELETE"); return RC_FX; } // end of DeleteDB diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 67eb5bbede052..4462541d7126f 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -85,7 +85,7 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) } // endif info if (GetIntegerTableOption(g, topt, "Multiple", 0)) { - strcpy(g->Message, "Cannot find column definition for multiple table"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot find column definition for multiple table"); return NULL; } // endif Multiple @@ -212,7 +212,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) tdp->Uri = (dsn && *dsn ? dsn : NULL); if (!tdp->Fn && !tdp->Uri) { - strcpy(g->Message, MSG(MISSING_FNAME)); + safe_strcpy(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return 0; } else topt->subtype = NULL; @@ -320,7 +320,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) switch (tjnp->ReadDB(g)) { case RC_EF: - strcpy(g->Message, "Void json table"); + safe_strcpy(g->Message, sizeof(g->Message), "Void json table"); case RC_FX: goto err; default: @@ -333,7 +333,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) } // endif pretty if (!(row = (jsp) ? jsp->GetObject() : NULL)) { - strcpy(g->Message, "Can only retrieve columns from object rows"); + safe_strcpy(g->Message, sizeof(g->Message), "Can only retrieve columns from object rows"); goto err; } // endif row @@ -417,7 +417,7 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j) if (jvp && jvp->DataType != TYPE_JSON) { if (JsonAllPath() && !fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); jcol.Type = jvp->DataType; @@ -450,7 +450,7 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j) jcol.Cbn = true; } else if (j < lvl && !Stringified(strfy, colname)) { if (!fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); p = fmt + strlen(fmt); jsp = jvp->GetJson(); @@ -520,11 +520,11 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j) } else if (lvl >= 0) { if (Stringified(strfy, colname)) { if (!fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); - strcat(fmt, ".*"); + safe_strcat(fmt, sizeof(fmt), ".*"); } else if (JsonAllPath() && !fmt[bf]) - strcat(fmt, colname); + safe_strcat(fmt, sizeof(fmt), colname); jcol.Type = TYPE_STRG; jcol.Len = sz; @@ -735,7 +735,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) } else if (m == MODE_INSERT) { txfp = new(g) ZIPFAM(this); } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's m #else // !ZIP_SUPPORT @@ -775,7 +775,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) #endif // 0 ((TDBJSN*)tdbp)->G = PlugInit(NULL, (size_t)Lrecl * (Pretty >= 0 ? 12 : 4)); } else { - strcpy(g->Message, "LRECL is not defined"); + safe_strcpy(g->Message, sizeof(g->Message), "LRECL is not defined"); return NULL; } // endif Lrecl @@ -785,10 +785,10 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (m == MODE_INSERT) { - strcpy(g->Message, "INSERT supported only for zipped JSON when pretty=0"); + safe_strcpy(g->Message, sizeof(g->Message), "INSERT supported only for zipped JSON when pretty=0"); return NULL; } else { - strcpy(g->Message, "UPDATE/DELETE not supported for ZIP"); + safe_strcpy(g->Message, sizeof(g->Message), "UPDATE/DELETE not supported for ZIP"); return NULL; } // endif's m #else // !ZIP_SUPPORT @@ -1145,7 +1145,7 @@ int TDBJSN::ReadDB(PGLOBAL g) { M = 1; rc = RC_OK; } else if (Pretty != 1 || strcmp(To_Line, "]")) { - strcpy(g->Message, G->Message); + safe_strcpy(g->Message, sizeof(g->Message), G->Message); rc = RC_FX; } else rc = RC_EF; @@ -1258,7 +1258,7 @@ bool TDBJSN::PrepareWriting(PGLOBAL g) strcat(s, ","); if ((signed)strlen(s) > Lrecl) { - strncpy(To_Line, s, Lrecl); + safe_strcpy(To_Line, Lrecl, s); snprintf(g->Message, sizeof(g->Message), "Line truncated (lrecl=%d)", Lrecl); return PushWarning(g, this); } else @@ -1360,7 +1360,7 @@ bool JSONCOL::CheckExpand(PGLOBAL g, int i, PSZ nm, bool b) Xpd = true; // Expandable object Nodes[i].Op = OP_EXP; } else if (b) { - strcpy(g->Message, "Cannot expand more than one branch"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot expand more than one branch"); return true; } // endif Xcol @@ -1571,7 +1571,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g) if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) return true; else if (Xpd && Tjp->Mode == MODE_DELETE) { - strcpy(g->Message, "Cannot delete expanded columns"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot delete expanded columns"); return true; } // endif Xpd @@ -1675,7 +1675,7 @@ PSZ JSONCOL::GetJpath(PGLOBAL g, bool proj) PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp, int n) { if (Value->IsTypeNum()) { - strcpy(g->Message, "Cannot make Json for a numeric column"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot make Json for a numeric column"); if (!Warned) { PushWarning(g, Tjp); @@ -1690,10 +1690,10 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp, int n) ulong len = Tjp->Lrecl ? Tjp->Lrecl : 500; PBSON bsp = JbinAlloc(g, NULL, len, jsp); - strcat(bsp->Msg, " column"); + safe_strcat(bsp->Msg, sizeof(bsp->Msg), " column"); ((BINVAL*)Value)->SetBinValue(bsp, sizeof(BSON)); } else { - strcpy(g->Message, "Column size too small"); + safe_strcpy(g->Message, sizeof(g->Message), "Column size too small"); Value->SetValue_char(NULL, 0); } // endif Clen #endif // 0 @@ -1937,7 +1937,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) } // endif ars if (!(jvp = arp->GetArrayValue((Nodes[n].Rx = Nodes[n].Nx)))) { - strcpy(g->Message, "Logical error expanding array"); + safe_strcpy(g->Message, sizeof(g->Message), "Logical error expanding array"); throw 666; } // endif jvp @@ -2125,7 +2125,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) ((PJAR)row)->AddArrayValue(G, new(G) JVALUE(nwr)); ((PJAR)row)->InitArray(G); } else { - strcpy(g->Message, "Wrong type when writing new row"); + safe_strcpy(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -2146,7 +2146,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) void JSONCOL::WriteColumn(PGLOBAL g) { if (Xpd && Tjp->Pretty < 2) { - strcpy(g->Message, "Cannot write expanded column when Pretty is not 2"); + safe_strcpy(g->Message, sizeof(g->Message), "Cannot write expanded column when Pretty is not 2"); throw 666; } // endif Xpd @@ -2182,7 +2182,7 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (s && *s) { if (!(jsp = ParseJson(G, s, strlen(s)))) { - strcpy(g->Message, s); + safe_strcpy(g->Message, sizeof(g->Message), s); throw 666; } // endif jsp @@ -2365,7 +2365,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) if (!a && *p && *p != '[' && !IsNum(p)) { // obj is a key if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Table path does not match the json file"); + safe_strcpy(g->Message, sizeof(g->Message), "Table path does not match the json file"); return RC_FX; } // endif Type @@ -2391,7 +2391,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) } // endif p if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Table path does not match the json file"); + safe_strcpy(g->Message, sizeof(g->Message), "Table path does not match the json file"); return RC_FX; } // endif Type @@ -2486,7 +2486,7 @@ void TDBJSON::ResetSize(void) int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool) { if (pxdf) { - strcpy(g->Message, "JSON not indexable when pretty = 2"); + safe_strcpy(g->Message, sizeof(g->Message), "JSON not indexable when pretty = 2"); return RC_FX; } else return RC_OK; From c6e58a8d173b7e9689952d07678ba79702ba8021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 11:05:44 +0300 Subject: [PATCH 51/70] MDEV-30753 fixup: Unsafe buffer page restoration trx_purge_free_segment(): The buffer-fix only prevents a block from being freed completely from the buffer pool, but it will not prevent the block from being evicted. Recheck the page identifier after acquiring an exclusive page latch. If it has changed, backtrack and invoke buf_page_get_gen() to look up the page normally. --- storage/innobase/trx/trx0purge.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 3843810848067..b22a85f4646ca 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -367,19 +367,30 @@ void trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) block->frame, &mtr)) { block->fix(); + const page_id_t id{block->page.id()}; mtr.commit(); /* NOTE: If the server is killed after the log that was produced up to this point was written, and before the log from the mtr.commit() in our caller is written, then the pages belonging to the undo log will become unaccessible garbage. - This does not matters when using multiple innodb_undo_tablespaces; + This does not matter when using multiple innodb_undo_tablespaces; innodb_undo_log_truncate=ON will be able to reclaim the space. */ log_free_check(); mtr.start(); ut_ad(rw_lock_s_lock_nowait(block->debug_latch, __FILE__, __LINE__)); rw_lock_x_lock(&block->lock); - mtr_memo_push(&mtr, block, MTR_MEMO_PAGE_X_FIX); + if (UNIV_UNLIKELY(block->page.id() != id)) + { + block->unfix(); + rw_lock_x_unlock(&block->lock); + ut_d(rw_lock_s_unlock(block->debug_latch)); + block= buf_page_get(id, 0, RW_X_LATCH, &mtr); + if (!block) + return; + } + else + mtr_memo_push(&mtr, block, MTR_MEMO_PAGE_X_FIX); } while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + From e55e761eae707e47e86af1899335c777e194fdd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 16:49:59 +0300 Subject: [PATCH 52/70] MDEV-31084 assert(waiting) failed in TP_connection_generic::wait_end buf_flush_wait_flushed(): Correct the logic for registering a wait around buf_flush_wait() that commit a091d6ac4e7d2d7873749e685943b3032ccfda57 recently broke. This should be easily repeatable when using a non-default startup parameter: thread-handling=pool-of-threads --- storage/innobase/buf/buf0flu.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 3ef70741da135..75286d9d33bd6 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1905,9 +1905,13 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) } else #endif + { + thd_wait_begin(nullptr, THD_WAIT_DISKIO); + tpool::tpool_wait_begin(); buf_flush_wait(sync_lsn); - - thd_wait_end(nullptr); + tpool::tpool_wait_end(); + thd_wait_end(nullptr); + } } mysql_mutex_unlock(&buf_pool.flush_list_mutex); From 46af63bfe202b62a5665e1aa09d069b5b5613249 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 10 Apr 2023 11:35:38 +0400 Subject: [PATCH 53/70] MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset MDEV-28769 earlier disabled the use if IDs with non-default collations in statements like: SET character_set_results=2/*latin2_czech_cs*/; SET character_set_client=2/*latin2_czech_cs*/; SET character_set_server=2/*latin2_czech_cs*/; SET character_set_connection=2/*latin2_czech_cs*/; MDEV-30824 later fixed "mysqlbinlog" to dump character set names instead of IDs in these statements: < SET @@session.character_set_client=33, ... /*!*/; > SET @@session.character_set_client=utf8mb3, ... /*!*/; However, mysqlbinlog from old (pre MDEV-30824) distributions can still produce incorrect statements with numeric non-default collation IDs. New servers should still be able to load old dumps. Allowing the use of "SET @@character_set_xxx=ID" with numeric non-default collation IDs but only if: - the current THD is a true slave thread or - the current THD a pseudo slave thread (loading a mysqlbinlog output). --- .../r/character_set_client_basic.result | 11 +++++++++ .../r/character_set_connection_basic.result | 16 +++++++++++++ .../r/character_set_results_basic.result | Bin 16427 -> 16895 bytes .../r/character_set_server_basic.result | 16 +++++++++++++ .../t/character_set_client_basic.test | 9 +++++++ .../t/character_set_connection_basic.test | 13 +++++++++++ .../t/character_set_results_basic.test | 12 ++++++++++ .../t/character_set_server_basic.test | 12 ++++++++++ sql/sys_vars.cc | 22 ++++++++++++++---- 9 files changed, 107 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/character_set_client_basic.result b/mysql-test/suite/sys_vars/r/character_set_client_basic.result index d62d88027c7e9..14c8bcfd05872 100644 --- a/mysql-test/suite/sys_vars/r/character_set_client_basic.result +++ b/mysql-test/suite/sys_vars/r/character_set_client_basic.result @@ -500,5 +500,16 @@ res # SET GLOBAL character_set_client=2; ERROR 42000: Unknown character set: '2' +# +# MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +# +SET @@pseudo_slave_mode=1; +SET character_set_client=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_client'; +Variable_name Value +character_set_client latin2 +SET @@pseudo_slave_mode=0; +Warnings: +Warning 1231 Slave applier execution mode not active, statement ineffective. SET @@global.character_set_client = @global_start_value; SET @@session.character_set_client = @session_start_value; diff --git a/mysql-test/suite/sys_vars/r/character_set_connection_basic.result b/mysql-test/suite/sys_vars/r/character_set_connection_basic.result index e356d62ed2ba6..bbb4f4e5f7522 100644 --- a/mysql-test/suite/sys_vars/r/character_set_connection_basic.result +++ b/mysql-test/suite/sys_vars/r/character_set_connection_basic.result @@ -494,5 +494,21 @@ SELECT @@session.character_set_connection = WHERE VARIABLE_NAME='character_set_connection') AS res; res 1 +# +# MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +# +SET character_set_connection=2/*latin2_czech_cs*/; +ERROR 42000: Unknown character set: '2' +SET @@pseudo_slave_mode=1; +SET character_set_connection=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_connection'; +Variable_name Value +character_set_connection latin2 +SHOW VARIABLES LIKE 'collation_connection'; +Variable_name Value +collation_connection latin2_general_ci +SET @@pseudo_slave_mode=0; +Warnings: +Warning 1231 Slave applier execution mode not active, statement ineffective. SET @@global.character_set_connection = @global_start_value; SET @@global.character_set_client = @save_character_set_client; diff --git a/mysql-test/suite/sys_vars/r/character_set_results_basic.result b/mysql-test/suite/sys_vars/r/character_set_results_basic.result index d1c6a52ba177c0b07efa3ba653ea42c1025b3e94..1346c8b42cac7e5b1b44f33f851388c23d7d2573 100644 GIT binary patch delta 394 zcmZ`#!AiqG5Tz7^TMSrJvW*$7g?C)vIuQVLQz>F-aFDxZupAAOj$#(Qf4R zumPu8J2J>IP~jJ#V-O3J%w- zdlf4iFK=ex3@4-E`PiPqcywi_@16ZhPj_g<=sibQ&=56;@&xsily}$K#`0eSv!~B! zB(fCo$={?At4*|Neg)7)_9=`2pU_JblLGR)iZ5ij*b*BME2=O=p@0bt0xW1_lbxlh-*00su)N2a*5) diff --git a/mysql-test/suite/sys_vars/r/character_set_server_basic.result b/mysql-test/suite/sys_vars/r/character_set_server_basic.result index e0a13c729fe52..7445be6aef191 100644 --- a/mysql-test/suite/sys_vars/r/character_set_server_basic.result +++ b/mysql-test/suite/sys_vars/r/character_set_server_basic.result @@ -486,5 +486,21 @@ SELECT @@session.character_set_server = WHERE VARIABLE_NAME='character_set_server') AS res; res 1 +# +# MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +# +SET character_set_server=2/*latin2_czech_cs*/; +ERROR 42000: Unknown character set: '2' +SET @@pseudo_slave_mode=1; +SET character_set_server=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_server'; +Variable_name Value +character_set_server latin2 +SHOW VARIABLES LIKE 'collation_server'; +Variable_name Value +collation_server latin2_general_ci +SET @@pseudo_slave_mode=0; +Warnings: +Warning 1231 Slave applier execution mode not active, statement ineffective. SET @@global.character_set_server = @global_start_value; SET @@session.character_set_server = @session_start_value; diff --git a/mysql-test/suite/sys_vars/t/character_set_client_basic.test b/mysql-test/suite/sys_vars/t/character_set_client_basic.test index 09f758a03161b..44c0d240a9d25 100644 --- a/mysql-test/suite/sys_vars/t/character_set_client_basic.test +++ b/mysql-test/suite/sys_vars/t/character_set_client_basic.test @@ -350,6 +350,15 @@ SELECT @@session.character_set_client = --error ER_UNKNOWN_CHARACTER_SET SET GLOBAL character_set_client=2; +--echo # +--echo # MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +--echo # + +SET @@pseudo_slave_mode=1; +SET character_set_client=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_client'; +SET @@pseudo_slave_mode=0; + #################################### # Restore initial value # #################################### diff --git a/mysql-test/suite/sys_vars/t/character_set_connection_basic.test b/mysql-test/suite/sys_vars/t/character_set_connection_basic.test index 3d9094fca0495..46bdfcb52e2e1 100644 --- a/mysql-test/suite/sys_vars/t/character_set_connection_basic.test +++ b/mysql-test/suite/sys_vars/t/character_set_connection_basic.test @@ -275,6 +275,19 @@ SELECT @@session.character_set_connection = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='character_set_connection') AS res; +--echo # +--echo # MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +--echo # + +--error ER_UNKNOWN_CHARACTER_SET +SET character_set_connection=2/*latin2_czech_cs*/; +SET @@pseudo_slave_mode=1; +SET character_set_connection=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_connection'; +SHOW VARIABLES LIKE 'collation_connection'; +SET @@pseudo_slave_mode=0; + + #################################### # Restore initial value # #################################### diff --git a/mysql-test/suite/sys_vars/t/character_set_results_basic.test b/mysql-test/suite/sys_vars/t/character_set_results_basic.test index 617332b978021..41090be665761 100644 --- a/mysql-test/suite/sys_vars/t/character_set_results_basic.test +++ b/mysql-test/suite/sys_vars/t/character_set_results_basic.test @@ -272,6 +272,18 @@ SELECT @@session.character_set_results = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='character_set_results') AS res; +--echo # +--echo # MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +--echo # + +--error ER_UNKNOWN_CHARACTER_SET +SET character_set_results=2/*latin2_czech_cs*/; +SET @@pseudo_slave_mode=1; +SET character_set_results=2; +SHOW VARIABLES LIKE 'character_set_results'; +SET @@pseudo_slave_mode=0; + + #################################### # Restore initial value # #################################### diff --git a/mysql-test/suite/sys_vars/t/character_set_server_basic.test b/mysql-test/suite/sys_vars/t/character_set_server_basic.test index b2f4788fdae32..929dbfaf14395 100644 --- a/mysql-test/suite/sys_vars/t/character_set_server_basic.test +++ b/mysql-test/suite/sys_vars/t/character_set_server_basic.test @@ -266,6 +266,18 @@ SELECT @@session.character_set_server = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='character_set_server') AS res; +--echo # +--echo # MDEV-31018 Replica of 10.3, 10.4, <10.5.19 and <10.6.12 to 10.11 will not work when using non-default charset +--echo # + +--error ER_UNKNOWN_CHARACTER_SET +SET character_set_server=2/*latin2_czech_cs*/; +SET @@pseudo_slave_mode=1; +SET character_set_server=2/*latin2_czech_cs*/; +SHOW VARIABLES LIKE 'character_set_server'; +SHOW VARIABLES LIKE 'collation_server'; +SET @@pseudo_slave_mode=0; + #################################### # Restore initial value # #################################### diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 10f9de106f85b..45b5fe20ff617 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -791,12 +791,26 @@ static bool check_charset(sys_var *self, THD *thd, set_var *var) { int csno= (int)var->value->val_int(); CHARSET_INFO *cs; - if (!(var->save_result.ptr= cs= get_charset(csno, MYF(0))) || - !(cs->state & MY_CS_PRIMARY)) + if ((var->save_result.ptr= cs= get_charset(csno, MYF(0)))) { - my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), llstr(csno, buff)); - return true; + /* + Backward compatibility: pre MDEV-30824 servers + can write non-default collation IDs to binary log: + SET character_set_client=83; -- utf8mb3_bin + Convert a non-default collation to the compiled default collation, + e.g. utf8mb3_bin to utf8mb3_general_ci, but only if + - THD is a slave thread or + - is processing a mysqlbinlog output. + */ + if ((cs->state & MY_CS_PRIMARY) || + ((thd->variables.pseudo_slave_mode || thd->slave_thread) && + (var->save_result.ptr= + Lex_exact_charset_opt_extended_collate(cs, true). + find_default_collation()))) + return false; } + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), llstr(csno, buff)); + return true; } return false; } From da1c91fb9232fbea88d3f9a27f81b39f85cfc468 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 28 Feb 2023 10:43:39 +1100 Subject: [PATCH 54/70] MDEV-30713 field length handling for CONNECT engine fp->field_length was unsigned and therefore the negative condition around it. Backport of cc182aca9352 fixes it, however to correct the consistent use of types pcf->Length needs to be unsigned too. At one point pcf->Precision is assigned from pcf->Length so that's also unsigned. GetTypeSize is assigned to length and has a length argument. A -1 default value seemed dangerious to case, so at least 0 should assert if every hit. --- storage/connect/catalog.h | 4 ++-- storage/connect/ha_connect.cc | 5 +---- storage/connect/tabext.cpp | 2 +- storage/connect/value.cpp | 8 ++++---- storage/connect/value.h | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index 2649a50cf7670..a46615f5d6ef9 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -39,9 +39,9 @@ typedef struct _colinfo { PCSZ Name; int Type; int Offset; - int Length; + unsigned Length; int Key; - int Precision; + unsigned Precision; int Scale; int Opt; int Freq; diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 81960332cbea6..0a0a206c9c8c1 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1618,10 +1618,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf) pcf->Scale= 0; pcf->Opt= (fop) ? (int)fop->opt : 0; - if (fp->field_length >= 0) - pcf->Length= fp->field_length; - else - pcf->Length= 256; // BLOB? + pcf->Length= fp->field_length; pcf->Precision= pcf->Length; diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp index 9d8a4aca077d3..6903e11223865 100644 --- a/storage/connect/tabext.cpp +++ b/storage/connect/tabext.cpp @@ -466,7 +466,7 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) if (Quote) { // Tabname can have both database and table identifiers, we need to parse - if (res= strstr(buf, ".")) + if ((res= strstr(buf, "."))) { // Parse schema my_len= res - buf + 1; diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 498ec71a87f15..7265b2ed0ca36 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -163,9 +163,9 @@ PCSZ GetTypeName(int type) /***********************************************************************/ /* GetTypeSize: returns the PlugDB internal type size. */ /***********************************************************************/ -int GetTypeSize(int type, int len) - { - switch (type) { +unsigned GetTypeSize(int type, unsigned len) +{ + switch (type) { case TYPE_DECIM: case TYPE_BIN: case TYPE_STRING: len = len * sizeof(char); break; @@ -176,7 +176,7 @@ int GetTypeSize(int type, int len) case TYPE_DOUBLE: len = sizeof(double); break; case TYPE_TINY: len = sizeof(char); break; case TYPE_PCHAR: len = sizeof(char*); break; - default: len = -1; + default: len = 0; } // endswitch type return len; diff --git a/storage/connect/value.h b/storage/connect/value.h index a0d947347c3f0..7eb0dec29f232 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -41,7 +41,7 @@ typedef struct _datpar *PDTP; // For DTVAL /***********************************************************************/ // Exported functions DllExport PCSZ GetTypeName(int); -DllExport int GetTypeSize(int, int); +DllExport unsigned GetTypeSize(int, unsigned); #ifdef ODBC_SUPPORT /* This function is exported for use in OEM table type DLLs */ DllExport int TranslateSQLType(int stp, int prec, From 40eff3f868108a202d88e4da339fc539cbf29e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 17:52:47 +0300 Subject: [PATCH 55/70] MDEV-26827 fixup: hangs and !os_aio_pending_writes() assertion failures buf_LRU_get_free_block(): Always wake up the page cleaner if needed before exiting the inner loop. srv_prepare_to_delete_redo_log_file(): Replace a debug assertion with a wait in debug builds. Starting with commit 7e31a8e7fa97a87fc164381588d172bf0e76abb6 the debug assertion ut_ad(!os_aio_pending_writes()) could occasionally fail, while it would hold in core dumps of crashes. The failure can be reproduced more easily by adding a sleep to the write completion callback function, right before releasing to write_slots. srv_start(): Remove a bogus debug assertion ut_ad(!os_aio_pending_writes()) that could fail in mariadb-backup --prepare. In an rr replay trace, we had buf_pool.flush_list.count==0 but write_slots->m_cache.m_pos==1 and buf_page_t::write_complete() was executing u_unlock(). --- storage/innobase/buf/buf0lru.cc | 6 +++--- storage/innobase/srv/srv0start.cc | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 844e288843b7a..feb15fc226c84 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -448,15 +448,15 @@ buf_block_t *buf_LRU_get_free_block(bool have_mutex) mysql_mutex_unlock(&buf_pool.mutex); mysql_mutex_lock(&buf_pool.flush_list_mutex); const auto n_flush = buf_pool.n_flush(); + if (!buf_pool.try_LRU_scan) { + buf_pool.page_cleaner_wakeup(true); + } mysql_mutex_unlock(&buf_pool.flush_list_mutex); mysql_mutex_lock(&buf_pool.mutex); if (!n_flush) { goto not_found; } if (!buf_pool.try_LRU_scan) { - mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_pool.page_cleaner_wakeup(true); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); my_cond_wait(&buf_pool.done_free, &buf_pool.mutex.m_mutex); } diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 707804f22065e..5f6b4b02e16ae 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -970,10 +970,10 @@ static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists) ut_ad(flushed_lsn == log_sys.get_lsn()); ut_ad(!os_aio_pending_reads()); - ut_ad(!os_aio_pending_writes()); ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); ut_ad(!buf_pool.get_oldest_modification(0)); ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); + ut_d(os_aio_wait_until_no_pending_writes()); DBUG_RETURN(flushed_lsn); } @@ -1608,7 +1608,6 @@ dberr_t srv_start(bool create_new_db) ut_ad(recv_no_log_write); err = fil_write_flushed_lsn(log_sys.get_lsn()); ut_ad(!os_aio_pending_reads()); - ut_ad(!os_aio_pending_writes()); ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); ut_ad(!buf_pool.get_oldest_modification(0)); ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); From 86767bcc0f121db3ad83a74647a642754a0ce57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 17:58:09 +0300 Subject: [PATCH 56/70] MDEV-29593 Purge misses a chance to free not-yet-reused undo pages trx_purge_truncate_rseg_history(): If all other conditions for invoking trx_purge_remove_log_hdr() hold, but the state is TRX_UNDO_CACHED instead of TRX_UNDO_TO_PURGE, detach and free it. Tested by: Matthias Leich --- storage/innobase/include/mtr0mtr.h | 2 +- storage/innobase/trx/trx0purge.cc | 231 ++++++++++++++--------------- 2 files changed, 116 insertions(+), 117 deletions(-) diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index 1c044319ca072..5ce297ba5c996 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -343,7 +343,7 @@ struct mtr_t { { mtr_memo_slot_t &slot= m_memo[savepoint]; ut_ad(slot.type <= MTR_MEMO_BUF_FIX); - ut_ad(type <= MTR_MEMO_BUF_FIX); + ut_ad(type < MTR_MEMO_S_LOCK); slot.type= type; } diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index ded4d63d70554..4a2fa214b37ec 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -275,7 +275,7 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) if (undo->state != TRX_UNDO_CACHED) { /* The undo log segment will not be reused */ ut_a(undo->id < TRX_RSEG_N_SLOTS); - compile_time_assert(FIL_NULL == 0xffffffff); + static_assert(FIL_NULL == 0xffffffff, ""); mtr->memset(rseg_header, TRX_RSEG + TRX_RSEG_UNDO_SLOTS + undo->id * TRX_RSEG_SLOT_SIZE, 4, 0xff); @@ -385,45 +385,11 @@ static dberr_t trx_purge_remove_log_hdr(buf_block_t *rseg, buf_block_t* log, uint16_t(offset + TRX_UNDO_HISTORY_NODE), mtr); } -MY_ATTRIBUTE((nonnull, warn_unused_result)) -/** Free an undo log segment, and remove the header from the history list. -@param[in,out] mtr mini-transaction -@param[in,out] rseg rollback segment -@param[in] hdr_addr file address of log_hdr -@return error code */ -static dberr_t -trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) +/** Free an undo log segment. +@param block rollback segment header page +@param mtr mini-transaction */ +static void trx_purge_free_segment(buf_block_t *block, mtr_t &mtr) { - mtr.commit(); - log_free_check(); - mtr.start(); - - const page_id_t hdr_page_id{rseg->space->id, hdr_addr.page}; - dberr_t err; - buf_block_t *rseg_hdr= rseg->get(&mtr, &err); - if (!rseg_hdr) - return err; - buf_block_t *block= buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH, - nullptr, BUF_GET_POSSIBLY_FREED, - &mtr, &err); - if (!block) - return err; - - const uint32_t seg_size= - flst_get_len(TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + block->page.frame); - - err= trx_purge_remove_log_hdr(rseg_hdr, block, hdr_addr.boffset, &mtr); - if (UNIV_UNLIKELY(err != DB_SUCCESS)) - return err; - - ut_ad(rseg->curr_size >= seg_size); - rseg->curr_size-= seg_size; - rseg->history_size--; - - byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame; - ut_ad(mach_read_from_4(hist) >= seg_size); - mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size); - while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + block->page.frame, &mtr)) { @@ -444,9 +410,9 @@ trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) { block->unfix(); block->page.lock.x_unlock(); - block= buf_page_get_gen(id, 0, RW_X_LATCH, nullptr, BUF_GET, &mtr, &err); + block= buf_page_get_gen(id, 0, RW_X_LATCH, nullptr, BUF_GET, &mtr); if (!block) - return err; + return; } else mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); @@ -454,102 +420,135 @@ trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + block->page.frame, &mtr)); - return DB_SUCCESS; } /** Remove unnecessary history data from a rollback segment. @param[in,out] rseg rollback segment @param[in] limit truncate anything before this @return error code */ -static -dberr_t -trx_purge_truncate_rseg_history( - trx_rseg_t& rseg, - const purge_sys_t::iterator& limit) +static dberr_t +trx_purge_truncate_rseg_history(trx_rseg_t& rseg, + const purge_sys_t::iterator& limit) { - fil_addr_t hdr_addr; - mtr_t mtr; + fil_addr_t hdr_addr; + mtr_t mtr; - mtr.start(); + log_free_check(); + mtr.start(); - dberr_t err; - buf_block_t* rseg_hdr = rseg.get(&mtr, &err); - if (!rseg_hdr) { - goto func_exit; - } + dberr_t err; +reget: + buf_block_t *rseg_hdr= rseg.get(&mtr, &err); + if (!rseg_hdr) + { +func_exit: + mtr.commit(); + return err; + } - hdr_addr = flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY - + rseg_hdr->page.frame); - hdr_addr.boffset = static_cast(hdr_addr.boffset - - TRX_UNDO_HISTORY_NODE); + hdr_addr= flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY + rseg_hdr->page.frame); + hdr_addr.boffset= static_cast(hdr_addr.boffset - + TRX_UNDO_HISTORY_NODE); loop: - if (hdr_addr.page == FIL_NULL) { -func_exit: - mtr.commit(); - return err; - } + if (hdr_addr.page == FIL_NULL) + goto func_exit; - buf_block_t* block = buf_page_get_gen(page_id_t(rseg.space->id, - hdr_addr.page), - 0, RW_X_LATCH, nullptr, - BUF_GET_POSSIBLY_FREED, - &mtr, &err); - if (!block) { - goto func_exit; - } + buf_block_t *b= + buf_page_get_gen(page_id_t(rseg.space->id, hdr_addr.page), + 0, RW_X_LATCH, nullptr, BUF_GET_POSSIBLY_FREED, + &mtr, &err); + if (!b) + goto func_exit; - const trx_id_t undo_trx_no = mach_read_from_8( - block->page.frame + hdr_addr.boffset + TRX_UNDO_TRX_NO); + const trx_id_t undo_trx_no= + mach_read_from_8(b->page.frame + hdr_addr.boffset + TRX_UNDO_TRX_NO); - if (undo_trx_no >= limit.trx_no) { - if (undo_trx_no == limit.trx_no) { - err = trx_undo_truncate_start( - &rseg, hdr_addr.page, - hdr_addr.boffset, limit.undo_no); - } + if (undo_trx_no >= limit.trx_no) + { + if (undo_trx_no == limit.trx_no) + err = trx_undo_truncate_start(&rseg, hdr_addr.page, + hdr_addr.boffset, limit.undo_no); + goto func_exit; + } - goto func_exit; - } + fil_addr_t prev_hdr_addr= + flst_get_prev_addr(b->page.frame + hdr_addr.boffset + + TRX_UNDO_HISTORY_NODE); + prev_hdr_addr.boffset= static_cast(prev_hdr_addr.boffset - + TRX_UNDO_HISTORY_NODE); + err= trx_purge_remove_log_hdr(rseg_hdr, b, hdr_addr.boffset, &mtr); + if (UNIV_UNLIKELY(err != DB_SUCCESS)) + goto func_exit; - fil_addr_t prev_hdr_addr = flst_get_prev_addr( - block->page.frame + hdr_addr.boffset + TRX_UNDO_HISTORY_NODE); - prev_hdr_addr.boffset = static_cast(prev_hdr_addr.boffset - - TRX_UNDO_HISTORY_NODE); - - if (!rseg.is_referenced() - && rseg.needs_purge <= (purge_sys.head.trx_no - ? purge_sys.head.trx_no - : purge_sys.tail.trx_no) - && mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE - + block->page.frame) - == TRX_UNDO_TO_PURGE - && !mach_read_from_2(block->page.frame + hdr_addr.boffset - + TRX_UNDO_NEXT_LOG)) { - /* We can free the whole log segment. - This will call trx_purge_remove_log_hdr(). */ - err = trx_purge_free_segment(mtr, &rseg, hdr_addr); - } else { - /* Remove the log hdr from the rseg history. */ - rseg.history_size--; - err = trx_purge_remove_log_hdr(rseg_hdr, block, - hdr_addr.boffset, &mtr); - } + rseg_hdr->fix(); - mtr.commit(); - if (err != DB_SUCCESS) { - return err; - } - mtr.start(); + if (mach_read_from_2(b->page.frame + hdr_addr.boffset + TRX_UNDO_NEXT_LOG) || + rseg.is_referenced() || + rseg.needs_purge > (purge_sys.head.trx_no + ? purge_sys.head.trx_no + : purge_sys.tail.trx_no)) + /* We cannot free the entire undo page. */; + else + { + const uint32_t seg_size= + flst_get_len(TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + b->page.frame); + switch (mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + + b->page.frame)) { + case TRX_UNDO_TO_PURGE: + { + byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame; + ut_ad(mach_read_from_4(hist) >= seg_size); + mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size); + } + free_segment: + ut_ad(rseg.curr_size >= seg_size); + rseg.curr_size-= seg_size; + trx_purge_free_segment(b, mtr); + break; + case TRX_UNDO_CACHED: + /* rseg.undo_cached must point to this page */ + trx_undo_t *undo= UT_LIST_GET_FIRST(rseg.undo_cached); + for (; undo; undo= UT_LIST_GET_NEXT(undo_list, undo)) + if (undo->hdr_page_no == hdr_addr.page) + goto found_cached; + ut_ad("inconsistent undo logs" == 0); + break; + found_cached: + UT_LIST_REMOVE(rseg.undo_cached, undo); + static_assert(FIL_NULL == 0xffffffff, ""); + if (UNIV_UNLIKELY(mach_read_from_4(TRX_RSEG + TRX_RSEG_FORMAT + + rseg_hdr->page.frame))) + trx_rseg_format_upgrade(rseg_hdr, &mtr); + mtr.memset(rseg_hdr, TRX_RSEG + TRX_RSEG_UNDO_SLOTS + + undo->id * TRX_RSEG_SLOT_SIZE, 4, 0xff); + ut_free(undo); + mtr.write<8,mtr_t::MAYBE_NOP>(*rseg_hdr, TRX_RSEG + TRX_RSEG_MAX_TRX_ID + + rseg_hdr->page.frame, + trx_sys.get_max_trx_id() - 1); + MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED); + MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_USED); + goto free_segment; + } + } - hdr_addr = prev_hdr_addr; + hdr_addr= prev_hdr_addr; - rseg_hdr = rseg.get(&mtr, &err); - if (!rseg_hdr) { - goto func_exit; - } + mtr.commit(); + ut_ad(rseg.history_size > 0); + rseg.history_size--; + log_free_check(); + mtr.start(); + rseg_hdr->page.lock.x_lock(); + if (UNIV_UNLIKELY(rseg_hdr->page.id() != rseg.page_id())) + { + rseg_hdr->unfix(); + rseg_hdr->page.lock.x_unlock(); + goto reget; + } + mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_MODIFY); - goto loop; + goto loop; } /** Cleanse purge queue to remove the rseg that reside in undo-tablespace From 204e7225dce32130ac2c96f469611d2cb421241e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 17:58:18 +0300 Subject: [PATCH 57/70] Cleanup: MONITOR_EXISTING trx_undo_slots_used, trx_undo_slots_cached Let us remove explicit updates of MONITOR_NUM_UNDO_SLOT_USED and MONITOR_NUM_UNDO_SLOT_CACHED, and let us compute the rough values from trx_sys.rseg_array[] on demand. --- .../r/innodb_skip_innodb_is_tables.result | 4 +-- storage/innobase/srv/srv0mon.cc | 34 ++++++++++++++++--- storage/innobase/trx/trx0purge.cc | 5 --- storage/innobase/trx/trx0rseg.cc | 2 -- storage/innobase/trx/trx0undo.cc | 6 ---- .../r/innodb_i_s_tables_disabled.result | 4 +-- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result b/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result index 9bdb546482e99..9810e49bd203b 100644 --- a/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result +++ b/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result @@ -164,8 +164,8 @@ trx_commits_insert_update transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NUL trx_rollbacks transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of transactions rolled back trx_rollbacks_savepoint transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of transactions rolled back to savepoint trx_rseg_history_len transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Length of the TRX_RSEG_HISTORY list -trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of undo slots used -trx_undo_slots_cached transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of undo slots cached +trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of undo slots used +trx_undo_slots_cached transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of undo slots cached trx_rseg_current_size transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current rollback segment size in pages purge_del_mark_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of delete-marked rows purged purge_upd_exist_or_extern_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of purges on updates of existing records and updates on delete marked record with externally stored field diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc index b6496d03908bc..2a3720641bcd8 100644 --- a/storage/innobase/srv/srv0mon.cc +++ b/storage/innobase/srv/srv0mon.cc @@ -704,16 +704,18 @@ static monitor_info_t innodb_counter_info[] = {"trx_rseg_history_len", "transaction", "Length of the TRX_RSEG_HISTORY list", static_cast( - MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT | MONITOR_DEFAULT_ON), + MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT), MONITOR_DEFAULT_START, MONITOR_RSEG_HISTORY_LEN}, {"trx_undo_slots_used", "transaction", "Number of undo slots used", - MONITOR_NONE, + static_cast( + MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT), MONITOR_DEFAULT_START, MONITOR_NUM_UNDO_SLOT_USED}, {"trx_undo_slots_cached", "transaction", "Number of undo slots cached", - MONITOR_NONE, + static_cast( + MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_NUM_UNDO_SLOT_CACHED}, {"trx_rseg_current_size", "transaction", @@ -1383,6 +1385,24 @@ TPOOL_SUPPRESS_TSAN static ulint srv_mon_get_rseg_size() return size; } +/** @return number of used undo log slots */ +TPOOL_SUPPRESS_TSAN static ulint srv_mon_get_rseg_used() +{ + ulint size= 0; + for (const auto &rseg : trx_sys.rseg_array) + size+= UT_LIST_GET_LEN(rseg.undo_list); + return size; +} + +/** @return number of cached undo log slots */ +TPOOL_SUPPRESS_TSAN static ulint srv_mon_get_rseg_cached() +{ + ulint size= 0; + for (const auto &rseg : trx_sys.rseg_array) + size+= UT_LIST_GET_LEN(rseg.undo_cached); + return size; +} + /****************************************************************//** This function consolidates some existing server counters used by "system status variables". These existing system variables do not have @@ -1690,7 +1710,12 @@ srv_mon_process_existing_counter( case MONITOR_RSEG_CUR_SIZE: value = srv_mon_get_rseg_size(); break; - + case MONITOR_NUM_UNDO_SLOT_USED: + value = srv_mon_get_rseg_used(); + break; + case MONITOR_NUM_UNDO_SLOT_CACHED: + value = srv_mon_get_rseg_cached(); + break; case MONITOR_OVLD_N_FILE_OPENED: value = fil_system.n_open; break; @@ -1812,7 +1837,6 @@ srv_mon_process_existing_counter( case MONITOR_TIMEOUT: value = lock_sys.timeouts; break; - default: ut_error; } diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 4a2fa214b37ec..7a63b1155b6b1 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -280,8 +280,6 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) TRX_RSEG + TRX_RSEG_UNDO_SLOTS + undo->id * TRX_RSEG_SLOT_SIZE, 4, 0xff); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_USED); - uint32_t hist_size = mach_read_from_4( TRX_RSEG_HISTORY_SIZE + TRX_RSEG + rseg_header->page.frame); @@ -363,7 +361,6 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) if (undo->state == TRX_UNDO_CACHED) { UT_LIST_ADD_FIRST(rseg->undo_cached, undo); - MONITOR_INC(MONITOR_NUM_UNDO_SLOT_CACHED); } else { ut_ad(undo->state == TRX_UNDO_TO_PURGE); ut_free(undo); @@ -526,8 +523,6 @@ trx_purge_truncate_rseg_history(trx_rseg_t& rseg, mtr.write<8,mtr_t::MAYBE_NOP>(*rseg_hdr, TRX_RSEG + TRX_RSEG_MAX_TRX_ID + rseg_hdr->page.frame, trx_sys.get_max_trx_id() - 1); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_USED); goto free_segment; } } diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 6d95dcf06f1b1..0d7b96e9280a4 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -394,7 +394,6 @@ void trx_rseg_t::reinit(uint32_t page) { next= UT_LIST_GET_NEXT(undo_list, undo); UT_LIST_REMOVE(undo_cached, undo); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED); ut_free(undo); } @@ -425,7 +424,6 @@ static dberr_t trx_undo_lists_init(trx_rseg_t *rseg, if (!undo) return DB_CORRUPTION; rseg->curr_size+= undo->size; - MONITOR_INC(MONITOR_NUM_UNDO_SLOT_USED); } } diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 33b1f93ff65d4..bccb6538e639a 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -535,8 +535,6 @@ trx_undo_seg_create(fil_space_t *space, buf_block_t *rseg_hdr, ulint *id, + slot_no * TRX_RSEG_SLOT_SIZE + rseg_hdr->page.frame, block->page.id().page_no()); - MONITOR_INC(MONITOR_NUM_UNDO_SLOT_USED); - *err = DB_SUCCESS; return block; } @@ -996,7 +994,6 @@ static void trx_undo_seg_free(const trx_undo_t *undo) static_assert(FIL_NULL == 0xffffffff, "compatibility"); mtr.memset(rseg_header, TRX_RSEG + TRX_RSEG_UNDO_SLOTS + undo->id * TRX_RSEG_SLOT_SIZE, 4, 0xff); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_USED); } } @@ -1155,7 +1152,6 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no) UT_LIST_ADD_LAST(rseg->undo_list, undo); } else { UT_LIST_ADD_LAST(rseg->undo_cached, undo); - MONITOR_INC(MONITOR_NUM_UNDO_SLOT_CACHED); } mtr.commit(); @@ -1333,7 +1329,6 @@ trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo, } UT_LIST_REMOVE(rseg->undo_cached, undo); - MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED); *pundo = undo; @@ -1546,7 +1541,6 @@ void trx_undo_commit_cleanup(trx_undo_t *undo) if (undo->state == TRX_UNDO_CACHED) { UT_LIST_ADD_FIRST(rseg->undo_cached, undo); - MONITOR_INC(MONITOR_NUM_UNDO_SLOT_CACHED); undo = nullptr; } else { ut_ad(undo->state == TRX_UNDO_TO_PURGE); diff --git a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result index d3f0ee3bcd918..064019a3bfc9c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result @@ -146,8 +146,8 @@ trx_commits_insert_update transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NUL trx_rollbacks transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of transactions rolled back trx_rollbacks_savepoint transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of transactions rolled back to savepoint trx_rseg_history_len transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Length of the TRX_RSEG_HISTORY list -trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of undo slots used -trx_undo_slots_cached transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of undo slots cached +trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of undo slots used +trx_undo_slots_cached transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of undo slots cached trx_rseg_current_size transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current rollback segment size in pages purge_del_mark_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of delete-marked rows purged purge_upd_exist_or_extern_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of purges on updates of existing records and updates on delete marked record with externally stored field From 51e62cb3b3b5f28a67c3c5862b3cb60ecf87180a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 21 Apr 2023 17:58:26 +0300 Subject: [PATCH 58/70] MDEV-26782 InnoDB temporary tablespace: reclaiming of free space does not work The motivation of this change is to allow undo pages for temporary tables to be marked free as often as possible, so that we can avoid buf_pool.LRU eviction (and writes) of undo pages that contain data that is no longer needed. For temporary tables, no MVCC or purge of history is needed, and reusing cached undo log pages might not help that much. It is possible that this may cause some performance regression due to more frequent allocation and freeing of undo log pages, but I only measured a performance improvement. trx_write_serialisation_history(): Never cache temporary undo log pages. trx_undo_reuse_cached(): Assert that the rollback segment is persistent. trx_undo_assign_low(): Add template. Never invoke trx_undo_reuse_cached() for temporary tables. Tested by: Matthias Leich --- storage/innobase/include/trx0undo.h | 10 ++- storage/innobase/trx/trx0rec.cc | 10 ++- storage/innobase/trx/trx0trx.cc | 8 +- storage/innobase/trx/trx0undo.cc | 114 ++++++++++++++-------------- 4 files changed, 78 insertions(+), 64 deletions(-) diff --git a/storage/innobase/include/trx0undo.h b/storage/innobase/include/trx0undo.h index 3474a903f6c42..670fe00c25b25 100644 --- a/storage/innobase/include/trx0undo.h +++ b/storage/innobase/include/trx0undo.h @@ -203,16 +203,18 @@ trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr) MY_ATTRIBUTE((nonnull)); /** Assign an undo log for a transaction. A new undo log is created or a cached undo log reused. +@tparam is_temp whether this is temporary undo log @param[in,out] trx transaction @param[in] rseg rollback segment @param[out] undo the undo log -@param[out] err error code @param[in,out] mtr mini-transaction +@param[out] err error code @return the undo log block -@retval NULL on error */ +@retval nullptr on error */ +template buf_block_t* -trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, - dberr_t* err, mtr_t* mtr) +trx_undo_assign_low(trx_t *trx, trx_rseg_t *rseg, trx_undo_t **undo, + mtr_t *mtr, dberr_t *err) MY_ATTRIBUTE((nonnull, warn_unused_result)); /******************************************************************//** Sets the state of the undo log segment at a transaction finish. diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index dc24f083d05d1..d3f64754d8967 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -1868,26 +1868,28 @@ trx_undo_report_row_operation( } mtr_t mtr; + dberr_t err; mtr.start(); trx_undo_t** pundo; trx_rseg_t* rseg; const bool is_temp = index->table->is_temporary(); + buf_block_t* undo_block; if (is_temp) { mtr.set_log_mode(MTR_LOG_NO_REDO); - rseg = trx->get_temp_rseg(); pundo = &trx->rsegs.m_noredo.undo; + undo_block = trx_undo_assign_low(trx, rseg, pundo, + &mtr, &err); } else { ut_ad(!trx->read_only); ut_ad(trx->id); pundo = &trx->rsegs.m_redo.undo; rseg = trx->rsegs.m_redo.rseg; + undo_block = trx_undo_assign_low(trx, rseg, pundo, + &mtr, &err); } - dberr_t err; - buf_block_t* undo_block = trx_undo_assign_low(trx, rseg, pundo, - &err, &mtr); trx_undo_t* undo = *pundo; ut_ad((err == DB_SUCCESS) == (undo_block != NULL)); if (UNIV_UNLIKELY(undo_block == NULL)) { diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 88e42b2ebadbf..b96ababb1f3cf 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1023,7 +1023,13 @@ trx_write_serialisation_history( mtr_t temp_mtr; temp_mtr.start(); temp_mtr.set_log_mode(MTR_LOG_NO_REDO); - trx_undo_set_state_at_finish(undo, &temp_mtr); + buf_block_t* block= buf_page_get(page_id_t(SRV_TMP_SPACE_ID, + undo->hdr_page_no), + 0, RW_X_LATCH, mtr); + ut_a(block); + temp_mtr.write<2>(*block, TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + + block->page.frame, TRX_UNDO_TO_PURGE); + undo->state = TRX_UNDO_TO_PURGE; temp_mtr.commit(); } diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index bccb6538e639a..20434d9fb9cca 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -1290,27 +1290,25 @@ trx_undo_create(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, @param[in,out] rseg rollback segment @param[out] pundo the undo log memory object @param[in,out] mtr mini-transaction +@param[out] err error code @return the undo log block @retval NULL if none cached */ static buf_block_t* trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo, - mtr_t* mtr) + mtr_t* mtr, dberr_t *err) { - if (rseg->is_persistent()) { - ut_ad(rseg->is_referenced()); - if (rseg->needs_purge <= trx->id) { - /* trx_purge_truncate_history() compares - rseg->needs_purge <= head.trx_no - so we need to compensate for that. - The rseg->needs_purge after crash - recovery would be at least trx->id + 1, - because that is the minimum possible value - assigned by trx_serialise() on commit. */ - rseg->needs_purge = trx->id + 1; - } - } else { - ut_ad(!rseg->is_referenced()); + ut_ad(rseg->is_persistent()); + ut_ad(rseg->is_referenced()); + if (rseg->needs_purge <= trx->id) { + /* trx_purge_truncate_history() compares + rseg->needs_purge <= head.trx_no + so we need to compensate for that. + The rseg->needs_purge after crash + recovery would be at least trx->id + 1, + because that is the minimum possible value + assigned by trx_serialise() on commit. */ + rseg->needs_purge = trx->id + 1; } trx_undo_t* undo = UT_LIST_GET_FIRST(rseg->undo_cached); @@ -1321,9 +1319,10 @@ trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo, ut_ad(undo->size == 1); ut_ad(undo->id < TRX_RSEG_N_SLOTS); - buf_block_t* block = buf_page_get(page_id_t(undo->rseg->space->id, - undo->hdr_page_no), - 0, RW_X_LATCH, mtr); + buf_block_t* block = buf_page_get_gen(page_id_t(undo->rseg->space->id, + undo->hdr_page_no), + 0, RW_X_LATCH, nullptr, BUF_GET, + mtr, err); if (!block) { return NULL; } @@ -1374,11 +1373,12 @@ trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr) BUF_GET, mtr, err); } + *err = DB_SUCCESS; trx_rseg_t* rseg = trx->rsegs.m_redo.rseg; rseg->latch.wr_lock(SRW_LOCK_CALL); buf_block_t* block = trx_undo_reuse_cached( - trx, rseg, &trx->rsegs.m_redo.undo, mtr); + trx, rseg, &trx->rsegs.m_redo.undo, mtr, err); if (!block) { block = trx_undo_create(trx, rseg, &trx->rsegs.m_redo.undo, @@ -1387,8 +1387,6 @@ trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr) if (!block) { goto func_exit; } - } else { - *err = DB_SUCCESS; } UT_LIST_ADD_FIRST(rseg->undo_list, trx->rsegs.m_redo.undo); @@ -1400,18 +1398,20 @@ trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr) /** Assign an undo log for a transaction. A new undo log is created or a cached undo log reused. +@tparam is_temp whether this is temporary undo log @param[in,out] trx transaction @param[in] rseg rollback segment @param[out] undo the undo log -@param[out] err error code @param[in,out] mtr mini-transaction +@param[out] err error code @return the undo log block -@retval NULL on error */ +@retval nullptr on error */ +template buf_block_t* -trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, - dberr_t* err, mtr_t* mtr) +trx_undo_assign_low(trx_t *trx, trx_rseg_t *rseg, trx_undo_t **undo, + mtr_t *mtr, dberr_t *err) { - ut_d(const bool is_temp = rseg == trx->rsegs.m_noredo.rseg); + ut_ad(is_temp == (rseg == trx->rsegs.m_noredo.rseg)); ut_ad(is_temp || rseg == trx->rsegs.m_redo.rseg); ut_ad(undo == (is_temp ? &trx->rsegs.m_noredo.undo @@ -1431,19 +1431,24 @@ trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, *err = DB_TOO_MANY_CONCURRENT_TRXS; return NULL; ); + *err = DB_SUCCESS; rseg->latch.wr_lock(SRW_LOCK_CALL); - buf_block_t* block = trx_undo_reuse_cached(trx, rseg, undo, mtr); - - if (!block) { - block = trx_undo_create(trx, rseg, undo, err, mtr); - ut_ad(!block == (*err != DB_SUCCESS)); - if (!block) { - goto func_exit; - } + buf_block_t* block; + if (is_temp) { + ut_ad(!UT_LIST_GET_LEN(rseg->undo_cached)); } else { - *err = DB_SUCCESS; + block = trx_undo_reuse_cached(trx, rseg, undo, mtr, err); + if (block) { + goto got_block; + } + } + block = trx_undo_create(trx, rseg, undo, err, mtr); + ut_ad(!block == (*err != DB_SUCCESS)); + if (!block) { + goto func_exit; } +got_block: UT_LIST_ADD_FIRST(rseg->undo_list, *undo); func_exit: @@ -1451,6 +1456,13 @@ trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, return block; } +template buf_block_t* +trx_undo_assign_low(trx_t *trx, trx_rseg_t *rseg, trx_undo_t **undo, + mtr_t *mtr, dberr_t *err); +template buf_block_t* +trx_undo_assign_low(trx_t *trx, trx_rseg_t *rseg, trx_undo_t **undo, + mtr_t *mtr, dberr_t *err); + /******************************************************************//** Sets the state of the undo log segment at a transaction finish. @return undo log segment header page, x-latched */ @@ -1461,6 +1473,7 @@ trx_undo_set_state_at_finish( mtr_t* mtr) /*!< in: mtr */ { ut_ad(undo->id < TRX_RSEG_N_SLOTS); + ut_ad(undo->rseg->is_persistent()); buf_block_t *block= buf_page_get(page_id_t(undo->rseg->space->id, undo->hdr_page_no), 0, @@ -1532,28 +1545,19 @@ the data can be discarded. @param undo temporary undo log */ void trx_undo_commit_cleanup(trx_undo_t *undo) { - trx_rseg_t* rseg = undo->rseg; - ut_ad(rseg->space == fil_system.temp_space); - - rseg->latch.wr_lock(SRW_LOCK_CALL); - - UT_LIST_REMOVE(rseg->undo_list, undo); - - if (undo->state == TRX_UNDO_CACHED) { - UT_LIST_ADD_FIRST(rseg->undo_cached, undo); - undo = nullptr; - } else { - ut_ad(undo->state == TRX_UNDO_TO_PURGE); + trx_rseg_t *rseg= undo->rseg; + ut_ad(rseg->space == fil_system.temp_space); + rseg->latch.wr_lock(SRW_LOCK_CALL); - /* Delete first the undo log segment in the file */ - trx_undo_seg_free(undo); + UT_LIST_REMOVE(rseg->undo_list, undo); + ut_ad(undo->state == TRX_UNDO_TO_PURGE); + /* Delete first the undo log segment in the file */ + trx_undo_seg_free(undo); + ut_ad(rseg->curr_size > undo->size); + rseg->curr_size-= undo->size; - ut_ad(rseg->curr_size > undo->size); - rseg->curr_size -= undo->size; - } - - rseg->latch.wr_unlock(); - ut_free(undo); + rseg->latch.wr_unlock(); + ut_free(undo); } /** At shutdown, frees the undo logs of a transaction. */ From 9f98a2acd71dcfbdb32a08e72a4737359ed9be40 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 13 Apr 2023 15:42:53 +0400 Subject: [PATCH 59/70] MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is used - `mariadb-backup --backup` was fixed to fetch the value of the @@aria_log_dir_path server variable and copy aria_log* files from @@aria_log_dir_path directory to the backup directory. Absolute and relative (to --datadir) paths are supported. Before this change aria_log* files were copied to the backup only if they were in the default location in @@datadir. - `mariadb-backup --copy-back` now understands a new my.cnf and command line parameter --aria-log-dir-path. `mariadb-backup --copy-back` in the main loop in copy_back() (when copying back from the backup directory to --datadir) was fixed to ignore all aria_log* files. A new function copy_back_aria_logs() was added. It consists of a separate loop copying back aria_log* files from the backup directory to the directory specified in --aria-log-dir-path. Absolute and relative (to --datadir) paths are supported. If --aria-log-dir-path is not specified, aria_log* files are copied to --datadir by default. - The function is_absolute_path() was fixed to understand MTR style paths on Windows with forward slashes, e.g. --aria-log-dir-path=D:/Buildbot/amd64-windows/build/mysql-test/var/... --- extra/mariabackup/backup_copy.cc | 70 +++++++++++- extra/mariabackup/backup_mysql.cc | 7 ++ extra/mariabackup/xtrabackup.cc | 14 ++- extra/mariabackup/xtrabackup.h | 1 + .../mariabackup/aria_log_dir_path.result | 41 +++++++ .../suite/mariabackup/aria_log_dir_path.test | 105 ++++++++++++++++++ .../mariabackup/aria_log_dir_path_rel.result | 41 +++++++ .../mariabackup/aria_log_dir_path_rel.test | 4 + storage/innobase/include/os0file.h | 6 +- 9 files changed, 281 insertions(+), 8 deletions(-) create mode 100644 mysql-test/suite/mariabackup/aria_log_dir_path.result create mode 100644 mysql-test/suite/mariabackup/aria_log_dir_path.test create mode 100644 mysql-test/suite/mariabackup/aria_log_dir_path_rel.result create mode 100644 mysql-test/suite/mariabackup/aria_log_dir_path_rel.test diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index ffaf6dc98e426..8ab52fa983b9b 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -130,7 +130,9 @@ struct datadir_thread_ctxt_t { bool ret; }; -static bool backup_files_from_datadir(ds_ctxt *ds_data, const char *dir_path); +static bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix); /************************************************************************ Retirn true if character if file separator */ @@ -1499,7 +1501,11 @@ bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, return(false); } - if (!backup_files_from_datadir(ds_data, fil_path_to_mysql_datadir)) { + if (!backup_files_from_datadir(ds_data, fil_path_to_mysql_datadir, + "aws-kms-key") || + !backup_files_from_datadir(ds_data, + aria_log_dir_path, + "aria_log")) { return false; } @@ -1714,7 +1720,12 @@ ibx_copy_incremental_over_full() } } - if (!(ret = backup_files_from_datadir(ds_data, xtrabackup_incremental_dir))) + if (!(ret = backup_files_from_datadir(ds_data, + xtrabackup_incremental_dir, + "aws-kms-key")) || + !(ret = backup_files_from_datadir(ds_data, + xtrabackup_incremental_dir, + "aria_log"))) goto cleanup; /* copy supplementary files */ @@ -1829,6 +1840,41 @@ class Copy_back_dst_dir } }; + +static inline bool +is_aria_log_dir_file(const datadir_node_t &node) +{ + return starts_with(node.filepath_rel, "aria_log"); +} + + +bool +copy_back_aria_logs() +{ + Copy_back_dst_dir dst_dir_buf; + const char *dstdir= dst_dir_buf.make(aria_log_dir_path); + std::unique_ptr + ds_ctxt_aria_log_dir_path(ds_create(dstdir, DS_TYPE_LOCAL), ds_destroy); + + datadir_node_t node; + datadir_node_init(&node); + datadir_iter_t *it = datadir_iter_new(".", false); + + while (datadir_iter_next(it, &node)) + { + if (!is_aria_log_dir_file(node)) + continue; + if (!copy_or_move_file(ds_ctxt_aria_log_dir_path.get(), + node.filepath, node.filepath_rel, + dstdir, 1)) + return false; + } + datadir_node_free(&node); + datadir_iter_free(it); + return true; +} + + bool copy_back() { @@ -1861,6 +1907,10 @@ copy_back() && !directory_exists(srv_log_group_home_dir, true)) { return(false); } + if (aria_log_dir_path && *aria_log_dir_path + && !directory_exists(aria_log_dir_path, true)) { + return false; + } /* cd to backup directory */ if (my_setwd(xtrabackup_target_dir, MYF(MY_WME))) @@ -1869,6 +1919,9 @@ copy_back() return(false); } + if (!copy_back_aria_logs()) + return false; + /* parse data file path */ if (!innobase_data_file_path) { @@ -1973,6 +2026,10 @@ copy_back() int i_tmp; bool is_ibdata_file; + /* Skip aria log files */ + if (is_aria_log_dir_file(node)) + continue; + if (strstr(node.filepath,"/" ROCKSDB_BACKUP_DIR "/") #ifdef _WIN32 || strstr(node.filepath,"\\" ROCKSDB_BACKUP_DIR "\\") @@ -2209,7 +2266,9 @@ decrypt_decompress() Do not copy the Innodb files (ibdata1, redo log files), as this is done in a separate step. */ -static bool backup_files_from_datadir(ds_ctxt *ds_data, const char *dir_path) +static bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix) { os_file_dir_t dir = os_file_opendir(dir_path); if (dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr)) return false; @@ -2225,8 +2284,7 @@ static bool backup_files_from_datadir(ds_ctxt *ds_data, const char *dir_path) if (!pname) pname = info.name; - if (!starts_with(pname, "aws-kms-key") && - !starts_with(pname, "aria_log")) + if (!starts_with(pname, prefix)) /* For ES exchange the above line with the following code: (!xtrabackup_prepare || !xtrabackup_incremental_dir || !starts_with(pname, "aria_log"))) diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index 6003bfb36c41b..1831485e957c3 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -367,6 +367,7 @@ bool get_mysql_vars(MYSQL *connection) char *innodb_undo_directory_var= NULL; char *innodb_page_size_var= NULL; char *innodb_undo_tablespaces_var= NULL; + char *aria_log_dir_path_var= NULL; char *page_zip_level_var= NULL; char *ignore_db_dirs= NULL; char *endptr; @@ -397,6 +398,7 @@ bool get_mysql_vars(MYSQL *connection) {"innodb_undo_tablespaces", &innodb_undo_tablespaces_var}, {"innodb_compression_level", &page_zip_level_var}, {"ignore_db_dirs", &ignore_db_dirs}, + {"aria_log_dir_path", &aria_log_dir_path_var}, {NULL, NULL}}; read_mysql_variables(connection, "SHOW VARIABLES", mysql_vars, true); @@ -538,6 +540,11 @@ bool get_mysql_vars(MYSQL *connection) ut_ad(*endptr == 0); } + if (aria_log_dir_path_var) + { + aria_log_dir_path= my_strdup(aria_log_dir_path_var, MYF(MY_FAE)); + } + if (page_zip_level_var != NULL) { page_zip_level= strtoul(page_zip_level_var, &endptr, 10); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index ee12034c9109f..96c90b5afad3a 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -266,6 +266,8 @@ my_bool innobase_locks_unsafe_for_binlog; my_bool innobase_rollback_on_timeout; my_bool innobase_create_status_file; +char *aria_log_dir_path; + /* The following counter is used to convey information to InnoDB about server activity: in selects it is not sensible to call srv_active_wake_master_thread after each fetch or search, we only do @@ -1105,7 +1107,8 @@ enum options_xtrabackup OPT_XTRA_CHECK_PRIVILEGES, OPT_XTRA_MYSQLD_ARGS, OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION, - OPT_INNODB_FORCE_RECOVERY + OPT_INNODB_FORCE_RECOVERY, + OPT_ARIA_LOG_DIR_PATH }; struct my_option xb_client_options[]= { @@ -1696,6 +1699,11 @@ struct my_option xb_server_options[] = &innodb_log_checksums, &innodb_log_checksums, 0, GET_BOOL, REQUIRED_ARG, 1, 0, 0, 0, 0, 0 }, + {"aria_log_dir_path", OPT_ARIA_LOG_DIR_PATH, + "Path to individual files and their sizes.", + &aria_log_dir_path, &aria_log_dir_path, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"open_files_limit", OPT_OPEN_FILES_LIMIT, "the maximum number of file " "descriptors to reserve with setrlimit().", (G_PTR*) &xb_open_files_limit, (G_PTR*) &xb_open_files_limit, 0, GET_ULONG, @@ -2012,6 +2020,10 @@ xb_get_one_option(int optid, } break; + case OPT_ARIA_LOG_DIR_PATH: + ADD_PRINT_PARAM_OPT(aria_log_dir_path); + break; + case OPT_XTRA_TARGET_DIR: strmake(xtrabackup_real_target_dir,argument, sizeof(xtrabackup_real_target_dir)-1); xtrabackup_target_dir= xtrabackup_real_target_dir; diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h index de3a96443a39c..df2f766aedbc4 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -74,6 +74,7 @@ extern char *xtrabackup_incremental_dir; extern char *xtrabackup_incremental_basedir; extern char *innobase_data_home_dir; extern char *innobase_buffer_pool_filename; +extern char *aria_log_dir_path; extern char *xb_plugin_dir; extern char *xb_rocksdb_datadir; extern my_bool xb_backup_rocksdb; diff --git a/mysql-test/suite/mariabackup/aria_log_dir_path.result b/mysql-test/suite/mariabackup/aria_log_dir_path.result new file mode 100644 index 0000000000000..1a877321bbebe --- /dev/null +++ b/mysql-test/suite/mariabackup/aria_log_dir_path.result @@ -0,0 +1,41 @@ +# +# MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is used +# +# Restart mariadbd with the test specific parameters +# restart: --aria-log-file-size=8388608 --aria-log-purge-type=external --loose-aria-log-dir-path=MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path +# Create and populate an Aria table (and Aria logs) +CREATE TABLE t1 (id INT, txt LONGTEXT) ENGINE=Aria; +BEGIN NOT ATOMIC +FOR id IN 0..9 DO +INSERT INTO test.t1 (id, txt) VALUES (id, REPEAT(id,1024*1024)); +END FOR; +END; +$$ +# Testing aria log files before --backup +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +SHOW ENGINE aria logs; +Type Name Status +Aria aria_log.00000001 free +Aria aria_log.00000002 in use +# mariadb-backup --backup +# mariadb-backup --prepare +# shutdown server +# remove datadir +# remove aria-log-dir-path +# mariadb-backup --copy-back +# with parameters: --defaults-file=MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=MYSQLTEST_VARDIR/mysqld.1/data/ --target-dir=MYSQLTEST_VARDIR/tmp/backup --parallel=2 --throttle=1 --aria-log-dir-path=MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path +# starting server +# restart: --aria-log-file-size=8388608 --aria-log-purge-type=external --loose-aria-log-dir-path=MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path +# Check that the table is there after --copy-back +SELECT COUNT(*) from t1; +COUNT(*) +10 +DROP TABLE t1; +# Testing aria log files after --copy-back +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +SHOW ENGINE aria logs; +Type Name Status +Aria aria_log.00000001 free +Aria aria_log.00000002 in use +# Restarting mariadbd with default parameters +# restart diff --git a/mysql-test/suite/mariabackup/aria_log_dir_path.test b/mysql-test/suite/mariabackup/aria_log_dir_path.test new file mode 100644 index 0000000000000..0178cd4eae5bc --- /dev/null +++ b/mysql-test/suite/mariabackup/aria_log_dir_path.test @@ -0,0 +1,105 @@ +--source include/have_maria.inc + +--echo # +--echo # MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is used +--echo # + +--let $datadir=`SELECT @@datadir` +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup + +if ($ARIA_LOGDIR_MARIADB == '') +{ + --let $ARIA_LOGDIR_MARIADB=$MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path +} + +if ($ARIA_LOGDIR_FS == '') +{ + --let $ARIA_LOGDIR_FS=$MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path +} + +--let $server_parameters=--aria-log-file-size=8388608 --aria-log-purge-type=external --loose-aria-log-dir-path=$ARIA_LOGDIR_MARIADB + + +--echo # Restart mariadbd with the test specific parameters +--mkdir $ARIA_LOGDIR_FS +--let $restart_parameters=$server_parameters +--source include/restart_mysqld.inc + + +--echo # Create and populate an Aria table (and Aria logs) +CREATE TABLE t1 (id INT, txt LONGTEXT) ENGINE=Aria; +DELIMITER $$; +BEGIN NOT ATOMIC + FOR id IN 0..9 DO + INSERT INTO test.t1 (id, txt) VALUES (id, REPEAT(id,1024*1024)); + END FOR; +END; +$$ +DELIMITER ;$$ + + +--echo # Testing aria log files before --backup +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +--file_exists $ARIA_LOGDIR_FS/aria_log_control +--file_exists $ARIA_LOGDIR_FS/aria_log.00000001 +--file_exists $ARIA_LOGDIR_FS/aria_log.00000002 +--error 1 +--file_exists $ARIA_LOGDIR_FS/aria_log.00000003 +--replace_regex /Size +[0-9]+ ; .+aria_log/aria_log/ +SHOW ENGINE aria logs; + + +--echo # mariadb-backup --backup +--disable_result_log +--mkdir $targetdir +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir +--enable_result_log + + +--echo # mariadb-backup --prepare +--disable_result_log +--exec $XTRABACKUP --prepare --target-dir=$targetdir +--enable_result_log + + +--echo # shutdown server +--disable_result_log +--source include/shutdown_mysqld.inc +--echo # remove datadir +--rmdir $datadir +--echo # remove aria-log-dir-path +--rmdir $ARIA_LOGDIR_FS + +--echo # mariadb-backup --copy-back +--let $mariadb_backup_parameters=--defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$datadir --target-dir=$targetdir --parallel=2 --throttle=1 --aria-log-dir-path=$ARIA_LOGDIR_MARIADB +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec echo "# with parameters: $mariadb_backup_parameters" +--exec $XTRABACKUP $mariadb_backup_parameters + +--echo # starting server +--let $restart_parameters=$server_parameters +--source include/start_mysqld.inc +--enable_result_log +--rmdir $targetdir + + +--echo # Check that the table is there after --copy-back +SELECT COUNT(*) from t1; +DROP TABLE t1; + + +--echo # Testing aria log files after --copy-back +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +--file_exists $ARIA_LOGDIR_FS/aria_log_control +--file_exists $ARIA_LOGDIR_FS/aria_log.00000001 +--file_exists $ARIA_LOGDIR_FS/aria_log.00000002 +--error 1 +--file_exists $ARIA_LOGDIR_FS/aria_log.00000003 +--replace_regex /Size +[0-9]+ ; .+aria_log/aria_log/ +SHOW ENGINE aria logs; + + +--echo # Restarting mariadbd with default parameters +--let $restart_parameters= +--source include/restart_mysqld.inc +--rmdir $ARIA_LOGDIR_FS diff --git a/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result b/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result new file mode 100644 index 0000000000000..7fef26096e0c5 --- /dev/null +++ b/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result @@ -0,0 +1,41 @@ +# +# MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is used +# +# Restart mariadbd with the test specific parameters +# restart: --aria-log-file-size=8388608 --aria-log-purge-type=external --loose-aria-log-dir-path=../../tmp/backup_aria_log_dir_path_rel +# Create and populate an Aria table (and Aria logs) +CREATE TABLE t1 (id INT, txt LONGTEXT) ENGINE=Aria; +BEGIN NOT ATOMIC +FOR id IN 0..9 DO +INSERT INTO test.t1 (id, txt) VALUES (id, REPEAT(id,1024*1024)); +END FOR; +END; +$$ +# Testing aria log files before --backup +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +SHOW ENGINE aria logs; +Type Name Status +Aria aria_log.00000001 free +Aria aria_log.00000002 in use +# mariadb-backup --backup +# mariadb-backup --prepare +# shutdown server +# remove datadir +# remove aria-log-dir-path +# mariadb-backup --copy-back +# with parameters: --defaults-file=MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=MYSQLTEST_VARDIR/mysqld.1/data/ --target-dir=MYSQLTEST_VARDIR/tmp/backup --parallel=2 --throttle=1 --aria-log-dir-path=../../tmp/backup_aria_log_dir_path_rel +# starting server +# restart: --aria-log-file-size=8388608 --aria-log-purge-type=external --loose-aria-log-dir-path=../../tmp/backup_aria_log_dir_path_rel +# Check that the table is there after --copy-back +SELECT COUNT(*) from t1; +COUNT(*) +10 +DROP TABLE t1; +# Testing aria log files after --copy-back +SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; +SHOW ENGINE aria logs; +Type Name Status +Aria aria_log.00000001 free +Aria aria_log.00000002 in use +# Restarting mariadbd with default parameters +# restart diff --git a/mysql-test/suite/mariabackup/aria_log_dir_path_rel.test b/mysql-test/suite/mariabackup/aria_log_dir_path_rel.test new file mode 100644 index 0000000000000..c8169959929b9 --- /dev/null +++ b/mysql-test/suite/mariabackup/aria_log_dir_path_rel.test @@ -0,0 +1,4 @@ +--let $ARIA_LOGDIR_MARIADB=../../tmp/backup_aria_log_dir_path_rel +--let $ARIA_LOGDIR_FS=$MYSQLTEST_VARDIR/tmp/backup_aria_log_dir_path_rel + +--source aria_log_dir_path.test diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index 20fcc0b64b8c6..76d4f465b95d8 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -1567,7 +1567,11 @@ is_absolute_path( } #ifdef _WIN32 - if (path[1] == ':' && path[2] == OS_PATH_SEPARATOR) { + // This will conflict during a 10.5->10.6 merge. + // Choose the 10.6 version as is. + if (path[1] == ':' && + (path[2] == OS_PATH_SEPARATOR || + path[2] == OS_PATH_SEPARATOR_ALT)) { return(true); } #endif /* _WIN32 */ From 6dc6c22c14fe204dbac43b6132c5bd130c69aba1 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 21 Apr 2023 18:49:52 -0700 Subject: [PATCH 60/70] MDEV-31085 Crash when processing multi-update using view with optimizer_trace on This bug caused server crash when processing a multi-update statement that used views if optimizer tracing was enabled. The bug was introduced in the patch for MDEV-30539 that could incorrectly detect the most top level selects of queries if views were used in them. Approved by Oleksandr Byelkin --- mysql-test/main/opt_trace.result | 356 +++++++++++++++++++++++++++++++ mysql-test/main/opt_trace.test | 19 ++ sql/sql_select.cc | 4 +- 3 files changed, 377 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index a8b391ffbe8b5..a7a8fb88e6d42 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -8505,5 +8505,361 @@ SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); a DROP TABLE t1; # +# MDEV-31085: multi-update using view with optimizer trace enabled +# +SET SESSION optimizer_trace = 'enabled=on'; +CREATE TABLE t (a int, b int); +CREATE VIEW v AS SELECT 1 AS c UNION SELECT 2 AS c; +INSERT INTO t VALUES (0,4),(5,6); +UPDATE t, v SET t.b = t.a, t.a = v.c WHERE v.c < t.a; +SELECT * FROM information_schema.optimizer_trace; +QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES +UPDATE t, v SET t.b = t.a, t.a = v.c WHERE v.c < t.a { + "steps": [ + { + "view": { + "table": "v", + "select_id": 2, + "algorithm": "materialized" + } + }, + { + "join_preparation": { + "select_id": 2, + "steps": [ + { + "expanded_query": "/* select#2 */ select 1 AS c" + } + ] + } + }, + { + "join_preparation": { + "select_id": 3, + "steps": [ + { + "expanded_query": "/* select#3 */ select 2 AS c" + } + ] + } + }, + { + "join_preparation": { + "select_id": 1, + "steps": [ + { + "expanded_query": "/* select#1 */ update t join v set t.b = t.a,t.a = v.c where v.c < t.a" + } + ] + } + }, + { + "join_optimization": { + "select_id": 1, + "steps": [ + { + "condition_processing": { + "condition": "WHERE", + "original_condition": "v.c < t.a", + "steps": [ + { + "transformation": "equality_propagation", + "resulting_condition": "v.c < t.a" + }, + { + "transformation": "constant_propagation", + "resulting_condition": "v.c < t.a" + }, + { + "transformation": "trivial_condition_removal", + "resulting_condition": "v.c < t.a" + } + ] + } + }, + { + "join_optimization": { + "select_id": 2, + "steps": [] + } + }, + { + "join_optimization": { + "select_id": 3, + "steps": [] + } + }, + { + "table_dependencies": [ + { + "table": "t", + "row_may_be_null": false, + "map_bit": 0, + "depends_on_map_bits": [] + }, + { + "table": "", + "row_may_be_null": false, + "map_bit": 1, + "depends_on_map_bits": [] + } + ] + }, + { + "ref_optimizer_key_uses": [] + }, + { + "rows_estimation": [ + { + "table": "t", + "table_scan": { + "rows": 2, + "cost": 2.0044 + } + }, + { + "table": "", + "table_scan": { + "rows": 2, + "cost": 2 + } + } + ] + }, + { + "considered_execution_plans": [ + { + "plan_prefix": [], + "table": "t", + "best_access_path": { + "considered_access_paths": [ + { + "access_type": "scan", + "resulting_rows": 2, + "cost": 2.0044, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "records": 2, + "cost": 2.0044, + "uses_join_buffering": false + } + }, + "rows_for_plan": 2, + "cost_for_plan": 2.4044, + "rest_of_plan": [ + { + "plan_prefix": ["t"], + "table": "", + "best_access_path": { + "considered_access_paths": [ + { + "access_type": "scan", + "resulting_rows": 2, + "cost": 2, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "records": 2, + "cost": 2, + "uses_join_buffering": true + } + }, + "rows_for_plan": 4, + "cost_for_plan": 5.2044, + "estimated_join_cardinality": 4 + } + ] + }, + { + "plan_prefix": [], + "table": "", + "best_access_path": { + "considered_access_paths": [ + { + "access_type": "scan", + "resulting_rows": 2, + "cost": 2, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "records": 2, + "cost": 2, + "uses_join_buffering": false + } + }, + "rows_for_plan": 2, + "cost_for_plan": 2.4, + "rest_of_plan": [ + { + "plan_prefix": [""], + "table": "t", + "best_access_path": { + "considered_access_paths": [ + { + "access_type": "scan", + "resulting_rows": 2, + "cost": 2.0044, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "records": 2, + "cost": 2.0044, + "uses_join_buffering": true + } + }, + "rows_for_plan": 4, + "cost_for_plan": 5.2044, + "pruned_by_cost": true + } + ] + } + ] + }, + { + "best_join_order": ["t", ""] + }, + { + "attaching_conditions_to_tables": { + "original_condition": "v.c < t.a", + "attached_conditions_computation": [], + "attached_conditions_summary": [ + { + "table": "t", + "attached": null + }, + { + "table": "", + "attached": "v.c < t.a" + } + ] + } + } + ] + } + }, + { + "join_execution": { + "select_id": 1, + "steps": [ + { + "join_execution": { + "select_id": 2, + "steps": [] + } + }, + { + "join_execution": { + "select_id": 3, + "steps": [] + } + }, + { + "join_preparation": { + "select_id": "fake", + "steps": [ + { + "expanded_query": "select c AS c from dual" + } + ] + } + }, + { + "join_optimization": { + "select_id": "fake", + "steps": [ + { + "table_dependencies": [ + { + "table": "union", + "row_may_be_null": false, + "map_bit": 0, + "depends_on_map_bits": [] + } + ] + }, + { + "rows_estimation": [ + { + "table": "union", + "table_scan": { + "rows": 2, + "cost": 10.1 + } + } + ] + }, + { + "considered_execution_plans": [ + { + "plan_prefix": [], + "table": "union", + "best_access_path": { + "considered_access_paths": [ + { + "access_type": "scan", + "resulting_rows": 2, + "cost": 10.1, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "records": 2, + "cost": 10.1, + "uses_join_buffering": false + } + }, + "rows_for_plan": 2, + "cost_for_plan": 10.5, + "estimated_join_cardinality": 2 + } + ] + }, + { + "best_join_order": ["union"] + }, + { + "attaching_conditions_to_tables": { + "original_condition": null, + "attached_conditions_computation": [], + "attached_conditions_summary": [ + { + "table": "union", + "attached": null + } + ] + } + } + ] + } + }, + { + "join_execution": { + "select_id": "fake", + "steps": [] + } + } + ] + } + } + ] +} 0 0 +SELECT * FROM t; +a b +0 4 +1 5 +SET optimizer_trace=DEFAULT; +DROP VIEW v; +DROP TABLE t; +# # End of 10.4 tests # diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 0785d828a0771..e0be53600691d 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -677,6 +677,25 @@ INSERT INTO t1 VALUES (0,0); SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); DROP TABLE t1; +--echo # +--echo # MDEV-31085: multi-update using view with optimizer trace enabled +--echo # + +SET SESSION optimizer_trace = 'enabled=on'; + +CREATE TABLE t (a int, b int); +CREATE VIEW v AS SELECT 1 AS c UNION SELECT 2 AS c; +INSERT INTO t VALUES (0,4),(5,6); +UPDATE t, v SET t.b = t.a, t.a = v.c WHERE v.c < t.a; +SELECT * FROM information_schema.optimizer_trace; + +SELECT * FROM t; + +SET optimizer_trace=DEFAULT; + +DROP VIEW v; +DROP TABLE t; + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0651c1d58bdde..03a2c3d0853e9 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -28050,7 +28050,7 @@ void st_select_lex::print_item_list(THD *thd, String *str, outer_select() can not be used here because it is for name resolution and will return NULL at any end of name resolution chain (view/derived) */ - bool top_level= (get_master()->get_master() == 0); + bool top_level= (get_master() == &thd->lex->unit); List_iterator_fast it(item_list); Item *item; while ((item= it++)) @@ -28157,7 +28157,7 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) return; } - bool top_level= (get_master()->get_master() == 0); + bool top_level= (get_master() == &thd->lex->unit); enum explainable_cmd_type sel_type= SELECT_CMD; if (top_level) sel_type= get_explainable_cmd_type(thd); From 2c567b2fa37b60fd6db06ddc113d107fd9863208 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Sat, 22 Apr 2023 16:42:52 +0530 Subject: [PATCH 61/70] MDEV-30996 insert.. select in presence of full text index freezes all other commits at commit time - This patch does the following: git revert --no-commit 673243c8938957ef1c01ffd3bfd35b5ae31ef484 git revert --no-commit 6c669b9586f72d6d760cc3956c1a0cb09ace2367 git revert --no-commit bacaf2d4f4c6d77a0b6c1ae4daddd19f81ef6fa3 git checkout HEAD mysql-test git revert --no-commit 1fd7d3a9adac50de37e40e92188077e3515de505 Above command reverts MDEV-29277, MDEV-25581, MDEV-29342. When binlog is enabled, trasaction takes a lot of time to do sync operation on innodb fts table. This leads to block of other transaction commit. To avoid this failure, remove the fulltext sync operation during transaction commit. So reverted MDEV-25581 related patches. We filed MDEV-31105 to avoid the memory consumption problem during fulltext sync operation. --- .../innodb_fts/r/concurrent_insert.result | 2 +- mysql-test/suite/innodb_fts/r/sync.result | 16 +- .../suite/innodb_fts/r/sync_block.result | 83 +++++ .../suite/innodb_fts/t/concurrent_insert.test | 2 +- mysql-test/suite/innodb_fts/t/sync.test | 4 +- mysql-test/suite/innodb_fts/t/sync_block.test | 124 +++++++ storage/innobase/fts/fts0fts.cc | 325 +++++++++++++----- storage/innobase/fts/fts0opt.cc | 56 ++- storage/innobase/handler/handler0alter.cc | 8 +- storage/innobase/include/fts0fts.h | 9 +- storage/innobase/include/fts0types.h | 32 +- 11 files changed, 552 insertions(+), 109 deletions(-) create mode 100644 mysql-test/suite/innodb_fts/r/sync_block.result create mode 100644 mysql-test/suite/innodb_fts/t/sync_block.test diff --git a/mysql-test/suite/innodb_fts/r/concurrent_insert.result b/mysql-test/suite/innodb_fts/r/concurrent_insert.result index 2335982816bf5..bc47511b04690 100644 --- a/mysql-test/suite/innodb_fts/r/concurrent_insert.result +++ b/mysql-test/suite/innodb_fts/r/concurrent_insert.result @@ -19,7 +19,7 @@ INSERT INTO t2 VALUES('mariadb'); connection default; SET @saved_dbug = @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug ='+d,fts_instrument_sync_request,ib_optimize_wq_hang'; -SET DEBUG_SYNC= 'fts_sync_end +SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL drop_index_start WAIT_FOR sync_op'; INSERT INTO t1 VALUES('Keyword'); connect con1,localhost,root,,,; diff --git a/mysql-test/suite/innodb_fts/r/sync.result b/mysql-test/suite/innodb_fts/r/sync.result index 74a5d2f13fb5e..928efffdb21d9 100644 --- a/mysql-test/suite/innodb_fts/r/sync.result +++ b/mysql-test/suite/innodb_fts/r/sync.result @@ -11,19 +11,19 @@ INSERT INTO t1(title) VALUES('database'); connection con1; SET @old_dbug = @@SESSION.debug_dbug; SET debug_dbug = '+d,fts_instrument_sync_debug'; -SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR selected'; +SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR selected'; INSERT INTO t1(title) VALUES('mysql database'); connection default; SET DEBUG_SYNC= 'now WAIT_FOR written'; SET GLOBAL innodb_ft_aux_table="test/t1"; SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION -SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; -WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION database 2 3 2 2 0 database 2 3 2 3 6 mysql 1 3 2 1 0 mysql 1 3 2 3 0 +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION SET GLOBAL innodb_ft_aux_table=default; SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); FTS_DOC_ID title @@ -59,7 +59,7 @@ INSERT INTO t1(title) VALUES('mysql'); INSERT INTO t1(title) VALUES('database'); connection con1; SET debug_dbug = '+d,fts_instrument_sync_debug'; -SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR inserted'; +SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR inserted'; INSERT INTO t1(title) VALUES('mysql database'); connection default; SET DEBUG_SYNC= 'now WAIT_FOR written'; @@ -70,14 +70,14 @@ SET debug_dbug = @old_dbug; SET GLOBAL innodb_ft_aux_table="test/t1"; SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION -database 4 4 1 4 6 -mysql 4 4 1 4 0 SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION database 2 3 2 2 0 database 2 3 2 3 6 -mysql 1 3 2 1 0 -mysql 1 3 2 3 0 +database 4 4 1 4 6 +mysql 1 4 3 1 0 +mysql 1 4 3 3 0 +mysql 1 4 3 4 0 SET GLOBAL innodb_ft_aux_table=default; SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); FTS_DOC_ID title diff --git a/mysql-test/suite/innodb_fts/r/sync_block.result b/mysql-test/suite/innodb_fts/r/sync_block.result new file mode 100644 index 0000000000000..65bee127e8068 --- /dev/null +++ b/mysql-test/suite/innodb_fts/r/sync_block.result @@ -0,0 +1,83 @@ +SET @old_log_output = @@global.log_output; +SET @old_slow_query_log = @@global.slow_query_log; +SET @old_general_log = @@global.general_log; +SET @old_long_query_time = @@global.long_query_time; +SET @old_debug = @@global.debug_dbug; +SET GLOBAL log_output = 'TABLE'; +SET GLOBAL general_log = 1; +SET GLOBAL slow_query_log = 1; +SET GLOBAL long_query_time = 1; +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connection default; +# Case 1: Sync blocks DML(insert) on the same table. +CREATE TABLE t1 ( +FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +FULLTEXT(title) +) ENGINE = InnoDB; +connection con1; +SET GLOBAL debug_dbug='+d,fts_instrument_sync_debug,fts_instrument_sync_sleep'; +SET DEBUG_SYNC= 'fts_sync_begin SIGNAL begin WAIT_FOR continue'; +INSERT INTO t1(title) VALUES('mysql database'); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR begin'; +SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); +connection default; +SET DEBUG_SYNC= 'now SIGNAL continue'; +connection con1; +/* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); +connection con2; +/* conneciton con2 */ SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); +FTS_DOC_ID title +connection default; +# make con1 & con2 show up in mysql.slow_log +SELECT SLEEP(2); +SLEEP(2) +0 +# slow log results should only contain INSERT INTO t1. +SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; +sql_text +INSERT INTO t1(title) VALUES('mysql database') +SET GLOBAL debug_dbug = @old_debug; +TRUNCATE TABLE mysql.slow_log; +DROP TABLE t1; +# Case 2: Sync blocks DML(insert) on other tables. +CREATE TABLE t1 ( +FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +FULLTEXT(title) +) ENGINE = InnoDB; +CREATE TABLE t2(id INT); +connection con1; +SET GLOBAL debug_dbug='+d,fts_instrument_sync_request,fts_instrument_sync_sleep'; +SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL begin WAIT_FOR continue'; +INSERT INTO t1(title) VALUES('mysql database'); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR begin'; +INSERT INTO t2 VALUES(1); +connection default; +SET DEBUG_SYNC= 'now SIGNAL continue'; +connection con1; +/* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); +connection con2; +/* conneciton con2 */ INSERT INTO t2 VALUES(1); +connection default; +SET DEBUG_SYNC = 'RESET'; +# make con1 & con2 show up in mysql.slow_log +SELECT SLEEP(2); +SLEEP(2) +0 +# slow log results should be empty here. +SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; +sql_text +SET GLOBAL debug_dbug = @old_debug; +TRUNCATE TABLE mysql.slow_log; +DROP TABLE t1,t2; +disconnect con1; +disconnect con2; +# Restore slow log settings. +SET GLOBAL log_output = @old_log_output; +SET GLOBAL general_log = @old_general_log; +SET GLOBAL slow_query_log = @old_slow_query_log; +SET GLOBAL long_query_time = @old_long_query_time; diff --git a/mysql-test/suite/innodb_fts/t/concurrent_insert.test b/mysql-test/suite/innodb_fts/t/concurrent_insert.test index b6991f6e5032c..9b4d9517b1a12 100644 --- a/mysql-test/suite/innodb_fts/t/concurrent_insert.test +++ b/mysql-test/suite/innodb_fts/t/concurrent_insert.test @@ -31,7 +31,7 @@ INSERT INTO t2 VALUES('mariadb'); connection default; SET @saved_dbug = @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug ='+d,fts_instrument_sync_request,ib_optimize_wq_hang'; -SET DEBUG_SYNC= 'fts_sync_end +SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL drop_index_start WAIT_FOR sync_op'; send INSERT INTO t1 VALUES('Keyword'); diff --git a/mysql-test/suite/innodb_fts/t/sync.test b/mysql-test/suite/innodb_fts/t/sync.test index 7c5c835f2ee21..168309a5c925f 100644 --- a/mysql-test/suite/innodb_fts/t/sync.test +++ b/mysql-test/suite/innodb_fts/t/sync.test @@ -27,7 +27,7 @@ connection con1; SET @old_dbug = @@SESSION.debug_dbug; SET debug_dbug = '+d,fts_instrument_sync_debug'; -SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR selected'; +SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR selected'; send INSERT INTO t1(title) VALUES('mysql database'); @@ -74,7 +74,7 @@ connection con1; SET debug_dbug = '+d,fts_instrument_sync_debug'; -SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR inserted'; +SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR inserted'; send INSERT INTO t1(title) VALUES('mysql database'); diff --git a/mysql-test/suite/innodb_fts/t/sync_block.test b/mysql-test/suite/innodb_fts/t/sync_block.test new file mode 100644 index 0000000000000..895d2ba8a59dc --- /dev/null +++ b/mysql-test/suite/innodb_fts/t/sync_block.test @@ -0,0 +1,124 @@ +# +# BUG#22516559 MYSQL INSTANCE STALLS WHEN SYNCING FTS INDEX +# + +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/have_log_bin.inc +--source include/count_sessions.inc + +SET @old_log_output = @@global.log_output; +SET @old_slow_query_log = @@global.slow_query_log; +SET @old_general_log = @@global.general_log; +SET @old_long_query_time = @@global.long_query_time; +SET @old_debug = @@global.debug_dbug; + +SET GLOBAL log_output = 'TABLE'; +SET GLOBAL general_log = 1; +SET GLOBAL slow_query_log = 1; +SET GLOBAL long_query_time = 1; + +connect (con1,localhost,root,,); +connect (con2,localhost,root,,); +connection default; + +--echo # Case 1: Sync blocks DML(insert) on the same table. +CREATE TABLE t1 ( + FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + FULLTEXT(title) +) ENGINE = InnoDB; + +connection con1; + +SET GLOBAL debug_dbug='+d,fts_instrument_sync_debug,fts_instrument_sync_sleep'; + +SET DEBUG_SYNC= 'fts_sync_begin SIGNAL begin WAIT_FOR continue'; + +send INSERT INTO t1(title) VALUES('mysql database'); + +connection con2; + +SET DEBUG_SYNC= 'now WAIT_FOR begin'; + +send SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); + +connection default; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +connection con1; +--echo /* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); +--reap + +connection con2; +--echo /* conneciton con2 */ SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); +--reap + +connection default; +-- echo # make con1 & con2 show up in mysql.slow_log +SELECT SLEEP(2); +-- echo # slow log results should only contain INSERT INTO t1. +SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; + +SET GLOBAL debug_dbug = @old_debug; +TRUNCATE TABLE mysql.slow_log; + +DROP TABLE t1; + +--echo # Case 2: Sync blocks DML(insert) on other tables. +CREATE TABLE t1 ( + FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + FULLTEXT(title) +) ENGINE = InnoDB; + +CREATE TABLE t2(id INT); + +connection con1; + +SET GLOBAL debug_dbug='+d,fts_instrument_sync_request,fts_instrument_sync_sleep'; + +SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL begin WAIT_FOR continue'; + +send INSERT INTO t1(title) VALUES('mysql database'); + +connection con2; + +SET DEBUG_SYNC= 'now WAIT_FOR begin'; + +send INSERT INTO t2 VALUES(1); + +connection default; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +connection con1; +--echo /* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); +--reap + +connection con2; +--echo /* conneciton con2 */ INSERT INTO t2 VALUES(1); +--reap + +connection default; +SET DEBUG_SYNC = 'RESET'; +-- echo # make con1 & con2 show up in mysql.slow_log +SELECT SLEEP(2); +-- echo # slow log results should be empty here. +SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; + +SET GLOBAL debug_dbug = @old_debug; +TRUNCATE TABLE mysql.slow_log; + +DROP TABLE t1,t2; + +disconnect con1; +disconnect con2; + +--source include/wait_until_count_sessions.inc + +-- echo # Restore slow log settings. +SET GLOBAL log_output = @old_log_output; +SET GLOBAL general_log = @old_general_log; +SET GLOBAL slow_query_log = @old_slow_query_log; +SET GLOBAL long_query_time = @old_long_query_time; diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index eed2eb72cd1a5..f94aed58d2119 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -38,22 +38,6 @@ Full Text Search interface #include "dict0stats.h" #include "btr0pcur.h" -/** The SYNC state of the cache. There is one instance of this struct -associated with each ADD thread. */ -struct fts_sync_t { - /** Transaction used for SYNCing the cache to disk */ - trx_t *trx; - /** Table with FTS index(es) */ - dict_table_t *table; - /** Max size in bytes of the cache */ - ulint max_cache_size; - /** The doc id at which the cache was noted as being - full, we use this to set the upper_limit field */ - doc_id_t max_doc_id; - /** SYNC start time; only used if fts_enable_diag_print */ - time_t start_time; -}; - static const ulint FTS_MAX_ID_LEN = 32; /** Column name from the FTS config table */ @@ -201,8 +185,15 @@ struct fts_tokenize_param_t { /** Run SYNC on the table, i.e., write out data from the cache to the FTS auxiliary INDEX table and clear the cache at the end. @param[in,out] sync sync state +@param[in] unlock_cache whether unlock cache lock when write node +@param[in] wait whether wait when a sync is in progress @return DB_SUCCESS if all OK */ -static dberr_t fts_sync(fts_sync_t *sync); +static +dberr_t +fts_sync( + fts_sync_t* sync, + bool unlock_cache, + bool wait); /****************************************************************//** Release all resources help by the words rb tree e.g., the node ilist. */ @@ -275,6 +266,7 @@ fts_cache_destroy(fts_cache_t* cache) mysql_mutex_destroy(&cache->init_lock); mysql_mutex_destroy(&cache->deleted_lock); mysql_mutex_destroy(&cache->doc_id_lock); + pthread_cond_destroy(&cache->sync->cond); if (cache->stopword_info.cached_stopword) { rbt_free(cache->stopword_info.cached_stopword); @@ -574,6 +566,7 @@ fts_index_cache_init( for (i = 0; i < FTS_NUM_AUX_INDEX; ++i) { ut_a(index_cache->ins_graph[i] == NULL); + ut_a(index_cache->sel_graph[i] == NULL); } } @@ -643,6 +636,7 @@ fts_cache_create( mem_heap_zalloc(heap, sizeof(fts_sync_t))); cache->sync->table = table; + pthread_cond_init(&cache->sync->cond, nullptr); /* Create the index cache vector that will hold the inverted indexes. */ cache->indexes = ib_vector_create( @@ -968,6 +962,10 @@ fts_cache_index_cache_create( mem_heap_zalloc(static_cast( cache->self_heap->arg), n_bytes)); + index_cache->sel_graph = static_cast( + mem_heap_zalloc(static_cast( + cache->self_heap->arg), n_bytes)); + fts_index_cache_init(cache->sync_heap, index_cache); if (cache->get_docs) { @@ -1041,6 +1039,13 @@ fts_cache_clear( index_cache->ins_graph[j] = NULL; } + + if (index_cache->sel_graph[j] != NULL) { + + que_graph_free(index_cache->sel_graph[j]); + + index_cache->sel_graph[j] = NULL; + } } index_cache->doc_stats = NULL; @@ -1333,7 +1338,8 @@ fts_cache_add_doc( ib_vector_last(word->nodes)); } - if (!fts_node || fts_node->ilist_size > FTS_ILIST_MAX_SIZE + if (fts_node == NULL || fts_node->synced + || fts_node->ilist_size > FTS_ILIST_MAX_SIZE || doc_id < fts_node->last_doc_id) { fts_node = static_cast( @@ -3320,7 +3326,7 @@ fts_add_doc_from_tuple( if (cache->total_size > fts_max_cache_size / 5 || fts_need_sync) { - fts_sync(cache->sync); + fts_sync(cache->sync, true, false); } mtr_start(&mtr); @@ -3356,7 +3362,7 @@ fts_add_doc_by_id( dict_index_t* fts_id_index; ibool is_id_cluster; fts_cache_t* cache = ftt->table->fts->cache; - bool need_sync= false; + ut_ad(cache->get_docs); /* If Doc ID has been supplied by the user, then the table @@ -3496,32 +3502,44 @@ fts_add_doc_by_id( get_doc->index_cache, doc_id, doc.tokens); - /** FTS cache sync should happen - frequently. Because user thread - shouldn't hold the cache lock for - longer time. So cache should sync - whenever cache size exceeds 512 KB */ - need_sync = - cache->total_size > 512*1024; + bool need_sync = !cache->sync->in_progress + && (fts_need_sync + || (cache->total_size + - cache->total_size_at_sync) + > fts_max_cache_size / 10); + if (need_sync) { + cache->total_size_at_sync = + cache->total_size; + } mysql_mutex_unlock(&table->fts->cache->lock); DBUG_EXECUTE_IF( "fts_instrument_sync", - fts_sync_table(table); + fts_optimize_request_sync_table(table); + mysql_mutex_lock(&cache->lock); + if (cache->sync->in_progress) + my_cond_wait( + &cache->sync->cond, + &cache->lock.m_mutex); + mysql_mutex_unlock(&cache->lock); ); DBUG_EXECUTE_IF( "fts_instrument_sync_debug", - fts_sync(cache->sync); + fts_sync(cache->sync, true, true); ); DEBUG_SYNC_C("fts_instrument_sync_request"); DBUG_EXECUTE_IF( "fts_instrument_sync_request", - need_sync= true; + fts_optimize_request_sync_table(table); ); + if (need_sync) { + fts_optimize_request_sync_table(table); + } + mtr_start(&mtr); if (i < num_idx - 1) { @@ -3547,10 +3565,6 @@ fts_add_doc_by_id( ut_free(pcur.old_rec_buf); mem_heap_free(heap); - - if (need_sync) { - fts_sync_table(table); - } } @@ -3910,13 +3924,15 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t fts_sync_write_words( trx_t* trx, - fts_index_cache_t* index_cache) + fts_index_cache_t* index_cache, + bool unlock_cache) { fts_table_t fts_table; ulint n_nodes = 0; ulint n_words = 0; const ib_rbt_node_t* rbt_node; dberr_t error = DB_SUCCESS; + ibool print_error = FALSE; dict_table_t* table = index_cache->index->table; FTS_INIT_INDEX_TABLE( @@ -3947,36 +3963,53 @@ fts_sync_write_words( fts_table.suffix = fts_get_suffix(selected); + /* We iterate over all the nodes even if there was an error */ for (i = 0; i < ib_vector_size(word->nodes); ++i) { fts_node_t* fts_node = static_cast( ib_vector_get(word->nodes, i)); - error = fts_write_node( - trx, &index_cache->ins_graph[selected], - &fts_table, &word->text, fts_node); + if (fts_node->synced) { + continue; + } else { + fts_node->synced = true; + } + + /*FIXME: we need to handle the error properly. */ + if (error == DB_SUCCESS) { + if (unlock_cache) { + mysql_mutex_unlock( + &table->fts->cache->lock); + } + + error = fts_write_node( + trx, + &index_cache->ins_graph[selected], + &fts_table, &word->text, fts_node); - DEBUG_SYNC_C("fts_write_node"); - DBUG_EXECUTE_IF("fts_write_node_crash", + DEBUG_SYNC_C("fts_write_node"); + DBUG_EXECUTE_IF("fts_write_node_crash", DBUG_SUICIDE();); - DBUG_EXECUTE_IF("fts_instrument_sync_sleep", + DBUG_EXECUTE_IF( + "fts_instrument_sync_sleep", std::this_thread::sleep_for( std::chrono::seconds(1));); - if (error != DB_SUCCESS) { - goto err_exit; + if (unlock_cache) { + mysql_mutex_lock( + &table->fts->cache->lock); + } } } n_nodes += ib_vector_size(word->nodes); - if (UNIV_UNLIKELY(error != DB_SUCCESS)) { -err_exit: + if (UNIV_UNLIKELY(error != DB_SUCCESS) && !print_error) { ib::error() << "(" << error << ") writing" " word node to FTS auxiliary index table " << table->name; - break; + print_error = TRUE; } } @@ -4035,44 +4068,58 @@ fts_sync_index( ut_ad(rbt_validate(index_cache->words)); - return(fts_sync_write_words(trx, index_cache)); + return(fts_sync_write_words(trx, index_cache, sync->unlock_cache)); } -/** Rollback a sync operation -@param[in,out] sync sync state */ +/** Check if index cache has been synced completely +@param[in,out] index_cache index cache +@return true if index is synced, otherwise false. */ static -void -fts_sync_rollback( - fts_sync_t* sync) +bool +fts_sync_index_check( + fts_index_cache_t* index_cache) { - trx_t* trx = sync->trx; - fts_cache_t* cache = sync->table->fts->cache; - - for (ulint i = 0; i < ib_vector_size(cache->indexes); ++i) { - ulint j; - fts_index_cache_t* index_cache; - - index_cache = static_cast( - ib_vector_get(cache->indexes, i)); + const ib_rbt_node_t* rbt_node; - for (j = 0; fts_index_selector[j].value; ++j) { + for (rbt_node = rbt_first(index_cache->words); + rbt_node != NULL; + rbt_node = rbt_next(index_cache->words, rbt_node)) { - if (index_cache->ins_graph[j] != NULL) { + fts_tokenizer_word_t* word; + word = rbt_value(fts_tokenizer_word_t, rbt_node); - que_graph_free(index_cache->ins_graph[j]); + fts_node_t* fts_node; + fts_node = static_cast(ib_vector_last(word->nodes)); - index_cache->ins_graph[j] = NULL; - } + if (!fts_node->synced) { + return(false); } } - mysql_mutex_unlock(&cache->lock); + return(true); +} - fts_sql_rollback(trx); +/** Reset synced flag in index cache when rollback +@param[in,out] index_cache index cache */ +static +void +fts_sync_index_reset( + fts_index_cache_t* index_cache) +{ + const ib_rbt_node_t* rbt_node; - /* Avoid assertion in trx_t::free(). */ - trx->dict_operation_lock_mode = false; - trx->free(); + for (rbt_node = rbt_first(index_cache->words); + rbt_node != NULL; + rbt_node = rbt_next(index_cache->words, rbt_node)) { + + fts_tokenizer_word_t* word; + word = rbt_value(fts_tokenizer_word_t, rbt_node); + + fts_node_t* fts_node; + fts_node = static_cast(ib_vector_last(word->nodes)); + + fts_node->synced = false; + } } /** Commit the SYNC, change state of processed doc ids etc. @@ -4105,20 +4152,19 @@ fts_sync_commit( sync, cache->deleted_doc_ids); } + /* We need to do this within the deleted lock since fts_delete() can + attempt to add a deleted doc id to the cache deleted id array. */ + fts_cache_clear(cache); + DEBUG_SYNC_C("fts_deleted_doc_ids_clear"); + fts_cache_init(cache); + mysql_mutex_unlock(&cache->lock); + if (UNIV_LIKELY(error == DB_SUCCESS)) { - /* We need to do this within the deleted lock - since fts_delete() can attempt to add a deleted - doc id to the cache deleted id array. */ - fts_cache_clear(cache); - DEBUG_SYNC_C("fts_deleted_doc_ids_clear"); - fts_cache_init(cache); - mysql_mutex_unlock(&cache->lock); fts_sql_commit(trx); } else { + fts_sql_rollback(trx); ib::error() << "(" << error << ") during SYNC of " "table " << sync->table->name; - fts_sync_rollback(sync); - return error; } if (UNIV_UNLIKELY(fts_enable_diag_print) && elapsed_time) { @@ -4138,13 +4184,66 @@ fts_sync_commit( return(error); } +/** Rollback a sync operation +@param[in,out] sync sync state */ +static +void +fts_sync_rollback( + fts_sync_t* sync) +{ + trx_t* trx = sync->trx; + fts_cache_t* cache = sync->table->fts->cache; + + for (ulint i = 0; i < ib_vector_size(cache->indexes); ++i) { + ulint j; + fts_index_cache_t* index_cache; + + index_cache = static_cast( + ib_vector_get(cache->indexes, i)); + + /* Reset synced flag so nodes will not be skipped + in the next sync, see fts_sync_write_words(). */ + fts_sync_index_reset(index_cache); + + for (j = 0; fts_index_selector[j].value; ++j) { + + if (index_cache->ins_graph[j] != NULL) { + + que_graph_free(index_cache->ins_graph[j]); + + index_cache->ins_graph[j] = NULL; + } + + if (index_cache->sel_graph[j] != NULL) { + + que_graph_free(index_cache->sel_graph[j]); + + index_cache->sel_graph[j] = NULL; + } + } + } + + mysql_mutex_unlock(&cache->lock); + + fts_sql_rollback(trx); + + /* Avoid assertion in trx_t::free(). */ + trx->dict_operation_lock_mode = false; + trx->free(); +} + /** Run SYNC on the table, i.e., write out data from the cache to the FTS auxiliary INDEX table and clear the cache at the end. @param[in,out] sync sync state @param[in] unlock_cache whether unlock cache lock when write node @param[in] wait whether wait when a sync is in progress @return DB_SUCCESS if all OK */ -static dberr_t fts_sync(fts_sync_t *sync) +static +dberr_t +fts_sync( + fts_sync_t* sync, + bool unlock_cache, + bool wait) { if (srv_read_only_mode) { return DB_READ_ONLY; @@ -4155,13 +4254,33 @@ static dberr_t fts_sync(fts_sync_t *sync) fts_cache_t* cache = sync->table->fts->cache; mysql_mutex_lock(&cache->lock); + + /* Check if cache is being synced. + Note: we release cache lock in fts_sync_write_words() to + avoid long wait for the lock by other threads. */ + if (sync->in_progress) { + if (!wait) { + mysql_mutex_unlock(&cache->lock); + return(DB_SUCCESS); + } + do { + my_cond_wait(&sync->cond, &cache->lock.m_mutex); + } while (sync->in_progress); + } + + sync->unlock_cache = unlock_cache; + sync->in_progress = true; + DEBUG_SYNC_C("fts_sync_begin"); fts_sync_begin(sync); +begin_sync: const size_t fts_cache_size= fts_max_cache_size; if (cache->total_size > fts_cache_size) { /* Avoid the case: sync never finish when insert/update keeps comming. */ + ut_ad(sync->unlock_cache); + sync->unlock_cache = false; ib::warn() << "Total InnoDB FTS size " << cache->total_size << " for the table " << cache->sync->table->name @@ -4185,23 +4304,52 @@ static dberr_t fts_sync(fts_sync_t *sync) error = fts_sync_index(sync, index_cache); if (error != DB_SUCCESS) { - goto err_exit; + goto end_sync; + } + + if (!sync->unlock_cache + && cache->total_size < fts_max_cache_size) { + /* Reset the unlock cache if the value + is less than innodb_ft_cache_size */ + sync->unlock_cache = true; } } DBUG_EXECUTE_IF("fts_instrument_sync_interrupted", + sync->interrupted = true; error = DB_INTERRUPTED; - goto err_exit; + goto end_sync; ); - if (error == DB_SUCCESS) { + /* Make sure all the caches are synced. */ + for (i = 0; i < ib_vector_size(cache->indexes); ++i) { + fts_index_cache_t* index_cache; + + index_cache = static_cast( + ib_vector_get(cache->indexes, i)); + + if (index_cache->index->to_be_dropped + || fts_sync_index_check(index_cache)) { + continue; + } + + goto begin_sync; + } + +end_sync: + if (error == DB_SUCCESS && !sync->interrupted) { error = fts_sync_commit(sync); } else { -err_exit: fts_sync_rollback(sync); - return error; } + mysql_mutex_lock(&cache->lock); + ut_ad(sync->in_progress); + sync->interrupted = false; + sync->in_progress = false; + pthread_cond_broadcast(&sync->cond); + mysql_mutex_unlock(&cache->lock); + /* We need to check whether an optimize is required, for that we make copies of the two variables that control the trigger. These variables can change behind our back and we don't want to hold the @@ -4213,7 +4361,6 @@ static dberr_t fts_sync(fts_sync_t *sync) mysql_mutex_unlock(&cache->deleted_lock); - DEBUG_SYNC_C("fts_sync_end"); return(error); } @@ -4222,12 +4369,12 @@ FTS auxiliary INDEX table and clear the cache at the end. @param[in,out] table fts table @param[in] wait whether wait for existing sync to finish @return DB_SUCCESS on success, error code on failure. */ -dberr_t fts_sync_table(dict_table_t* table) +dberr_t fts_sync_table(dict_table_t* table, bool wait) { ut_ad(table->fts); return table->space && !table->corrupted && table->fts->cache - ? fts_sync(table->fts->cache->sync) + ? fts_sync(table->fts->cache->sync, !wait, wait) : DB_SUCCESS; } diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc index 7c40a25e6e744..fe31767d90133 100644 --- a/storage/innobase/fts/fts0opt.cc +++ b/storage/innobase/fts/fts0opt.cc @@ -83,8 +83,9 @@ enum fts_msg_type_t { FTS_MSG_ADD_TABLE, /*!< Add table to the optimize thread's work queue */ - FTS_MSG_DEL_TABLE /*!< Remove a table from the optimize + FTS_MSG_DEL_TABLE, /*!< Remove a table from the optimize threads work queue */ + FTS_MSG_SYNC_TABLE /*!< Sync fts cache of a table */ }; /** Compressed list of words that have been read from FTS INDEX @@ -2624,6 +2625,36 @@ fts_optimize_remove_table( mysql_mutex_unlock(&fts_optimize_wq->mutex); } +/** Send sync fts cache for the table. +@param[in] table table to sync */ +void +fts_optimize_request_sync_table( + dict_table_t* table) +{ + /* if the optimize system not yet initialized, return */ + if (!fts_optimize_wq) { + return; + } + + mysql_mutex_lock(&fts_optimize_wq->mutex); + + /* FTS optimizer thread is already exited */ + if (fts_opt_start_shutdown) { + ib::info() << "Try to sync table " << table->name + << " after FTS optimize thread exiting."; + } else if (table->fts->sync_message) { + /* If the table already has SYNC message in + fts_optimize_wq queue then ignore it */ + } else { + add_msg(fts_optimize_create_msg(FTS_MSG_SYNC_TABLE, table)); + table->fts->sync_message = true; + DBUG_EXECUTE_IF("fts_optimize_wq_count_check", + DBUG_ASSERT(fts_optimize_wq->length <= 1000);); + } + + mysql_mutex_unlock(&fts_optimize_wq->mutex); +} + /** Add a table to fts_slots if it doesn't already exist. */ static bool fts_optimize_new_table(dict_table_t* table) { @@ -2765,8 +2796,7 @@ static void fts_optimize_sync_table(dict_table_t *table, if (sync_table->fts && sync_table->fts->cache && sync_table->is_accessible()) { - fts_sync_table(sync_table); - + fts_sync_table(sync_table, false); if (process_message) { mysql_mutex_lock(&fts_optimize_wq->mutex); @@ -2866,6 +2896,24 @@ static void fts_optimize_callback(void *) --n_tables; } break; + + case FTS_MSG_SYNC_TABLE: + if (UNIV_UNLIKELY(wsrep_sst_disable_writes)) { + add_msg(msg); + goto retry_later; + } + + DBUG_EXECUTE_IF( + "fts_instrument_msg_sync_sleep", + std::this_thread::sleep_for( + std::chrono::milliseconds( + 300));); + + fts_optimize_sync_table( + static_cast(msg->ptr), + true); + break; + default: ut_error; } @@ -2998,7 +3046,7 @@ void fts_sync_during_ddl(dict_table_t* table) if (!sync_message) return; - fts_sync_table(table); + fts_sync_table(table, false); mysql_mutex_lock(&fts_optimize_wq->mutex); table->fts->sync_message = false; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 7e4beeede3b3a..06101e6cca53a 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -11584,8 +11584,12 @@ ha_innobase::commit_inplace_alter_table( ut_d(dict_table_check_for_dup_indexes( ctx->new_table, CHECK_ABORTED_OK)); - ut_ad(!ctx->new_table->fts - || fts_check_cached_index(ctx->new_table)); +#ifdef UNIV_DEBUG + if (!(ctx->new_table->fts != NULL + && ctx->new_table->fts->cache->sync->in_progress)) { + ut_a(fts_check_cached_index(ctx->new_table)); + } +#endif } unlock_and_close_files(deleted, trx); diff --git a/storage/innobase/include/fts0fts.h b/storage/innobase/include/fts0fts.h index 720fe7f25b9c3..c0151b4406338 100644 --- a/storage/innobase/include/fts0fts.h +++ b/storage/innobase/include/fts0fts.h @@ -648,6 +648,12 @@ fts_optimize_remove_table( void fts_optimize_shutdown(); +/** Send sync fts cache for the table. +@param[in] table table to sync */ +void +fts_optimize_request_sync_table( + dict_table_t* table); + /**********************************************************************//** Take a FTS savepoint. */ void @@ -702,8 +708,9 @@ fts_savepoint_rollback_last_stmt( /** Run SYNC on the table, i.e., write out data from the cache to the FTS auxiliary INDEX table and clear the cache at the end. @param[in,out] table fts table +@param[in] wait whether to wait for existing sync to finish @return DB_SUCCESS on success, error code on failure. */ -dberr_t fts_sync_table(dict_table_t* table); +dberr_t fts_sync_table(dict_table_t* table, bool wait = true); /****************************************************************//** Create an FTS index cache. */ diff --git a/storage/innobase/include/fts0types.h b/storage/innobase/include/fts0types.h index 04e99d595c55c..fb278d543c441 100644 --- a/storage/innobase/include/fts0types.h +++ b/storage/innobase/include/fts0types.h @@ -75,6 +75,7 @@ struct fts_index_cache_t { que_t** ins_graph; /*!< Insert query graphs */ + que_t** sel_graph; /*!< Select query graphs */ CHARSET_INFO* charset; /*!< charset */ }; @@ -86,7 +87,35 @@ struct fts_stopword_t { CHARSET_INFO* charset; /*!< charset for stopword */ }; -struct fts_sync_t; +/** The SYNC state of the cache. There is one instance of this struct +associated with each ADD thread. */ +struct fts_sync_t { + trx_t* trx; /*!< The transaction used for SYNCing + the cache to disk */ + dict_table_t* table; /*!< Table with FTS index(es) */ + ulint max_cache_size; /*!< Max size in bytes of the cache */ + ibool cache_full; /*!< flag, when true it indicates that + we need to sync the cache to disk */ + ulint lower_index; /*!< the start index of the doc id + vector from where to start adding + documents to the FTS cache */ + ulint upper_index; /*!< max index of the doc id vector to + add to the FTS cache */ + ibool interrupted; /*!< TRUE if SYNC was interrupted */ + doc_id_t min_doc_id; /*!< The smallest doc id added to the + cache. It should equal to + doc_ids[lower_index] */ + doc_id_t max_doc_id; /*!< The doc id at which the cache was + noted as being full, we use this to + set the upper_limit field */ + time_t start_time; /*!< SYNC start time; only used if + fts_enable_diag_print */ + bool in_progress; /*!< flag whether sync is in progress.*/ + bool unlock_cache; /*!< flag whether unlock cache when + write fts node */ + /** condition variable for in_progress; used with table->fts->cache->lock */ + pthread_cond_t cond; +}; /** The cache for the FTS system. It is a memory-based inverted index that new entries are added to, until it grows over the configured maximum @@ -175,6 +204,7 @@ struct fts_node_t { ulint ilist_size_alloc; /*!< Allocated size of ilist in bytes */ + bool synced; /*!< flag whether the node is synced */ }; /** A tokenizer word. Contains information about one word. */ From d3e394b3b1ff1e2c4e160972aad1f78a13fbb62e Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 24 Apr 2023 10:27:55 +0400 Subject: [PATCH 62/70] A cleanup for MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is used Fixing buildbot failures on mariabackup.aria_log_dir_path_rel. The problem was that directory_exists() was called with the relative aria_log_dir_path value, while the current directory in mariadb-backup is not necessarily equal to datadir when MTR is running. Fix: - Moving building the absolute path un level upper: from the function copy_back_aria_logs() to the function copy_back(). - Passing the built absolute path to both directory_exists() and copy_back_aria_logs() as a parameter. --- extra/mariabackup/backup_copy.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index 8ab52fa983b9b..05acc1e6765c0 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -1849,10 +1849,8 @@ is_aria_log_dir_file(const datadir_node_t &node) bool -copy_back_aria_logs() +copy_back_aria_logs(const char *dstdir) { - Copy_back_dst_dir dst_dir_buf; - const char *dstdir= dst_dir_buf.make(aria_log_dir_path); std::unique_ptr ds_ctxt_aria_log_dir_path(ds_create(dstdir, DS_TYPE_LOCAL), ds_destroy); @@ -1907,8 +1905,11 @@ copy_back() && !directory_exists(srv_log_group_home_dir, true)) { return(false); } + + Copy_back_dst_dir aria_log_dir_path_dst; + const char *aria_log_dir_path_abs= aria_log_dir_path_dst.make(aria_log_dir_path); if (aria_log_dir_path && *aria_log_dir_path - && !directory_exists(aria_log_dir_path, true)) { + && !directory_exists(aria_log_dir_path_abs, true)) { return false; } @@ -1919,7 +1920,7 @@ copy_back() return(false); } - if (!copy_back_aria_logs()) + if (!copy_back_aria_logs(aria_log_dir_path_abs)) return false; /* parse data file path */ From 0976afec889d8914326f9e71b15ea215470dadba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 24 Apr 2023 09:57:58 +0300 Subject: [PATCH 63/70] MDEV-31114 Assertion !...is_waiting() failed in os_aio_wait_until_no_pending_writes() os_aio_wait_until_no_pending_reads(), os_aio_wait_until_pending_writes(): Add a Boolean parameter to indicate whether the wait should be declared in the thread pool. buf_flush_wait(): The callers have already declared a wait, so let us avoid doing that again, just call os_aio_wait_until_pending_writes(false). buf_flush_wait_flushed(): Do not declare a wait in the rare case that the buf_flush_page_cleaner thread has been shut down already. buf_flush_page_cleaner(), buf_flush_buffer_pool(): In the code that runs during shutdown, do not declare waits. buf_flush_buffer_pool(): Remove a debug assertion that might fail. What really matters here is buf_pool.flush_list.count==0. buf_read_recv_pages(), srv_prepare_to_delete_redo_log_file(): Do not declare waits during InnoDB startup. --- storage/innobase/buf/buf0buf.cc | 4 ++-- storage/innobase/buf/buf0dump.cc | 2 +- storage/innobase/buf/buf0flu.cc | 13 ++++++------- storage/innobase/buf/buf0rea.cc | 2 +- storage/innobase/include/os0file.h | 10 ++++++---- storage/innobase/log/log0recv.cc | 2 +- storage/innobase/os/os0file.cc | 18 ++++++++++-------- storage/innobase/row/row0quiesce.cc | 2 +- storage/innobase/srv/srv0start.cc | 2 +- 9 files changed, 29 insertions(+), 26 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 462b1eb634afa..693826917c9c2 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1317,11 +1317,11 @@ buf_tmp_buffer_t *buf_pool_t::io_buf_t::reserve() for (buf_tmp_buffer_t *s= slots, *e= slots + n_slots; s != e; s++) if (s->acquire()) return s; - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(true); for (buf_tmp_buffer_t *s= slots, *e= slots + n_slots; s != e; s++) if (s->acquire()) return s; - os_aio_wait_until_no_pending_reads(); + os_aio_wait_until_no_pending_reads(true); } } diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 05b18de1d5b4b..03876666f1d51 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -647,7 +647,7 @@ buf_load() ut_free(dump); if (i == dump_n) { - os_aio_wait_until_no_pending_reads(); + os_aio_wait_until_no_pending_reads(true); } ut_sprintf_timestamp(now); diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 75286d9d33bd6..fff70eefd13f3 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -246,7 +246,7 @@ void buf_flush_remove_pages(ulint id) if (!deferred) break; - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(true); } } @@ -1692,7 +1692,7 @@ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed) space->release(); if (space->purpose == FIL_TYPE_IMPORT) - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(true); else buf_dblwr.flush_buffered_writes(); @@ -1862,7 +1862,7 @@ static void buf_flush_wait(lsn_t lsn) break; } mysql_mutex_unlock(&buf_pool.flush_list_mutex); - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(false); mysql_mutex_lock(&buf_pool.flush_list_mutex); } } @@ -1898,7 +1898,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) MONITOR_FLUSH_SYNC_COUNT, MONITOR_FLUSH_SYNC_PAGES, n_pages); } - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(false); mysql_mutex_lock(&buf_pool.flush_list_mutex); } while (buf_pool.get_oldest_modification(sync_lsn) < sync_lsn); @@ -2421,7 +2421,7 @@ static void buf_flush_page_cleaner() mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_wait_LRU_batch_end(); mysql_mutex_unlock(&buf_pool.flush_list_mutex); - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(false); } mysql_mutex_lock(&buf_pool.flush_list_mutex); @@ -2471,7 +2471,7 @@ ATTRIBUTE_COLD void buf_flush_buffer_pool() { mysql_mutex_unlock(&buf_pool.flush_list_mutex); buf_flush_list(srv_max_io_capacity); - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(false); mysql_mutex_lock(&buf_pool.flush_list_mutex); service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, "Waiting to flush " ULINTPF " pages", @@ -2479,7 +2479,6 @@ ATTRIBUTE_COLD void buf_flush_buffer_pool() } mysql_mutex_unlock(&buf_pool.flush_list_mutex); - ut_ad(!os_aio_pending_writes()); ut_ad(!os_aio_pending_reads()); } diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index b8fa3055adfec..1fe629ca8a738 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -687,7 +687,7 @@ void buf_read_recv_pages(ulint space_id, const uint32_t* page_nos, ulint n) } if (os_aio_pending_reads() >= limit) { - os_aio_wait_until_no_pending_reads(); + os_aio_wait_until_no_pending_reads(false); } space->reacquire(); diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index f8ae0f5155741..7ac0579cc07d3 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -1066,11 +1066,13 @@ size_t os_aio_pending_reads_approx(); /** @return number of pending writes */ size_t os_aio_pending_writes(); -/** Wait until there are no pending asynchronous writes. */ -void os_aio_wait_until_no_pending_writes(); +/** Wait until there are no pending asynchronous writes. +@param declare whether the wait will be declared in tpool */ +void os_aio_wait_until_no_pending_writes(bool declare); -/** Wait until all pending asynchronous reads have completed. */ -void os_aio_wait_until_no_pending_reads(); +/** Wait until all pending asynchronous reads have completed. +@param declare whether the wait will be declared in tpool */ +void os_aio_wait_until_no_pending_reads(bool declare); /** Prints info of the aio arrays. @param[in/out] file file where to print */ diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index f87ff15c3938c..78ba8b70a492f 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -3407,7 +3407,7 @@ void recv_sys_t::apply(bool last_batch) else { mysql_mutex_unlock(&mutex); - os_aio_wait_until_no_pending_reads(); + os_aio_wait_until_no_pending_reads(false); mysql_mutex_lock(&mutex); ut_ad(pages.empty()); } diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index e816f6ef7b15e..3b81dc7ee078b 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -3644,9 +3644,9 @@ void os_aio_free() } /** Wait until there are no pending asynchronous writes. */ -static void os_aio_wait_until_no_pending_writes_low() +static void os_aio_wait_until_no_pending_writes_low(bool declare) { - bool notify_wait = write_slots->pending_io_count() > 0; + const bool notify_wait= declare && write_slots->pending_io_count(); if (notify_wait) tpool::tpool_wait_begin(); @@ -3657,10 +3657,11 @@ static void os_aio_wait_until_no_pending_writes_low() tpool::tpool_wait_end(); } -/** Wait until there are no pending asynchronous writes. */ -void os_aio_wait_until_no_pending_writes() +/** Wait until there are no pending asynchronous writes. +@param declare whether the wait will be declared in tpool */ +void os_aio_wait_until_no_pending_writes(bool declare) { - os_aio_wait_until_no_pending_writes_low(); + os_aio_wait_until_no_pending_writes_low(declare); buf_dblwr.wait_flush_buffered_writes(); } @@ -3688,10 +3689,11 @@ size_t os_aio_pending_writes() return pending; } -/** Wait until all pending asynchronous reads have completed. */ -void os_aio_wait_until_no_pending_reads() +/** Wait until all pending asynchronous reads have completed. +@param declare whether the wait will be declared in tpool */ +void os_aio_wait_until_no_pending_reads(bool declare) { - const auto notify_wait= read_slots->pending_io_count(); + const bool notify_wait= declare && read_slots->pending_io_count(); if (notify_wait) tpool::tpool_wait_begin(); diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index a4d634f2d140c..eadb30bfcfa0e 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -553,7 +553,7 @@ row_quiesce_table_start( if (!trx_is_interrupted(trx)) { /* Ensure that all asynchronous IO is completed. */ - os_aio_wait_until_no_pending_writes(); + os_aio_wait_until_no_pending_writes(true); table->space->flush(); if (row_quiesce_write_cfg(table, trx->mysql_thd) diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 5f6b4b02e16ae..c111120ea0e06 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -973,7 +973,7 @@ static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists) ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); ut_ad(!buf_pool.get_oldest_modification(0)); ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); - ut_d(os_aio_wait_until_no_pending_writes()); + ut_d(os_aio_wait_until_no_pending_writes(false)); DBUG_RETURN(flushed_lsn); } From 31f09e36c183d026a28f42ddbb9be2229613a3ed Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Tue, 18 Apr 2023 13:22:43 -0600 Subject: [PATCH 64/70] MDEV-31038: Parallel Replication Breaks if XA PREPARE Fails Updating Slave GTID State If a replica failed to update the GTID slave state when committing an XA PREPARE, the replica would retry the transaction and get an out-of-order GTID error. This is because the commit phase of an XA PREPARE is bifurcated. That is, first, the prepare is handled by the relevant storage engines. Then second, the GTID slave state is updated as a separate autocommit transaction. If the second phase fails, and the transaction is retried, then the same transaction is attempted to be committed again, resulting in a GTID out-of-order error. This patch fixes this error by immediately stopping the slave and reporting the appropriate error. That is, there was logic to bypass the error when updating the GTID slave state table if the underlying error is allowed for retry on a parallel slave. This patch adds a parameter to disallow the error bypass, thereby forcing the error state to still happen. Reviewed By ============ Andrei Elkin --- .../rpl/r/rpl_xa_prepare_gtid_fail.result | 51 +++++++++ .../suite/rpl/t/rpl_xa_prepare_gtid_fail.test | 106 ++++++++++++++++++ sql/handler.cc | 7 +- sql/log_event.h | 2 +- sql/log_event_server.cc | 64 +++++++---- 5 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 mysql-test/suite/rpl/r/rpl_xa_prepare_gtid_fail.result create mode 100644 mysql-test/suite/rpl/t/rpl_xa_prepare_gtid_fail.test diff --git a/mysql-test/suite/rpl/r/rpl_xa_prepare_gtid_fail.result b/mysql-test/suite/rpl/r/rpl_xa_prepare_gtid_fail.result new file mode 100644 index 0000000000000..f3fecbda34953 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_xa_prepare_gtid_fail.result @@ -0,0 +1,51 @@ +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +change master to master_use_gtid=slave_pos; +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= optimistic; +set @@global.gtid_strict_mode=ON; +set sql_log_bin= 0; +alter table mysql.gtid_slave_pos engine=innodb; +call mtr.add_suppression("Deadlock found.*"); +set sql_log_bin= 1; +include/start_slave.inc +connection master; +create table t1 (a int primary key, b int) engine=innodb; +insert t1 values (1,1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.innodb_lock_wait_timeout= 1; +connection master; +set @@session.gtid_seq_no=100; +xa start '1'; +update t1 set b=b+10 where a=1; +xa end '1'; +xa prepare '1'; +xa commit '1'; +include/save_master_gtid.inc +connection slave; +connection slave1; +BEGIN; +SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=100 FOR UPDATE; +domain_id sub_id server_id seq_no +connection slave; +include/start_slave.inc +include/wait_for_slave_sql_error.inc [errno=1942,1213] +connection slave1; +ROLLBACK; +# Cleanup +connection master; +drop table t1; +connection slave; +include/stop_slave.inc +set @@global.gtid_slave_pos= "0-1-100"; +set @@global.slave_parallel_threads= 0; +set @@global.gtid_strict_mode= 0; +set @@global.innodb_lock_wait_timeout= 50; +include/start_slave.inc +include/rpl_end.inc +# End of rpl_xa_prepare_gtid_fail.test diff --git a/mysql-test/suite/rpl/t/rpl_xa_prepare_gtid_fail.test b/mysql-test/suite/rpl/t/rpl_xa_prepare_gtid_fail.test new file mode 100644 index 0000000000000..8042b355754f5 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_xa_prepare_gtid_fail.test @@ -0,0 +1,106 @@ +# +# When handling the replication of an XA PREPARE, the commit phase is +# bifurcated. First, the prepare is handled by the relevant storage engines. +# Then second,the GTID slave state is updated as a separate autocommit +# transaction. If the second stage fails, i.e. we are unable to update the +# GTID slave state, then the slave should immediately quit in error, without +# retry. +# +# This tests validates the above behavior by simulating a deadlock on the +# GTID slave state table during the second part of XA PREPARE's commit, to +# ensure that the appropriate error is reported and the transaction was never +# retried. +# +# +# References +# MDEV-31038: Parallel Replication Breaks if XA PREPARE Fails Updating Slave +# GTID State +# +source include/master-slave.inc; +source include/have_binlog_format_row.inc; +source include/have_innodb.inc; + +--connection slave +--source include/stop_slave.inc + +--let $save_par_thds= `SELECT @@global.slave_parallel_threads` +--let $save_strict_mode= `SELECT @@global.gtid_strict_mode` +--let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` + +change master to master_use_gtid=slave_pos; +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= optimistic; +set @@global.gtid_strict_mode=ON; + +set sql_log_bin= 0; +alter table mysql.gtid_slave_pos engine=innodb; +call mtr.add_suppression("Deadlock found.*"); +set sql_log_bin= 1; +--source include/start_slave.inc + +--connection master +let $datadir= `select @@datadir`; +create table t1 (a int primary key, b int) engine=innodb; +insert t1 values (1,1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @@global.innodb_lock_wait_timeout= 1; + +--let $retried_tx_initial= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) + +--connection master +--let $gtid_domain_id=`SELECT @@GLOBAL.gtid_domain_id` +--let $gtid_server_id=`SELECT @@GLOBAL.server_id` +--let $xap_seq_no=100 +--eval set @@session.gtid_seq_no=$xap_seq_no +xa start '1'; +update t1 set b=b+10 where a=1; +xa end '1'; +xa prepare '1'; +--let $new_gtid= `SELECT @@global.gtid_binlog_pos` +xa commit '1'; +--source include/save_master_gtid.inc + + +--connection slave + +#--eval set statement sql_log_bin=0 for insert into mysql.gtid_slave_pos values ($gtid_domain_id, 5, $gtid_server_id, $xap_seq_no) + +--connection slave1 +BEGIN; +--eval SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=$xap_seq_no FOR UPDATE + +--connection slave +--source include/start_slave.inc + +--let $slave_sql_errno= 1942,1213 +--source include/wait_for_slave_sql_error.inc + +--let $retried_tx_test= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) +if ($retried_tx_initial != $retried_tx_test) +{ + --echo Transaction was retried when a failed XA PREPARE slave GTID update should lead to immediate slave stop without retry + --die Transaction was retried when a failed XA PREPARE slave GTID update should lead to immediate slave stop without retry +} + +--connection slave1 +ROLLBACK; + +--echo # Cleanup + +--connection master +drop table t1; + +--connection slave +--source include/stop_slave.inc +--eval set @@global.gtid_slave_pos= "$new_gtid" +--eval set @@global.slave_parallel_threads= $save_par_thds +--eval set @@global.gtid_strict_mode= $save_strict_mode +--eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout +--source include/start_slave.inc + +--source include/rpl_end.inc +--echo # End of rpl_xa_prepare_gtid_fail.test diff --git a/sql/handler.cc b/sql/handler.cc index 926ef2f4f5421..eaaf4664c074b 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -2057,8 +2057,11 @@ int ha_rollback_trans(THD *thd, bool all) rollback without signalling following transactions. And in release builds, we explicitly do the signalling before rolling back. */ - DBUG_ASSERT(!(thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) || - thd->transaction->xid_state.is_explicit_XA()); + DBUG_ASSERT( + !(thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) || + (thd->transaction->xid_state.is_explicit_XA() || + (thd->rgi_slave->gtid_ev_flags2 & Gtid_log_event::FL_PREPARED_XA))); + if (thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) thd->rgi_slave->unmark_start_commit(); } diff --git a/sql/log_event.h b/sql/log_event.h index 5dcf0315f68f8..2fcc4549bc968 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -3042,7 +3042,7 @@ class Xid_apply_log_event: public Log_event virtual int do_commit()= 0; virtual int do_apply_event(rpl_group_info *rgi); int do_record_gtid(THD *thd, rpl_group_info *rgi, bool in_trans, - void **out_hton); + void **out_hton, bool force_err= false); enum_skip_reason do_shall_skip(rpl_group_info *rgi); virtual const char* get_query()= 0; #endif diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc index c5fb637a00089..a2b78bc241d84 100644 --- a/sql/log_event_server.cc +++ b/sql/log_event_server.cc @@ -152,6 +152,30 @@ is_parallel_retry_error(rpl_group_info *rgi, int err) return has_temporary_error(rgi->thd); } +/** + Accumulate a Diagnostics_area's errors and warnings into an output buffer + + @param errbuf The output buffer to write error messages + @param errbuf_size The size of the output buffer + @param da The Diagnostics_area to check for errors +*/ +static void inline aggregate_da_errors(char *errbuf, size_t errbuf_size, + Diagnostics_area *da) +{ + const char *errbuf_end= errbuf + errbuf_size; + char *slider; + Diagnostics_area::Sql_condition_iterator it= da->sql_conditions(); + const Sql_condition *err; + size_t len; + for (err= it++, slider= errbuf; err && slider < errbuf_end - 1; + slider += len, err= it++) + { + len= my_snprintf(slider, errbuf_end - slider, + " %s, Error_code: %d;", err->get_message_text(), + err->get_sql_errno()); + } +} + /** Error reporting facility for Rows_log_event::do_apply_event @@ -172,13 +196,8 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error, const char *log_name, my_off_t pos) { const char *handler_error= (ha_error ? HA_ERR(ha_error) : NULL); - char buff[MAX_SLAVE_ERRMSG], *slider; - const char *buff_end= buff + sizeof(buff); - size_t len; - Diagnostics_area::Sql_condition_iterator it= - thd->get_stmt_da()->sql_conditions(); + char buff[MAX_SLAVE_ERRMSG]; Relay_log_info const *rli= rgi->rli; - const Sql_condition *err; buff[0]= 0; int errcode= thd->is_error() ? thd->get_stmt_da()->sql_errno() : 0; @@ -191,13 +210,7 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error, if (is_parallel_retry_error(rgi, errcode)) return; - for (err= it++, slider= buff; err && slider < buff_end - 1; - slider += len, err= it++) - { - len= my_snprintf(slider, buff_end - slider, - " %s, Error_code: %d;", err->get_message_text(), - err->get_sql_errno()); - } + aggregate_da_errors(buff, sizeof(buff), thd->get_stmt_da()); if (ha_error != 0) rli->report(level, errcode, rgi->gtid_info(), @@ -3893,7 +3906,8 @@ bool slave_execute_deferred_events(THD *thd) #if defined(HAVE_REPLICATION) int Xid_apply_log_event::do_record_gtid(THD *thd, rpl_group_info *rgi, - bool in_trans, void **out_hton) + bool in_trans, void **out_hton, + bool force_err) { int err= 0; Relay_log_info const *rli= rgi->rli; @@ -3908,14 +3922,26 @@ int Xid_apply_log_event::do_record_gtid(THD *thd, rpl_group_info *rgi, int ec= thd->get_stmt_da()->sql_errno(); /* Do not report an error if this is really a kill due to a deadlock. - In this case, the transaction will be re-tried instead. + In this case, the transaction will be re-tried instead. Unless force_err + is set, as in the case of XA PREPARE, as the GTID state is updated as a + separate transaction, and if that fails, we should not retry but exit in + error immediately. */ - if (!is_parallel_retry_error(rgi, ec)) + if (!is_parallel_retry_error(rgi, ec) || force_err) + { + char buff[MAX_SLAVE_ERRMSG]; + buff[0]= 0; + aggregate_da_errors(buff, sizeof(buff), thd->get_stmt_da()); + + if (force_err) + thd->clear_error(); + rli->report(ERROR_LEVEL, ER_CANNOT_UPDATE_GTID_STATE, rgi->gtid_info(), "Error during XID COMMIT: failed to update GTID state in " - "%s.%s: %d: %s", + "%s.%s: %d: %s the event's master log %s, end_log_pos %llu", "mysql", rpl_gtid_slave_state_table_name.str, ec, - thd->get_stmt_da()->message()); + buff, RPL_LOG_NAME, log_pos); + } thd->is_slave_error= 1; } @@ -3989,7 +4015,7 @@ int Xid_apply_log_event::do_apply_event(rpl_group_info *rgi) { DBUG_ASSERT(!thd->transaction->xid_state.is_explicit_XA()); - if ((err= do_record_gtid(thd, rgi, false, &hton))) + if ((err= do_record_gtid(thd, rgi, false, &hton, true))) return err; } From 50f3b7d1649002df3c73ec88827707096ce3135c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 25 Apr 2023 12:17:06 +0300 Subject: [PATCH 65/70] MDEV-31124 Innodb_data_written miscounts doublewrites When commit a5a2ef079cec378340d8b575aef05974b0b3442e implemented asynchronous doublewrite, the writes via the doublewrite buffer started to be counted incorrectly, without multiplying them by innodb_page_size. srv_export_innodb_status(): Correctly count the Innodb_data_written. buf_dblwr_t: Remove submitted(), because it is close to written() and only Innodb_data_written was interested in it. According to its name, it should count completed and not submitted writes. Tested by: Axel Schwenke --- storage/innobase/buf/buf0dblwr.cc | 1 - storage/innobase/include/buf0dblwr.h | 5 ----- storage/innobase/srv/srv0srv.cc | 7 ++++--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 1d582b6cfbf81..b6b6e87b6dfac 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -582,7 +582,6 @@ bool buf_dblwr_t::flush_buffered_writes(const ulint size) const bool multi_batch= block1 + static_cast(size) != block2 && old_first_free > size; flushing_buffered_writes= 1 + multi_batch; - pages_submitted+= old_first_free; /* Now safe to release the mutex. */ mysql_mutex_unlock(&mutex); #ifdef UNIV_DEBUG diff --git a/storage/innobase/include/buf0dblwr.h b/storage/innobase/include/buf0dblwr.h index fb9df55504c00..f82baeec89a40 100644 --- a/storage/innobase/include/buf0dblwr.h +++ b/storage/innobase/include/buf0dblwr.h @@ -66,8 +66,6 @@ class buf_dblwr_t bool batch_running; /** number of expected flush_buffered_writes_completed() calls */ unsigned flushing_buffered_writes; - /** pages submitted to flush_buffered_writes() */ - ulint pages_submitted; /** number of flush_buffered_writes_completed() calls */ ulint writes_completed; /** number of pages written by flush_buffered_writes_completed() */ @@ -92,9 +90,6 @@ class buf_dblwr_t /** Acquire the mutex */ void lock() { mysql_mutex_lock(&mutex); } - /** @return the number of submitted page writes */ - ulint submitted() const - { mysql_mutex_assert_owner(&mutex); return pages_submitted; } /** @return the number of completed batches */ ulint batches() const { mysql_mutex_assert_owner(&mutex); return writes_completed; } diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 337460fc4d2cc..57aa4bef9fe95 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1013,13 +1013,14 @@ srv_export_innodb_status(void) if (buf_dblwr.is_initialised()) { buf_dblwr.lock(); - dblwr = buf_dblwr.submitted(); - export_vars.innodb_dblwr_pages_written = buf_dblwr.written(); + dblwr = buf_dblwr.written(); + export_vars.innodb_dblwr_pages_written = dblwr; export_vars.innodb_dblwr_writes = buf_dblwr.batches(); buf_dblwr.unlock(); } - export_vars.innodb_data_written = srv_stats.data_written + dblwr; + export_vars.innodb_data_written = srv_stats.data_written + + (dblwr << srv_page_size_shift); export_vars.innodb_buffer_pool_read_requests = buf_pool.stat.n_page_gets; From c22ab93f8af5baf2cefe802dfd4a3819225d6df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 25 Apr 2023 15:03:38 +0300 Subject: [PATCH 66/70] MDEV-26827 fixup: Prevent a hang in LRU eviction buf_pool_t::page_cleaner_wakeup(): If for_LRU=true, wake up the page cleaner immediately, also when it is in a timed wait. This avoids an unnecessary delay of up to 1 second. --- storage/innobase/buf/buf0flu.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index fff70eefd13f3..b201250bc3bd5 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -115,7 +115,12 @@ static void buf_flush_validate_skip() void buf_pool_t::page_cleaner_wakeup(bool for_LRU) { if (!page_cleaner_idle()) + { + if (for_LRU) + /* Ensure that the page cleaner is not in a timed wait. */ + pthread_cond_signal(&do_flush_list); return; + } double dirty_pct= double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 / double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)); double pct_lwm= srv_max_dirty_pages_pct_lwm; From 898320b5f8afd20ba07efa8ea193e18661f2a0a4 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 25 Apr 2023 18:55:53 +0200 Subject: [PATCH 67/70] MDEV-30804 addendum for 10.6+ branches This addition to MDEV-30804 is relevant for 10.6+, it excludes the mixed transaction section using both innodb and aria storage engines from the galera_var_replicate_aria_off test, since such transactions cannot be executed unless aria supports two-phase transaction commit. No additional tests are required as this commit fixes the mtr test itself. --- .../suite/galera/r/galera_var_replicate_aria_on.result | 5 ++--- .../suite/galera/t/galera_var_replicate_aria_on.test | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_var_replicate_aria_on.result b/mysql-test/suite/galera/r/galera_var_replicate_aria_on.result index 39fd748314c6d..91c07ba6681e7 100644 --- a/mysql-test/suite/galera/r/galera_var_replicate_aria_on.result +++ b/mysql-test/suite/galera/r/galera_var_replicate_aria_on.result @@ -89,11 +89,8 @@ connection node_1; SET GLOBAL wsrep_sync_wait=15; CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=Aria; CREATE TABLE t2 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); -COMMIT; connection node_2; SET GLOBAL wsrep_sync_wait=15; SELECT COUNT(*) AS EXPECT_1 FROM t1; @@ -103,6 +100,7 @@ SELECT COUNT(*) AS EXPECT_1 FROM t2; EXPECT_1 1 connection node_1; +SET AUTOCOMMIT=OFF; START TRANSACTION; INSERT INTO t1 VALUES (2); INSERT INTO t2 VALUES (2); @@ -129,6 +127,7 @@ INSERT INTO t1 VALUES (1); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' connection node_1; COMMIT; +ERROR HY000: Transactional commit not supported by involved engine(s) DROP TABLE t1,t2; connection node_1; CREATE TABLE t1 (i INT NOT NULL PRIMARY KEY) ENGINE=INNODB; diff --git a/mysql-test/suite/galera/t/galera_var_replicate_aria_on.test b/mysql-test/suite/galera/t/galera_var_replicate_aria_on.test index c3bc53ee17fec..ac9a79e61962c 100644 --- a/mysql-test/suite/galera/t/galera_var_replicate_aria_on.test +++ b/mysql-test/suite/galera/t/galera_var_replicate_aria_on.test @@ -85,18 +85,15 @@ SELECT * FROM t1; DROP TABLE t1; # -# Transaction +# Preparation for next tests # --connection node_1 SET GLOBAL wsrep_sync_wait=15; CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=Aria; CREATE TABLE t2 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); -COMMIT; --connection node_2 SET GLOBAL wsrep_sync_wait=15; @@ -108,6 +105,7 @@ SELECT COUNT(*) AS EXPECT_1 FROM t2; # --connection node_1 +SET AUTOCOMMIT=OFF; START TRANSACTION; INSERT INTO t1 VALUES (2); INSERT INTO t2 VALUES (2); @@ -138,6 +136,8 @@ INSERT INTO t2 VALUES (1); INSERT INTO t1 VALUES (1); --connection node_1 + +--error ER_ERROR_DURING_COMMIT COMMIT; DROP TABLE t1,t2; From d4265fbde587bd79b6fe3793225d3f4798ee955e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 26 Apr 2023 11:53:42 +0300 Subject: [PATCH 68/70] MDEV-26055: Correct the formula for adaptive flushing page_cleaner_flush_pages_recommendation(): If dirty_pct is between innodb_max_dirty_pages_pct_lwm and innodb_max_dirty_pages_pct, scale the effort relative to how close we are to innodb_max_dirty_pages_pct. The previous formula was missing a multiplication by 100. Tested by: Axel Schwenke --- storage/innobase/buf/buf0flu.cc | 37 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index b201250bc3bd5..73fc2957ebba2 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -2081,10 +2081,12 @@ Based on various factors it decides if there is a need to do flushing. @return number of pages recommended to be flushed @param last_pages_in number of pages flushed in previous batch @param oldest_lsn buf_pool.get_oldest_modification(0) +@param pct_lwm innodb_max_dirty_pages_pct_lwm, or 0 to ignore it @param dirty_blocks UT_LIST_GET_LEN(buf_pool.flush_list) @param dirty_pct 100*flush_list.count / (LRU.count + free.count) */ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, lsn_t oldest_lsn, + double pct_lwm, ulint dirty_blocks, double dirty_pct) { @@ -2154,11 +2156,17 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, sum_pages = 0; } - const ulint pct_for_dirty = srv_max_dirty_pages_pct_lwm == 0 - ? (dirty_pct >= max_pct ? 100 : 0) - : static_cast - (max_pct > 0.0 ? dirty_pct / max_pct : dirty_pct); - ulint pct_total = std::max(pct_for_dirty, pct_for_lsn); + MONITOR_SET(MONITOR_FLUSH_PCT_FOR_LSN, pct_for_lsn); + + double total_ratio; + if (pct_lwm == 0.0 || max_pct == 0.0) { + total_ratio = 1; + } else { + total_ratio = std::max(double(pct_for_lsn) / 100, + (dirty_pct / max_pct)); + } + + MONITOR_SET(MONITOR_FLUSH_PCT_FOR_DIRTY, ulint(total_ratio * 100)); /* Estimate pages to be flushed for the lsn progress */ lsn_t target_lsn = oldest_lsn @@ -2184,7 +2192,7 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, pages_for_lsn = 1; } - n_pages = (ulint(double(srv_io_capacity) * double(pct_total) / 100.0) + n_pages = (ulint(double(srv_io_capacity) * total_ratio) + avg_page_rate + pages_for_lsn) / 3; if (n_pages > srv_max_io_capacity) { @@ -2197,8 +2205,6 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, MONITOR_SET(MONITOR_FLUSH_AVG_PAGE_RATE, avg_page_rate); MONITOR_SET(MONITOR_FLUSH_LSN_AVG_RATE, lsn_avg_rate); - MONITOR_SET(MONITOR_FLUSH_PCT_FOR_DIRTY, pct_for_dirty); - MONITOR_SET(MONITOR_FLUSH_PCT_FOR_LSN, pct_for_lsn); goto func_exit; } @@ -2305,7 +2311,7 @@ static void buf_flush_page_cleaner() soft_lsn_limit= lsn_limit; } - bool idle_flush= false; + double pct_lwm= 0.0; ulint n_flushed= 0, n; if (UNIV_UNLIKELY(soft_lsn_limit != 0)) @@ -2324,7 +2330,7 @@ static void buf_flush_page_cleaner() mysql_mutex_unlock(&buf_pool.mutex); last_pages+= n; - if (!idle_flush) + if (pct_lwm == 0.0) goto end_of_batch; /* when idle flushing kicks in page_cleaner is marked active. @@ -2342,7 +2348,8 @@ static void buf_flush_page_cleaner() guaranteed to be nonempty, and it is a subset of buf_pool.LRU. */ const double dirty_pct= double(dirty_blocks) * 100.0 / double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)); - if (srv_max_dirty_pages_pct_lwm != 0.0) + pct_lwm= srv_max_dirty_pages_pct_lwm; + if (pct_lwm != 0.0) { const ulint activity_count= srv_get_activity_count(); if (activity_count != last_activity_count) @@ -2359,13 +2366,16 @@ static void buf_flush_page_cleaner() - there are no pending reads but there are dirty pages to flush */ buf_pool.update_last_activity_count(activity_count); mysql_mutex_unlock(&buf_pool.flush_list_mutex); - idle_flush= true; goto idle_flush; } else + { maybe_unemployed: - if (dirty_pct < srv_max_dirty_pages_pct_lwm) + const bool below{dirty_pct < pct_lwm}; + pct_lwm= 0.0; + if (below) goto possibly_unemployed; + } } else if (dirty_pct < srv_max_buf_pool_modified_pct) possibly_unemployed: @@ -2396,6 +2406,7 @@ static void buf_flush_page_cleaner() } else if ((n= page_cleaner_flush_pages_recommendation(last_pages, oldest_lsn, + pct_lwm, dirty_blocks, dirty_pct)) != 0) { From 5740638c4c3337a0021a82f5b744afca1ab1346c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 26 Apr 2023 12:08:59 +0300 Subject: [PATCH 69/70] MDEV-31132 Deadlock between DDL and purge of InnoDB history log_free_check(): Assert that the caller must not hold exclusive lock_sys.latch. This was the case for calls from ibuf_delete_for_discarded_space(). This caused a deadlock with another thread that would be holding a latch on a dirty page that would need to be written so that the checkpoint would advance and log_free_check() could return. That other thread was waiting for a shared lock_sys.latch. fil_delete_tablespace(): Do not invoke ibuf_delete_for_discarded_space() because in DDL operations, we will be holding exclusive lock_sys.latch. trx_t::commit(std::vector&), innodb_drop_database(), row_purge_remove_clust_if_poss_low(), row_undo_ins_remove_clust_rec(), row_discard_tablespace_for_mysql(): Invoke ibuf_delete_for_discarded_space() on the deleted tablespaces after releasing all latches. --- storage/innobase/dict/drop.cc | 7 +++++++ storage/innobase/fil/fil0fil.cc | 2 -- storage/innobase/handler/ha_innodb.cc | 5 +++++ storage/innobase/include/log0log.h | 13 ++++--------- storage/innobase/include/log0log.inl | 20 -------------------- storage/innobase/log/log0log.cc | 10 ++++++++++ storage/innobase/row/row0mysql.cc | 1 + storage/innobase/row/row0purge.cc | 9 +++++++-- storage/innobase/row/row0uins.cc | 9 +++++++-- 9 files changed, 41 insertions(+), 35 deletions(-) diff --git a/storage/innobase/dict/drop.cc b/storage/innobase/dict/drop.cc index 9013841ba5e00..45747fb35965b 100644 --- a/storage/innobase/dict/drop.cc +++ b/storage/innobase/dict/drop.cc @@ -68,6 +68,7 @@ before transaction commit and must be rolled back explicitly are as follows: #include "dict0defrag_bg.h" #include "btr0defragment.h" +#include "ibuf0ibuf.h" #include "lock0lock.h" #include "que0que.h" @@ -237,6 +238,8 @@ void trx_t::commit(std::vector &deleted) commit_persist(); if (dict_operation) { + std::vector space_ids; + space_ids.reserve(mod_tables.size()); ut_ad(dict_sys.locked()); lock_sys.wr_lock(SRW_LOCK_CALL); mutex_lock(); @@ -271,6 +274,7 @@ void trx_t::commit(std::vector &deleted) dict_sys.remove(table); if (const auto id= space ? space->id : 0) { + space_ids.emplace_back(uint32_t(id)); pfs_os_file_t d= fil_delete_tablespace(id); if (d != OS_FILE_CLOSED) deleted.emplace_back(d); @@ -283,6 +287,9 @@ void trx_t::commit(std::vector &deleted) mysql_mutex_lock(&lock_sys.wait_mutex); lock_sys.deadlock_check(); mysql_mutex_unlock(&lock_sys.wait_mutex); + + for (const auto id : space_ids) + ibuf_delete_for_discarded_space(id); } commit_cleanup(); } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 48d205f428ad5..23f0cf75f3906 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -45,7 +45,6 @@ Created 10/25/1995 Heikki Tuuri #include "srv0start.h" #include "trx0purge.h" #include "buf0lru.h" -#include "ibuf0ibuf.h" #include "buf0flu.h" #include "log.h" #ifdef __linux__ @@ -1689,7 +1688,6 @@ pfs_os_file_t fil_delete_tablespace(ulint id) fil_space_free_low(space); } - ibuf_delete_for_discarded_space(id); return handle; } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index f102789d7ab28..0b117c02e29f7 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1542,6 +1542,7 @@ static void innodb_drop_database(handlerton*, char *path) dfield_set_data(&dfield, namebuf, len); dict_index_copy_types(&tuple, sys_index, 1); std::vector to_close; + std::vector space_ids; mtr_t mtr; mtr.start(); pcur.btr_cur.page_cur.index = sys_index; @@ -1585,6 +1586,7 @@ static void innodb_drop_database(handlerton*, char *path) ut_ad("corrupted SYS_TABLES.SPACE" == 0); else if (uint32_t space_id= mach_read_from_4(s)) { + space_ids.emplace_back(space_id); pfs_os_file_t detached= fil_delete_tablespace(space_id); if (detached != OS_FILE_CLOSED) to_close.emplace_back(detached); @@ -1594,6 +1596,9 @@ static void innodb_drop_database(handlerton*, char *path) mtr.commit(); for (pfs_os_file_t detached : to_close) os_file_close(detached); + for (const auto id : space_ids) + ibuf_delete_for_discarded_space(id); + /* Any changes must be persisted before we return. */ log_write_up_to(mtr.commit_lsn(), true); } diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index 0f9a4da049bb5..0996b66ef52af 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -73,15 +73,10 @@ log_reserve_and_write_fast( const void* str, ulint len, lsn_t* start_lsn); -/***********************************************************************//** -Checks if there is need for a log buffer flush or a new checkpoint, and does -this if yes. Any database operation should call this when it has modified -more than about 4 pages. NOTE that this function may only be called when the -OS thread owns no synchronization objects except dict_sys.latch. */ -UNIV_INLINE -void -log_free_check(void); -/*================*/ +/** Wait for a log checkpoint if needed. +NOTE that this function may only be called while not holding +any synchronization objects except dict_sys.latch. */ +void log_free_check(); /** Extends the log buffer. @param[in] len requested minimum size in bytes */ diff --git a/storage/innobase/include/log0log.inl b/storage/innobase/include/log0log.inl index c29c0bfa55feb..27856fca8f92a 100644 --- a/storage/innobase/include/log0log.inl +++ b/storage/innobase/include/log0log.inl @@ -289,23 +289,3 @@ log_reserve_and_write_fast( return lsn; } - -/***********************************************************************//** -Checks if there is need for a log buffer flush or a new checkpoint, and does -this if yes. Any database operation should call this when it has modified -more than about 4 pages. NOTE that this function may only be called when the -OS thread owns no synchronization objects except dict_sys.latch. */ -UNIV_INLINE -void -log_free_check(void) -/*================*/ -{ - /* During row_log_table_apply(), this function will be called while we - are holding some latches. This is OK, as long as we are not holding - any latches on buffer blocks. */ - - if (log_sys.check_flush_or_checkpoint()) { - - log_check_margins(); - } -} diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index c53e2fd50746f..f65e812f40f9e 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -1065,6 +1065,16 @@ ATTRIBUTE_COLD void log_check_margins() while (log_sys.check_flush_or_checkpoint()); } +/** Wait for a log checkpoint if needed. +NOTE that this function may only be called while not holding +any synchronization objects except dict_sys.latch. */ +void log_free_check() +{ + ut_ad(!lock_sys.is_writer()); + if (log_sys.check_flush_or_checkpoint()) + log_check_margins(); +} + extern void buf_resize_shutdown(); /** Make a checkpoint at the latest lsn on shutdown. */ diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 67167f19c70b3..d27fc9642191b 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -2492,6 +2492,7 @@ dberr_t row_discard_tablespace_for_mysql(dict_table_t *table, trx_t *trx) if (fts_exist) purge_sys.resume_FTS(); + ibuf_delete_for_discarded_space(space_id); buf_flush_remove_pages(space_id); trx->op_info= ""; return err; diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc index 753b42332fcc1..f4db252b06934 100644 --- a/storage/innobase/row/row0purge.cc +++ b/storage/innobase/row/row0purge.cc @@ -162,8 +162,9 @@ row_purge_remove_clust_if_poss_low( ut_ad("corrupted SYS_INDEXES record" == 0); } - if (const uint32_t space_id = dict_drop_index_tree( - &node->pcur, nullptr, &mtr)) { + const uint32_t space_id = dict_drop_index_tree( + &node->pcur, nullptr, &mtr); + if (space_id) { if (table) { if (table->get_ref_count() == 0) { dict_sys.remove(table); @@ -184,6 +185,10 @@ row_purge_remove_clust_if_poss_low( table = nullptr; } + if (space_id) { + ibuf_delete_for_discarded_space(space_id); + } + purge_sys.check_stop_SYS(); mtr.start(); index->set_modified(mtr); diff --git a/storage/innobase/row/row0uins.cc b/storage/innobase/row/row0uins.cc index 50196e780927d..ff1a34b46c3df 100644 --- a/storage/innobase/row/row0uins.cc +++ b/storage/innobase/row/row0uins.cc @@ -147,8 +147,9 @@ row_undo_ins_remove_clust_rec( pfs_os_file_t d = OS_FILE_CLOSED; - if (const uint32_t space_id = dict_drop_index_tree( - &node->pcur, node->trx, &mtr)) { + const uint32_t space_id = dict_drop_index_tree( + &node->pcur, node->trx, &mtr); + if (space_id) { if (table) { lock_release_on_rollback(node->trx, table); @@ -187,6 +188,10 @@ row_undo_ins_remove_clust_rec( os_file_close(d); } + if (space_id) { + ibuf_delete_for_discarded_space(space_id); + } + mtr.start(); ut_a(node->pcur.restore_position( BTR_MODIFY_LEAF, &mtr) == btr_pcur_t::SAME_ALL); From 09fdd3aca6f0d6cfaf8218def9d1a99f5a325160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 26 Apr 2023 18:19:44 +0300 Subject: [PATCH 70/70] After-merge fix This fixes up commit e3f6e1c92e1604c63e4de113f8863953c05b29a9 --- storage/spider/spd_db_mysql.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 753e777017c69..f11bf4fc4398d 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -2261,8 +2261,7 @@ void spider_db_mbase::fetch_and_print_warnings(struct tm *l_time) DBUG_VOID_RETURN; if (mysql_num_fields(res) == 3) - for (MYSQL_ROW row= mysql_fetch_row(res); row; - mysql_fetch_row(res)) + while (MYSQL_ROW row= mysql_fetch_row(res)) fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] from [%s] %ld " "to %ld: %s %s %s\n",